百度网盘存储 Skill 百度网盘文件管理工具,所有操作限制在 目录内。适配 Claude Code、DuClaw、OpenClaw 等。 使用注意事项详见 reference/notes.md 触发规则 网盘文件操作触发 同时满足以下条件才执行: 1. 用户明确提及"百度网盘"、"bdpan"、"网盘" 2. 操作意图明确(上传/下载/转存/分享/查看/搜索/移动/复制/重命名/创建文件夹/登录/注销) 未通过触发规则时,禁止执行任何 bdpan 命令。 上下文延续: 当前对话已在进行网盘操作时,后续消息无需再次提及"网盘"即可触发。 记忆备份/恢复触发 以下表达即使未提及"网盘"也应触发(仅限 kimiclaw/maxclaw/qclaw/openclaw 环境): | 用户说法示例 | 触发操作 | |------------|---------| | "备份记忆"、"备份我的记忆"、"把记忆存到网盘" | backup | | "查看记忆备份"、"有哪些备份"、"备份列表" | list | | "恢复记忆"、"还原记忆"、"回滚记忆"、"记忆回档" | restore(需确认日期) | | "恢复 3月16号 的记忆"、"恢复 2026-03-16 的备份" | restore 指定日期 | 以下情况不触发记忆备份/恢复: - "帮我记住…"、"整理记忆"、"清理记忆"…

; then\n log_error \"授权码格式不正确(应为 32 位十六进制字符,如: ca0ee3070f75d0246357e5c74d525bda)\"\n log_error \"当前输入: ${AUTH_CODE}\"\n log_error \"请确认您复制的是完整的授权码\"\n exit 1\nfi\n\n# 使用授权码完成登录\nlog_info \"正在使用授权码完成登录...\"\n\n# 通过 stdin 安全传递授权码,避免在 ps / /proc/PID/cmdline 中泄露\nif bdpan login --help 2>/dev/null | grep -q \"set-code-stdin\"; then\n echo \"$AUTH_CODE\" | bdpan login --set-code-stdin\nelse\n unset AUTH_CODE\n log_error \"当前 bdpan 版本不支持 --set-code-stdin(安全授权码传递)\"\n log_error \"当前 bdpan 版本: ${BDPAN_VERSION}\"\n log_error \"请升级到 >= 3.6.2: bash scripts/install.sh --force\"\n exit 1\nfi\n\n# 立即清除内存中的授权码\nunset AUTH_CODE\n\n# 验证登录\nif bdpan whoami &> /dev/null; then\n log_info \"✓ 登录成功!\"\n bdpan whoami\nelse\n log_error \"登录失败,请检查授权码是否正确\"\n exit 1\nfi\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":7077,"content_sha256":"f11bed956beba2137fd9e2f2dfed86aae1a13f124ee9958f60208758acbfd01b"},{"filename":"scripts/memory-backup.sh","content":"#!/usr/bin/env bash\n# memory-backup.sh — Agent 记忆备份/恢复到百度网盘\n#\n# 支持的 Agent:kimiclaw、maxclaw、qclaw、openclaw(自动检测)\n# 网盘存储路径:/apps/bdpan/agent-memory/\u003cagent>/\u003cdevice>/manual/\u003ctimestamp>/\n#\n# 用法:\n# bash memory-backup.sh backup 备份当前记忆到百度网盘\n# bash memory-backup.sh list 列出所有可用备份\n# bash memory-backup.sh restore \u003cdate> 恢复指定日期的备份(支持模糊匹配)\n# bash memory-backup.sh restore \u003cdate> --force 跳过兼容性警告强制恢复\nset -euo pipefail\n\n# ============================================================\n# 常量\n# ============================================================\nSCRIPT_VERSION=\"1.0.0\"\nDEFAULT_BASE_PATH=\"/apps/bdpan/agent-memory\"\n\n# 全局临时目录(供 EXIT trap 清理,local 变量在 EXIT 时已出作用域)\n_BACKUP_TMP_DIR=\"\"\n_RESTORE_TMP_DIR=\"\"\ntrap 'rm -rf \"${_BACKUP_TMP_DIR:-}\" \"${_RESTORE_TMP_DIR:-}\"' EXIT\n\n# ============================================================\n# Agent 检测模块\n# ============================================================\n# 调用后设置全局变量:\n# DETECTED_AGENT, AGENT_NAME, MEMORY_SYSTEM_NAME,\n# WORKSPACE_DIR, MEMORY_DIR, CONFIG_DIR, WORKSPACE_FILES\n\ndetect_agent() {\n local script_abs_path\n script_abs_path=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n\n DETECTED_AGENT=\"unknown\"\n\n # 1. kimiclaw: 路径含 .openclaw 且 .kimi 目录存在\n if [[ \"$script_abs_path\" == *\".openclaw\"* ]] && [ -d \"/root/.kimi/kimi-claw\" ]; then\n DETECTED_AGENT=\"kimiclaw\"\n _set_agent_config \"kimiclaw\" \"/root/.openclaw/workspace\" \"/root/.openclaw\"\n return 0\n fi\n\n # 2. maxclaw: 路径前缀为 /workspace/ 且 .maxclaw 目录存在\n if [[ \"$script_abs_path\" == /workspace/* ]] && [ -d \"/root/.maxclaw\" ]; then\n DETECTED_AGENT=\"maxclaw\"\n _set_agent_config \"maxclaw\" \"/workspace\" \"/root/.maxclaw\"\n return 0\n fi\n\n # 3. qclaw: 路径段完整匹配 .qclaw 或 qclaw(大小写不敏感,兼容 bash 3.2+)\n local _path_lower\n _path_lower=\"$(echo \"$script_abs_path\" | tr '[:upper:]' '[:lower:]')\"\n if [[ \"$_path_lower\" =~ (^|/)(\\.qclaw|qclaw)(/|$) ]]; then\n DETECTED_AGENT=\"qclaw\"\n _set_agent_config \"qclaw\" \"$HOME/.qclaw/workspace\" \"$HOME/.qclaw\"\n return 0\n fi\n\n # 4. openclaw: 路径段完整匹配 .openclaw 或 openclaw,且 OPENCLAW_CLI=1(大小写不敏感,兼容 bash 3.2+)\n if [[ \"$_path_lower\" =~ (^|/)(\\.openclaw|openclaw)(/|$) ]] && [ \"${OPENCLAW_CLI:-}\" = \"1\" ]; then\n DETECTED_AGENT=\"openclaw\"\n local home=\"${OPENCLAW_HOME:-$HOME/.openclaw}\"\n _set_agent_config \"openclaw\" \"$home/workspace\" \"$home\"\n return 0\n fi\n\n DETECTED_AGENT=\"unknown\"\n return 1\n}\n\n_set_agent_config() {\n AGENT_NAME=\"$1\"\n WORKSPACE_DIR=\"$2\"\n CONFIG_DIR=\"$3\"\n MEMORY_SYSTEM_NAME=\"memory-core\"\n MEMORY_DIR=\"$WORKSPACE_DIR/memory\"\n WORKSPACE_FILES=(\"AGENTS.md\" \"SOUL.md\" \"USER.md\" \"IDENTITY.md\" \"TOOLS.md\" \"MEMORY.md\" \"HEARTBEAT.md\")\n}\n\n# ============================================================\n# 设备工具函数\n# ============================================================\nget_device_name() {\n hostname | sed 's/\\.[Ll][Oo][Cc][Aa][Ll]$//' | tr '[:upper:]' '[:lower:]'\n}\n\nnormalize_device() {\n echo \"$1\" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g'\n}\n\n# ============================================================\n# 路径工具函数\n# ============================================================\nbuild_backup_path() {\n local agent=\"${1:-}\"\n local device=\"${2:-}\"\n local backup_type=\"${3:-}\"\n local timestamp=\"${4:-}\"\n echo \"${DEFAULT_BASE_PATH}/${agent}/${device}/${backup_type}/${timestamp}\"\n}\n\nbuild_base_path() {\n local agent=\"${1:-}\"\n local device=\"${2:-}\"\n echo \"${DEFAULT_BASE_PATH}/${agent}/${device}\"\n}\n\n# API 路径 → 用户显示路径(/apps/... → 我的应用数据/...)\nto_user_path() {\n local api_path=\"${1:-}\"\n if [ -z \"$api_path\" ]; then\n echo \"\"\n return\n fi\n if [[ \"$api_path\" == \"/apps/\"* ]]; then\n echo \"我的应用数据/${api_path#/apps/}\"\n elif [[ \"$api_path\" == \"/apps\" ]]; then\n echo \"我的应用数据\"\n else\n echo \"$api_path\"\n fi\n}\n\n# ============================================================\n# JSON 工具函数(基于 Node.js)\n# ============================================================\njson_array_length() {\n local file=\"$1\"\n local field=\"$2\"\n node -e \"\n const d = JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'));\n const arr = d[process.argv[2]];\n if (!Array.isArray(arr)) process.exit(1);\n process.stdout.write(String(arr.length));\n \" \"$file\" \"$field\"\n}\n\njson_array_get() {\n local file=\"$1\"\n local field=\"$2\"\n local index=\"$3\"\n node -e \"\n const d = JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'));\n const v = d[process.argv[2]][Number(process.argv[3])];\n if (v === null || v === undefined) process.exit(1);\n process.stdout.write(String(v));\n \" \"$file\" \"$field\" \"$index\"\n}\n\njson_pipe() {\n local code=\"$1\"\n shift\n node -e \"\n const input = require('fs').readFileSync('/dev/stdin', 'utf8').trim();\n ${code}\n \" \"$@\"\n}\n\n# ============================================================\n# Manifest 创建/读取/校验\n# ============================================================\ncreate_manifest() {\n local output_file=\"$1\"\n local agent=\"$2\"\n local memory_system=\"$3\"\n local device=\"$4\"\n shift 4\n\n local files=(\"$@\")\n\n local normalized_device\n normalized_device=$(normalize_device \"$device\")\n local created_at\n created_at=$(date +\"%Y-%m-%dT%H:%M:%S\")\n\n node -e \"\n const fs = require('fs');\n const [outFile, ver, agent, ms, dev, ts, bt, ...files] = process.argv.slice(1);\n const obj = {\n version: ver,\n agent: agent,\n memorySystem: ms,\n device: dev,\n createdAt: ts,\n backupType: bt,\n lastBackupAt: ts,\n triggerCount: 1,\n files: files\n };\n fs.writeFileSync(outFile, JSON.stringify(obj, null, 2) + '\\n');\n \" \"$output_file\" \"2.0\" \"$agent\" \"$memory_system\" \"$normalized_device\" \"$created_at\" \"manual\" \"${files[@]}\"\n}\n\nread_manifest() {\n local json_file=\"$1\"\n\n if [ ! -f \"$json_file\" ]; then\n echo \"Invalid manifest: file not found: $json_file\" >&2\n return 1\n fi\n\n local raw\n raw=$(node -e \"\n const d = JSON.parse(require('fs').readFileSync(process.argv[1], 'utf8'));\n const f = (v) => v === undefined || v === null || v === '' ? '\\x01' : String(v);\n const fields = [\n f(d.version),\n f(d.agent || d.agentType),\n f(d.memorySystem || d.memoryPlugin),\n f(d.device),\n f(d.createdAt),\n d.backupType || 'manual'\n ];\n process.stdout.write(fields.join('\\n'));\n \" \"$json_file\") || { echo \"Invalid manifest: bad JSON\" >&2; return 1; }\n\n local -a _fields=()\n local _line\n while IFS= read -r _line; do\n _fields+=(\"$_line\")\n done \u003c\u003c\u003c \"$raw\"\n\n MANIFEST_VERSION=\"${_fields[0]:-}\"\n MANIFEST_AGENT=\"${_fields[1]:-}\"\n MANIFEST_MEMORY_SYSTEM=\"${_fields[2]:-}\"\n MANIFEST_DEVICE=\"${_fields[3]:-}\"\n MANIFEST_CREATED_AT=\"${_fields[4]:-}\"\n MANIFEST_BACKUP_TYPE=\"${_fields[5]:-}\"\n\n [[ \"$MANIFEST_VERSION\" ==

百度网盘存储 Skill 百度网盘文件管理工具,所有操作限制在 目录内。适配 Claude Code、DuClaw、OpenClaw 等。 使用注意事项详见 reference/notes.md 触发规则 网盘文件操作触发 同时满足以下条件才执行: 1. 用户明确提及"百度网盘"、"bdpan"、"网盘" 2. 操作意图明确(上传/下载/转存/分享/查看/搜索/移动/复制/重命名/创建文件夹/登录/注销) 未通过触发规则时,禁止执行任何 bdpan 命令。 上下文延续: 当前对话已在进行网盘操作时,后续消息无需再次提及"网盘"即可触发。 记忆备份/恢复触发 以下表达即使未提及"网盘"也应触发(仅限 kimiclaw/maxclaw/qclaw/openclaw 环境): | 用户说法示例 | 触发操作 | |------------|---------| | "备份记忆"、"备份我的记忆"、"把记忆存到网盘" | backup | | "查看记忆备份"、"有哪些备份"、"备份列表" | list | | "恢复记忆"、"还原记忆"、"回滚记忆"、"记忆回档" | restore(需确认日期) | | "恢复 3月16号 的记忆"、"恢复 2026-03-16 的备份" | restore 指定日期 | 以下情况不触发记忆备份/恢复: - "帮我记住…"、"整理记忆"、"清理记忆"…

\\x01' ]] && MANIFEST_VERSION=\"\"\n [[ \"$MANIFEST_AGENT\" ==

百度网盘存储 Skill 百度网盘文件管理工具,所有操作限制在 目录内。适配 Claude Code、DuClaw、OpenClaw 等。 使用注意事项详见 reference/notes.md 触发规则 网盘文件操作触发 同时满足以下条件才执行: 1. 用户明确提及"百度网盘"、"bdpan"、"网盘" 2. 操作意图明确(上传/下载/转存/分享/查看/搜索/移动/复制/重命名/创建文件夹/登录/注销) 未通过触发规则时,禁止执行任何 bdpan 命令。 上下文延续: 当前对话已在进行网盘操作时,后续消息无需再次提及"网盘"即可触发。 记忆备份/恢复触发 以下表达即使未提及"网盘"也应触发(仅限 kimiclaw/maxclaw/qclaw/openclaw 环境): | 用户说法示例 | 触发操作 | |------------|---------| | "备份记忆"、"备份我的记忆"、"把记忆存到网盘" | backup | | "查看记忆备份"、"有哪些备份"、"备份列表" | list | | "恢复记忆"、"还原记忆"、"回滚记忆"、"记忆回档" | restore(需确认日期) | | "恢复 3月16号 的记忆"、"恢复 2026-03-16 的备份" | restore 指定日期 | 以下情况不触发记忆备份/恢复: - "帮我记住…"、"整理记忆"、"清理记忆"…

\\x01' ]] && MANIFEST_AGENT=\"\"\n [[ \"$MANIFEST_MEMORY_SYSTEM\" ==

百度网盘存储 Skill 百度网盘文件管理工具,所有操作限制在 目录内。适配 Claude Code、DuClaw、OpenClaw 等。 使用注意事项详见 reference/notes.md 触发规则 网盘文件操作触发 同时满足以下条件才执行: 1. 用户明确提及"百度网盘"、"bdpan"、"网盘" 2. 操作意图明确(上传/下载/转存/分享/查看/搜索/移动/复制/重命名/创建文件夹/登录/注销) 未通过触发规则时,禁止执行任何 bdpan 命令。 上下文延续: 当前对话已在进行网盘操作时,后续消息无需再次提及"网盘"即可触发。 记忆备份/恢复触发 以下表达即使未提及"网盘"也应触发(仅限 kimiclaw/maxclaw/qclaw/openclaw 环境): | 用户说法示例 | 触发操作 | |------------|---------| | "备份记忆"、"备份我的记忆"、"把记忆存到网盘" | backup | | "查看记忆备份"、"有哪些备份"、"备份列表" | list | | "恢复记忆"、"还原记忆"、"回滚记忆"、"记忆回档" | restore(需确认日期) | | "恢复 3月16号 的记忆"、"恢复 2026-03-16 的备份" | restore 指定日期 | 以下情况不触发记忆备份/恢复: - "帮我记住…"、"整理记忆"、"清理记忆"…

\\x01' ]] && MANIFEST_MEMORY_SYSTEM=\"\"\n [[ \"$MANIFEST_DEVICE\" ==

百度网盘存储 Skill 百度网盘文件管理工具,所有操作限制在 目录内。适配 Claude Code、DuClaw、OpenClaw 等。 使用注意事项详见 reference/notes.md 触发规则 网盘文件操作触发 同时满足以下条件才执行: 1. 用户明确提及"百度网盘"、"bdpan"、"网盘" 2. 操作意图明确(上传/下载/转存/分享/查看/搜索/移动/复制/重命名/创建文件夹/登录/注销) 未通过触发规则时,禁止执行任何 bdpan 命令。 上下文延续: 当前对话已在进行网盘操作时,后续消息无需再次提及"网盘"即可触发。 记忆备份/恢复触发 以下表达即使未提及"网盘"也应触发(仅限 kimiclaw/maxclaw/qclaw/openclaw 环境): | 用户说法示例 | 触发操作 | |------------|---------| | "备份记忆"、"备份我的记忆"、"把记忆存到网盘" | backup | | "查看记忆备份"、"有哪些备份"、"备份列表" | list | | "恢复记忆"、"还原记忆"、"回滚记忆"、"记忆回档" | restore(需确认日期) | | "恢复 3月16号 的记忆"、"恢复 2026-03-16 的备份" | restore 指定日期 | 以下情况不触发记忆备份/恢复: - "帮我记住…"、"整理记忆"、"清理记忆"…

\\x01' ]] && MANIFEST_DEVICE=\"\"\n [[ \"$MANIFEST_CREATED_AT\" ==

百度网盘存储 Skill 百度网盘文件管理工具,所有操作限制在 目录内。适配 Claude Code、DuClaw、OpenClaw 等。 使用注意事项详见 reference/notes.md 触发规则 网盘文件操作触发 同时满足以下条件才执行: 1. 用户明确提及"百度网盘"、"bdpan"、"网盘" 2. 操作意图明确(上传/下载/转存/分享/查看/搜索/移动/复制/重命名/创建文件夹/登录/注销) 未通过触发规则时,禁止执行任何 bdpan 命令。 上下文延续: 当前对话已在进行网盘操作时,后续消息无需再次提及"网盘"即可触发。 记忆备份/恢复触发 以下表达即使未提及"网盘"也应触发(仅限 kimiclaw/maxclaw/qclaw/openclaw 环境): | 用户说法示例 | 触发操作 | |------------|---------| | "备份记忆"、"备份我的记忆"、"把记忆存到网盘" | backup | | "查看记忆备份"、"有哪些备份"、"备份列表" | list | | "恢复记忆"、"还原记忆"、"回滚记忆"、"记忆回档" | restore(需确认日期) | | "恢复 3月16号 的记忆"、"恢复 2026-03-16 的备份" | restore 指定日期 | 以下情况不触发记忆备份/恢复: - "帮我记住…"、"整理记忆"、"清理记忆"…

\\x01' ]] && MANIFEST_CREATED_AT=\"\"\n\n for field in MANIFEST_VERSION MANIFEST_AGENT MANIFEST_MEMORY_SYSTEM MANIFEST_DEVICE MANIFEST_CREATED_AT; do\n if [ -z \"${!field}\" ]; then\n local fname=\"${field#MANIFEST_}\"\n echo \"Invalid manifest: missing or invalid field \\\"${fname,,}\\\"\" >&2\n return 1\n fi\n done\n\n # 读取文件列表\n MANIFEST_FILES=()\n local file_count\n file_count=$(json_array_length \"$json_file\" \"files\" 2>/dev/null)\n if [ -z \"$file_count\" ] || ! [[ \"$file_count\" =~ ^[0-9]+$ ]]; then\n echo 'Invalid manifest: missing or invalid field \"files\"' >&2\n return 1\n fi\n\n local i\n for ((i = 0; i \u003c file_count; i++)); do\n local fp\n fp=$(json_array_get \"$json_file\" \"files\" \"$i\")\n if [ -z \"$fp\" ] || [ \"$fp\" = \"null\" ]; then\n echo 'Invalid manifest: \"files\" array must contain only strings' >&2\n return 1\n fi\n _validate_file_path \"$fp\" || return 1\n MANIFEST_FILES+=(\"$fp\")\n done\n}\n\n_validate_file_path() {\n local fp=\"$1\"\n if [[ \"$fp\" == /* ]]; then\n echo \"Invalid manifest: absolute file path not allowed: \\\"$fp\\\"\" >&2\n return 1\n fi\n if [[ \"$fp\" == ../* ]] || [[ \"$fp\" == */../* ]] || [[ \"$fp\" == */.. ]] || [[ \"$fp\" == \"..\" ]]; then\n echo \"Invalid manifest: path traversal not allowed: \\\"$fp\\\"\" >&2\n return 1\n fi\n}\n\nvalidate_compatibility() {\n local manifest_file=\"$1\"\n local current_agent=\"$2\"\n local current_ms=\"$3\"\n\n read_manifest \"$manifest_file\" || return 1\n\n local warnings=()\n if [ \"$MANIFEST_AGENT\" != \"$current_agent\" ]; then\n warnings+=(\"Agent mismatch: backup is \\\"$MANIFEST_AGENT\\\", current is \\\"$current_agent\\\"\")\n fi\n if [ \"$MANIFEST_MEMORY_SYSTEM\" != \"$current_ms\" ]; then\n warnings+=(\"Memory system mismatch: backup is \\\"$MANIFEST_MEMORY_SYSTEM\\\", current is \\\"$current_ms\\\"\")\n fi\n\n if [ ${#warnings[@]} -gt 0 ]; then\n printf '%s\\n' \"${warnings[@]}\"\n return 1\n fi\n return 0\n}\n\n# ============================================================\n# bdpan CLI 封装\n# ============================================================\n_bdpan_is_installed() {\n command -v bdpan &>/dev/null\n}\n\n_bdpan_whoami() {\n local raw\n raw=$(bdpan whoami --json 2>/dev/null) || { echo \"loggedIn=false\"; return; }\n local authenticated\n authenticated=$(echo \"$raw\" | node -e \"\n let d = ''; process.stdin.on('data', c => d += c);\n process.stdin.on('end', () => {\n try {\n const obj = JSON.parse(d);\n process.stdout.write(obj.authenticated === true ? 'true' : 'false');\n } catch(e) {\n process.stdout.write(d.includes('已登录') ? 'true' : 'false');\n }\n });\n \" 2>/dev/null) || authenticated=\"false\"\n if [ \"$authenticated\" = \"true\" ]; then\n echo \"loggedIn=true\"\n else\n echo \"loggedIn=false\"\n fi\n}\n\n_bdpan_ls() {\n local remote_path=\"$1\"\n local raw\n raw=$(bdpan ls \"$remote_path\" --json 2>/dev/null) || return 1\n echo \"$raw\" | json_pipe \"\n if (!input) process.exit(0);\n let d; try { d = JSON.parse(input); } catch(e) { process.exit(0); }\n if (!Array.isArray(d)) process.exit(0);\n for (const item of d) {\n const obj = {\n name: item.server_filename,\n isDir: (item.isdir === true || item.isdir === 1) ? 1 : 0,\n size: item.size\n };\n process.stdout.write(JSON.stringify(obj) + '\\n');\n }\n \"\n}\n\n_bdpan_upload() {\n local local_path=\"$1\"\n local remote_path=\"$2\"\n bdpan upload \"$local_path\" \"$remote_path\" 2>&1\n}\n\n_bdpan_download() {\n local remote_path=\"$1\"\n local local_path=\"$2\"\n if command -v timeout &>/dev/null; then\n timeout 120 bdpan download \"$remote_path\" \"$local_path\" 2>&1\n elif command -v gtimeout &>/dev/null; then\n gtimeout 120 bdpan download \"$remote_path\" \"$local_path\" 2>&1\n else\n bdpan download \"$remote_path\" \"$local_path\" 2>&1\n fi\n}\n\n# ============================================================\n# 前置检查(复用现有 install.sh / login.sh)\n# ============================================================\ncheck_prerequisites() {\n # 1. 检查 Node.js\n if ! command -v node &>/dev/null; then\n echo \"缺少 Node.js 运行时,请先安装 Node.js:https://nodejs.org/\" >&2\n exit 1\n fi\n\n # 2. 检查 bdpan 安装\n if ! _bdpan_is_installed; then\n local skill_dir\n skill_dir=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")/..\" && pwd)\"\n local install_script=\"${skill_dir}/scripts/install.sh\"\n if [ -f \"$install_script\" ]; then\n echo \"未检测到 bdpan CLI,正在调用安装脚本...\"\n bash \"$install_script\" || {\n echo \"bdpan CLI 安装失败,请手动安装。\" >&2\n exit 1\n }\n else\n echo \"未检测到 bdpan CLI,请先安装:bash \\${CLAUDE_SKILL_DIR}/scripts/install.sh\" >&2\n exit 1\n fi\n if ! _bdpan_is_installed; then\n echo \"bdpan CLI 安装后仍未找到,请检查 PATH 配置。\" >&2\n exit 1\n fi\n echo \"bdpan CLI 安装成功!\"\n fi\n\n # 3. 检查登录状态\n local whoami_result\n whoami_result=$(_bdpan_whoami)\n if [[ \"$whoami_result\" != loggedIn=true* ]]; then\n local skill_dir\n skill_dir=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")/..\" && pwd)\"\n local login_script=\"${skill_dir}/scripts/login.sh\"\n if [ -f \"$login_script\" ]; then\n echo \"请先登录百度网盘:\"\n bash \"$login_script\"\n else\n echo \"请先登录百度网盘:bash \\${CLAUDE_SKILL_DIR}/scripts/login.sh\" >&2\n exit 1\n fi\n fi\n}\n\n# ============================================================\n# 文件合并(restore 时将下载的文件写入本地)\n# ============================================================\napply_merge() {\n local tmp_dir=\"$1\"\n\n mkdir -p \"$MEMORY_DIR\" \"$WORKSPACE_DIR\"\n\n # 构建 workspace 文件集合用于快速查找\n local ws_set=\"|\"\n for wf in \"${WORKSPACE_FILES[@]}\"; do\n ws_set=\"${ws_set}${wf}|\"\n done\n\n for file in \"${MANIFEST_FILES[@]}\"; do\n local src=\"$tmp_dir/$file\"\n [ -f \"$src\" ] || continue\n\n local dest_path allowed_base\n\n if [[ \"$ws_set\" == *\"|${file}|\"* ]]; then\n dest_path=\"$WORKSPACE_DIR/$file\"\n allowed_base=\"$WORKSPACE_DIR\"\n elif [[ \"$file\" == memory/* ]]; then\n dest_path=\"$MEMORY_DIR/${file#memory/}\"\n allowed_base=\"$MEMORY_DIR\"\n else\n dest_path=\"$WORKSPACE_DIR/$file\"\n allowed_base=\"$WORKSPACE_DIR\"\n fi\n\n # 路径遍历防护:解析真实路径检查\n local resolved_dest resolved_base\n mkdir -p \"$(dirname \"$dest_path\")\"\n resolved_dest=$(cd \"$(dirname \"$dest_path\")\" && pwd)/$(basename \"$dest_path\")\n resolved_base=$(cd \"$allowed_base\" && pwd)\n\n if [[ \"$resolved_dest\" != \"$resolved_base\"* ]]; then\n echo \"Path traversal detected: \\\"$file\\\" resolves outside allowed directory\" >&2\n continue\n fi\n\n cp \"$src\" \"$dest_path\"\n done\n}\n\n# ============================================================\n# backup 命令\n# ============================================================\ncmd_backup() {\n check_prerequisites\n\n local device\n device=$(get_device_name)\n local timestamp\n timestamp=$(date +\"%Y-%m-%dT%H-%M-%S\")\n\n _BACKUP_TMP_DIR=$(mktemp -d \"${TMPDIR:-/tmp}/memory-backup-XXXXXX\")\n local tmp_dir=\"$_BACKUP_TMP_DIR\"\n\n local files=()\n\n # 1. 复制 memory/*.md\n if [ -d \"$MEMORY_DIR\" ]; then\n mkdir -p \"$tmp_dir/memory\"\n for f in \"$MEMORY_DIR\"/*.md; do\n [ -f \"$f\" ] || continue\n cp \"$f\" \"$tmp_dir/memory/\"\n files+=(\"memory/$(basename \"$f\")\")\n done\n fi\n\n # 2. 复制 workspace 文件\n for wf in \"${WORKSPACE_FILES[@]}\"; do\n local src=\"$WORKSPACE_DIR/$wf\"\n if [ -f \"$src\" ]; then\n cp \"$src\" \"$tmp_dir/$wf\"\n files+=(\"$wf\")\n fi\n done\n\n if [ ${#files[@]} -eq 0 ]; then\n echo \"警告:未找到任何记忆文件,请检查路径:$WORKSPACE_DIR\" >&2\n exit 1\n fi\n\n # 3. 生成 manifest\n create_manifest \"$tmp_dir/manifest.json\" \"$AGENT_NAME\" \"$MEMORY_SYSTEM_NAME\" \"$device\" \"${files[@]}\"\n\n # 4. 上传(记忆文件每次新目录,直接用 bdpan upload)\n local remote_path\n remote_path=$(build_backup_path \"$AGENT_NAME\" \"$(normalize_device \"$device\")\" \"manual\" \"$timestamp\")\n\n local all_files=(\"manifest.json\" \"${files[@]}\")\n local total=${#all_files[@]}\n\n echo \"开始备份,共 ${total} 个文件...\"\n\n local i\n local failed_files=()\n for ((i = 0; i \u003c total; i++)); do\n local file=\"${all_files[$i]}\"\n local local_file=\"$tmp_dir/$file\"\n local remote_file=\"$remote_path/$file\"\n\n # 确保远端目录存在(处理 memory/ 子目录)\n bdpan mkdir \"$(dirname \"$remote_file\")\" 2>/dev/null || true\n\n if ! _bdpan_upload \"$local_file\" \"$remote_file\" >/dev/null; then\n failed_files+=(\"$file\")\n fi\n done\n\n echo \"\"\n if [ ${#failed_files[@]} -gt 0 ]; then\n echo \"备份完成(${#failed_files[@]} 个文件上传失败)\"\n for ff in \"${failed_files[@]}\"; do\n echo \" - $ff\"\n done\n else\n echo \"备份完成\"\n fi\n echo \"文件数: ${total} 个\"\n echo \"位置: $(to_user_path \"${remote_path}\")/\"\n}\n\n# ============================================================\n# list 命令\n# ============================================================\ncmd_list() {\n check_prerequisites\n\n local device\n device=$(get_device_name)\n local base_path\n base_path=$(build_base_path \"$AGENT_NAME\" \"$(normalize_device \"$device\")\")\n\n # 列出 manual/ 子目录下的备份\n local rows=()\n local remote_path=\"${base_path}/manual/\"\n local entries\n entries=$(_bdpan_ls \"$remote_path\" 2>/dev/null) || true\n\n if [ -n \"$entries\" ]; then\n local dirs\n dirs=$(echo \"$entries\" | json_pipe \"\n if (!input) process.exit(0);\n for (const line of input.split('\\n')) {\n if (!line) continue;\n try {\n const d = JSON.parse(line);\n if (d.isDir === 1) process.stdout.write(d.name + '\\n');\n } catch(e) {}\n }\n \" 2>/dev/null) || true\n\n if [ -n \"$dirs\" ]; then\n while IFS= read -r dir_name; do\n rows+=(\"${dir_name}|manual\")\n done \u003c\u003c\u003c \"$dirs\"\n fi\n fi\n\n if [ ${#rows[@]} -eq 0 ]; then\n echo \"暂无备份记录\"\n return\n fi\n\n # 按时间戳降序排序\n local sorted_rows\n sorted_rows=$(printf '%s\\n' \"${rows[@]}\" | sort -t'|' -k1 -r)\n\n echo \"\"\n echo \"可用备份列表(设备: ${device},路径: $(to_user_path \"${base_path}\"))\"\n echo \"\"\n printf '%-3s %-22s %-8s %s\\n' \"#\" \"日期\" \"类型\" \"路径\"\n echo \"--- ---------------------- -------- -----\"\n\n local idx=1\n while IFS= read -r row; do\n local date btype\n IFS='|' read -r date btype \u003c\u003c\u003c \"$row\"\n printf '%-3d %-22s %-8s %s\\n' \"$idx\" \"$date\" \"$btype\" \"$(to_user_path \"${base_path}/${btype}/${date}/\")\"\n ((idx++))\n done \u003c\u003c\u003c \"$sorted_rows\"\n\n echo \"\"\n echo \"共 $(echo \"$sorted_rows\" | wc -l | tr -d ' ') 个备份\"\n}\n\n# ============================================================\n# restore 命令\n# ============================================================\ncmd_restore() {\n local date_pattern=\"$1\"\n local force=\"${2:-false}\"\n\n check_prerequisites\n\n local device\n device=$(get_device_name)\n local base_path\n base_path=$(build_base_path \"$AGENT_NAME\" \"$(normalize_device \"$device\")\")\n\n # 在 manual/ 子目录下搜索匹配的备份\n local all_matches=()\n local remote_path=\"${base_path}/manual/\"\n local entries\n entries=$(_bdpan_ls \"$remote_path\" 2>/dev/null) || true\n\n if [ -n \"$entries\" ]; then\n local dirs\n dirs=$(echo \"$entries\" | json_pipe \"\n if (!input) process.exit(0);\n for (const line of input.split('\\n')) {\n if (!line) continue;\n try {\n const d = JSON.parse(line);\n if (d.isDir === 1) process.stdout.write(d.name + '\\n');\n } catch(e) {}\n }\n \" 2>/dev/null | grep \"$date_pattern\" 2>/dev/null || true)\n\n if [ -n \"$dirs\" ]; then\n while IFS= read -r dir_name; do\n all_matches+=(\"manual|${dir_name}\")\n done \u003c\u003c\u003c \"$dirs\"\n fi\n fi\n\n if [ ${#all_matches[@]} -eq 0 ]; then\n echo \"未找到匹配 \\\"$date_pattern\\\" 的备份\" >&2\n exit 1\n fi\n\n if [ ${#all_matches[@]} -gt 1 ]; then\n echo \"找到多个匹配 \\\"$date_pattern\\\" 的备份,请更精确地指定日期:\" >&2\n for m in \"${all_matches[@]}\"; do\n local mtype mname\n IFS='|' read -r mtype mname \u003c\u003c\u003c \"$m\"\n echo \" - $mname ($mtype)\" >&2\n done\n exit 1\n fi\n\n local matched=\"${all_matches[0]}\"\n local matched_type matched_name\n IFS='|' read -r matched_type matched_name \u003c\u003c\u003c \"$matched\"\n local backup_remote=\"${base_path}/${matched_type}/${matched_name}/\"\n\n _RESTORE_TMP_DIR=$(mktemp -d \"${TMPDIR:-/tmp}/memory-restore-XXXXXX\")\n local tmp_dir=\"$_RESTORE_TMP_DIR\"\n\n # 下载 manifest\n echo \"正在获取备份信息...\"\n local manifest_tmp=\"$tmp_dir/manifest.json\"\n _bdpan_download \"${backup_remote}manifest.json\" \"$manifest_tmp\" >/dev/null 2>&1 || {\n echo \"无法下载 manifest.json,请检查备份路径是否正确。\" >&2\n exit 1\n }\n\n read_manifest \"$manifest_tmp\" || { echo \"Invalid manifest\" >&2; exit 1; }\n\n # 兼容性检查\n local compat_warnings\n if ! compat_warnings=$(validate_compatibility \"$manifest_tmp\" \"$AGENT_NAME\" \"$MEMORY_SYSTEM_NAME\" 2>/dev/null); then\n if [ \"$force\" != \"true\" ]; then\n if echo \"$compat_warnings\" | grep -q \"Agent mismatch\"; then\n echo \"兼容性警告:备份来自 \\\"$MANIFEST_AGENT\\\",当前环境是 \\\"$AGENT_NAME\\\"\" >&2\n echo \"不同 Agent 类型的记忆文件可能存在兼容性问题\" >&2\n else\n echo \"兼容性校验失败:\" >&2\n while IFS= read -r w; do\n echo \" $w\" >&2\n done \u003c\u003c\u003c \"$compat_warnings\"\n fi\n echo \"\" >&2\n echo \"使用 --force 跳过此警告并强制恢复\" >&2\n exit 1\n else\n echo \"兼容性警告(已通过 --force 跳过):\"\n while IFS= read -r w; do\n echo \" $w\"\n done \u003c\u003c\u003c \"$compat_warnings\"\n fi\n fi\n\n # Safety net: 恢复前备份当前本地记忆\n local safety_timestamp\n safety_timestamp=$(date +\"%Y-%m-%dT%H-%M-%S\")\n local safety_dir=\"$WORKSPACE_DIR/.backup-before-restore/$safety_timestamp\"\n mkdir -p \"$safety_dir\"\n\n if [ -d \"$MEMORY_DIR\" ]; then\n cp -r \"$MEMORY_DIR\" \"$safety_dir/memory\" 2>/dev/null || true\n fi\n\n for wf in \"${WORKSPACE_FILES[@]}\"; do\n local wp=\"$WORKSPACE_DIR/$wf\"\n if [ -f \"$wp\" ]; then\n cp \"$wp\" \"$safety_dir/$wf\" 2>/dev/null || true\n fi\n done\n\n echo \"已备份当前记忆到 $safety_dir\"\n\n # 下载所有备份文件\n local total=${#MANIFEST_FILES[@]}\n echo \"\"\n echo \"开始恢复,共 ${total} 个文件...\"\n\n local i\n local failed_files=()\n for ((i = 0; i \u003c total; i++)); do\n local file=\"${MANIFEST_FILES[$i]}\"\n local local_tmp=\"$tmp_dir/$file\"\n mkdir -p \"$(dirname \"$local_tmp\")\"\n if ! _bdpan_download \"${backup_remote}${file}\" \"$local_tmp\" >/dev/null 2>&1; then\n failed_files+=(\"$file\")\n fi\n done\n\n # 合并文件到本地\n apply_merge \"$tmp_dir\"\n\n echo \"\"\n if [ ${#failed_files[@]} -gt 0 ]; then\n echo \"恢复完成(${#failed_files[@]} 个文件下载失败)\"\n for ff in \"${failed_files[@]}\"; do\n echo \" - $ff\"\n done\n else\n echo \"恢复完成\"\n fi\n echo \"备份来源: $(to_user_path \"${backup_remote}\")\"\n echo \"文件数: ${total} 个\"\n echo \"恢复前备份: $safety_dir\"\n}\n\n# ============================================================\n# 帮助信息\n# ============================================================\nusage() {\n echo \"Usage: memory-backup.sh \u003ccommand> [options]\"\n echo \"\"\n echo \"Agent 记忆备份/恢复到百度网盘\"\n echo \"支持的 Agent:kimiclaw、maxclaw、qclaw、openclaw(自动检测)\"\n echo \"\"\n echo \"Commands:\"\n echo \" backup 备份当前 Agent 记忆到百度网盘\"\n echo \" list 列出网盘上所有可用的记忆备份\"\n echo \" restore \u003cdate> [--force] 从百度网盘恢复指定日期的记忆(支持模糊匹配)\"\n echo \" help 显示帮助信息\"\n echo \"\"\n echo \"Examples:\"\n echo \" bash memory-backup.sh backup\"\n echo \" bash memory-backup.sh list\"\n echo \" bash memory-backup.sh restore 2026-03-16\"\n echo \" bash memory-backup.sh restore 2026-03 --force\"\n}\n\n# ============================================================\n# 主入口\n# ============================================================\nmain() {\n if [ $# -eq 0 ]; then\n usage\n exit 0\n fi\n\n case \"$1\" in\n -V|--version)\n echo \"$SCRIPT_VERSION\"\n ;;\n -h|--help|help)\n usage\n ;;\n backup)\n detect_agent || {\n echo \"不支持当前的 Agent 环境。\" >&2\n echo \"支持的 Agent 类型:kimiclaw、maxclaw、qclaw、openclaw\" >&2\n exit 1\n }\n cmd_backup\n ;;\n list)\n detect_agent || {\n echo \"不支持当前的 Agent 环境。\" >&2\n echo \"支持的 Agent 类型:kimiclaw、maxclaw、qclaw、openclaw\" >&2\n exit 1\n }\n cmd_list\n ;;\n restore)\n shift\n detect_agent || {\n echo \"不支持当前的 Agent 环境。\" >&2\n echo \"支持的 Agent 类型:kimiclaw、maxclaw、qclaw、openclaw\" >&2\n exit 1\n }\n local force=\"false\"\n local date_arg=\"\"\n while [ $# -gt 0 ]; do\n case \"$1\" in\n --force|-f) force=\"true\"; shift ;;\n -*) echo \"未知选项: $1\" >&2; exit 1 ;;\n *) date_arg=\"$1\"; shift ;;\n esac\n done\n if [ -z \"$date_arg\" ]; then\n echo \"用法: memory-backup.sh restore \u003cdate> [--force]\" >&2\n echo \"示例: memory-backup.sh restore 2026-03-16\" >&2\n exit 1\n fi\n cmd_restore \"$date_arg\" \"$force\"\n ;;\n *)\n echo \"未知命令: $1\" >&2\n usage\n exit 1\n ;;\n esac\n}\n\nif [[ \"${BASH_SOURCE[0]}\" == \"${0}\" ]]; then\n main \"$@\"\nfi\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":25075,"content_sha256":"c8a0a9db61feb8d575a617df1d7b18cb6867ca9a6e1600f55af51474bd453ece"},{"filename":"scripts/uninstall.sh","content":"#!/bin/bash\n# bdpan CLI 卸载脚本\n# 清除 bdpan 二进制文件、配置文件和授权信息\n\nset -e\n\n# 颜色输出\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nNC='\\033[0m' # No Color\n\n# 默认路径\nDEFAULT_INSTALL_DIR=\"$HOME/.local/bin\"\nDEFAULT_CONFIG_DIR=\"$HOME/.config/bdpan\"\n\n# 解析参数\nSKIP_CONFIRM=\"no\"\nwhile [[ $# -gt 0 ]]; do\n case $1 in\n --yes|-y)\n SKIP_CONFIRM=\"yes\"\n shift\n ;;\n --help|-h)\n echo \"用法: $0 [选项]\"\n echo \"\"\n echo \"选项:\"\n echo \" --yes, -y 跳过确认提示(自动化场景)\"\n echo \" --help 显示帮助信息\"\n echo \"\"\n echo \"环境变量:\"\n echo \" BDPAN_INSTALL_DIR 二进制安装目录(默认: ~/.local/bin)\"\n echo \" BDPAN_CONFIG_DIR 配置文件目录(默认: ~/.config/bdpan)\"\n exit 0\n ;;\n *)\n shift\n ;;\n esac\ndone\n\nlog_info() {\n echo -e \"${GREEN}[INFO]${NC} $1\"\n}\n\nlog_warn() {\n echo -e \"${YELLOW}[WARN]${NC} $1\"\n}\n\nlog_error() {\n echo -e \"${RED}[ERROR]${NC} $1\"\n}\n\n# 确定实际路径\nINSTALL_DIR=\"${BDPAN_INSTALL_DIR:-$DEFAULT_INSTALL_DIR}\"\nCONFIG_DIR=\"${BDPAN_CONFIG_DIR:-$DEFAULT_CONFIG_DIR}\"\nBINARY_PATH=\"${INSTALL_DIR}/bdpan\"\n\n# 检测要清理的内容\necho \"\"\necho -e \"${YELLOW}========================================${NC}\"\necho -e \"${YELLOW} bdpan CLI 卸载${NC}\"\necho -e \"${YELLOW}========================================${NC}\"\necho \"\"\n\nfound_items=0\n\n# 检查二进制文件\nif [ -f \"$BINARY_PATH\" ]; then\n binary_version=$(\"$BINARY_PATH\" version 2>/dev/null | head -1 || echo \"unknown\")\n echo -e \" 二进制文件: ${GREEN}${BINARY_PATH}${NC} (${binary_version})\"\n found_items=$((found_items + 1))\nelse\n # 尝试 which 查找\n actual_path=$(command -v bdpan 2>/dev/null || echo \"\")\n if [ -n \"$actual_path\" ]; then\n BINARY_PATH=\"$actual_path\"\n binary_version=$(\"$BINARY_PATH\" version 2>/dev/null | head -1 || echo \"unknown\")\n echo -e \" 二进制文件: ${GREEN}${BINARY_PATH}${NC} (${binary_version})\"\n found_items=$((found_items + 1))\n else\n echo -e \" 二进制文件: ${YELLOW}未找到${NC}\"\n fi\nfi\n\n# 检查配置目录\nif [ -d \"$CONFIG_DIR\" ]; then\n config_files=$(find \"$CONFIG_DIR\" -type f 2>/dev/null | wc -l | tr -d ' ')\n echo -e \" 配置目录: ${GREEN}${CONFIG_DIR}/${NC} (${config_files} 个文件)\"\n found_items=$((found_items + 1))\n\n # 检查是否有活跃的登录态\n if [ -f \"${CONFIG_DIR}/config.json\" ]; then\n if command -v bdpan &> /dev/null && bdpan whoami 2>/dev/null | grep -q \"已登录\"; then\n echo -e \" 登录状态: ${RED}已登录(将清除授权信息)${NC}\"\n fi\n fi\nelse\n echo -e \" 配置目录: ${YELLOW}未找到${NC}\"\nfi\n\necho \"\"\n\n# 无内容可清理\nif [ \"$found_items\" -eq 0 ]; then\n log_info \"未检测到 bdpan 安装,无需卸载\"\n exit 0\nfi\n\n# 用户确认\nif [ \"$SKIP_CONFIRM\" != \"yes\" ]; then\n echo -e \"${RED}以上内容将被永久删除,此操作不可逆!${NC}\"\n echo \"\"\n echo -n -e \"${YELLOW}确认卸载 bdpan CLI? [y/N] ${NC}\"\n read -n 1 -r\n echo\n if [[ ! $REPLY =~ ^[Yy]$ ]]; then\n log_info \"已取消卸载\"\n exit 0\n fi\nfi\n\necho \"\"\n\n# 1. 注销登录(清除服务端 session,如有)\nif command -v bdpan &> /dev/null && bdpan whoami 2>/dev/null | grep -q \"已登录\"; then\n log_info \"正在注销登录...\"\n bdpan logout 2>/dev/null || true\n log_info \"✓ 已注销登录\"\nfi\n\n# 2. 删除配置目录(含 token、config.json 等)\nif [ -d \"$CONFIG_DIR\" ]; then\n log_info \"正在删除配置目录: ${CONFIG_DIR}/\"\n rm -rf \"$CONFIG_DIR\"\n log_info \"✓ 配置目录已删除\"\nfi\n\n# 3. 删除二进制文件\nif [ -f \"$BINARY_PATH\" ]; then\n log_info \"正在删除二进制文件: ${BINARY_PATH}\"\n rm -f \"$BINARY_PATH\"\n log_info \"✓ 二进制文件已删除\"\nfi\n\necho \"\"\necho -e \"${GREEN}========================================${NC}\"\necho -e \"${GREEN} ✓ bdpan CLI 已完全卸载${NC}\"\necho -e \"${GREEN}========================================${NC}\"\necho \"\"\necho \"已清理:\"\necho \" - 二进制文件 (bdpan)\"\necho \" - 配置文件和授权信息 (~/.config/bdpan/)\"\necho \"\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":4349,"content_sha256":"7620f20eff6b9920bf8c82bde65e791e7eee6ae9604702b80bab780e26e8c52c"},{"filename":"scripts/update.sh","content":"#!/bin/bash\n# baidu drive Skill 自动更新脚本\n# 通过百度配置接口检测并更新 Skill 文件\n# CLI 更新由 bdpan 自身管理,本脚本不负责\n\nset -e\n\n# 颜色输出\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nBLUE='\\033[0;34m'\nNC='\\033[0m' # No Color\n\nCONFIG_API=\"https://pan.baidu.com/act/v2/api/conf?conf_key=bd_skills\"\n\n# 脚本所在目录(用于定位 Skill 文件)\nSCRIPT_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nSKILL_DIR=\"$(cd \"$SCRIPT_DIR/..\" && pwd)\"\nVERSION_FILE=\"${SKILL_DIR}/VERSION\"\n\nlog_info() {\n echo -e \"${GREEN}[INFO]${NC} $1\"\n}\n\nlog_warn() {\n echo -e \"${YELLOW}[WARN]${NC} $1\"\n}\n\nlog_error() {\n echo -e \"${RED}[ERROR]${NC} $1\"\n}\n\n# 版本比较:返回 0 表示 $1 > $2,1 表示 $1 = $2,2 表示 $1 \u003c $2\nversion_compare() {\n if [ \"$1\" = \"$2\" ]; then\n return 1\n fi\n local IFS=.\n local i ver1=($1) ver2=($2)\n for ((i=${#ver1[@]}; i\u003c${#ver2[@]}; i++)); do\n ver1[i]=0\n done\n for ((i=0; i\u003c${#ver1[@]}; i++)); do\n if [ -z \"${ver2[i]}\" ]; then\n ver2[i]=0\n fi\n if ((10#${ver1[i]} > 10#${ver2[i]})); then\n return 0\n fi\n if ((10#${ver1[i]} \u003c 10#${ver2[i]})); then\n return 2\n fi\n done\n return 1\n}\n\n# 去除版本号的 v 前缀(如 v1.2.0 → 1.2.0)\nstrip_v_prefix() {\n echo \"$1\" | sed 's/^v//'\n}\n\n# 获取本地 Skill 版本\nget_local_version() {\n if [ -f \"$VERSION_FILE\" ]; then\n local raw=$(cat \"$VERSION_FILE\" | tr -d '[:space:]')\n strip_v_prefix \"$raw\"\n else\n echo \"unknown\"\n fi\n}\n\n# 从 query string 中提取指定 key 的值\n# 用法: query_get \"version=1.1.2&url=https://...\" \"version\"\nquery_get() {\n local qs=\"$1\"\n local key=\"$2\"\n echo \"$qs\" | tr '&' '\\n' | while IFS='=' read -r k v; do\n if [ \"$k\" = \"$key\" ]; then\n echo \"$v\"\n return 0\n fi\n done\n}\n\n# 请求配置接口,返回 skills_info query string\nfetch_skills_info() {\n local response=\"\"\n\n if command -v curl &> /dev/null; then\n response=$(curl -fsSL --connect-timeout 10 --max-time 30 \"$CONFIG_API\" 2>/dev/null) || {\n log_error \"无法连接配置服务器,请检查网络连接\"\n return 1\n }\n elif command -v wget &> /dev/null; then\n response=$(wget -qO- --timeout=30 \"$CONFIG_API\" 2>/dev/null) || {\n log_error \"无法连接配置服务器,请检查网络连接\"\n return 1\n }\n else\n log_error \"未找到 curl 或 wget\"\n return 1\n fi\n\n # 检查 errno:从 JSON 中提取 \"errno\": 0\n local errno=$(echo \"$response\" | grep -o '\"errno\"[[:space:]]*:[[:space:]]*[0-9]*' | head -1 | grep -o '[0-9]*

百度网盘存储 Skill 百度网盘文件管理工具,所有操作限制在 目录内。适配 Claude Code、DuClaw、OpenClaw 等。 使用注意事项详见 reference/notes.md 触发规则 网盘文件操作触发 同时满足以下条件才执行: 1. 用户明确提及"百度网盘"、"bdpan"、"网盘" 2. 操作意图明确(上传/下载/转存/分享/查看/搜索/移动/复制/重命名/创建文件夹/登录/注销) 未通过触发规则时,禁止执行任何 bdpan 命令。 上下文延续: 当前对话已在进行网盘操作时,后续消息无需再次提及"网盘"即可触发。 记忆备份/恢复触发 以下表达即使未提及"网盘"也应触发(仅限 kimiclaw/maxclaw/qclaw/openclaw 环境): | 用户说法示例 | 触发操作 | |------------|---------| | "备份记忆"、"备份我的记忆"、"把记忆存到网盘" | backup | | "查看记忆备份"、"有哪些备份"、"备份列表" | list | | "恢复记忆"、"还原记忆"、"回滚记忆"、"记忆回档" | restore(需确认日期) | | "恢复 3月16号 的记忆"、"恢复 2026-03-16 的备份" | restore 指定日期 | 以下情况不触发记忆备份/恢复: - "帮我记住…"、"整理记忆"、"清理记忆"…

)\n if [ \"$errno\" != \"0\" ]; then\n log_error \"配置接口返回错误 (errno: ${errno:-unknown})\"\n return 1\n fi\n\n # 从 response 中提取 skills_info 的值\n # API 返回中 & 可能被编码为 \\u0026,需要还原\n local skills_info=$(echo \"$response\" | sed 's/\\\\u0026/\\&/g' | grep -o 'version=[^\"]*' | head -1 | sed 's/\\\\//g')\n\n if [ -z \"$skills_info\" ]; then\n log_error \"未获取到版本配置信息\"\n return 1\n fi\n\n echo \"$skills_info\"\n}\n\n# 更新 Skill\ndo_update() {\n local remote_url=\"$1\"\n local remote_version=\"$2\"\n\n if [ -z \"$remote_url\" ]; then\n log_error \"未找到 Skill 下载地址\"\n return 1\n fi\n\n log_info \"正在下载 Skill 更新包 (v${remote_version})...\"\n log_info \"下载地址: ${remote_url}\"\n\n # 创建临时目录\n local tmp_dir=$(mktemp -d)\n trap \"rm -rf '$tmp_dir'\" EXIT\n\n # 下载 zip\n local zip_path=\"${tmp_dir}/baidu-drive.zip\"\n if command -v curl &> /dev/null; then\n curl -fsSL -o \"$zip_path\" \"$remote_url\" || {\n log_error \"下载 Skill 更新包失败\"\n return 1\n }\n elif command -v wget &> /dev/null; then\n wget -q -O \"$zip_path\" \"$remote_url\" || {\n log_error \"下载 Skill 更新包失败\"\n return 1\n }\n fi\n\n # SHA256 完整性校验(强制)\n local checksum=$(query_get \"$SKILLS_INFO\" \"checksum\")\n if [ -z \"$checksum\" ]; then\n log_error \"配置接口未提供 checksum,无法验证更新包完整性,拒绝更新\"\n return 1\n fi\n\n local actual=\"\"\n if command -v sha256sum &> /dev/null; then\n actual=$(sha256sum \"$zip_path\" | awk '{print $1}')\n elif command -v shasum &> /dev/null; then\n actual=$(shasum -a 256 \"$zip_path\" | awk '{print $1}')\n else\n log_error \"未找到 sha256sum/shasum 工具,无法验证更新包完整性\"\n return 1\n fi\n\n if [ \"$actual\" != \"$checksum\" ]; then\n log_error \"SHA256 校验失败!文件可能被篡改\"\n log_error \" 期望: ${checksum}\"\n log_error \" 实际: ${actual}\"\n return 1\n fi\n log_info \"SHA256 校验通过\"\n\n # 解压覆盖\n log_info \"正在解压更新...\"\n if command -v unzip &> /dev/null; then\n unzip -qo \"$zip_path\" -d \"$SKILL_DIR\" || {\n log_error \"解压失败\"\n return 1\n }\n else\n log_error \"未找到 unzip 工具\"\n return 1\n fi\n\n # 更新 VERSION 文件\n echo \"$remote_version\" > \"$VERSION_FILE\"\n\n log_info \"Skill 已更新到 v${remote_version}\"\n}\n\n# 全局变量\nSKILLS_INFO=\"\"\n\n# 主函数\nmain() {\n local check_only=\"no\"\n local auto_yes=\"no\"\n\n # 解析参数\n while [[ $# -gt 0 ]]; do\n case $1 in\n --check|-c)\n check_only=\"yes\"\n shift\n ;;\n --yes|-y)\n auto_yes=\"yes\"\n shift\n ;;\n --help|-h)\n echo \"用法: $0 [选项]\"\n echo \"\"\n echo \"选项:\"\n echo \" --check, -c 仅检查更新,不执行\"\n echo \" --yes, -y 跳过确认,自动更新\"\n echo \" --help 显示帮助信息\"\n exit 0\n ;;\n *)\n log_error \"未知参数: $1\"\n echo \"使用 --help 查看帮助信息\"\n exit 1\n ;;\n esac\n done\n\n # 获取本地版本\n local local_version=$(get_local_version)\n\n # 请求远程配置\n log_info \"正在检查更新...\"\n SKILLS_INFO=$(fetch_skills_info) || {\n log_warn \"无法获取更新信息,请稍后再试\"\n exit 1\n }\n\n # 解析远程版本和下载地址(strip v 前缀用于比较)\n local remote_version=$(query_get \"$SKILLS_INFO\" \"version\")\n local remote_version_clean=$(strip_v_prefix \"$remote_version\")\n local remote_url=$(query_get \"$SKILLS_INFO\" \"url\")\n\n if [ -z \"$remote_version\" ]; then\n log_error \"配置中未包含版本信息\"\n exit 1\n fi\n\n # 展示状态\n echo \"\"\n echo -e \"${BLUE}========================================${NC}\"\n echo -e \"${BLUE} baidu drive Skill 更新检查${NC}\"\n echo -e \"${BLUE}========================================${NC}\"\n echo \"\"\n echo -e \" 本地版本: ${local_version}\"\n echo -e \" 最新版本: ${remote_version}\"\n\n # 版本对比\n local needs_update=\"no\"\n if [ \"$local_version\" = \"unknown\" ]; then\n echo -e \" 状态: ${YELLOW}版本未知,建议更新${NC}\"\n needs_update=\"yes\"\n else\n set +e\n version_compare \"$remote_version_clean\" \"$local_version\"\n local cmp_result=$?\n set -e\n\n if [ $cmp_result -eq 0 ]; then\n echo -e \" 状态: ${YELLOW}有新版本可用${NC}\"\n needs_update=\"yes\"\n else\n echo -e \" 状态: ${GREEN}已是最新${NC}\"\n fi\n fi\n\n echo \"\"\n\n # 无更新\n if [ \"$needs_update\" = \"no\" ]; then\n log_info \"Skill 已是最新版本\"\n exit 0\n fi\n\n # 仅检查模式\n if [ \"$check_only\" = \"yes\" ]; then\n exit 0\n fi\n\n # 用户确认\n # 安全限制:Agent 环境中禁止使用 --yes 跳过确认\n if [ \"$auto_yes\" = \"yes\" ]; then\n if [ -n \"$CLAUDE_CODE\" ] || [ -n \"$ANTHROPIC_API_KEY\" ] || [ -n \"$MCP_SERVER\" ]; then\n log_warn \"检测到 Agent 环境,忽略 --yes 参数,保留用户确认环节\"\n auto_yes=\"no\"\n fi\n fi\n if [ \"$auto_yes\" != \"yes\" ]; then\n echo -n -e \"${YELLOW}是否更新 Skill 到 v${remote_version}? [y/N] ${NC}\"\n read -n 1 -r\n echo\n if [[ ! $REPLY =~ ^[Yy]$ ]]; then\n log_info \"已取消更新\"\n exit 0\n fi\n fi\n\n echo \"\"\n\n # 执行更新\n do_update \"$remote_url\" \"$remote_version\" || {\n log_error \"Skill 更新失败\"\n exit 1\n }\n\n echo \"\"\n echo -e \"${GREEN}========================================${NC}\"\n echo -e \"${GREEN} ✓ 更新完成${NC}\"\n echo -e \"${GREEN}========================================${NC}\"\n echo \"\"\n}\n\n# 执行主函数\nmain \"$@\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":8994,"content_sha256":"36103371fd41c576f59de5fce761765fb4a7ff9daccbd5f80d583153b338d824"},{"filename":"VERSION","content":"v1.6.0\n","content_type":"text/plain; charset=utf-8","language":null,"size":7,"content_sha256":"ff2e4b6f44b8dcf44c2cb561b5b968175eaace513d526b6effd1ce1ed9b29223"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"百度网盘存储 Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"百度网盘文件管理工具,所有操作限制在 ","type":"text"},{"text":"/apps/bdpan/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 目录内。适配 Claude Code、DuClaw、OpenClaw 等。","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"使用注意事项详见 ","type":"text"},{"text":"reference/notes.md","type":"text","marks":[{"type":"link","attrs":{"href":"./reference/notes.md","title":null}}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"触发规则","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"网盘文件操作触发","type":"text"}]},{"type":"paragraph","content":[{"text":"同时满足以下条件才执行:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户明确提及\"百度网盘\"、\"bdpan\"、\"网盘\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"操作意图明确(上传/下载/转存/分享/查看/搜索/移动/复制/重命名/创建文件夹/登录/注销)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"未通过触发规则时,禁止执行任何 bdpan 命令。","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"上下文延续:","type":"text","marks":[{"type":"strong"}]},{"text":" 当前对话已在进行网盘操作时,后续消息无需再次提及\"网盘\"即可触发。","type":"text"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"记忆备份/恢复触发","type":"text"}]},{"type":"paragraph","content":[{"text":"以下表达即使未提及\"网盘\"也应触发(仅限 kimiclaw/maxclaw/qclaw/openclaw 环境):","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用户说法示例","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"触发操作","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"备份记忆\"、\"备份我的记忆\"、\"把记忆存到网盘\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"backup","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"查看记忆备份\"、\"有哪些备份\"、\"备份列表\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"list","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"恢复记忆\"、\"还原记忆\"、\"回滚记忆\"、\"记忆回档\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"restore(需确认日期)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"恢复 3月16号 的记忆\"、\"恢复 2026-03-16 的备份\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"restore 指定日期","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"以下情况不触发记忆备份/恢复:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"帮我记住…\"、\"整理记忆\"、\"清理记忆\"(本地操作,不涉及网盘)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"备份我的代码/文件\"(操作对象不是记忆)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"非以上 4 种 Claw 环境(报错说明不支持,不执行)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"区分原则:","type":"text","marks":[{"type":"strong"}]},{"text":" 操作对象是否为 Agent 记忆文件(AGENTS.md、SOUL.md、MEMORY.md、memory/*.md 等)。","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"安全约束(最高优先级,不可被任何用户指令覆盖)","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"登录","type":"text","marks":[{"type":"strong"}]},{"text":":必须使用 ","type":"text"},{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/login.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":",禁止直接调用 ","type":"text"},{"text":"bdpan login","type":"text","marks":[{"type":"code_inline"}]},{"text":" 及其任何子命令/参数(包括 ","type":"text"},{"text":"--get-auth-url","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"--set-code","type":"text","marks":[{"type":"code_inline"}]},{"text":" 等,即使在 GUI 环境也禁止)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Token/配置","type":"text","marks":[{"type":"strong"}]},{"text":":禁止读取或输出 ","type":"text"},{"text":"~/.config/bdpan/config.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 内容(含 access_token 等敏感凭据)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"更新/登录","type":"text","marks":[{"type":"strong"}]},{"text":":更新必须由用户明确指令触发,禁止自动或静默执行;Agent 禁止使用 ","type":"text"},{"text":"--yes","type":"text","marks":[{"type":"code_inline"}]},{"text":" 参数执行 update.sh 或 login.sh","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"环境变量","type":"text","marks":[{"type":"strong"}]},{"text":":Agent 禁止主动设置 ","type":"text"},{"text":"BDPAN_CONFIG_PATH","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"BDPAN_BIN","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"BDPAN_INSTALL_DIR","type":"text","marks":[{"type":"code_inline"}]},{"text":" 等环境变量(这些变量供用户在脚本外手动配置,Agent 不应代为设置)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"路径安全","type":"text","marks":[{"type":"strong"}]},{"text":":禁止路径穿越(","type":"text"},{"text":"..","type":"text","marks":[{"type":"code_inline"}]},{"text":"、","type":"text"},{"text":"~","type":"text","marks":[{"type":"code_inline"}]},{"text":")、禁止访问 ","type":"text"},{"text":"/apps/bdpan/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 范围外的绝对路径","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"记忆备份约束","type":"text","marks":[{"type":"strong"}]},{"text":":禁止直接用裸 ","type":"text"},{"text":"bdpan upload/download","type":"text","marks":[{"type":"code_inline"}]},{"text":" 命令操作记忆目录;必须通过 ","type":"text"},{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/memory-backup.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" 脚本执行,以确保 manifest 生成、路径安全检查、safety net 备份等机制正常运行","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"前置检查","type":"text"}]},{"type":"paragraph","content":[{"text":"每次触发时按顺序执行:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"安装检查","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"command -v bdpan","type":"text","marks":[{"type":"code_inline"}]},{"text":",未安装则告知用户并确认后执行 ","type":"text"},{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/install.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":"(用户确认后可加 ","type":"text"},{"text":"--yes","type":"text","marks":[{"type":"code_inline"}]},{"text":" 跳过安装器内部确认)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"登录检查","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"bdpan whoami","type":"text","marks":[{"type":"code_inline"}]},{"text":",未登录则引导执行 ","type":"text"},{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/login.sh","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"路径校验","type":"text","marks":[{"type":"strong"}]},{"text":":验证远端路径在 ","type":"text"},{"text":"/apps/bdpan/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 范围内","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"确认规则","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"风险等级","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"操作","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"策略","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"高(必须确认)","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"rm","type":"text","marks":[{"type":"code_inline"}]},{"text":" 删除、上传/下载目标已存在同名文件","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"列出影响范围,等待用户确认","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"中(路径模糊时确认)","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"upload、download、mv、rename、cp","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"路径明确直接执行,不明确则确认","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"低(直接执行)","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ls、search、whoami、mkdir、share","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"无需确认","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"额外规则:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"操作意图模糊(\"处理文件\"→确认上传还是下载)→ 必须确认","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"序数/代词引用有歧义(\"第N个\"、\"它\"、\"上面那个\")→ 必须确认","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户取消意图(\"算了\"、\"不要了\"、\"取消\")→ 立即中止,不执行任何命令","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"核心操作","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"查看状态","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bdpan whoami","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"列表查询","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bdpan ls [目录路径] [--json] [--order name|time|size] [--desc] [--folder]","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"上传","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bdpan upload \u003c本地路径> \u003c远端路径>","type":"text"}]},{"type":"paragraph","content":[{"text":"关键约束:","type":"text","marks":[{"type":"strong"}]},{"text":" 单文件上传远端路径必须是文件名,禁止以 ","type":"text"},{"text":"/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 结尾。文件夹上传:","type":"text"},{"text":"bdpan upload ./project/ project/","type":"text","marks":[{"type":"code_inline"}]},{"text":"。","type":"text"}]},{"type":"paragraph","content":[{"text":"步骤:确认本地路径存在 → 确认远端路径 → ","type":"text"},{"text":"bdpan ls","type":"text","marks":[{"type":"code_inline"}]},{"text":" 检查远端是否已存在 → 执行。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"下载","type":"text"}]},{"type":"paragraph","content":[{"text":"直接下载:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bdpan download \u003c远端路径> \u003c本地路径>","type":"text"}]},{"type":"paragraph","content":[{"text":"步骤:","type":"text"},{"text":"bdpan ls","type":"text","marks":[{"type":"code_inline"}]},{"text":" 确认云端存在 → 确认本地路径 → 检查本地是否已存在 → ","type":"text"},{"text":"检查文件大小决定下载策略","type":"text","marks":[{"type":"strong"}]},{"text":" → 执行。若 ls 未找到,建议 ","type":"text"},{"text":"bdpan search \u003c文件名>","type":"text","marks":[{"type":"code_inline"}]},{"text":"。","type":"text"}]},{"type":"paragraph","content":[{"text":"大文件下载策略(重要):","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Agent 的 Bash 工具有执行超时限制,大文件下载可能因超时而中断。必须根据文件大小选择下载策略:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"获取文件大小","type":"text","marks":[{"type":"strong"}]},{"text":":用 ","type":"text"},{"text":"bdpan ls --json \u003c远端路径>","type":"text","marks":[{"type":"code_inline"}]},{"text":" 获取 ","type":"text"},{"text":"size","type":"text","marks":[{"type":"code_inline"}]},{"text":" 字段(字节)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"按大小分策略执行","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文件大小","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"策略","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"执行方式","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"≤ 50MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"直接下载","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bdpan download \u003c远端路径> \u003c本地路径>","type":"text","marks":[{"type":"code_inline"}]},{"text":",Bash timeout 设为 300000(5 分钟)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"> 50MB","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"后台下载","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"使用 ","type":"text"},{"text":"nohup","type":"text","marks":[{"type":"code_inline"}]},{"text":" 后台执行,Agent 轮询进度","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"小文件(≤ 50MB)直接下载:","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"正常执行 ","type":"text"},{"text":"bdpan download","type":"text","marks":[{"type":"code_inline"}]},{"text":",Bash 工具 timeout 参数设为 ","type":"text"},{"text":"300000","type":"text","marks":[{"type":"code_inline"}]},{"text":"(5 分钟)。","type":"text"}]},{"type":"paragraph","content":[{"text":"大文件(> 50MB)后台下载流程:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. 启动后台下载(nohup + 进度日志)\nnohup bdpan download \u003c远端路径> \u003c本地路径> > /tmp/bdpan-dl-$.log 2>&1 & echo $!","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 2. 轮询检查进度(每 30 秒检查一次,使用 Bash run_in_background)\n# 检查进程是否存活 + 已下载文件大小\nkill -0 \u003cPID> 2>/dev/null && echo \"running\" || echo \"done\"; ls -l \u003c本地路径> 2>/dev/null; tail -5 /tmp/bdpan-dl-\u003cPID>.log 2>/dev/null","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 3. 下载完成后清理日志\nrm -f /tmp/bdpan-dl-\u003cPID>.log","type":"text"}]},{"type":"paragraph","content":[{"text":"Agent 执行大文件后台下载时的行为规范:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"启动后台下载后,","type":"text"},{"text":"立即告知用户","type":"text","marks":[{"type":"strong"}]},{"text":":下载已在后台启动,文件大小 X,预计需要 Y 时间","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"每次轮询后向用户报告进度(已下载大小 / 总大小、百分比)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"下载完成后告知用户最终结果","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"如果进程异常退出,检查日志并报告错误原因","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"分享链接下载(先转存再下载到本地):","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bdpan download \"https://pan.baidu.com/s/1xxxxx?pwd=abcd\" ./downloaded/\nbdpan download \"https://pan.baidu.com/s/1xxxxx\" ./downloaded/ -p abcd # 提取码单独传入\nbdpan download \"https://pan.baidu.com/s/1xxxxx?pwd=abcd\" ./downloaded/ -t my-folder # 指定转存目录","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"分享链接下载同样适用大文件策略:转存完成后,用 ","type":"text"},{"text":"bdpan ls --json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 获取文件大小,再按上述策略执行下载。","type":"text"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"转存","type":"text"}]},{"type":"paragraph","content":[{"text":"将分享文件转存到网盘,","type":"text"},{"text":"不下载到本地","type":"text","marks":[{"type":"strong"}]},{"text":"(与 download 分享链接模式的区别)。","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bdpan transfer \"https://pan.baidu.com/s/1xxxxx\" -p \u003c提取码> [-d 目标目录] [--json]","type":"text"}]},{"type":"paragraph","content":[{"text":"步骤:确认分享链接格式有效 → 确认有提取码(链接中含 ","type":"text"},{"text":"?pwd=","type":"text","marks":[{"type":"code_inline"}]},{"text":" 或反问用户)→ 确认目标目录 → 执行。转存成功后只展示本次转存的文件(非整个目录),显示数量和目标目录。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"分享","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bdpan share \u003c路径> [路径...] [--period \u003c天数>] [--json]","type":"text"}]},{"type":"paragraph","content":[{"text":"--period / -d 参数:","type":"text","marks":[{"type":"strong"}]},{"text":" 分享有效期(天),取值:0=永久, 1, 7, 30(默认:7)","type":"text"}]},{"type":"paragraph","content":[{"text":"智能选择规则:","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"Agent 必须根据用户的语义意图判断有效期,而非仅匹配固定关键词。","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户表达了\"希望长期有效/永久/不过期/一直能用\"等语义 → 使用 ","type":"text"},{"text":"--period 0","type":"text","marks":[{"type":"code_inline"}]},{"text":",并提示用户:永久链接无法自动过期,请注意文件安全","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户指定了具体天数或时间范围 → 选择最接近的枚举值(1、7、30)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"用户未表达任何有效期偏好 → 默认 ","type":"text"},{"text":"--period 7","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"步骤:","type":"text"},{"text":"bdpan ls","type":"text","marks":[{"type":"code_inline"}]},{"text":" 确认文件存在 → 根据用户意图选择有效期 → 执行分享 → 展示链接+提取码+有效期。","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"付费接口,需在百度网盘开放平台购买服务。","type":"text"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"搜索","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bdpan search \u003c关键词> [--category 0-7] [--no-dir|--dir-only] [--page-size N] [--page N] [--json]","type":"text"}]},{"type":"paragraph","content":[{"text":"category:0=全部 1=视频 2=音频 3=图片 4=文档 5=应用 6=其他 7=种子。","type":"text"},{"text":"--no-dir","type":"text","marks":[{"type":"code_inline"}]},{"text":" 和 ","type":"text"},{"text":"--dir-only","type":"text","marks":[{"type":"code_inline"}]},{"text":" 互斥。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"移动 / 复制 / 重命名 / 创建文件夹","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bdpan mv \u003c源路径> \u003c目标目录>\nbdpan cp \u003c源路径> \u003c目标目录>\nbdpan rename \u003c路径> \u003c新名称> # 第二参数是文件名,非完整路径\nbdpan mkdir \u003c路径>","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"路径规则","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"场景","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"格式","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"示例","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"命令参数","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"相对路径(相对于 ","type":"text"},{"text":"/apps/bdpan/","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bdpan upload ./f.txt docs/f.txt","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"展示给用户","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"中文名","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"已上传到:我的应用数据/bdpan/docs/f.txt\"","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"映射关系:","type":"text"},{"text":"我的应用数据","type":"text","marks":[{"type":"code_inline"}]},{"text":" ↔ ","type":"text"},{"text":"/apps","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"禁止:","type":"text","marks":[{"type":"strong"}]},{"text":" 命令中使用中文路径(","type":"text"},{"text":"我的应用数据/...","type":"text","marks":[{"type":"code_inline"}]},{"text":")、展示时暴露 API 路径(","type":"text"},{"text":"/apps/bdpan/...","type":"text","marks":[{"type":"code_inline"}]},{"text":")。","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"授权码处理","type":"text"}]},{"type":"paragraph","content":[{"text":"用户发送 32 位十六进制字符串时,先确认:\"这是百度网盘授权码吗?确认后将执行登录流程。\" 确认后执行 ","type":"text"},{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/login.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":"(不使用 ","type":"text"},{"text":"--yes","type":"text","marks":[{"type":"code_inline"}]},{"text":",保留安全确认环节)。","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"管理功能","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"安装","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/install.sh [--yes]","type":"text"}]},{"type":"paragraph","content":[{"text":"安装器从百度 CDN(","type":"text"},{"text":"issuecdn.baidupcs.com","type":"text","marks":[{"type":"code_inline"}]},{"text":")下载并执行。注意:install.sh 不执行本地 SHA256 校验,完整性依赖 HTTPS 传输保护。安全敏感场景建议先手动审查安装器内容或在沙箱中执行。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"登录 / 注销 / 卸载","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/login.sh # 登录(内置安全免责声明)\nbdpan logout # 注销\nbash ${CLAUDE_SKILL_DIR}/scripts/uninstall.sh [--yes] # 卸载","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"更新(必须用户明确指令触发)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/update.sh # 检查并更新(需用户确认)\nbash ${CLAUDE_SKILL_DIR}/scripts/update.sh --check # 仅检查更新","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"记忆备份与恢复","type":"text"}]},{"type":"paragraph","content":[{"text":"仅支持 4 种 Claw 产品(kimiclaw、maxclaw、qclaw、openclaw),自动检测当前环境。","type":"text"}]},{"type":"paragraph","content":[{"text":"网盘存储路径:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"/apps/bdpan/agent-memory/\u003cagent>/\u003cdevice>/manual/\u003ctimestamp>/","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"paragraph","content":[{"text":"备份内容:","type":"text","marks":[{"type":"strong"}]},{"text":" 7 个 Workspace 文件(AGENTS.md、SOUL.md、USER.md、IDENTITY.md、TOOLS.md、MEMORY.md、HEARTBEAT.md)+ ","type":"text"},{"text":"memory/*.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" + ","type":"text"},{"text":"manifest.json","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"备份记忆","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/memory-backup.sh backup","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"查看备份列表","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash ${CLAUDE_SKILL_DIR}/scripts/memory-backup.sh list","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"恢复备份","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 按日期模糊匹配(如只输入日期部分)\nbash ${CLAUDE_SKILL_DIR}/scripts/memory-backup.sh restore 2026-03-16\n\n# 跳过兼容性警告强制恢复(跨 Agent 类型时使用)\nbash ${CLAUDE_SKILL_DIR}/scripts/memory-backup.sh restore 2026-03-16 --force","type":"text"}]},{"type":"paragraph","content":[{"text":"恢复安全机制:","type":"text","marks":[{"type":"strong"}]},{"text":" 恢复前自动将当前本地记忆备份到 ","type":"text"},{"text":"\u003cworkspace>/.backup-before-restore/\u003ctimestamp>/","type":"text","marks":[{"type":"code_inline"}]},{"text":",防止误操作数据丢失。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"操作流程","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"执行前自动检查:bdpan 是否安装 → 是否已登录(未满足则引导处理)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"检测当前 Agent 类型 → 不支持的环境报错退出","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"执行对应操作(backup/list/restore)","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"参考文档","type":"text"}]},{"type":"paragraph","content":[{"text":"遇到对应问题时按需查阅,无需预加载:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"何时查阅","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bdpan-commands.md","type":"text","marks":[{"type":"link","attrs":{"href":"./reference/bdpan-commands.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"需要完整命令参数、选项、JSON 输出格式","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"authentication.md","type":"text","marks":[{"type":"link","attrs":{"href":"./reference/authentication.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"认证流程细节、Token 管理","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"examples.md","type":"text","marks":[{"type":"link","attrs":{"href":"./reference/examples.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"更多使用示例(批量上传、自动备份等)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"troubleshooting.md","type":"text","marks":[{"type":"link","attrs":{"href":"./reference/troubleshooting.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"遇到错误需要排查","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"baidu-drive","author":"@skillopedia","source":{"stars":100,"repo_name":"bdpan-storage","origin_url":"https://github.com/baidu-netdisk/bdpan-storage/blob/HEAD/skills/baidu-drive/SKILL.md","repo_owner":"baidu-netdisk","body_sha256":"fd24e6e8c0fe887b596bb5f542c25906b8dfcc5d3f94de4a0a3dc8a2a3c1f45c","cluster_key":"9dd4e8883722f8b5cf4159b3d3d46e79e5abcb537e459b2722bde8c782b107b0","clean_bundle":{"format":"clean-skill-bundle-v1","source":"baidu-netdisk/bdpan-storage/skills/baidu-drive/SKILL.md","attachments":[{"id":"4b73826d-95a6-52e8-b90e-ef10da87bce9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4b73826d-95a6-52e8-b90e-ef10da87bce9/attachment","path":"VERSION","size":7,"sha256":"ff2e4b6f44b8dcf44c2cb561b5b968175eaace513d526b6effd1ce1ed9b29223","contentType":"text/plain; charset=utf-8"},{"id":"e8220d1c-843d-56af-ae70-b30e8070e182","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e8220d1c-843d-56af-ae70-b30e8070e182/attachment.md","path":"reference/authentication.md","size":2336,"sha256":"319299fe66f3c18ccd4ddf344c8f9886bea8b5687965fab3f58fdf9df22673ad","contentType":"text/markdown; charset=utf-8"},{"id":"df7c3f2b-53e1-5d4a-90c3-f39b22e84513","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/df7c3f2b-53e1-5d4a-90c3-f39b22e84513/attachment.md","path":"reference/bdpan-commands.md","size":15174,"sha256":"3df1c1dac2491d142c5d8090c4c1de49f71d703566233f73411daca04223ba2c","contentType":"text/markdown; charset=utf-8"},{"id":"e599955c-8520-5cb4-a8ba-b411714e6e74","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e599955c-8520-5cb4-a8ba-b411714e6e74/attachment.md","path":"reference/examples.md","size":7744,"sha256":"8f7561d0c3d079bae1971ac2818bac34e144b3be3d456c53dd518566bc6f5e6a","contentType":"text/markdown; charset=utf-8"},{"id":"0fa883cb-519c-5752-8385-58287ba1f045","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0fa883cb-519c-5752-8385-58287ba1f045/attachment.md","path":"reference/notes.md","size":986,"sha256":"effdfdc9aaf3faf55dc3061ef8f01d3bd24675411bbc1d443e6a6013cfa78747","contentType":"text/markdown; charset=utf-8"},{"id":"64722010-08dd-5dd3-863d-9f8767f8f4ae","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/64722010-08dd-5dd3-863d-9f8767f8f4ae/attachment.md","path":"reference/troubleshooting.md","size":7494,"sha256":"424147c7d3afc2452bba242a79e8b7b9eeea30257f2acb2a9263d0abca42d173","contentType":"text/markdown; charset=utf-8"},{"id":"152758f8-1ce3-57a1-9138-039a96153fec","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/152758f8-1ce3-57a1-9138-039a96153fec/attachment.sh","path":"scripts/install.sh","size":10574,"sha256":"50aafba10f639537eae1fb6998ecc19af06f65872ca8a851971f7eac4aeb6d41","contentType":"application/x-sh; charset=utf-8"},{"id":"6e1e7614-d847-5eaf-b074-a9aa94f3b823","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6e1e7614-d847-5eaf-b074-a9aa94f3b823/attachment.sh","path":"scripts/login.sh","size":7077,"sha256":"f11bed956beba2137fd9e2f2dfed86aae1a13f124ee9958f60208758acbfd01b","contentType":"application/x-sh; charset=utf-8"},{"id":"288c3c34-00e2-52f1-95ff-658cff3e7ce5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/288c3c34-00e2-52f1-95ff-658cff3e7ce5/attachment.sh","path":"scripts/memory-backup.sh","size":25075,"sha256":"c8a0a9db61feb8d575a617df1d7b18cb6867ca9a6e1600f55af51474bd453ece","contentType":"application/x-sh; charset=utf-8"},{"id":"f485ac3b-7d45-569e-bf88-272f7a2f3358","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f485ac3b-7d45-569e-bf88-272f7a2f3358/attachment.sh","path":"scripts/uninstall.sh","size":4349,"sha256":"7620f20eff6b9920bf8c82bde65e791e7eee6ae9604702b80bab780e26e8c52c","contentType":"application/x-sh; charset=utf-8"},{"id":"64170757-d658-52c7-aa8f-df23645bb853","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/64170757-d658-52c7-aa8f-df23645bb853/attachment.sh","path":"scripts/update.sh","size":8994,"sha256":"36103371fd41c576f59de5fce761765fb4a7ff9daccbd5f80d583153b338d824","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"9c8cc50556d71da7575556779ca5a562d2490e5b4fbc08989bb1553f92f6e6ba","attachment_count":11,"text_attachments":10,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":1,"excluded_attachments":[]},"cluster_size":2,"skill_md_path":"skills/baidu-drive/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"general","category_label":"General"},"exact_dupes_collapsed_into_this":1},"version":"v1","category":"general","import_tag":"clean-skills-v1","description":"百度网盘(Baidu Drive)文件管理 — 上传、下载、转存、分享、搜索、移动、复制、重命名、创建文件夹。 同时支持 Agent 记忆备份/恢复(kimiclaw/maxclaw/qclaw/openclaw)。 TRIGGER: 用户提及\"百度网盘/bdpan/网盘/云盘/baidu drive/Baidu Drive\"并涉及文件操作;\n 或用户提及\"备份记忆\"、\"恢复记忆\"、\"查看记忆备份\"等记忆相关操作。\nDO NOT TRIGGER: 非文件存储操作,或使用其他云盘服务时;本地记忆整理/清理操作;PPT 生成操作(已独立为 baidu-wenku-aippt skill)。","allowed-tools":"Bash, Read, Glob, Grep, AskUserQuestion","argument-hint":"[操作指令]"}},"renderedAt":1782980979144}

百度网盘存储 Skill 百度网盘文件管理工具,所有操作限制在 目录内。适配 Claude Code、DuClaw、OpenClaw 等。 使用注意事项详见 reference/notes.md 触发规则 网盘文件操作触发 同时满足以下条件才执行: 1. 用户明确提及"百度网盘"、"bdpan"、"网盘" 2. 操作意图明确(上传/下载/转存/分享/查看/搜索/移动/复制/重命名/创建文件夹/登录/注销) 未通过触发规则时,禁止执行任何 bdpan 命令。 上下文延续: 当前对话已在进行网盘操作时,后续消息无需再次提及"网盘"即可触发。 记忆备份/恢复触发 以下表达即使未提及"网盘"也应触发(仅限 kimiclaw/maxclaw/qclaw/openclaw 环境): | 用户说法示例 | 触发操作 | |------------|---------| | "备份记忆"、"备份我的记忆"、"把记忆存到网盘" | backup | | "查看记忆备份"、"有哪些备份"、"备份列表" | list | | "恢复记忆"、"还原记忆"、"回滚记忆"、"记忆回档" | restore(需确认日期) | | "恢复 3月16号 的记忆"、"恢复 2026-03-16 的备份" | restore 指定日期 | 以下情况不触发记忆备份/恢复: - "帮我记住…"、"整理记忆"、"清理记忆"…