{"id":"61be7285-4942-43c3-b523-463d18821af8","entityType":"agent","slug":"clawhub-dengjiawei1226-ielts-tuyaya-upload","name":"IELTS Tuyaya Upload 雅思成绩一键上传","canonicalUrl":"https://www.xpersona.co/agent/clawhub-dengjiawei1226-ielts-tuyaya-upload","canonicalPath":"/agent/clawhub-dengjiawei1226-ielts-tuyaya-upload","generatedAt":"2026-10-11T05:38:49.721Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T02:59:24.035Z","emptyReason":null},"description":"上传雅思阅读复盘文件到服务器，支持 token 模式（进个人主页）和匿名模式。当用户想要上传已有的复盘 JSON、查看个人复盘仪表板时使用。触发词：上传复盘、上传复盘文件、sync review、upload review、查看我的复盘记录、我的仪表板、dashboard、tuyaya 上传、批量同步。","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s171z5dmkr3hr6e5vrt1whgtt583m22s:ielts-tuyaya-upload","sourceUrl":"https://clawhub.ai/dengjiawei1226/ielts-tuyaya-upload","homepage":"https://clawhub.ai/dengjiawei1226/skills/ielts-tuyaya-upload","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/dengjiawei1226/ielts-tuyaya-upload","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/dengjiawei1226/skills/ielts-tuyaya-upload","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"IELTS Tuyaya Upload 雅思成绩一键上传 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-11T02:59:24.035Z","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-11T02:59:24.035Z","emptyReason":null},"stars":null,"forks":null,"downloads":1180,"packageName":null,"latestVersion":"1.3.2","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T02:59:24.022Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T02:59:24.035Z","lastCrawledAt":"2026-10-11T02:59:24.022Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T02:59:24.022Z","lastVerifiedAt":null,"highlights":[{"version":"1.3.2","createdAt":"2026-06-23T03:07:10.308Z","changelog":"v1.3.2: 域名迁移 tuyaya.online → www.liuxue.online（旧域名因 ICP 备案审核已全站 403 不可用）。sync-review.sh/upload.js 默认 API 地址、所有提示文案、README/SKILL 文档全部切换。老用户必须 --force 更新，已存 token 仍有效。\\n\\nv1.3.1: 文档大改造，README/SKILL 全面阐释 v1.3.0 OAuth 风格浏览器授权流——新旧流程对比表 + 安全设计四大保障 + Q&A 答疑。同步推送 GitHub。\\n\\nv1.3.0: 跟随 ielts-reading-review v5.4.0 升级——sync-review.sh 在 IELTS_USER_TOKEN 缺失时，自动调用 setup-client-mode.sh 走浏览器授权流（不再要求用户 F12 手动复制 token）。","fileCount":7,"zipByteSize":20316},{"version":"1.3.1","createdAt":"2026-05-20T12:24:59.372Z","changelog":"v1.3.1: 文档大改造，README/SKILL 全面阐释 v1.3.0 OAuth 风格浏览器授权流——新旧流程对比表 + 安全设计四大保障 + Q&A 答疑。同步推送 GitHub。\\n\\nv1.3.0: 跟随 ielts-reading-review v5.4.0 升级——sync-review.sh 在 IELTS_USER_TOKEN 缺失时，自动调用 setup-client-mode.sh 走浏览器授权流（不再要求用户 F12 手动复制 token）。","fileCount":7,"zipByteSize":19956},{"version":"1.3.0","createdAt":"2026-05-20T06:56:44.428Z","changelog":"v1.3.0: 跟随 ielts-reading-review v5.4.0 升级——sync-review.sh 在 IELTS_USER_TOKEN 缺失时，自动调用 setup-client-mode.sh 走浏览器授权流（不再要求用户 F12 手动复制 token）。配合更新 SKILL.md 触发词与文档示例。\\n\\nv1.2.0: 双通道改造，sync-review.sh 自动检测 IELTS_USER_TOKEN，token 通道走 batchImport，匿名走 skill-review。","fileCount":6,"zipByteSize":16973},{"version":"1.2.0","createdAt":"2026-05-20T06:37:15.379Z","changelog":"v1.2.0: 双通道改造——配合 ielts-reading-review v5.3.0 客户端模式上线 (1) sync-review.sh 自动检测 IELTS_USER_TOKEN：有 token 走 batchImport（数据进个人主页/进度图/词汇本），无 token 兜底走匿名 skill-review 通道 (2) 支持 --token-mode / --anon-mode 强制切换 (3) batchImport 通道复用服务端 schemaUpgrader，富格式 JSON 直接落主库 (4) 文档重写双通道说明、查看入口提示、token 配置引导。\\n\\nv1.1.0: 文档大幅增强——README 和 SKILL.md 补充完整的\"端到端一条龙\"使用指南。\\n\\nv1.0.0: 首个公开版本。支持多用户——token 持久化到 ~/.ielts-tuyaya-token，批量上传跳过已有记录。","fileCount":6,"zipByteSize":16758},{"version":"1.1.0","createdAt":"2026-04-21T16:06:40.961Z","changelog":"v1.1.0: 文档大幅增强——README 和 SKILL.md 补充完整的\"端到端一条龙\"使用指南，配合 ielts-reading-review v3.4.0+ 实现自动扫 → 生成 JSON → 批量上传的全流程。新增流程示意图、耗时参考、踩坑提示、Q&A。扩展触发词，\"批量导入历史复盘\"\"端到端同步雅思\"等表达也能触发。\\n\\nv1.0.0: 首个公开版本。支持多用户——本地不再硬编码 token，新增 --register（注册）/--login（登录）/--logout/--whoami 命令，token 持久化到 ~/.ielts-tuyaya-token（0600 权限，30 天有效）。批量上传能自动跳过服务器已有记录，diff 命令可提前对比本地与云端差量。替代手动拖 JSON 到 tuyaya.online/ielts/submit.html 的流程，配合 ielts-reading-review 生成的 v3 JSON 一键同步。","fileCount":5,"zipByteSize":14863},{"version":"1.0.0","createdAt":"2026-04-21T15:54:57.284Z","changelog":"v1.0.0: 首个公开版本。支持多用户——本地不再硬编码 token，新增 --register（注册）/--login（登录）/--logout/--whoami 命令，token 持久化到 ~/.ielts-tuyaya-token（0600 权限，30 天有效）。批量上传能自动跳过服务器已有记录，diff 命令可提前对比本地与云端差量。替代手动拖 JSON 到 tuyaya.online/ielts/submit.html 的流程，配合 ielts-reading-review 生成的 v3 JSON 一键同步。","fileCount":5,"zipByteSize":11007}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s171z5dmkr3hr6e5vrt1whgtt583m22s:ielts-tuyaya-upload","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s171z5dmkr3hr6e5vrt1whgtt583m22s:ielts-tuyaya-upload` 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/dengjiawei1226/ielts-tuyaya-upload 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-dengjiawei1226-ielts-tuyaya-upload/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dengjiawei1226-ielts-tuyaya-upload/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dengjiawei1226-ielts-tuyaya-upload/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dengjiawei1226-ielts-tuyaya-upload/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dengjiawei1226-ielts-tuyaya-upload/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dengjiawei1226-ielts-tuyaya-upload/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-11T05:38:49.719Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dengjiawei1226-ielts-tuyaya-upload/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dengjiawei1226-ielts-tuyaya-upload/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dengjiawei1226-ielts-tuyaya-upload/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dengjiawei1226-ielts-tuyaya-upload/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-11T02:59:24.035Z","emptyReason":null},"readme":"Skill: IELTS Tuyaya Upload 雅思成绩一键上传\n\nOwner: dengjiawei1226\n\nSummary: 上传雅思阅读复盘文件到服务器，支持 token 模式（进个人主页）和匿名模式。当用户想要上传已有的复盘 JSON、查看个人复盘仪表板时使用。触发词：上传复盘、上传复盘文件、sync review、upload review、查看我的复盘记录、我的仪表板、dashboard、tuyaya 上传、批量同步。\n\nTags: latest:1.3.2\n\nVersion history:\n\nv1.3.2 | 2026-06-23T03:07:10.308Z | user\n\nv1.3.2: 域名迁移 tuyaya.online → www.liuxue.online（旧域名因 ICP 备案审核已全站 403 不可用）。sync-review.sh/upload.js 默认 API 地址、所有提示文案、README/SKILL 文档全部切换。老用户必须 --force 更新，已存 token 仍有效。\\n\\nv1.3.1: 文档大改造，README/SKILL 全面阐释 v1.3.0 OAuth 风格浏览器授权流——新旧流程对比表 + 安全设计四大保障 + Q&A 答疑。同步推送 GitHub。\\n\\nv1.3.0: 跟随 ielts-reading-review v5.4.0 升级——sync-review.sh 在 IELTS_USER_TOKEN 缺失时，自动调用 setup-client-mode.sh 走浏览器授权流（不再要求用户 F12 手动复制 token）。\n\nv1.3.1 | 2026-05-20T12:24:59.372Z | user\n\nv1.3.1: 文档大改造，README/SKILL 全面阐释 v1.3.0 OAuth 风格浏览器授权流——新旧流程对比表 + 安全设计四大保障 + Q&A 答疑。同步推送 GitHub。\\n\\nv1.3.0: 跟随 ielts-reading-review v5.4.0 升级——sync-review.sh 在 IELTS_USER_TOKEN 缺失时，自动调用 setup-client-mode.sh 走浏览器授权流（不再要求用户 F12 手动复制 token）。\n\nv1.3.0 | 2026-05-20T06:56:44.428Z | user\n\nv1.3.0: 跟随 ielts-reading-review v5.4.0 升级——sync-review.sh 在 IELTS_USER_TOKEN 缺失时，自动调用 setup-client-mode.sh 走浏览器授权流（不再要求用户 F12 手动复制 token）。配合更新 SKILL.md 触发词与文档示例。\\n\\nv1.2.0: 双通道改造，sync-review.sh 自动检测 IELTS_USER_TOKEN，token 通道走 batchImport，匿名走 skill-review。\n\nv1.2.0 | 2026-05-20T06:37:15.379Z | user\n\nv1.2.0: 双通道改造——配合 ielts-reading-review v5.3.0 客户端模式上线 (1) sync-review.sh 自动检测 IELTS_USER_TOKEN：有 token 走 batchImport（数据进个人主页/进度图/词汇本），无 token 兜底走匿名 skill-review 通道 (2) 支持 --token-mode / --anon-mode 强制切换 (3) batchImport 通道复用服务端 schemaUpgrader，富格式 JSON 直接落主库 (4) 文档重写双通道说明、查看入口提示、token 配置引导。\\n\\nv1.1.0: 文档大幅增强——README 和 SKILL.md 补充完整的\"端到端一条龙\"使用指南。\\n\\nv1.0.0: 首个公开版本。支持多用户——token 持久化到 ~/.ielts-tuyaya-token，批量上传跳过已有记录。\n\nv1.1.0 | 2026-04-21T16:06:40.961Z | user\n\nv1.1.0: 文档大幅增强——README 和 SKILL.md 补充完整的\"端到端一条龙\"使用指南，配合 ielts-reading-review v3.4.0+ 实现自动扫 → 生成 JSON → 批量上传的全流程。新增流程示意图、耗时参考、踩坑提示、Q&A。扩展触发词，\"批量导入历史复盘\"\"端到端同步雅思\"等表达也能触发。\\n\\nv1.0.0: 首个公开版本。支持多用户——本地不再硬编码 token，新增 --register（注册）/--login（登录）/--logout/--whoami 命令，token 持久化到 ~/.ielts-tuyaya-token（0600 权限，30 天有效）。批量上传能自动跳过服务器已有记录，diff 命令可提前对比本地与云端差量。替代手动拖 JSON 到 tuyaya.online/ielts/submit.html 的流程，配合 ielts-reading-review 生成的 v3 JSON 一键同步。\n\nv1.0.0 | 2026-04-21T15:54:57.284Z | user\n\nv1.0.0: 首个公开版本。支持多用户——本地不再硬编码 token，新增 --register（注册）/--login（登录）/--logout/--whoami 命令，token 持久化到 ~/.ielts-tuyaya-token（0600 权限，30 天有效）。批量上传能自动跳过服务器已有记录，diff 命令可提前对比本地与云端差量。替代手动拖 JSON 到 tuyaya.online/ielts/submit.html 的流程，配合 ielts-reading-review 生成的 v3 JSON 一键同步。\n\nArchive index:\n\nArchive v1.3.2: 7 files, 20316 bytes\n\nFiles: _meta.json (138b), publish-clawhub.sh (2863b), README.md (10158b), scripts/sync-review.sh (7765b), scripts/upload.js (16666b), skill-card.md (2114b), SKILL.md (7777b)\n\nFile v1.3.2:SKILL.md\n\n---\nname: ielts-tuyaya-upload\ndescription: \"上传雅思阅读复盘文件到服务器，支持 token 模式（进个人主页）和匿名模式。当用户想要上传已有的复盘 JSON、查看个人复盘仪表板时使用。触发词：上传复盘、上传复盘文件、sync review、upload review、查看我的复盘记录、我的仪表板、dashboard、tuyaya 上传、批量同步。\"\n---\n\n# IELTS Review Upload Skill\n\n## Purpose\n\n把已有的雅思阅读复盘 JSON 上传到 www.liuxue.online。支持两种通道：\n\n| 模式 | 触发条件 | 通道 | 数据落点 | 适用 |\n|---|---|---|---|---|\n| **Token 模式（推荐）** | 设置了 `IELTS_USER_TOKEN` 环境变量 | `POST /api/ielts {action:'batchImport', token}` | 主库 + **进个人主页进度图/词汇本** | 登录用户（dengjiawei / lishuzhuo / 其他注册账号） |\n| **匿名模式（兜底）** | 没有 token | `POST /ielts-api/skill-review` (x-api-key) | 匿名 dashboard 表 | 访客试用、未注册账号 |\n\n**默认走 token 模式**。脚本会自动检测 `IELTS_USER_TOKEN`，没设置时 v1.3.0 起会**直接弹起浏览器授权页**让用户一键完成绑定（OAuth 风格），完全无需 F12。\n\n## What's New in v1.3.2 — 域名迁移到 liuxue.online\n\n**⚠️ v1.3.2（2026-06-23）**：旧域名 `tuyaya.online` 因 ICP 备案审核已全站 403 不可用，所有默认 API/授权/登录地址迁移到 `www.liuxue.online`。`sync-review.sh` / `upload.js` / `setup-client-mode.sh`（含 CORS Allow-Origin）默认值全部更新。**老用户必须 `clawhub install ielts-tuyaya-upload --force` 更新**，否则上传会撞旧域名 403 失败。已存的 token 仍有效，无需重新授权。\n\n## What's New in v1.3.0 — 浏览器授权流\n\n跟随 ielts-reading-review v5.4.0 升级：\n\n- ❌ **告别 F12 复制 token**：不再需要打开 DevTools → Console 手动 `localStorage.ielts_user_token`\n- ✅ **一键浏览器授权**：缺 token 时 `sync-review.sh` 自动调起 `setup-client-mode.sh` → 浏览器弹 `www.liuxue.online/authorize.html` → 点【授权】完事\n- 🔒 **token 全程在本机**：通过 `<img src=http://127.0.0.1:port/cb?token=...>` 回传，不进 URL bar，不走第三方\n- 🛡️ **CSRF 防护**：state 随机串 + 回调白名单（仅 127.0.0.1/localhost）\n- 🪟 **三系统支持**：macOS `open` / Linux `xdg-open` / 兜底打印链接手动粘贴\n\n## When to Activate\n\n- 用户说\"上传复盘\"、\"上传复盘文件\"\n- 用户说 \"sync review\"、\"upload review\"\n- 用户想查看个人复盘仪表板\n- 用户说\"查看我的复盘记录\"、\"我的仪表板\"\n\n## Workflow\n\n### Step 0: 确认 token 是否就位\n\n第一步先检查 `IELTS_USER_TOKEN`：\n\n```bash\necho \"${IELTS_USER_TOKEN:0:20}...\"  # 只显示前 20 位避免泄漏\n```\n\n- **有输出** → 走 token 模式，数据进个人主页 ✅\n- **没输出** → 走 v1.3.0 浏览器授权流（OAuth 风格，30 秒搞定）：\n\n```\n你还没配置 IELTS_USER_TOKEN，上传后数据不会进个人主页进度图。\n\n🔧 一键授权（推荐）：\nbash ~/.workbuddy/skills/ielts-reading-review/scripts/setup-client-mode.sh\n\n脚本会：\n1. 在本机起一个随机端口的 HTTP 服务监听回调\n2. 自动唤起浏览器到 www.liuxue.online/authorize.html\n3. 你在网页点【授权】按钮，token 通过 <img> 请求回传到本机\n4. 校验通过后写入 ~/.zshrc 并 source 生效\n5. token 永远不离开你的电脑（不进 URL bar、不走第三方）\n\n兜底（浏览器/网络异常时）：\nbash setup-client-mode.sh --manual    # 走 F12 复制 token 老流程\n\n要不要现在跑一下，还是先走匿名模式？\n```\n\n**v1.3.0 起 sync-review.sh 自动检测 token，没设置时直接调起 setup-client-mode.sh，全程不用手动复制。**\n\n### Step 1: 收集 JSON 文件路径\n\n询问用户要上传的 JSON 文件路径。\n\n**JSON 格式支持两种**：\n\n**扁平格式（最简）**：\n```json\n{\n  \"book\": 5,\n  \"test\": 4,\n  \"passage\": 1,\n  \"score\": 11,\n  \"total\": 13,\n  \"date\": \"2026-04-09\",\n  \"duration\": 2050,\n  \"wrongQuestions\": [3, 7, 12]\n}\n```\n\n**v4.0 富格式（推荐，复盘 skill 直接产出）**：\n```json\n{\n  \"version\": \"4.0.0\",\n  \"source\": {\"book\": 5, \"test\": 4, \"passage\": 1, \"title\": \"...\", \"titleCN\": \"...\"},\n  \"score\": {\"correct\": 11, \"total\": 13, \"band\": \"6.5-7.0\"},\n  \"timing\": {\"minutes\": 34.2, \"formatted\": \"34:10\"},\n  \"date\": \"2026-04-09\",\n  \"wrongQuestions\": [...],\n  \"synonyms\": [...],\n  \"vocabulary\": [...]\n}\n```\n\n服务端 schemaUpgrader 会自动识别富格式，无需手动转换。\n\n### Step 2: 跑上传脚本\n\n```bash\nbash ~/.workbuddy/skills/ielts-review-upload/scripts/sync-review.sh <path-to-data.json>\n```\n\n**脚本行为**：\n- 自动检测 `IELTS_USER_TOKEN`，决定走 token 还是匿名通道\n- token 模式：包装成 batchImport payload，POST 到 `/api/ielts`\n- 匿名模式：用 hostname+username SHA256 生成稳定 user id，POST 到 `/ielts-api/skill-review`\n- 失败时打印明确错误（token 过期 / 字段缺失 / HTTP 错误）\n\n**强制覆盖通道**：\n```bash\nbash sync-review.sh data.json --token-mode    # 强制走 token，没 token 直接报错\nbash sync-review.sh data.json --anon-mode     # 强制走匿名（即使有 token）\n```\n\n### Step 3: 上传后告知查看入口\n\n**Token 模式成功**：\n```\n✅ 上传成功！数据已进入你的个人主页。\n\n📊 查看：https://www.liuxue.online/ielts/reading.html\n（登录后能看到进度图、词汇本、错题本同步更新）\n```\n\n**匿名模式成功**：\n```\n✅ 上传成功（匿名）。\n\n📊 你的专属看板：\nhttps://www.liuxue.online/ielts-api/web/?user=<USER_ID>&key=<API_KEY>\n\n⚠️ 此数据不在主站个人主页中。建议下次配置 IELTS_USER_TOKEN 以同步到主页。\n```\n\n### Step 4: 入库回查（仅 token 模式，可选但推荐）\n\n```bash\ncurl -s https://www.liuxue.online/api/ielts \\\n  -H 'Content-Type: application/json' \\\n  -d \"{\\\"action\\\":\\\"getReviews\\\",\\\"token\\\":\\\"$IELTS_USER_TOKEN\\\",\\\"book\\\":5,\\\"test\\\":4}\" \\\n  | python3 -m json.tool\n```\n\n确认返回的 data 数组里有刚上传的篇目。\n\n## Configuration\n\n### Token（推荐，token 模式）\n\n- 浏览器 `localStorage.token` 取，写入 `~/.zshrc`：\n  ```bash\n  export IELTS_USER_TOKEN='eyJ1Ijoi...'\n  ```\n- 也可以用 `~/.workbuddy/skills/ielts-reading-review/scripts/get-token.sh` 一键签发（如已部署）\n\n### API Key（匿名模式 fallback）\n\n脚本内置默认 API key：`ielts_8b0832b3cfd38884e44ab26ee68acaeed294623ef8da9b201871a7768b072606`\n\n如需更换：\n```bash\nexport IELTS_API_KEY='your_key_here'\n```\n\n### Backend URL\n\n```bash\nexport IELTS_API_BASE='https://www.liuxue.online/api/ielts'        # token 模式\nexport IELTS_LEGACY_BASE='https://www.liuxue.online/ielts-api'     # 匿名模式\n```\n\n## Reference Files\n\n| File | Purpose |\n|------|---------|\n| `scripts/sync-review.sh` | 双通道上传脚本（token + 匿名 fallback） |\n\n## Troubleshooting\n\n### \"token 过期 / 401\"\n\n重新登录 www.liuxue.online 拿新 token，更新 `IELTS_USER_TOKEN`。\n\n### \"缺少 book/test/passage\"\n\nJSON 必须包含 `source.book`/`source.test`/`source.passage`（v4.0）或顶层 `book`/`test`/`passage`（扁平）。\n\n### \"Upload failed (HTTP 5xx)\"\n\n后端服务异常，先 ping 健康检查：\n```bash\ncurl https://www.liuxue.online/api/health\n```\n\n### 数据没进个人主页\n\n检查：\n1. `echo $IELTS_USER_TOKEN` 是否真的有值（可能 `.zshrc` 没 source）\n2. 脚本输出有没有 `Mode: token`，如果是 `Mode: anon` 则数据在匿名表里\n\n## Style Guidelines\n\n- 简洁直接，不要多余包装\n- 默认推荐 token 模式，仅在用户明确要匿名或没条件配 token 时走 fallback\n- 上传完成后必须打印查看入口\n\nFile v1.3.2:README.md\n\n# IELTS Tuyaya Upload\n\n把本地雅思阅读复盘 JSON 一键上传到 [www.liuxue.online](https://www.liuxue.online/ielts/)，告别手动拖文件。\n\n## 🆕 v1.3.0 — 浏览器一键授权（告别 F12）\n\n跟随 `ielts-reading-review` v5.4.0 同步升级，**绑定账号体验彻底重做**：\n\n| 旧流程 (≤v1.2) | 新流程 (v1.3+) |\n|---|---|\n| 打开 www.liuxue.online 登录 | 同左 |\n| F12 → Console → `localStorage.ielts_user_token` | ❌ 不再需要 |\n| 手动复制 token 字符串 | ❌ 不再需要 |\n| 打开 ~/.zshrc 手动 `export IELTS_USER_TOKEN=...` | ❌ 不再需要 |\n| `source ~/.zshrc` | ❌ 不再需要 |\n| —— | ✅ 浏览器弹授权页，点一下【授权】完事 |\n\n**触发方式**：跑任何上传命令（如 `node scripts/upload.js --batch xxx`），脚本检测到没设 `IELTS_USER_TOKEN` 就会自动调起 `setup-client-mode.sh`，几秒后浏览器弹出 OAuth 风格的授权卡片。\n\n**安全保障**：\n- token 通过 `<img src=http://127.0.0.1:随机端口/cb?token=...>` 回传到本机，永远不离开你的电脑\n- 回调地址白名单：仅接受 `127.0.0.1 / localhost / ::1`\n- CSRF state 校验：每次启动随机生成 16 字节，防止跨站攻击\n- token 不进浏览器 URL bar、不走第三方服务器\n\n如果浏览器异常，可手动跑 `bash setup-client-mode.sh --manual` 走 F12 老流程兜底。\n\n---\n\n## 适合谁用？\n\n- 用 `ielts-reading-review` skill 生成了一堆 JSON 复盘文件\n- 想把成绩同步到 www.liuxue.online 云端，在任何设备打开网页查看\n- 不想手动一个个拖到 submit 页面\n- 有一堆旧笔记（HTML/Markdown/截图）想一次性导入成绩看趋势图\n\n## 🚀 端到端一条龙（推荐）\n\n如果你的复盘还是散在文件夹里的旧笔记，推荐配合 `ielts-reading-review` v3.4.0+ 一起用：**自动扫 → 生成 JSON → 自动上传**，一条 prompt 搞定。\n\n### Step 1：装两个 skill（只做一次）\n\n```bash\nclawhub install ielts-reading-review\nclawhub install ielts-tuyaya-upload\n```\n\n### Step 2：把下面这段 prompt 整段发给你的 AI Buddy\n\n**不用改任何内容，复制粘贴直接发就行。**\n\n```\n帮我一条龙处理我的历史雅思复盘。\n\n流程：\n\n【A. 自动找复盘文件夹】\n1. 用 ielts-reading-review skill 的 scan-legacy-reviews.js --auto 扫我电脑常见位置\n2. 把推荐目录和其他候选报给我，让我确认用哪个\n\n【B. 生成 JSON】\n3. 对确认后的目录做深扫（--deep），列出识别到的篇目清单，让我再确认一次\n4. 逐篇生成 v3.0 schema 的 JSON，输出到 ./batch-output/\n5. 字段缺失的地方不要瞎编，缺就置空\n6. 汇报成功几篇、数据缺失几篇\n\n【C. 上传到 www.liuxue.online】\n7. 用 ielts-tuyaya-upload skill 检查登录状态（--whoami）\n   - 如果我还没账号：引导我 --register 注册（我会自己输入用户名密码）\n   - 如果已登录：继续\n8. 先跑 --diff ./batch-output/ 给我看差量（哪些是新的、哪些服务器已有）\n9. 我确认后，跑 --batch ./batch-output/ 批量上传\n10. 上传完告诉我成功几条，给我 https://www.liuxue.online/ielts/ 的链接让我去看成绩\n\n规则：\n- 每一步之间要停下来等我确认，别一口气全跑完\n- 注册/登录时让我自己在终端输入密码，你不要替我生成\n- 上传过程中有失败的，列出来让我决定要不要重试\n```\n\n### Step 3：按 Buddy 提示逐步确认\n\nAI 会每一步停下来让你确认：路径对不对 → 篇目清单对不对 → 上传差量对不对 → 最后给你成绩链接。\n\n### 全流程示意\n\n```\n  你      ─▶  我发 prompt\n                │\n                ▼\n  Buddy   ─▶  🔍 auto 扫电脑\n                │\n                ▼\n  你      ─▶  确认\"用这个目录\"\n                │\n                ▼\n  Buddy   ─▶  📂 深扫列出所有篇目\n                │\n                ▼\n  你      ─▶  确认\"篇目没错\"\n                │\n                ▼\n  Buddy   ─▶  ✍️  逐篇生成 JSON 到 batch-output/\n                │\n                ▼\n  Buddy   ─▶  🔑 检查 tuyaya 账号\n                │\n                ▼\n  你      ─▶  （首次）注册账号 / 已有直接登录\n                │\n                ▼\n  Buddy   ─▶  📊 diff 差量给你看\n                │\n                ▼\n  你      ─▶  \"上传吧\"\n                │\n                ▼\n  Buddy   ─▶  🚀 批量上传\n                │\n                ▼\n  你      ─▶  🎯 去 www.liuxue.online 看成绩\n```\n\n### 各阶段预计耗时\n\n| 阶段 | 时间 |\n|------|------|\n| 🔍 自动发现 | 3-5 秒 |\n| 📂 深扫 + 确认篇目 | 10-30 秒 |\n| ✍️ 生成 JSON（每篇） | 1-3 分钟 |\n| 🔑 注册/登录（首次） | 30 秒 |\n| 📊 diff | 5 秒 |\n| 🚀 批量上传 | 每篇 1-2 秒 |\n\n**实际示例**：20 篇老复盘，从头到尾约 30-50 分钟。\n\n---\n\n## 🔧 只用本 skill（已经有 JSON 了）\n\n如果 `./batch-output/` 或 `./history-json/` 已经有生成好的 JSON，直接走这套：\n\n### Step 1：绑定账号（首次）\n\n**v1.3.0 推荐 — 浏览器一键授权**：\n\n```bash\nbash ~/.workbuddy/skills/ielts-reading-review/scripts/setup-client-mode.sh\n```\n\n脚本自动起本地服务 → 弹浏览器到授权页 → 点【授权】 → token 写入 `~/.zshrc`，30 秒搞定。\n\n或直接跑上传命令，没 token 时会自动触发授权流：\n\n```bash\nbash ~/.workbuddy/skills/ielts-tuyaya-upload/scripts/sync-review.sh data.json\n```\n\n**老流程（兜底）— CLI 注册/登录**：\n\n```bash\nnode scripts/upload.js --register   # 全新注册\nnode scripts/upload.js --login      # 已有账号\n```\n\n按提示输入用户名、密码、昵称。注册成功后自动登录。\n\n### Step 2：批量上传\n\n```bash\nnode scripts/upload.js --batch ./batch-output/\n```\n\n脚本会自动跳过服务器上已有的记录，只上传新的。\n\n### Step 3：查看成绩\n\n打开 https://www.liuxue.online/ielts/ 登录，所有成绩已在云端。\n\n---\n\n## 所有命令\n\n```\nnode scripts/upload.js --register        # 注册新账号\nnode scripts/upload.js --login           # 登录\nnode scripts/upload.js --logout          # 退出\nnode scripts/upload.js --whoami          # 查看当前账号\n\nnode scripts/upload.js --batch <dir>     # 批量上传目录下所有 JSON\nnode scripts/upload.js <file.json>       # 上传单个 JSON\nnode scripts/upload.js --diff <dir>      # 对比本地和服务器差量\nnode scripts/upload.js --status          # 查看服务器上的成绩\n```\n\n---\n\n## 踩坑提示\n\n### 🟢 AI Buddy 能自动搞定\n\n- 自动找到你的复盘文件夹（不管在桌面、文档、下载还是 iCloud）\n- 识别篇目（文件名有\"剑X-TestX-PassageX\"就能认出来）\n- 正确答案核验（查本地答案库）\n- 多文件合并（同一篇有 HTML + 截图 + MD，会合并读）\n- 注册登录（你跟着提示输入就行）\n- 差量上传（服务器已有的不会重复上传）\n\n### 🟡 它可能搞不定的（需要你补充）\n\n- **文件名没有篇目信息**：比如 `笔记-20260315.docx`，会标为 \"__unknown__\" 让你分配\n- **答案是手写拍照**：AI 识别手写可能有误，生成后扫一眼 JSON 里的 `score.correct` 对不对\n- **错题分析太简略**：老笔记只写了 \"Q3错了\" 没写原因，`wrongQuestions[].analysis` 会是空的（成绩单数据不受影响）\n\n### 🔴 一定不能干的\n\n- 不要一口气喂超过 50 篇，容易超时。分批跑，每次 10-20 篇\n- AI 问你确认时**别秒回 yes**，扫一眼清单对不对\n- 注册密码别用 123456，≥6 位就行但别太水\n\n---\n\n## 常见问题\n\n**Q: Token 过期了怎么办？**\nA: Token 有效期 10 年（v5.1+），过期后重跑 `bash setup-client-mode.sh` 浏览器授权一下即可。\n\n**Q: 每台电脑都要授权一次吗？**\nA: 是的。token 只存本机 `~/.zshrc`，换电脑重跑一次 setup-client-mode.sh 就好。授权流支持记住浏览器登录态，所以二次授权基本是「点一下按钮」的事。\n\n**Q: 浏览器授权安全吗？token 会泄漏到第三方吗？**\nA: 不会。技术细节：\n- 本机起 HTTP 服务监听 `127.0.0.1:随机端口`，授权页通过 `<img>` 请求把 token 回传\n- 回调白名单：服务端校验 callback 必须是 127.0.0.1 / localhost / ::1\n- CSRF state 校验：每次会话生成 16 字节随机串，防止跨站攻击\n- token 不进 URL bar、不走任何第三方服务器，全程仅你浏览器 ↔ 本机进程\n\n**Q: 数据存在哪？**\nA: Token 存在 `~/.ielts-tuyaya-token`（权限 0600，只有自己可读）。成绩数据存在 www.liuxue.online 服务器。\n\n**Q: 可以多账号切换吗？**\nA: 可以。`--logout` 退出后 `--login` 另一个账号即可。\n\n**Q: 忘记密码？**\nA: 目前暂不支持找回，用 `--register` 注册新账号。\n\n**Q: 换电脑了，token 还有效吗？**\nA: token 只在本机保存。换电脑跑一次 `--login` 重新登录就行。\n\n**Q: 注册 tuyaya 账号要手机号/邮箱吗？**\nA: 不要。就用户名 + 密码，完全独立于其他平台。\n\n**Q: 上传过程中失败了会重试吗？**\nA: 同一篇重复上传会自动覆盖。失败的 buddy 会列给你，你说\"重试失败的\"就行。\n\n**Q: 笔记里只写了错题编号（比如 \"Q3/Q7 错了\"），没详细分析，能用吗？**\nA: 能。JSON 会生成基础成绩单（对 X 道/共 Y 道/band 分数），错题分析留空。以后想补细节，再拿着这篇原文找 AI 重新做。\n\n**Q: 批量跑完，哪些数据会显示在网站上？**\nA: 成绩单（每篇对多少道、分数）、错题列表、词汇、同义替换——全部同步。进度图、历史趋势图自动刷新。\n\n---\n\n## 依赖\n\n- Node.js ≥ 18（有原生 fetch）\n- 无需 npm install，纯 Node 标准库\n\n## 相关\n\n- [www.liuxue.online/ielts](https://www.liuxue.online/ielts/) — 你的雅思进度可视化主页\n- `ielts-reading-review` skill — 生成复盘 JSON 的配套工具（配合用最爽）\n\n---\n\n祝复盘愉快 🎯\n\nFile v1.3.2:_meta.json\n\n{\n  \"ownerId\": \"kn7dr93fbgrvymnk8d9r9y0tws83mhrk\",\n  \"slug\": \"ielts-tuyaya-upload\",\n  \"version\": \"1.3.2\",\n  \"publishedAt\": 1782184030308\n}\n\nFile v1.3.2:skill-card.md\n\n## Description:\n\nUploads local IELTS reading review JSON files to www.liuxue.online, with token-based account sync and an anonymous fallback mode.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dengjiawei1226](https://clawhub.ai/user/dengjiawei1226)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nLearners and agents use this skill to upload existing IELTS reading review JSON files, compare local and server records, and view synchronized review progress on www.liuxue.online.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill uploads IELTS review data to www.liuxue.online and uses local account tokens for token mode.\n\nMitigation: Install and run it only after accepting that data flow, and review local token storage before using account sync.\n\nRisk: Anonymous mode can send a persistent local identifier and OS username.\n\nMitigation: Prefer token mode for normal use, or set explicit anonymous identifiers only after deciding that disclosure is acceptable.\n\nRisk: The publishing helper can modify local skill installations and is intended for maintainers.\n\nMitigation: Do not run publish-clawhub.sh unless maintaining the package and prepared for its local install changes.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/dengjiawei1226/skills/ielts-tuyaya-upload)\n- [www.liuxue.online IELTS dashboard](https://www.liuxue.online/ielts/)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands and JSON examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May guide execution of local shell or Node.js upload commands that send JSON review data to www.liuxue.online.]\n\n## Skill Version(s):\n\n1.3.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.3.1: 7 files, 19956 bytes\n\nFiles: publish-clawhub.sh (2584b), README.md (10114b), scripts/sync-review.sh (7745b), scripts/upload.js (16590b), skill-card.md (2535b), SKILL.md (7229b), _meta.json (138b)\n\nFile v1.3.1:SKILL.md\n\n---\nname: ielts-tuyaya-upload\ndescription: \"上传雅思阅读复盘文件到服务器，支持 token 模式（进个人主页）和匿名模式。当用户想要上传已有的复盘 JSON、查看个人复盘仪表板时使用。触发词：上传复盘、上传复盘文件、sync review、upload review、查看我的复盘记录、我的仪表板、dashboard、tuyaya 上传、批量同步。\"\n---\n\n# IELTS Review Upload Skill\n\n## Purpose\n\n把已有的雅思阅读复盘 JSON 上传到 tuyaya.online。支持两种通道：\n\n| 模式 | 触发条件 | 通道 | 数据落点 | 适用 |\n|---|---|---|---|---|\n| **Token 模式（推荐）** | 设置了 `IELTS_USER_TOKEN` 环境变量 | `POST /api/ielts {action:'batchImport', token}` | 主库 + **进个人主页进度图/词汇本** | 登录用户（dengjiawei / lishuzhuo / 其他注册账号） |\n| **匿名模式（兜底）** | 没有 token | `POST /ielts-api/skill-review` (x-api-key) | 匿名 dashboard 表 | 访客试用、未注册账号 |\n\n**默认走 token 模式**。脚本会自动检测 `IELTS_USER_TOKEN`，没设置时 v1.3.0 起会**直接弹起浏览器授权页**让用户一键完成绑定（OAuth 风格），完全无需 F12。\n\n## What's New in v1.3.0 — 浏览器授权流\n\n跟随 ielts-reading-review v5.4.0 升级：\n\n- ❌ **告别 F12 复制 token**：不再需要打开 DevTools → Console 手动 `localStorage.ielts_user_token`\n- ✅ **一键浏览器授权**：缺 token 时 `sync-review.sh` 自动调起 `setup-client-mode.sh` → 浏览器弹 `tuyaya.online/authorize.html` → 点【授权】完事\n- 🔒 **token 全程在本机**：通过 `<img src=http://127.0.0.1:port/cb?token=...>` 回传，不进 URL bar，不走第三方\n- 🛡️ **CSRF 防护**：state 随机串 + 回调白名单（仅 127.0.0.1/localhost）\n- 🪟 **三系统支持**：macOS `open` / Linux `xdg-open` / 兜底打印链接手动粘贴\n\n## When to Activate\n\n- 用户说\"上传复盘\"、\"上传复盘文件\"\n- 用户说 \"sync review\"、\"upload review\"\n- 用户想查看个人复盘仪表板\n- 用户说\"查看我的复盘记录\"、\"我的仪表板\"\n\n## Workflow\n\n### Step 0: 确认 token 是否就位\n\n第一步先检查 `IELTS_USER_TOKEN`：\n\n```bash\necho \"${IELTS_USER_TOKEN:0:20}...\"  # 只显示前 20 位避免泄漏\n```\n\n- **有输出** → 走 token 模式，数据进个人主页 ✅\n- **没输出** → 走 v1.3.0 浏览器授权流（OAuth 风格，30 秒搞定）：\n\n```\n你还没配置 IELTS_USER_TOKEN，上传后数据不会进个人主页进度图。\n\n🔧 一键授权（推荐）：\nbash ~/.workbuddy/skills/ielts-reading-review/scripts/setup-client-mode.sh\n\n脚本会：\n1. 在本机起一个随机端口的 HTTP 服务监听回调\n2. 自动唤起浏览器到 tuyaya.online/authorize.html\n3. 你在网页点【授权】按钮，token 通过 <img> 请求回传到本机\n4. 校验通过后写入 ~/.zshrc 并 source 生效\n5. token 永远不离开你的电脑（不进 URL bar、不走第三方）\n\n兜底（浏览器/网络异常时）：\nbash setup-client-mode.sh --manual    # 走 F12 复制 token 老流程\n\n要不要现在跑一下，还是先走匿名模式？\n```\n\n**v1.3.0 起 sync-review.sh 自动检测 token，没设置时直接调起 setup-client-mode.sh，全程不用手动复制。**\n\n### Step 1: 收集 JSON 文件路径\n\n询问用户要上传的 JSON 文件路径。\n\n**JSON 格式支持两种**：\n\n**扁平格式（最简）**：\n```json\n{\n  \"book\": 5,\n  \"test\": 4,\n  \"passage\": 1,\n  \"score\": 11,\n  \"total\": 13,\n  \"date\": \"2026-04-09\",\n  \"duration\": 2050,\n  \"wrongQuestions\": [3, 7, 12]\n}\n```\n\n**v4.0 富格式（推荐，复盘 skill 直接产出）**：\n```json\n{\n  \"version\": \"4.0.0\",\n  \"source\": {\"book\": 5, \"test\": 4, \"passage\": 1, \"title\": \"...\", \"titleCN\": \"...\"},\n  \"score\": {\"correct\": 11, \"total\": 13, \"band\": \"6.5-7.0\"},\n  \"timing\": {\"minutes\": 34.2, \"formatted\": \"34:10\"},\n  \"date\": \"2026-04-09\",\n  \"wrongQuestions\": [...],\n  \"synonyms\": [...],\n  \"vocabulary\": [...]\n}\n```\n\n服务端 schemaUpgrader 会自动识别富格式，无需手动转换。\n\n### Step 2: 跑上传脚本\n\n```bash\nbash ~/.workbuddy/skills/ielts-review-upload/scripts/sync-review.sh <path-to-data.json>\n```\n\n**脚本行为**：\n- 自动检测 `IELTS_USER_TOKEN`，决定走 token 还是匿名通道\n- token 模式：包装成 batchImport payload，POST 到 `/api/ielts`\n- 匿名模式：用 hostname+username SHA256 生成稳定 user id，POST 到 `/ielts-api/skill-review`\n- 失败时打印明确错误（token 过期 / 字段缺失 / HTTP 错误）\n\n**强制覆盖通道**：\n```bash\nbash sync-review.sh data.json --token-mode    # 强制走 token，没 token 直接报错\nbash sync-review.sh data.json --anon-mode     # 强制走匿名（即使有 token）\n```\n\n### Step 3: 上传后告知查看入口\n\n**Token 模式成功**：\n```\n✅ 上传成功！数据已进入你的个人主页。\n\n📊 查看：https://tuyaya.online/ielts/reading.html\n（登录后能看到进度图、词汇本、错题本同步更新）\n```\n\n**匿名模式成功**：\n```\n✅ 上传成功（匿名）。\n\n📊 你的专属看板：\nhttps://tuyaya.online/ielts-api/web/?user=<USER_ID>&key=<API_KEY>\n\n⚠️ 此数据不在主站个人主页中。建议下次配置 IELTS_USER_TOKEN 以同步到主页。\n```\n\n### Step 4: 入库回查（仅 token 模式，可选但推荐）\n\n```bash\ncurl -s https://tuyaya.online/api/ielts \\\n  -H 'Content-Type: application/json' \\\n  -d \"{\\\"action\\\":\\\"getReviews\\\",\\\"token\\\":\\\"$IELTS_USER_TOKEN\\\",\\\"book\\\":5,\\\"test\\\":4}\" \\\n  | python3 -m json.tool\n```\n\n确认返回的 data 数组里有刚上传的篇目。\n\n## Configuration\n\n### Token（推荐，token 模式）\n\n- 浏览器 `localStorage.token` 取，写入 `~/.zshrc`：\n  ```bash\n  export IELTS_USER_TOKEN='eyJ1Ijoi...'\n  ```\n- 也可以用 `~/.workbuddy/skills/ielts-reading-review/scripts/get-token.sh` 一键签发（如已部署）\n\n### API Key（匿名模式 fallback）\n\n脚本内置默认 API key：`ielts_8b0832b3cfd38884e44ab26ee68acaeed294623ef8da9b201871a7768b072606`\n\n如需更换：\n```bash\nexport IELTS_API_KEY='your_key_here'\n```\n\n### Backend URL\n\n```bash\nexport IELTS_API_BASE='https://tuyaya.online/api/ielts'        # token 模式\nexport IELTS_LEGACY_BASE='https://tuyaya.online/ielts-api'     # 匿名模式\n```\n\n## Reference Files\n\n| File | Purpose |\n|------|---------|\n| `scripts/sync-review.sh` | 双通道上传脚本（token + 匿名 fallback） |\n\n## Troubleshooting\n\n### \"token 过期 / 401\"\n\n重新登录 tuyaya.online 拿新 token，更新 `IELTS_USER_TOKEN`。\n\n### \"缺少 book/test/passage\"\n\nJSON 必须包含 `source.book`/`source.test`/`source.passage`（v4.0）或顶层 `book`/`test`/`passage`（扁平）。\n\n### \"Upload failed (HTTP 5xx)\"\n\n后端服务异常，先 ping 健康检查：\n```bash\ncurl https://tuyaya.online/api/health\n```\n\n### 数据没进个人主页\n\n检查：\n1. `echo $IELTS_USER_TOKEN` 是否真的有值（可能 `.zshrc` 没 source）\n2. 脚本输出有没有 `Mode: token`，如果是 `Mode: anon` 则数据在匿名表里\n\n## Style Guidelines\n\n- 简洁直接，不要多余包装\n- 默认推荐 token 模式，仅在用户明确要匿名或没条件配 token 时走 fallback\n- 上传完成后必须打印查看入口\n\nFile v1.3.1:README.md\n\n# IELTS Tuyaya Upload\n\n把本地雅思阅读复盘 JSON 一键上传到 [tuyaya.online](https://tuyaya.online/ielts/)，告别手动拖文件。\n\n## 🆕 v1.3.0 — 浏览器一键授权（告别 F12）\n\n跟随 `ielts-reading-review` v5.4.0 同步升级，**绑定账号体验彻底重做**：\n\n| 旧流程 (≤v1.2) | 新流程 (v1.3+) |\n|---|---|\n| 打开 tuyaya.online 登录 | 同左 |\n| F12 → Console → `localStorage.ielts_user_token` | ❌ 不再需要 |\n| 手动复制 token 字符串 | ❌ 不再需要 |\n| 打开 ~/.zshrc 手动 `export IELTS_USER_TOKEN=...` | ❌ 不再需要 |\n| `source ~/.zshrc` | ❌ 不再需要 |\n| —— | ✅ 浏览器弹授权页，点一下【授权】完事 |\n\n**触发方式**：跑任何上传命令（如 `node scripts/upload.js --batch xxx`），脚本检测到没设 `IELTS_USER_TOKEN` 就会自动调起 `setup-client-mode.sh`，几秒后浏览器弹出 OAuth 风格的授权卡片。\n\n**安全保障**：\n- token 通过 `<img src=http://127.0.0.1:随机端口/cb?token=...>` 回传到本机，永远不离开你的电脑\n- 回调地址白名单：仅接受 `127.0.0.1 / localhost / ::1`\n- CSRF state 校验：每次启动随机生成 16 字节，防止跨站攻击\n- token 不进浏览器 URL bar、不走第三方服务器\n\n如果浏览器异常，可手动跑 `bash setup-client-mode.sh --manual` 走 F12 老流程兜底。\n\n---\n\n## 适合谁用？\n\n- 用 `ielts-reading-review` skill 生成了一堆 JSON 复盘文件\n- 想把成绩同步到 tuyaya.online 云端，在任何设备打开网页查看\n- 不想手动一个个拖到 submit 页面\n- 有一堆旧笔记（HTML/Markdown/截图）想一次性导入成绩看趋势图\n\n## 🚀 端到端一条龙（推荐）\n\n如果你的复盘还是散在文件夹里的旧笔记，推荐配合 `ielts-reading-review` v3.4.0+ 一起用：**自动扫 → 生成 JSON → 自动上传**，一条 prompt 搞定。\n\n### Step 1：装两个 skill（只做一次）\n\n```bash\nclawhub install ielts-reading-review\nclawhub install ielts-tuyaya-upload\n```\n\n### Step 2：把下面这段 prompt 整段发给你的 AI Buddy\n\n**不用改任何内容，复制粘贴直接发就行。**\n\n```\n帮我一条龙处理我的历史雅思复盘。\n\n流程：\n\n【A. 自动找复盘文件夹】\n1. 用 ielts-reading-review skill 的 scan-legacy-reviews.js --auto 扫我电脑常见位置\n2. 把推荐目录和其他候选报给我，让我确认用哪个\n\n【B. 生成 JSON】\n3. 对确认后的目录做深扫（--deep），列出识别到的篇目清单，让我再确认一次\n4. 逐篇生成 v3.0 schema 的 JSON，输出到 ./batch-output/\n5. 字段缺失的地方不要瞎编，缺就置空\n6. 汇报成功几篇、数据缺失几篇\n\n【C. 上传到 tuyaya.online】\n7. 用 ielts-tuyaya-upload skill 检查登录状态（--whoami）\n   - 如果我还没账号：引导我 --register 注册（我会自己输入用户名密码）\n   - 如果已登录：继续\n8. 先跑 --diff ./batch-output/ 给我看差量（哪些是新的、哪些服务器已有）\n9. 我确认后，跑 --batch ./batch-output/ 批量上传\n10. 上传完告诉我成功几条，给我 https://tuyaya.online/ielts/ 的链接让我去看成绩\n\n规则：\n- 每一步之间要停下来等我确认，别一口气全跑完\n- 注册/登录时让我自己在终端输入密码，你不要替我生成\n- 上传过程中有失败的，列出来让我决定要不要重试\n```\n\n### Step 3：按 Buddy 提示逐步确认\n\nAI 会每一步停下来让你确认：路径对不对 → 篇目清单对不对 → 上传差量对不对 → 最后给你成绩链接。\n\n### 全流程示意\n\n```\n  你      ─▶  我发 prompt\n                │\n                ▼\n  Buddy   ─▶  🔍 auto 扫电脑\n                │\n                ▼\n  你      ─▶  确认\"用这个目录\"\n                │\n                ▼\n  Buddy   ─▶  📂 深扫列出所有篇目\n                │\n                ▼\n  你      ─▶  确认\"篇目没错\"\n                │\n                ▼\n  Buddy   ─▶  ✍️  逐篇生成 JSON 到 batch-output/\n                │\n                ▼\n  Buddy   ─▶  🔑 检查 tuyaya 账号\n                │\n                ▼\n  你      ─▶  （首次）注册账号 / 已有直接登录\n                │\n                ▼\n  Buddy   ─▶  📊 diff 差量给你看\n                │\n                ▼\n  你      ─▶  \"上传吧\"\n                │\n                ▼\n  Buddy   ─▶  🚀 批量上传\n                │\n                ▼\n  你      ─▶  🎯 去 tuyaya.online 看成绩\n```\n\n### 各阶段预计耗时\n\n| 阶段 | 时间 |\n|------|------|\n| 🔍 自动发现 | 3-5 秒 |\n| 📂 深扫 + 确认篇目 | 10-30 秒 |\n| ✍️ 生成 JSON（每篇） | 1-3 分钟 |\n| 🔑 注册/登录（首次） | 30 秒 |\n| 📊 diff | 5 秒 |\n| 🚀 批量上传 | 每篇 1-2 秒 |\n\n**实际示例**：20 篇老复盘，从头到尾约 30-50 分钟。\n\n---\n\n## 🔧 只用本 skill（已经有 JSON 了）\n\n如果 `./batch-output/` 或 `./history-json/` 已经有生成好的 JSON，直接走这套：\n\n### Step 1：绑定账号（首次）\n\n**v1.3.0 推荐 — 浏览器一键授权**：\n\n```bash\nbash ~/.workbuddy/skills/ielts-reading-review/scripts/setup-client-mode.sh\n```\n\n脚本自动起本地服务 → 弹浏览器到授权页 → 点【授权】 → token 写入 `~/.zshrc`，30 秒搞定。\n\n或直接跑上传命令，没 token 时会自动触发授权流：\n\n```bash\nbash ~/.workbuddy/skills/ielts-tuyaya-upload/scripts/sync-review.sh data.json\n```\n\n**老流程（兜底）— CLI 注册/登录**：\n\n```bash\nnode scripts/upload.js --register   # 全新注册\nnode scripts/upload.js --login      # 已有账号\n```\n\n按提示输入用户名、密码、昵称。注册成功后自动登录。\n\n### Step 2：批量上传\n\n```bash\nnode scripts/upload.js --batch ./batch-output/\n```\n\n脚本会自动跳过服务器上已有的记录，只上传新的。\n\n### Step 3：查看成绩\n\n打开 https://tuyaya.online/ielts/ 登录，所有成绩已在云端。\n\n---\n\n## 所有命令\n\n```\nnode scripts/upload.js --register        # 注册新账号\nnode scripts/upload.js --login           # 登录\nnode scripts/upload.js --logout          # 退出\nnode scripts/upload.js --whoami          # 查看当前账号\n\nnode scripts/upload.js --batch <dir>     # 批量上传目录下所有 JSON\nnode scripts/upload.js <file.json>       # 上传单个 JSON\nnode scripts/upload.js --diff <dir>      # 对比本地和服务器差量\nnode scripts/upload.js --status          # 查看服务器上的成绩\n```\n\n---\n\n## 踩坑提示\n\n### 🟢 AI Buddy 能自动搞定\n\n- 自动找到你的复盘文件夹（不管在桌面、文档、下载还是 iCloud）\n- 识别篇目（文件名有\"剑X-TestX-PassageX\"就能认出来）\n- 正确答案核验（查本地答案库）\n- 多文件合并（同一篇有 HTML + 截图 + MD，会合并读）\n- 注册登录（你跟着提示输入就行）\n- 差量上传（服务器已有的不会重复上传）\n\n### 🟡 它可能搞不定的（需要你补充）\n\n- **文件名没有篇目信息**：比如 `笔记-20260315.docx`，会标为 \"__unknown__\" 让你分配\n- **答案是手写拍照**：AI 识别手写可能有误，生成后扫一眼 JSON 里的 `score.correct` 对不对\n- **错题分析太简略**：老笔记只写了 \"Q3错了\" 没写原因，`wrongQuestions[].analysis` 会是空的（成绩单数据不受影响）\n\n### 🔴 一定不能干的\n\n- 不要一口气喂超过 50 篇，容易超时。分批跑，每次 10-20 篇\n- AI 问你确认时**别秒回 yes**，扫一眼清单对不对\n- 注册密码别用 123456，≥6 位就行但别太水\n\n---\n\n## 常见问题\n\n**Q: Token 过期了怎么办？**\nA: Token 有效期 10 年（v5.1+），过期后重跑 `bash setup-client-mode.sh` 浏览器授权一下即可。\n\n**Q: 每台电脑都要授权一次吗？**\nA: 是的。token 只存本机 `~/.zshrc`，换电脑重跑一次 setup-client-mode.sh 就好。授权流支持记住浏览器登录态，所以二次授权基本是「点一下按钮」的事。\n\n**Q: 浏览器授权安全吗？token 会泄漏到第三方吗？**\nA: 不会。技术细节：\n- 本机起 HTTP 服务监听 `127.0.0.1:随机端口`，授权页通过 `<img>` 请求把 token 回传\n- 回调白名单：服务端校验 callback 必须是 127.0.0.1 / localhost / ::1\n- CSRF state 校验：每次会话生成 16 字节随机串，防止跨站攻击\n- token 不进 URL bar、不走任何第三方服务器，全程仅你浏览器 ↔ 本机进程\n\n**Q: 数据存在哪？**\nA: Token 存在 `~/.ielts-tuyaya-token`（权限 0600，只有自己可读）。成绩数据存在 tuyaya.online 服务器。\n\n**Q: 可以多账号切换吗？**\nA: 可以。`--logout` 退出后 `--login` 另一个账号即可。\n\n**Q: 忘记密码？**\nA: 目前暂不支持找回，用 `--register` 注册新账号。\n\n**Q: 换电脑了，token 还有效吗？**\nA: token 只在本机保存。换电脑跑一次 `--login` 重新登录就行。\n\n**Q: 注册 tuyaya 账号要手机号/邮箱吗？**\nA: 不要。就用户名 + 密码，完全独立于其他平台。\n\n**Q: 上传过程中失败了会重试吗？**\nA: 同一篇重复上传会自动覆盖。失败的 buddy 会列给你，你说\"重试失败的\"就行。\n\n**Q: 笔记里只写了错题编号（比如 \"Q3/Q7 错了\"），没详细分析，能用吗？**\nA: 能。JSON 会生成基础成绩单（对 X 道/共 Y 道/band 分数），错题分析留空。以后想补细节，再拿着这篇原文找 AI 重新做。\n\n**Q: 批量跑完，哪些数据会显示在网站上？**\nA: 成绩单（每篇对多少道、分数）、错题列表、词汇、同义替换——全部同步。进度图、历史趋势图自动刷新。\n\n---\n\n## 依赖\n\n- Node.js ≥ 18（有原生 fetch）\n- 无需 npm install，纯 Node 标准库\n\n## 相关\n\n- [tuyaya.online/ielts](https://tuyaya.online/ielts/) — 你的雅思进度可视化主页\n- `ielts-reading-review` skill — 生成复盘 JSON 的配套工具（配合用最爽）\n\n---\n\n祝复盘愉快 🎯\n\nFile v1.3.1:_meta.json\n\n{\n  \"ownerId\": \"kn7dr93fbgrvymnk8d9r9y0tws83mhrk\",\n  \"slug\": \"ielts-tuyaya-upload\",\n  \"version\": \"1.3.1\",\n  \"publishedAt\": 1779279899372\n}\n\nFile v1.3.1:skill-card.md\n\n## Description: <br>\nUploads local IELTS reading review JSON to tuyaya.online in token mode for account-bound dashboards or anonymous mode for fallback dashboards. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[dengjiawei1226](https://clawhub.ai/user/dengjiawei1226) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nIELTS learners and agents that already have IELTS reading review JSON use this skill to upload single files or batches to tuyaya.online, compare local reviews with server records, and open account-bound or anonymous dashboards. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: IELTS review JSON and tuyaya authentication tokens are sent to tuyaya.online. <br>\nMitigation: Install only if comfortable with that data transfer, review files before batch upload, and avoid sharing tokens, terminal output, or chat logs that contain sensitive values. <br>\nRisk: Anonymous mode can link uploads to a stable local identifier and exposes dashboard links that include access parameters. <br>\nMitigation: Treat anonymous uploads as pseudonymous, do not share anonymous dashboard links, and prefer token mode for account-bound data. <br>\nRisk: Saved tokens and printed status output can expose account access if copied into logs or shared prompts. <br>\nMitigation: Keep token files and environment variables private, mask token values when checking configuration, and rotate or re-login if a token may have been exposed. <br>\n\n\n## Reference(s): <br>\n- [ClawHub release page](https://clawhub.ai/dengjiawei1226/ielts-tuyaya-upload) <br>\n- [Tuyaya IELTS](https://tuyaya.online/ielts/) <br>\n- [Tuyaya IELTS reading dashboard](https://tuyaya.online/ielts/reading.html) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with inline shell commands and status output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May invoke local shell scripts that upload JSON files and print dashboard URLs, token status, diff results, or upload errors.] <br>\n\n## Skill Version(s): <br>\n1.3.1 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.3.0: 6 files, 16973 bytes\n\nFiles: publish-clawhub.sh (2580b), README.md (7674b), scripts/sync-review.sh (7745b), scripts/upload.js (16590b), SKILL.md (6014b), _meta.json (138b)\n\nFile v1.3.0:SKILL.md\n\n---\nname: ielts-tuyaya-upload\ndescription: \"上传雅思阅读复盘文件到服务器，支持 token 模式（进个人主页）和匿名模式。当用户想要上传已有的复盘 JSON、查看个人复盘仪表板时使用。触发词：上传复盘、上传复盘文件、sync review、upload review、查看我的复盘记录、我的仪表板、dashboard、tuyaya 上传、批量同步。\"\n---\n\n# IELTS Review Upload Skill\n\n## Purpose\n\n把已有的雅思阅读复盘 JSON 上传到 tuyaya.online。支持两种通道：\n\n| 模式 | 触发条件 | 通道 | 数据落点 | 适用 |\n|---|---|---|---|---|\n| **Token 模式（推荐）** | 设置了 `IELTS_USER_TOKEN` 环境变量 | `POST /api/ielts {action:'batchImport', token}` | 主库 + **进个人主页进度图/词汇本** | 登录用户（dengjiawei / lishuzhuo / 其他注册账号） |\n| **匿名模式（兜底）** | 没有 token | `POST /ielts-api/skill-review` (x-api-key) | 匿名 dashboard 表 | 访客试用、未注册账号 |\n\n**默认走 token 模式**。脚本会自动检测 `IELTS_USER_TOKEN`，没设置才 fallback 到匿名。\n\n## When to Activate\n\n- 用户说\"上传复盘\"、\"上传复盘文件\"\n- 用户说 \"sync review\"、\"upload review\"\n- 用户想查看个人复盘仪表板\n- 用户说\"查看我的复盘记录\"、\"我的仪表板\"\n\n## Workflow\n\n### Step 0: 确认 token 是否就位\n\n第一步先检查 `IELTS_USER_TOKEN`：\n\n```bash\necho \"${IELTS_USER_TOKEN:0:20}...\"  # 只显示前 20 位避免泄漏\n```\n\n- **有输出** → 走 token 模式，数据进个人主页 ✅\n- **没输出** → 提醒用户：\n\n```\n你还没配置 IELTS_USER_TOKEN，上传后数据不会进个人主页进度图。\n\n🔧 一次配置永久生效：\n1. 浏览器登录 https://tuyaya.online/ielts/login.html\n2. 打开 DevTools → Console，运行：localStorage.token\n3. 复制返回的字符串（一长串 base64）\n4. 在 ~/.zshrc 或 ~/.bashrc 末尾加一行：\n   export IELTS_USER_TOKEN='粘贴token'\n5. source ~/.zshrc\n\n要不要先帮你配 token，还是直接走匿名模式？\n```\n\n### Step 1: 收集 JSON 文件路径\n\n询问用户要上传的 JSON 文件路径。\n\n**JSON 格式支持两种**：\n\n**扁平格式（最简）**：\n```json\n{\n  \"book\": 5,\n  \"test\": 4,\n  \"passage\": 1,\n  \"score\": 11,\n  \"total\": 13,\n  \"date\": \"2026-04-09\",\n  \"duration\": 2050,\n  \"wrongQuestions\": [3, 7, 12]\n}\n```\n\n**v4.0 富格式（推荐，复盘 skill 直接产出）**：\n```json\n{\n  \"version\": \"4.0.0\",\n  \"source\": {\"book\": 5, \"test\": 4, \"passage\": 1, \"title\": \"...\", \"titleCN\": \"...\"},\n  \"score\": {\"correct\": 11, \"total\": 13, \"band\": \"6.5-7.0\"},\n  \"timing\": {\"minutes\": 34.2, \"formatted\": \"34:10\"},\n  \"date\": \"2026-04-09\",\n  \"wrongQuestions\": [...],\n  \"synonyms\": [...],\n  \"vocabulary\": [...]\n}\n```\n\n服务端 schemaUpgrader 会自动识别富格式，无需手动转换。\n\n### Step 2: 跑上传脚本\n\n```bash\nbash ~/.workbuddy/skills/ielts-review-upload/scripts/sync-review.sh <path-to-data.json>\n```\n\n**脚本行为**：\n- 自动检测 `IELTS_USER_TOKEN`，决定走 token 还是匿名通道\n- token 模式：包装成 batchImport payload，POST 到 `/api/ielts`\n- 匿名模式：用 hostname+username SHA256 生成稳定 user id，POST 到 `/ielts-api/skill-review`\n- 失败时打印明确错误（token 过期 / 字段缺失 / HTTP 错误）\n\n**强制覆盖通道**：\n```bash\nbash sync-review.sh data.json --token-mode    # 强制走 token，没 token 直接报错\nbash sync-review.sh data.json --anon-mode     # 强制走匿名（即使有 token）\n```\n\n### Step 3: 上传后告知查看入口\n\n**Token 模式成功**：\n```\n✅ 上传成功！数据已进入你的个人主页。\n\n📊 查看：https://tuyaya.online/ielts/reading.html\n（登录后能看到进度图、词汇本、错题本同步更新）\n```\n\n**匿名模式成功**：\n```\n✅ 上传成功（匿名）。\n\n📊 你的专属看板：\nhttps://tuyaya.online/ielts-api/web/?user=<USER_ID>&key=<API_KEY>\n\n⚠️ 此数据不在主站个人主页中。建议下次配置 IELTS_USER_TOKEN 以同步到主页。\n```\n\n### Step 4: 入库回查（仅 token 模式，可选但推荐）\n\n```bash\ncurl -s https://tuyaya.online/api/ielts \\\n  -H 'Content-Type: application/json' \\\n  -d \"{\\\"action\\\":\\\"getReviews\\\",\\\"token\\\":\\\"$IELTS_USER_TOKEN\\\",\\\"book\\\":5,\\\"test\\\":4}\" \\\n  | python3 -m json.tool\n```\n\n确认返回的 data 数组里有刚上传的篇目。\n\n## Configuration\n\n### Token（推荐，token 模式）\n\n- 浏览器 `localStorage.token` 取，写入 `~/.zshrc`：\n  ```bash\n  export IELTS_USER_TOKEN='eyJ1Ijoi...'\n  ```\n- 也可以用 `~/.workbuddy/skills/ielts-reading-review/scripts/get-token.sh` 一键签发（如已部署）\n\n### API Key（匿名模式 fallback）\n\n脚本内置默认 API key：`ielts_8b0832b3cfd38884e44ab26ee68acaeed294623ef8da9b201871a7768b072606`\n\n如需更换：\n```bash\nexport IELTS_API_KEY='your_key_here'\n```\n\n### Backend URL\n\n```bash\nexport IELTS_API_BASE='https://tuyaya.online/api/ielts'        # token 模式\nexport IELTS_LEGACY_BASE='https://tuyaya.online/ielts-api'     # 匿名模式\n```\n\n## Reference Files\n\n| File | Purpose |\n|------|---------|\n| `scripts/sync-review.sh` | 双通道上传脚本（token + 匿名 fallback） |\n\n## Troubleshooting\n\n### \"token 过期 / 401\"\n\n重新登录 tuyaya.online 拿新 token，更新 `IELTS_USER_TOKEN`。\n\n### \"缺少 book/test/passage\"\n\nJSON 必须包含 `source.book`/`source.test`/`source.passage`（v4.0）或顶层 `book`/`test`/`passage`（扁平）。\n\n### \"Upload failed (HTTP 5xx)\"\n\n后端服务异常，先 ping 健康检查：\n```bash\ncurl https://tuyaya.online/api/health\n```\n\n### 数据没进个人主页\n\n检查：\n1. `echo $IELTS_USER_TOKEN` 是否真的有值（可能 `.zshrc` 没 source）\n2. 脚本输出有没有 `Mode: token`，如果是 `Mode: anon` 则数据在匿名表里\n\n## Style Guidelines\n\n- 简洁直接，不要多余包装\n- 默认推荐 token 模式，仅在用户明确要匿名或没条件配 token 时走 fallback\n- 上传完成后必须打印查看入口\n\nFile v1.3.0:README.md\n\n# IELTS Tuyaya Upload\n\n把本地雅思阅读复盘 JSON 一键上传到 [tuyaya.online](https://tuyaya.online/ielts/)，告别手动拖文件。\n\n## 适合谁用？\n\n- 用 `ielts-reading-review` skill 生成了一堆 JSON 复盘文件\n- 想把成绩同步到 tuyaya.online 云端，在任何设备打开网页查看\n- 不想手动一个个拖到 submit 页面\n- 有一堆旧笔记（HTML/Markdown/截图）想一次性导入成绩看趋势图\n\n## 🚀 端到端一条龙（推荐）\n\n如果你的复盘还是散在文件夹里的旧笔记，推荐配合 `ielts-reading-review` v3.4.0+ 一起用：**自动扫 → 生成 JSON → 自动上传**，一条 prompt 搞定。\n\n### Step 1：装两个 skill（只做一次）\n\n```bash\nclawhub install ielts-reading-review\nclawhub install ielts-tuyaya-upload\n```\n\n### Step 2：把下面这段 prompt 整段发给你的 AI Buddy\n\n**不用改任何内容，复制粘贴直接发就行。**\n\n```\n帮我一条龙处理我的历史雅思复盘。\n\n流程：\n\n【A. 自动找复盘文件夹】\n1. 用 ielts-reading-review skill 的 scan-legacy-reviews.js --auto 扫我电脑常见位置\n2. 把推荐目录和其他候选报给我，让我确认用哪个\n\n【B. 生成 JSON】\n3. 对确认后的目录做深扫（--deep），列出识别到的篇目清单，让我再确认一次\n4. 逐篇生成 v3.0 schema 的 JSON，输出到 ./batch-output/\n5. 字段缺失的地方不要瞎编，缺就置空\n6. 汇报成功几篇、数据缺失几篇\n\n【C. 上传到 tuyaya.online】\n7. 用 ielts-tuyaya-upload skill 检查登录状态（--whoami）\n   - 如果我还没账号：引导我 --register 注册（我会自己输入用户名密码）\n   - 如果已登录：继续\n8. 先跑 --diff ./batch-output/ 给我看差量（哪些是新的、哪些服务器已有）\n9. 我确认后，跑 --batch ./batch-output/ 批量上传\n10. 上传完告诉我成功几条，给我 https://tuyaya.online/ielts/ 的链接让我去看成绩\n\n规则：\n- 每一步之间要停下来等我确认，别一口气全跑完\n- 注册/登录时让我自己在终端输入密码，你不要替我生成\n- 上传过程中有失败的，列出来让我决定要不要重试\n```\n\n### Step 3：按 Buddy 提示逐步确认\n\nAI 会每一步停下来让你确认：路径对不对 → 篇目清单对不对 → 上传差量对不对 → 最后给你成绩链接。\n\n### 全流程示意\n\n```\n  你      ─▶  我发 prompt\n                │\n                ▼\n  Buddy   ─▶  🔍 auto 扫电脑\n                │\n                ▼\n  你      ─▶  确认\"用这个目录\"\n                │\n                ▼\n  Buddy   ─▶  📂 深扫列出所有篇目\n                │\n                ▼\n  你      ─▶  确认\"篇目没错\"\n                │\n                ▼\n  Buddy   ─▶  ✍️  逐篇生成 JSON 到 batch-output/\n                │\n                ▼\n  Buddy   ─▶  🔑 检查 tuyaya 账号\n                │\n                ▼\n  你      ─▶  （首次）注册账号 / 已有直接登录\n                │\n                ▼\n  Buddy   ─▶  📊 diff 差量给你看\n                │\n                ▼\n  你      ─▶  \"上传吧\"\n                │\n                ▼\n  Buddy   ─▶  🚀 批量上传\n                │\n                ▼\n  你      ─▶  🎯 去 tuyaya.online 看成绩\n```\n\n### 各阶段预计耗时\n\n| 阶段 | 时间 |\n|------|------|\n| 🔍 自动发现 | 3-5 秒 |\n| 📂 深扫 + 确认篇目 | 10-30 秒 |\n| ✍️ 生成 JSON（每篇） | 1-3 分钟 |\n| 🔑 注册/登录（首次） | 30 秒 |\n| 📊 diff | 5 秒 |\n| 🚀 批量上传 | 每篇 1-2 秒 |\n\n**实际示例**：20 篇老复盘，从头到尾约 30-50 分钟。\n\n---\n\n## 🔧 只用本 skill（已经有 JSON 了）\n\n如果 `./batch-output/` 或 `./history-json/` 已经有生成好的 JSON，直接走这套：\n\n### Step 1：注册账号（首次）\n\n```bash\nnode scripts/upload.js --register\n```\n\n按提示输入用户名、密码、昵称。注册成功后自动登录。\n\n已有账号？直接登录：\n\n```bash\nnode scripts/upload.js --login\n```\n\n### Step 2：批量上传\n\n```bash\nnode scripts/upload.js --batch ./batch-output/\n```\n\n脚本会自动跳过服务器上已有的记录，只上传新的。\n\n### Step 3：查看成绩\n\n打开 https://tuyaya.online/ielts/ 登录，所有成绩已在云端。\n\n---\n\n## 所有命令\n\n```\nnode scripts/upload.js --register        # 注册新账号\nnode scripts/upload.js --login           # 登录\nnode scripts/upload.js --logout          # 退出\nnode scripts/upload.js --whoami          # 查看当前账号\n\nnode scripts/upload.js --batch <dir>     # 批量上传目录下所有 JSON\nnode scripts/upload.js <file.json>       # 上传单个 JSON\nnode scripts/upload.js --diff <dir>      # 对比本地和服务器差量\nnode scripts/upload.js --status          # 查看服务器上的成绩\n```\n\n---\n\n## 踩坑提示\n\n### 🟢 AI Buddy 能自动搞定\n\n- 自动找到你的复盘文件夹（不管在桌面、文档、下载还是 iCloud）\n- 识别篇目（文件名有\"剑X-TestX-PassageX\"就能认出来）\n- 正确答案核验（查本地答案库）\n- 多文件合并（同一篇有 HTML + 截图 + MD，会合并读）\n- 注册登录（你跟着提示输入就行）\n- 差量上传（服务器已有的不会重复上传）\n\n### 🟡 它可能搞不定的（需要你补充）\n\n- **文件名没有篇目信息**：比如 `笔记-20260315.docx`，会标为 \"__unknown__\" 让你分配\n- **答案是手写拍照**：AI 识别手写可能有误，生成后扫一眼 JSON 里的 `score.correct` 对不对\n- **错题分析太简略**：老笔记只写了 \"Q3错了\" 没写原因，`wrongQuestions[].analysis` 会是空的（成绩单数据不受影响）\n\n### 🔴 一定不能干的\n\n- 不要一口气喂超过 50 篇，容易超时。分批跑，每次 10-20 篇\n- AI 问你确认时**别秒回 yes**，扫一眼清单对不对\n- 注册密码别用 123456，≥6 位就行但别太水\n\n---\n\n## 常见问题\n\n**Q: Token 过期了怎么办？**\nA: Token 有效期 30 天，过期后运行 `--login` 重新登录即可。\n\n**Q: 数据存在哪？**\nA: Token 存在 `~/.ielts-tuyaya-token`（权限 0600，只有自己可读）。成绩数据存在 tuyaya.online 服务器。\n\n**Q: 可以多账号切换吗？**\nA: 可以。`--logout` 退出后 `--login` 另一个账号即可。\n\n**Q: 忘记密码？**\nA: 目前暂不支持找回，用 `--register` 注册新账号。\n\n**Q: 换电脑了，token 还有效吗？**\nA: token 只在本机保存。换电脑跑一次 `--login` 重新登录就行。\n\n**Q: 注册 tuyaya 账号要手机号/邮箱吗？**\nA: 不要。就用户名 + 密码，完全独立于其他平台。\n\n**Q: 上传过程中失败了会重试吗？**\nA: 同一篇重复上传会自动覆盖。失败的 buddy 会列给你，你说\"重试失败的\"就行。\n\n**Q: 笔记里只写了错题编号（比如 \"Q3/Q7 错了\"），没详细分析，能用吗？**\nA: 能。JSON 会生成基础成绩单（对 X 道/共 Y 道/band 分数），错题分析留空。以后想补细节，再拿着这篇原文找 AI 重新做。\n\n**Q: 批量跑完，哪些数据会显示在网站上？**\nA: 成绩单（每篇对多少道、分数）、错题列表、词汇、同义替换——全部同步。进度图、历史趋势图自动刷新。\n\n---\n\n## 依赖\n\n- Node.js ≥ 18（有原生 fetch）\n- 无需 npm install，纯 Node 标准库\n\n## 相关\n\n- [tuyaya.online/ielts](https://tuyaya.online/ielts/) — 你的雅思进度可视化主页\n- `ielts-reading-review` skill — 生成复盘 JSON 的配套工具（配合用最爽）\n\n---\n\n祝复盘愉快 🎯\n\nFile v1.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn7dr93fbgrvymnk8d9r9y0tws83mhrk\",\n  \"slug\": \"ielts-tuyaya-upload\",\n  \"version\": \"1.3.0\",\n  \"publishedAt\": 1779260204428\n}\n\nArchive v1.2.0: 6 files, 16758 bytes\n\nFiles: publish-clawhub.sh (2900b), README.md (7674b), scripts/sync-review.sh (6575b), scripts/upload.js (16590b), SKILL.md (6014b), _meta.json (138b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: ielts-tuyaya-upload\ndescription: \"上传雅思阅读复盘文件到服务器，支持 token 模式（进个人主页）和匿名模式。当用户想要上传已有的复盘 JSON、查看个人复盘仪表板时使用。触发词：上传复盘、上传复盘文件、sync review、upload review、查看我的复盘记录、我的仪表板、dashboard、tuyaya 上传、批量同步。\"\n---\n\n# IELTS Review Upload Skill\n\n## Purpose\n\n把已有的雅思阅读复盘 JSON 上传到 tuyaya.online。支持两种通道：\n\n| 模式 | 触发条件 | 通道 | 数据落点 | 适用 |\n|---|---|---|---|---|\n| **Token 模式（推荐）** | 设置了 `IELTS_USER_TOKEN` 环境变量 | `POST /api/ielts {action:'batchImport', token}` | 主库 + **进个人主页进度图/词汇本** | 登录用户（dengjiawei / lishuzhuo / 其他注册账号） |\n| **匿名模式（兜底）** | 没有 token | `POST /ielts-api/skill-review` (x-api-key) | 匿名 dashboard 表 | 访客试用、未注册账号 |\n\n**默认走 token 模式**。脚本会自动检测 `IELTS_USER_TOKEN`，没设置才 fallback 到匿名。\n\n## When to Activate\n\n- 用户说\"上传复盘\"、\"上传复盘文件\"\n- 用户说 \"sync review\"、\"upload review\"\n- 用户想查看个人复盘仪表板\n- 用户说\"查看我的复盘记录\"、\"我的仪表板\"\n\n## Workflow\n\n### Step 0: 确认 token 是否就位\n\n第一步先检查 `IELTS_USER_TOKEN`：\n\n```bash\necho \"${IELTS_USER_TOKEN:0:20}...\"  # 只显示前 20 位避免泄漏\n```\n\n- **有输出** → 走 token 模式，数据进个人主页 ✅\n- **没输出** → 提醒用户：\n\n```\n你还没配置 IELTS_USER_TOKEN，上传后数据不会进个人主页进度图。\n\n🔧 一次配置永久生效：\n1. 浏览器登录 https://tuyaya.online/ielts/login.html\n2. 打开 DevTools → Console，运行：localStorage.token\n3. 复制返回的字符串（一长串 base64）\n4. 在 ~/.zshrc 或 ~/.bashrc 末尾加一行：\n   export IELTS_USER_TOKEN='粘贴token'\n5. source ~/.zshrc\n\n要不要先帮你配 token，还是直接走匿名模式？\n```\n\n### Step 1: 收集 JSON 文件路径\n\n询问用户要上传的 JSON 文件路径。\n\n**JSON 格式支持两种**：\n\n**扁平格式（最简）**：\n```json\n{\n  \"book\": 5,\n  \"test\": 4,\n  \"passage\": 1,\n  \"score\": 11,\n  \"total\": 13,\n  \"date\": \"2026-04-09\",\n  \"duration\": 2050,\n  \"wrongQuestions\": [3, 7, 12]\n}\n```\n\n**v4.0 富格式（推荐，复盘 skill 直接产出）**：\n```json\n{\n  \"version\": \"4.0.0\",\n  \"source\": {\"book\": 5, \"test\": 4, \"passage\": 1, \"title\": \"...\", \"titleCN\": \"...\"},\n  \"score\": {\"correct\": 11, \"total\": 13, \"band\": \"6.5-7.0\"},\n  \"timing\": {\"minutes\": 34.2, \"formatted\": \"34:10\"},\n  \"date\": \"2026-04-09\",\n  \"wrongQuestions\": [...],\n  \"synonyms\": [...],\n  \"vocabulary\": [...]\n}\n```\n\n服务端 schemaUpgrader 会自动识别富格式，无需手动转换。\n\n### Step 2: 跑上传脚本\n\n```bash\nbash ~/.workbuddy/skills/ielts-review-upload/scripts/sync-review.sh <path-to-data.json>\n```\n\n**脚本行为**：\n- 自动检测 `IELTS_USER_TOKEN`，决定走 token 还是匿名通道\n- token 模式：包装成 batchImport payload，POST 到 `/api/ielts`\n- 匿名模式：用 hostname+username SHA256 生成稳定 user id，POST 到 `/ielts-api/skill-review`\n- 失败时打印明确错误（token 过期 / 字段缺失 / HTTP 错误）\n\n**强制覆盖通道**：\n```bash\nbash sync-review.sh data.json --token-mode    # 强制走 token，没 token 直接报错\nbash sync-review.sh data.json --anon-mode     # 强制走匿名（即使有 token）\n```\n\n### Step 3: 上传后告知查看入口\n\n**Token 模式成功**：\n```\n✅ 上传成功！数据已进入你的个人主页。\n\n📊 查看：https://tuyaya.online/ielts/reading.html\n（登录后能看到进度图、词汇本、错题本同步更新）\n```\n\n**匿名模式成功**：\n```\n✅ 上传成功（匿名）。\n\n📊 你的专属看板：\nhttps://tuyaya.online/ielts-api/web/?user=<USER_ID>&key=<API_KEY>\n\n⚠️ 此数据不在主站个人主页中。建议下次配置 IELTS_USER_TOKEN 以同步到主页。\n```\n\n### Step 4: 入库回查（仅 token 模式，可选但推荐）\n\n```bash\ncurl -s https://tuyaya.online/api/ielts \\\n  -H 'Content-Type: application/json' \\\n  -d \"{\\\"action\\\":\\\"getReviews\\\",\\\"token\\\":\\\"$IELTS_USER_TOKEN\\\",\\\"book\\\":5,\\\"test\\\":4}\" \\\n  | python3 -m json.tool\n```\n\n确认返回的 data 数组里有刚上传的篇目。\n\n## Configuration\n\n### Token（推荐，token 模式）\n\n- 浏览器 `localStorage.token` 取，写入 `~/.zshrc`：\n  ```bash\n  export IELTS_USER_TOKEN='eyJ1Ijoi...'\n  ```\n- 也可以用 `~/.workbuddy/skills/ielts-reading-review/scripts/get-token.sh` 一键签发（如已部署）\n\n### API Key（匿名模式 fallback）\n\n脚本内置默认 API key：`ielts_8b0832b3cfd38884e44ab26ee68acaeed294623ef8da9b201871a7768b072606`\n\n如需更换：\n```bash\nexport IELTS_API_KEY='your_key_here'\n```\n\n### Backend URL\n\n```bash\nexport IELTS_API_BASE='https://tuyaya.online/api/ielts'        # token 模式\nexport IELTS_LEGACY_BASE='https://tuyaya.online/ielts-api'     # 匿名模式\n```\n\n## Reference Files\n\n| File | Purpose |\n|------|---------|\n| `scripts/sync-review.sh` | 双通道上传脚本（token + 匿名 fallback） |\n\n## Troubleshooting\n\n### \"token 过期 / 401\"\n\n重新登录 tuyaya.online 拿新 token，更新 `IELTS_USER_TOKEN`。\n\n### \"缺少 book/test/passage\"\n\nJSON 必须包含 `source.book`/`source.test`/`source.passage`（v4.0）或顶层 `book`/`test`/`passage`（扁平）。\n\n### \"Upload failed (HTTP 5xx)\"\n\n后端服务异常，先 ping 健康检查：\n```bash\ncurl https://tuyaya.online/api/health\n```\n\n### 数据没进个人主页\n\n检查：\n1. `echo $IELTS_USER_TOKEN` 是否真的有值（可能 `.zshrc` 没 source）\n2. 脚本输出有没有 `Mode: token`，如果是 `Mode: anon` 则数据在匿名表里\n\n## Style Guidelines\n\n- 简洁直接，不要多余包装\n- 默认推荐 token 模式，仅在用户明确要匿名或没条件配 token 时走 fallback\n- 上传完成后必须打印查看入口\n\nFile v1.2.0:README.md\n\n# IELTS Tuyaya Upload\n\n把本地雅思阅读复盘 JSON 一键上传到 [tuyaya.online](https://tuyaya.online/ielts/)，告别手动拖文件。\n\n## 适合谁用？\n\n- 用 `ielts-reading-review` skill 生成了一堆 JSON 复盘文件\n- 想把成绩同步到 tuyaya.online 云端，在任何设备打开网页查看\n- 不想手动一个个拖到 submit 页面\n- 有一堆旧笔记（HTML/Markdown/截图）想一次性导入成绩看趋势图\n\n## 🚀 端到端一条龙（推荐）\n\n如果你的复盘还是散在文件夹里的旧笔记，推荐配合 `ielts-reading-review` v3.4.0+ 一起用：**自动扫 → 生成 JSON → 自动上传**，一条 prompt 搞定。\n\n### Step 1：装两个 skill（只做一次）\n\n```bash\nclawhub install ielts-reading-review\nclawhub install ielts-tuyaya-upload\n```\n\n### Step 2：把下面这段 prompt 整段发给你的 AI Buddy\n\n**不用改任何内容，复制粘贴直接发就行。**\n\n```\n帮我一条龙处理我的历史雅思复盘。\n\n流程：\n\n【A. 自动找复盘文件夹】\n1. 用 ielts-reading-review skill 的 scan-legacy-reviews.js --auto 扫我电脑常见位置\n2. 把推荐目录和其他候选报给我，让我确认用哪个\n\n【B. 生成 JSON】\n3. 对确认后的目录做深扫（--deep），列出识别到的篇目清单，让我再确认一次\n4. 逐篇生成 v3.0 schema 的 JSON，输出到 ./batch-output/\n5. 字段缺失的地方不要瞎编，缺就置空\n6. 汇报成功几篇、数据缺失几篇\n\n【C. 上传到 tuyaya.online】\n7. 用 ielts-tuyaya-upload skill 检查登录状态（--whoami）\n   - 如果我还没账号：引导我 --register 注册（我会自己输入用户名密码）\n   - 如果已登录：继续\n8. 先跑 --diff ./batch-output/ 给我看差量（哪些是新的、哪些服务器已有）\n9. 我确认后，跑 --batch ./batch-output/ 批量上传\n10. 上传完告诉我成功几条，给我 https://tuyaya.online/ielts/ 的链接让我去看成绩\n\n规则：\n- 每一步之间要停下来等我确认，别一口气全跑完\n- 注册/登录时让我自己在终端输入密码，你不要替我生成\n- 上传过程中有失败的，列出来让我决定要不要重试\n```\n\n### Step 3：按 Buddy 提示逐步确认\n\nAI 会每一步停下来让你确认：路径对不对 → 篇目清单对不对 → 上传差量对不对 → 最后给你成绩链接。\n\n### 全流程示意\n\n```\n  你      ─▶  我发 prompt\n                │\n                ▼\n  Buddy   ─▶  🔍 auto 扫电脑\n                │\n                ▼\n  你      ─▶  确认\"用这个目录\"\n                │\n                ▼\n  Buddy   ─▶  📂 深扫列出所有篇目\n                │\n                ▼\n  你      ─▶  确认\"篇目没错\"\n                │\n                ▼\n  Buddy   ─▶  ✍️  逐篇生成 JSON 到 batch-output/\n                │\n                ▼\n  Buddy   ─▶  🔑 检查 tuyaya 账号\n                │\n                ▼\n  你      ─▶  （首次）注册账号 / 已有直接登录\n                │\n                ▼\n  Buddy   ─▶  📊 diff 差量给你看\n                │\n                ▼\n  你      ─▶  \"上传吧\"\n                │\n                ▼\n  Buddy   ─▶  🚀 批量上传\n                │\n                ▼\n  你      ─▶  🎯 去 tuyaya.online 看成绩\n```\n\n### 各阶段预计耗时\n\n| 阶段 | 时间 |\n|------|------|\n| 🔍 自动发现 | 3-5 秒 |\n| 📂 深扫 + 确认篇目 | 10-30 秒 |\n| ✍️ 生成 JSON（每篇） | 1-3 分钟 |\n| 🔑 注册/登录（首次） | 30 秒 |\n| 📊 diff | 5 秒 |\n| 🚀 批量上传 | 每篇 1-2 秒 |\n\n**实际示例**：20 篇老复盘，从头到尾约 30-50 分钟。\n\n---\n\n## 🔧 只用本 skill（已经有 JSON 了）\n\n如果 `./batch-output/` 或 `./history-json/` 已经有生成好的 JSON，直接走这套：\n\n### Step 1：注册账号（首次）\n\n```bash\nnode scripts/upload.js --register\n```\n\n按提示输入用户名、密码、昵称。注册成功后自动登录。\n\n已有账号？直接登录：\n\n```bash\nnode scripts/upload.js --login\n```\n\n### Step 2：批量上传\n\n```bash\nnode scripts/upload.js --batch ./batch-output/\n```\n\n脚本会自动跳过服务器上已有的记录，只上传新的。\n\n### Step 3：查看成绩\n\n打开 https://tuyaya.online/ielts/ 登录，所有成绩已在云端。\n\n---\n\n## 所有命令\n\n```\nnode scripts/upload.js --register        # 注册新账号\nnode scripts/upload.js --login           # 登录\nnode scripts/upload.js --logout          # 退出\nnode scripts/upload.js --whoami          # 查看当前账号\n\nnode scripts/upload.js --batch <dir>     # 批量上传目录下所有 JSON\nnode scripts/upload.js <file.json>       # 上传单个 JSON\nnode scripts/upload.js --diff <dir>      # 对比本地和服务器差量\nnode scripts/upload.js --status          # 查看服务器上的成绩\n```\n\n---\n\n## 踩坑提示\n\n### 🟢 AI Buddy 能自动搞定\n\n- 自动找到你的复盘文件夹（不管在桌面、文档、下载还是 iCloud）\n- 识别篇目（文件名有\"剑X-TestX-PassageX\"就能认出来）\n- 正确答案核验（查本地答案库）\n- 多文件合并（同一篇有 HTML + 截图 + MD，会合并读）\n- 注册登录（你跟着提示输入就行）\n- 差量上传（服务器已有的不会重复上传）\n\n### 🟡 它可能搞不定的（需要你补充）\n\n- **文件名没有篇目信息**：比如 `笔记-20260315.docx`，会标为 \"__unknown__\" 让你分配\n- **答案是手写拍照**：AI 识别手写可能有误，生成后扫一眼 JSON 里的 `score.correct` 对不对\n- **错题分析太简略**：老笔记只写了 \"Q3错了\" 没写原因，`wrongQuestions[].analysis` 会是空的（成绩单数据不受影响）\n\n### 🔴 一定不能干的\n\n- 不要一口气喂超过 50 篇，容易超时。分批跑，每次 10-20 篇\n- AI 问你确认时**别秒回 yes**，扫一眼清单对不对\n- 注册密码别用 123456，≥6 位就行但别太水\n\n---\n\n## 常见问题\n\n**Q: Token 过期了怎么办？**\nA: Token 有效期 30 天，过期后运行 `--login` 重新登录即可。\n\n**Q: 数据存在哪？**\nA: Token 存在 `~/.ielts-tuyaya-token`（权限 0600，只有自己可读）。成绩数据存在 tuyaya.online 服务器。\n\n**Q: 可以多账号切换吗？**\nA: 可以。`--logout` 退出后 `--login` 另一个账号即可。\n\n**Q: 忘记密码？**\nA: 目前暂不支持找回，用 `--register` 注册新账号。\n\n**Q: 换电脑了，token 还有效吗？**\nA: token 只在本机保存。换电脑跑一次 `--login` 重新登录就行。\n\n**Q: 注册 tuyaya 账号要手机号/邮箱吗？**\nA: 不要。就用户名 + 密码，完全独立于其他平台。\n\n**Q: 上传过程中失败了会重试吗？**\nA: 同一篇重复上传会自动覆盖。失败的 buddy 会列给你，你说\"重试失败的\"就行。\n\n**Q: 笔记里只写了错题编号（比如 \"Q3/Q7 错了\"），没详细分析，能用吗？**\nA: 能。JSON 会生成基础成绩单（对 X 道/共 Y 道/band 分数），错题分析留空。以后想补细节，再拿着这篇原文找 AI 重新做。\n\n**Q: 批量跑完，哪些数据会显示在网站上？**\nA: 成绩单（每篇对多少道、分数）、错题列表、词汇、同义替换——全部同步。进度图、历史趋势图自动刷新。\n\n---\n\n## 依赖\n\n- Node.js ≥ 18（有原生 fetch）\n- 无需 npm install，纯 Node 标准库\n\n## 相关\n\n- [tuyaya.online/ielts](https://tuyaya.online/ielts/) — 你的雅思进度可视化主页\n- `ielts-reading-review` skill — 生成复盘 JSON 的配套工具（配合用最爽）\n\n---\n\n祝复盘愉快 🎯\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn7dr93fbgrvymnk8d9r9y0tws83mhrk\",\n  \"slug\": \"ielts-tuyaya-upload\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1779259035379\n}\n\nArchive v1.1.0: 5 files, 14863 bytes\n\nFiles: publish-clawhub.sh (1864b), README.md (7674b), scripts/upload.js (16492b), SKILL.md (9760b), _meta.json (138b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: ielts-tuyaya-upload\ndescription: \"Upload IELTS reading review JSON files to tuyaya.online — your personal IELTS progress tracker. Supports end-to-end pipeline with ielts-reading-review: auto-scan → generate JSON → batch upload. Trigger phrases: 上传复盘 / 同步服务器 / 上传到 tuyaya / 把复盘上传 / 注册 tuyaya / 登录 tuyaya / 查看我的成绩 / 批量同步雅思成绩 / 批量导入历史复盘 / 一条龙处理复盘 / 端到端同步雅思 / 把老笔记导入 tuyaya / upload ielts reviews / sync to tuyaya / register tuyaya / tuyaya 账号 / tuyaya 上传.\"\nversion: 1.1.0\n---\n\n# IELTS Tuyaya Upload Skill\n\n## Purpose\n\n把本地生成的雅思阅读复盘 JSON（通常来自 `ielts-reading-review` skill）一键上传到 tuyaya.online 服务器，不再需要手动拖文件到 submit 页面。\n\n**✨ 多用户支持**：每个用户有独立账号，token 本地保存，一次登录长期有效。\n\n## When to use\n\n当用户说以下话时，触发本 skill：\n- \"上传复盘\" / \"同步到服务器\" / \"把 JSON 上传\"\n- \"注册 tuyaya 账号\" / \"登录 tuyaya\"\n- \"查看我在 tuyaya 的成绩\"\n- \"批量同步雅思成绩\"\n\n## Prerequisites\n\n- Node.js ≥ 18（有原生 fetch）\n- 本地有 `*.json` 复盘文件（通常在 `./batch-output/` 或 `./history-json/`）\n\n## Skill Location\n\nSkill 目录（包含 `scripts/upload.js`）所在路径会在安装时自动设置。典型路径：\n- ClawHub 安装：`~/.clawhub/skills/ielts-tuyaya-upload/`\n- 手动安装：用户指定目录\n\nAI 在调用脚本时，使用 **skill 所在目录下的 `scripts/upload.js`**，不要假设绝对路径。\n\n## Workflow — AI 执行规则\n\n### 🌟 场景 0：端到端一条龙（最常见，强烈推荐）\n\n**触发信号**：用户说\"批量导入我的历史复盘\"、\"把我电脑里的老笔记一次性同步到 tuyaya\"、\"一条龙处理我的复盘\"、\"从扫描到上传全流程\"。\n\n**前提**：同时安装了 `ielts-reading-review` v3.4.0+（提供 Auto-Discovery + 深扫 + JSON 生成）。\n\n**AI 动作（必须分步停下来等确认，不要一口气跑完）**：\n\n#### A. 自动发现复盘目录\n1. 调用 `ielts-reading-review` 的 `scan-legacy-reviews.js --auto` 扫常见位置（桌面/文档/下载/iCloud/WorkBuddy）\n2. 把推荐目录 + 其他候选列给用户，让用户确认用哪个\n\n#### B. 生成 JSON\n3. 对确认的目录跑 `--deep` 深扫，列出识别到的篇目清单（含 `__unknown__`）\n4. 让用户确认篇目清单对不对\n5. 逐篇生成 v3.0 schema JSON，输出到 `./batch-output/`\n6. 缺失字段置空，不瞎编\n7. 汇报成功/失败/数据缺失数量\n\n#### C. 上传到 tuyaya.online（本 skill 主战场）\n8. 运行 `--whoami` 检查登录状态\n   - 未登录 → 先走场景 1（注册）或场景 2（登录）\n9. 运行 `--diff ./batch-output/` 展示差量（新/已存在/冲突）\n10. 用户确认后运行 `--batch ./batch-output/` 批量上传\n11. 汇报成功/跳过/失败数量\n12. 给用户 https://tuyaya.online/ielts/ 链接去查看成绩\n\n**⚠️ 关键规则**：\n- 每一步（A→B→C 内部每个子步骤）都要停下来等用户确认\n- 注册/登录必须让用户在终端自己输入密码，AI 不要代填、不要建议密码\n- 失败的条目要列出来让用户决定是否重试\n- 不要一口气处理 50+ 篇，超过建议让用户分批\n\n### 场景 1：用户首次使用（没账号）\n\n**触发信号**：用户说\"我想用 tuyaya\"、\"帮我注册\"、\"我还没账号\"，或者运行命令报错\"还没登录\"。\n\n**AI 动作**：\n1. 告知用户：即将运行注册命令，需要在终端交互输入用户名和密码\n2. 运行：`node <skill_dir>/scripts/upload.js --register`\n3. 提示用户完成交互输入（用户名 3-20 字符、密码 ≥6 位）\n4. 注册成功后会自动登录并保存 token，可以直接进入上传流程\n\n**⚠️ 不要替用户生成密码**，让用户自己输入。\n\n### 场景 2：用户已有账号（需要登录）\n\n**触发信号**：用户说\"我想登录\"、\"换个账号\"，或者 `--whoami` 提示未登录。\n\n**AI 动作**：\n1. 运行：`node <skill_dir>/scripts/upload.js --login`\n2. 提示用户在终端输入用户名密码\n3. 成功后 token 保存到 `~/.ielts-tuyaya-token`，下次不用再登录\n\n### 场景 3：批量上传 JSON（核心场景）\n\n**触发信号**：用户说\"把 batch-output 里的 JSON 上传\"、\"同步所有复盘\"。\n\n**AI 动作**：\n1. **先检查登录状态**：`node <skill_dir>/scripts/upload.js --whoami`\n   - 如果未登录 → 跳到场景 1 或 2\n   - 已登录 → 继续\n\n2. **（推荐）先 diff 看差量**：\n   `node <skill_dir>/scripts/upload.js --diff <用户的 JSON 目录>`\n   - 展示给用户看：哪些是新的、哪些已在服务器、哪些不一致\n   - 让用户确认是否继续上传\n\n3. **确认后批量上传**：\n   `node <skill_dir>/scripts/upload.js --batch <用户的 JSON 目录>`\n   - 脚本会自动跳过服务器上已有的记录\n   - 汇总成功/跳过数量\n\n4. **完成后**：告诉用户去 https://tuyaya.online/ielts/ 查看成绩\n\n### 场景 4：上传单个 JSON\n\n`node <skill_dir>/scripts/upload.js <文件路径>`\n\n### 场景 5：查看服务器成绩\n\n`node <skill_dir>/scripts/upload.js --status`\n\n### 场景 6：退出账号 / 查看当前账号\n\n- `--logout`：清除本地 token\n- `--whoami`：查看当前登录的用户名\n\n## Commands Reference\n\n| 命令 | 说明 | 是否需要登录 |\n|------|------|---|\n| `--register` | 注册新账号（交互式） | ❌ |\n| `--login` | 登录并保存 token | ❌ |\n| `--logout` | 清除本地 token | ❌ |\n| `--whoami` | 查看当前登录账号 | ❌ |\n| `--status` | 查看服务器成绩 | ✅ |\n| `--diff <dir>` | 对比本地和服务器差量 | ✅ |\n| `--batch <dir>` | 批量上传目录下所有 JSON | ✅ |\n| `<file.json>` | 上传单个文件 | ✅ |\n\n## Token Storage\n\n登录后 token 保存在：`~/.ielts-tuyaya-token`（文件权限 0600）\n\n内容示例：\n```json\n{\n  \"token\": \"eyJ1Ijoi...\",\n  \"username\": \"alice\",\n  \"savedAt\": \"2026-04-21T15:00:00.000Z\"\n}\n```\n\nToken 有效期 30 天，过期后重新 `--login` 即可。\n\n## JSON Format\n\n本 skill 消费 `ielts-reading-review` v3.0 产出的 JSON：\n\n```json\n{\n  \"version\": \"3.0.0\",\n  \"source\": { \"book\": 5, \"test\": 1, \"passage\": 2 },\n  \"score\": { \"correct\": 9, \"total\": 13 },\n  \"timing\": { \"minutes\": 25 },\n  \"date\": \"2026-04-20\",\n  \"wrongQuestions\": [...],\n  \"vocabulary\": [...]\n}\n```\n\n也兼容旧格式（平铺 `book/test/passage/score/total`）。\n\n## AI 对话范例\n\n### 范例 0：端到端一条龙（最常见）\n\n> **用户**：帮我一条龙处理我的历史雅思复盘，从扫我电脑到上传 tuyaya 都搞定\n>\n> **AI**：\n> 好，我分三段处理，每段停下来等你确认。\n>\n> **[A. 自动扫描]**\n> *运行 `ielts-reading-review` 的 `scan-legacy-reviews.js --auto`*\n> 找到 3 个候选目录，推荐 `/Users/xx/Documents/雅思学习`（命中 28 个复盘文件）。用这个吗？\n>\n> *用户：用这个*\n>\n> **[B. 深扫 + 生成]**\n> *运行 `--deep` 深扫*\n> 识别到 20 篇（剑4 全本 + 剑5 T1-T3），2 篇 `__unknown__` 需要你补充。清单 OK 吗？\n>\n> *用户：OK，unknown 那 2 篇先跳过*\n>\n> *逐篇生成 JSON 到 `./batch-output/`*\n> 生成完：18 成功，2 跳过。\n>\n> **[C. 上传 tuyaya]**\n> *运行 `--whoami`* → 还没登录\n> 你有 tuyaya 账号吗？\n>\n> *用户：没有，帮我注册*\n>\n> *运行 `--register`*（用户在终端输入用户名密码）\n>\n> *运行 `--diff ./batch-output/`*\n> 18 个全是新的，服务器还没有。开始上传？\n>\n> *用户：上传*\n>\n> *运行 `--batch ./batch-output/`*\n> ✅ 18 条全部成功。去 https://tuyaya.online/ielts/ 看趋势图吧～\n\n### 范例 A：新用户首次使用\n\n> **用户**：我想把我的雅思复盘同步到 tuyaya\n>\n> **AI**：\n> 我先检查一下你的登录状态。\n> *运行 `node scripts/upload.js --whoami`*\n> 还没登录。tuyaya.online 需要一个账号——你有账号吗？\n> - 有 → 我帮你登录\n> - 没有 → 我引导你注册一个（免费、只要用户名密码）\n\n### 范例 B：批量上传（已登录）\n\n> **用户**：把 batch-output 目录下的 JSON 全上传\n>\n> **AI**：\n> *运行 `--diff ./batch-output/`*\n> 本地有 12 个，服务器已有 5 个，8 个是新的。我开始上传这 8 个。\n> *运行 `--batch ./batch-output/`*\n> ✅ 上传完成：8 条成功。去 https://tuyaya.online/ielts/ 看看吧～\n\n### 范例 C：登录过期\n\n> **用户**：--status 报错说 token 过期了\n>\n> **AI**：\n> Token 30 天有效期到了，重新登录就行：\n> *运行 `--login`*\n> 输入用户名密码后，token 会自动更新保存。\n\n## Error Handling\n\n| 错误 | 处理 |\n|------|------|\n| `还没登录` | 引导运行 `--register` 或 `--login` |\n| `token 过期` | 运行 `--login` 重新获取 |\n| `用户名已存在`（注册时） | 让用户换个名字，或改用 `--login` |\n| `用户名或密码错误`（登录时） | 让用户重试，或 `--register` 新账号 |\n| `HTTP 500` | 服务器问题，建议稍后重试 |\n| 网络错误 | 检查是否能访问 https://tuyaya.online |\n\n## Privacy & Security\n\n- **Token 本地存储**：仅保存在 `~/.ielts-tuyaya-token`，权限 0600（只有自己可读）\n- **密码不保存**：只保存 token，密码从不落盘\n- **独立账号**：每个用户在服务器有独立数据，互相隔离\n- **HTTPS 传输**：所有请求走 https://tuyaya.online\n\n## Related Skills\n\n- `ielts-reading-review`：生成复盘 JSON，本 skill 负责上传这些 JSON\n- 配合使用：先用 `ielts-reading-review` 批量生成 → 再用本 skill 批量上传\n\nFile v1.1.0:README.md\n\n# IELTS Tuyaya Upload\n\n把本地雅思阅读复盘 JSON 一键上传到 [tuyaya.online](https://tuyaya.online/ielts/)，告别手动拖文件。\n\n## 适合谁用？\n\n- 用 `ielts-reading-review` skill 生成了一堆 JSON 复盘文件\n- 想把成绩同步到 tuyaya.online 云端，在任何设备打开网页查看\n- 不想手动一个个拖到 submit 页面\n- 有一堆旧笔记（HTML/Markdown/截图）想一次性导入成绩看趋势图\n\n## 🚀 端到端一条龙（推荐）\n\n如果你的复盘还是散在文件夹里的旧笔记，推荐配合 `ielts-reading-review` v3.4.0+ 一起用：**自动扫 → 生成 JSON → 自动上传**，一条 prompt 搞定。\n\n### Step 1：装两个 skill（只做一次）\n\n```bash\nclawhub install ielts-reading-review\nclawhub install ielts-tuyaya-upload\n```\n\n### Step 2：把下面这段 prompt 整段发给你的 AI Buddy\n\n**不用改任何内容，复制粘贴直接发就行。**\n\n```\n帮我一条龙处理我的历史雅思复盘。\n\n流程：\n\n【A. 自动找复盘文件夹】\n1. 用 ielts-reading-review skill 的 scan-legacy-reviews.js --auto 扫我电脑常见位置\n2. 把推荐目录和其他候选报给我，让我确认用哪个\n\n【B. 生成 JSON】\n3. 对确认后的目录做深扫（--deep），列出识别到的篇目清单，让我再确认一次\n4. 逐篇生成 v3.0 schema 的 JSON，输出到 ./batch-output/\n5. 字段缺失的地方不要瞎编，缺就置空\n6. 汇报成功几篇、数据缺失几篇\n\n【C. 上传到 tuyaya.online】\n7. 用 ielts-tuyaya-upload skill 检查登录状态（--whoami）\n   - 如果我还没账号：引导我 --register 注册（我会自己输入用户名密码）\n   - 如果已登录：继续\n8. 先跑 --diff ./batch-output/ 给我看差量（哪些是新的、哪些服务器已有）\n9. 我确认后，跑 --batch ./batch-output/ 批量上传\n10. 上传完告诉我成功几条，给我 https://tuyaya.online/ielts/ 的链接让我去看成绩\n\n规则：\n- 每一步之间要停下来等我确认，别一口气全跑完\n- 注册/登录时让我自己在终端输入密码，你不要替我生成\n- 上传过程中有失败的，列出来让我决定要不要重试\n```\n\n### Step 3：按 Buddy 提示逐步确认\n\nAI 会每一步停下来让你确认：路径对不对 → 篇目清单对不对 → 上传差量对不对 → 最后给你成绩链接。\n\n### 全流程示意\n\n```\n  你      ─▶  我发 prompt\n                │\n                ▼\n  Buddy   ─▶  🔍 auto 扫电脑\n                │\n                ▼\n  你      ─▶  确认\"用这个目录\"\n                │\n                ▼\n  Buddy   ─▶  📂 深扫列出所有篇目\n                │\n                ▼\n  你      ─▶  确认\"篇目没错\"\n                │\n                ▼\n  Buddy   ─▶  ✍️  逐篇生成 JSON 到 batch-output/\n                │\n                ▼\n  Buddy   ─▶  🔑 检查 tuyaya 账号\n                │\n                ▼\n  你      ─▶  （首次）注册账号 / 已有直接登录\n                │\n                ▼\n  Buddy   ─▶  📊 diff 差量给你看\n                │\n                ▼\n  你      ─▶  \"上传吧\"\n                │\n                ▼\n  Buddy   ─▶  🚀 批量上传\n                │\n                ▼\n  你      ─▶  🎯 去 tuyaya.online 看成绩\n```\n\n### 各阶段预计耗时\n\n| 阶段 | 时间 |\n|------|------|\n| 🔍 自动发现 | 3-5 秒 |\n| 📂 深扫 + 确认篇目 | 10-30 秒 |\n| ✍️ 生成 JSON（每篇） | 1-3 分钟 |\n| 🔑 注册/登录（首次） | 30 秒 |\n| 📊 diff | 5 秒 |\n| 🚀 批量上传 | 每篇 1-2 秒 |\n\n**实际示例**：20 篇老复盘，从头到尾约 30-50 分钟。\n\n---\n\n## 🔧 只用本 skill（已经有 JSON 了）\n\n如果 `./batch-output/` 或 `./history-json/` 已经有生成好的 JSON，直接走这套：\n\n### Step 1：注册账号（首次）\n\n```bash\nnode scripts/upload.js --register\n```\n\n按提示输入用户名、密码、昵称。注册成功后自动登录。\n\n已有账号？直接登录：\n\n```bash\nnode scripts/upload.js --login\n```\n\n### Step 2：批量上传\n\n```bash\nnode scripts/upload.js --batch ./batch-output/\n```\n\n脚本会自动跳过服务器上已有的记录，只上传新的。\n\n### Step 3：查看成绩\n\n打开 https://tuyaya.online/ielts/ 登录，所有成绩已在云端。\n\n---\n\n## 所有命令\n\n```\nnode scripts/upload.js --register        # 注册新账号\nnode scripts/upload.js --login           # 登录\nnode scripts/upload.js --logout          # 退出\nnode scripts/upload.js --whoami          # 查看当前账号\n\nnode scripts/upload.js --batch <dir>     # 批量上传目录下所有 JSON\nnode scripts/upload.js <file.json>       # 上传单个 JSON\nnode scripts/upload.js --diff <dir>      # 对比本地和服务器差量\nnode scripts/upload.js --status          # 查看服务器上的成绩\n```\n\n---\n\n## 踩坑提示\n\n### 🟢 AI Buddy 能自动搞定\n\n- 自动找到你的复盘文件夹（不管在桌面、文档、下载还是 iCloud）\n- 识别篇目（文件名有\"剑X-TestX-PassageX\"就能认出来）\n- 正确答案核验（查本地答案库）\n- 多文件合并（同一篇有 HTML + 截图 + MD，会合并读）\n- 注册登录（你跟着提示输入就行）\n- 差量上传（服务器已有的不会重复上传）\n\n### 🟡 它可能搞不定的（需要你补充）\n\n- **文件名没有篇目信息**：比如 `笔记-20260315.docx`，会标为 \"__unknown__\" 让你分配\n- **答案是手写拍照**：AI 识别手写可能有误，生成后扫一眼 JSON 里的 `score.correct` 对不对\n- **错题分析太简略**：老笔记只写了 \"Q3错了\" 没写原因，`wrongQuestions[].analysis` 会是空的（成绩单数据不受影响）\n\n### 🔴 一定不能干的\n\n- 不要一口气喂超过 50 篇，容易超时。分批跑，每次 10-20 篇\n- AI 问你确认时**别秒回 yes**，扫一眼清单对不对\n- 注册密码别用 123456，≥6 位就行但别太水\n\n---\n\n## 常见问题\n\n**Q: Token 过期了怎么办？**\nA: Token 有效期 30 天，过期后运行 `--login` 重新登录即可。\n\n**Q: 数据存在哪？**\nA: Token 存在 `~/.ielts-tuyaya-token`（权限 0600，只有自己可读）。成绩数据存在 tuyaya.online 服务器。\n\n**Q: 可以多账号切换吗？**\nA: 可以。`--logout` 退出后 `--login` 另一个账号即可。\n\n**Q: 忘记密码？**\nA: 目前暂不支持找回，用 `--register` 注册新账号。\n\n**Q: 换电脑了，token 还有效吗？**\nA: token 只在本机保存。换电脑跑一次 `--login` 重新登录就行。\n\n**Q: 注册 tuyaya 账号要手机号/邮箱吗？**\nA: 不要。就用户名 + 密码，完全独立于其他平台。\n\n**Q: 上传过程中失败了会重试吗？**\nA: 同一篇重复上传会自动覆盖。失败的 buddy 会列给你，你说\"重试失败的\"就行。\n\n**Q: 笔记里只写了错题编号（比如 \"Q3/Q7 错了\"），没详细分析，能用吗？**\nA: 能。JSON 会生成基础成绩单（对 X 道/共 Y 道/band 分数），错题分析留空。以后想补细节，再拿着这篇原文找 AI 重新做。\n\n**Q: 批量跑完，哪些数据会显示在网站上？**\nA: 成绩单（每篇对多少道、分数）、错题列表、词汇、同义替换——全部同步。进度图、历史趋势图自动刷新。\n\n---\n\n## 依赖\n\n- Node.js ≥ 18（有原生 fetch）\n- 无需 npm install，纯 Node 标准库\n\n## 相关\n\n- [tuyaya.online/ielts](https://tuyaya.online/ielts/) — 你的雅思进度可视化主页\n- `ielts-reading-review` skill — 生成复盘 JSON 的配套工具（配合用最爽）\n\n---\n\n祝复盘愉快 🎯\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7dr93fbgrvymnk8d9r9y0tws83mhrk\",\n  \"slug\": \"ielts-tuyaya-upload\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1776787600961\n}\n\nArchive v1.0.0: 5 files, 11007 bytes\n\nFiles: publish-clawhub.sh (1502b), README.md (2229b), scripts/upload.js (16492b), SKILL.md (6642b), _meta.json (138b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: ielts-tuyaya-upload\ndescription: \"Upload IELTS reading review JSON files to tuyaya.online — your personal IELTS progress tracker. Trigger phrases: 上传复盘 / 同步服务器 / 上传到 tuyaya / 把复盘上传 / 注册 tuyaya / 登录 tuyaya / 查看我的成绩 / 批量同步雅思成绩 / upload ielts reviews / sync to tuyaya / register tuyaya / tuyaya 账号 / tuyaya 上传.\"\nversion: 1.0.0\n---\n\n# IELTS Tuyaya Upload Skill\n\n## Purpose\n\n把本地生成的雅思阅读复盘 JSON（通常来自 `ielts-reading-review` skill）一键上传到 tuyaya.online 服务器，不再需要手动拖文件到 submit 页面。\n\n**✨ 多用户支持**：每个用户有独立账号，token 本地保存，一次登录长期有效。\n\n## When to use\n\n当用户说以下话时，触发本 skill：\n- \"上传复盘\" / \"同步到服务器\" / \"把 JSON 上传\"\n- \"注册 tuyaya 账号\" / \"登录 tuyaya\"\n- \"查看我在 tuyaya 的成绩\"\n- \"批量同步雅思成绩\"\n\n## Prerequisites\n\n- Node.js ≥ 18（有原生 fetch）\n- 本地有 `*.json` 复盘文件（通常在 `./batch-output/` 或 `./history-json/`）\n\n## Skill Location\n\nSkill 目录（包含 `scripts/upload.js`）所在路径会在安装时自动设置。典型路径：\n- ClawHub 安装：`~/.clawhub/skills/ielts-tuyaya-upload/`\n- 手动安装：用户指定目录\n\nAI 在调用脚本时，使用 **skill 所在目录下的 `scripts/upload.js`**，不要假设绝对路径。\n\n## Workflow — AI 执行规则\n\n### 场景 1：用户首次使用（没账号）\n\n**触发信号**：用户说\"我想用 tuyaya\"、\"帮我注册\"、\"我还没账号\"，或者运行命令报错\"还没登录\"。\n\n**AI 动作**：\n1. 告知用户：即将运行注册命令，需要在终端交互输入用户名和密码\n2. 运行：`node <skill_dir>/scripts/upload.js --register`\n3. 提示用户完成交互输入（用户名 3-20 字符、密码 ≥6 位）\n4. 注册成功后会自动登录并保存 token，可以直接进入上传流程\n\n**⚠️ 不要替用户生成密码**，让用户自己输入。\n\n### 场景 2：用户已有账号（需要登录）\n\n**触发信号**：用户说\"我想登录\"、\"换个账号\"，或者 `--whoami` 提示未登录。\n\n**AI 动作**：\n1. 运行：`node <skill_dir>/scripts/upload.js --login`\n2. 提示用户在终端输入用户名密码\n3. 成功后 token 保存到 `~/.ielts-tuyaya-token`，下次不用再登录\n\n### 场景 3：批量上传 JSON（核心场景）\n\n**触发信号**：用户说\"把 batch-output 里的 JSON 上传\"、\"同步所有复盘\"。\n\n**AI 动作**：\n1. **先检查登录状态**：`node <skill_dir>/scripts/upload.js --whoami`\n   - 如果未登录 → 跳到场景 1 或 2\n   - 已登录 → 继续\n\n2. **（推荐）先 diff 看差量**：\n   `node <skill_dir>/scripts/upload.js --diff <用户的 JSON 目录>`\n   - 展示给用户看：哪些是新的、哪些已在服务器、哪些不一致\n   - 让用户确认是否继续上传\n\n3. **确认后批量上传**：\n   `node <skill_dir>/scripts/upload.js --batch <用户的 JSON 目录>`\n   - 脚本会自动跳过服务器上已有的记录\n   - 汇总成功/跳过数量\n\n4. **完成后**：告诉用户去 https://tuyaya.online/ielts/ 查看成绩\n\n### 场景 4：上传单个 JSON\n\n`node <skill_dir>/scripts/upload.js <文件路径>`\n\n### 场景 5：查看服务器成绩\n\n`node <skill_dir>/scripts/upload.js --status`\n\n### 场景 6：退出账号 / 查看当前账号\n\n- `--logout`：清除本地 token\n- `--whoami`：查看当前登录的用户名\n\n## Commands Reference\n\n| 命令 | 说明 | 是否需要登录 |\n|------|------|---|\n| `--register` | 注册新账号（交互式） | ❌ |\n| `--login` | 登录并保存 token | ❌ |\n| `--logout` | 清除本地 token | ❌ |\n| `--whoami` | 查看当前登录账号 | ❌ |\n| `--status` | 查看服务器成绩 | ✅ |\n| `--diff <dir>` | 对比本地和服务器差量 | ✅ |\n| `--batch <dir>` | 批量上传目录下所有 JSON | ✅ |\n| `<file.json>` | 上传单个文件 | ✅ |\n\n## Token Storage\n\n登录后 token 保存在：`~/.ielts-tuyaya-token`（文件权限 0600）\n\n内容示例：\n```json\n{\n  \"token\": \"eyJ1Ijoi...\",\n  \"username\": \"alice\",\n  \"savedAt\": \"2026-04-21T15:00:00.000Z\"\n}\n```\n\nToken 有效期 30 天，过期后重新 `--login` 即可。\n\n## JSON Format\n\n本 skill 消费 `ielts-reading-review` v3.0 产出的 JSON：\n\n```json\n{\n  \"version\": \"3.0.0\",\n  \"source\": { \"book\": 5, \"test\": 1, \"passage\": 2 },\n  \"score\": { \"correct\": 9, \"total\": 13 },\n  \"timing\": { \"minutes\": 25 },\n  \"date\": \"2026-04-20\",\n  \"wrongQuestions\": [...],\n  \"vocabulary\": [...]\n}\n```\n\n也兼容旧格式（平铺 `book/test/passage/score/total`）。\n\n## AI 对话范例\n\n### 范例 A：新用户首次使用\n\n> **用户**：我想把我的雅思复盘同步到 tuyaya\n>\n> **AI**：\n> 我先检查一下你的登录状态。\n> *运行 `node scripts/upload.js --whoami`*\n> 还没登录。tuyaya.online 需要一个账号——你有账号吗？\n> - 有 → 我帮你登录\n> - 没有 → 我引导你注册一个（免费、只要用户名密码）\n\n### 范例 B：批量上传（已登录）\n\n> **用户**：把 batch-output 目录下的 JSON 全上传\n>\n> **AI**：\n> *运行 `--diff ./batch-output/`*\n> 本地有 12 个，服务器已有 5 个，8 个是新的。我开始上传这 8 个。\n> *运行 `--batch ./batch-output/`*\n> ✅ 上传完成：8 条成功。去 https://tuyaya.online/ielts/ 看看吧～\n\n### 范例 C：登录过期\n\n> **用户**：--status 报错说 token 过期了\n>\n> **AI**：\n> Token 30 天有效期到了，重新登录就行：\n> *运行 `--login`*\n> 输入用户名密码后，token 会自动更新保存。\n\n## Error Handling\n\n| 错误 | 处理 |\n|------|------|\n| `还没登录` | 引导运行 `--register` 或 `--login` |\n| `token 过期` | 运行 `--login` 重新获取 |\n| `用户名已存在`（注册时） | 让用户换个名字，或改用 `--login` |\n| `用户名或密码错误`（登录时） | 让用户重试，或 `--register` 新账号 |\n| `HTTP 500` | 服务器问题，建议稍后重试 |\n| 网络错误 | 检查是否能访问 https://tuyaya.online |\n\n## Privacy & Security\n\n- **Token 本地存储**：仅保存在 `~/.ielts-tuyaya-token`，权限 0600（只有自己可读）\n- **密码不保存**：只保存 token，密码从不落盘\n- **独立账号**：每个用户在服务器有独立数据，互相隔离\n- **HTTPS 传输**：所有请求走 https://tuyaya.online\n\n## Related Skills\n\n- `ielts-reading-review`：生成复盘 JSON，本 skill 负责上传这些 JSON\n- 配合使用：先用 `ielts-reading-review` 批量生成 → 再用本 skill 批量上传\n\nFile v1.0.0:README.md\n\n# IELTS Tuyaya Upload\n\n把本地雅思阅读复盘 JSON 一键上传到 [tuyaya.online](https://tuyaya.online/ielts/)，告别手动拖文件。\n\n## 适合谁用？\n\n- 用 `ielts-reading-review` skill 生成了一堆 JSON 复盘文件\n- 想把成绩同步到 tuyaya.online 云端，在任何设备打开网页查看\n- 不想手动一个个拖到 submit 页面\n\n## 快速上手\n\n### Step 1：安装 skill\n\n通过 ClawHub 安装，或手动把目录放到你的 skills 路径下。\n\n### Step 2：注册账号（首次）\n\n```bash\nnode scripts/upload.js --register\n```\n\n按提示输入用户名、密码、昵称。注册成功后自动登录。\n\n已有账号？直接登录：\n\n```bash\nnode scripts/upload.js --login\n```\n\n### Step 3：批量上传\n\n```bash\nnode scripts/upload.js --batch ./batch-output/\n```\n\n脚本会自动跳过服务器上已有的记录，只上传新的。\n\n### Step 4：查看成绩\n\n打开 https://tuyaya.online/ielts/ 登录，所有成绩已在云端。\n\n## 所有命令\n\n```\nnode scripts/upload.js --register        # 注册新账号\nnode scripts/upload.js --login           # 登录\nnode scripts/upload.js --logout          # 退出\nnode scripts/upload.js --whoami          # 查看当前账号\n\nnode scripts/upload.js --batch <dir>     # 批量上传目录下所有 JSON\nnode scripts/upload.js <file.json>       # 上传单个 JSON\nnode scripts/upload.js --diff <dir>      # 对比本地和服务器差量\nnode scripts/upload.js --status          # 查看服务器上的成绩\n```\n\n## 常见问题\n\n**Q: Token 过期了怎么办？**\nA: Token 有效期 30 天，过期后运行 `--login` 重新登录即可。\n\n**Q: 数据存在哪？**\nA: Token 存在 `~/.ielts-tuyaya-token`（只有自己可读）。成绩数据存在 tuyaya.online 服务器。\n\n**Q: 可以多账号切换吗？**\nA: 可以。`--logout` 退出后 `--login` 另一个账号即可。\n\n**Q: 忘记密码？**\nA: 目前暂不支持找回，用 `--register` 注册新账号。\n\n## 依赖\n\n- Node.js ≥ 18（有原生 fetch）\n- 无需 npm install，纯 Node 标准库\n\n## 相关\n\n- [tuyaya.online/ielts](https://tuyaya.online/ielts/) — 你的雅思进度可视化主页\n- `ielts-reading-review` skill — 生成复盘 JSON 的工具\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7dr93fbgrvymnk8d9r9y0tws83mhrk\",\n  \"slug\": \"ielts-tuyaya-upload\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1776786897284\n}","readmeExcerpt":"Skill: IELTS Tuyaya Upload 雅思成绩一键上传 Owner: dengjiawei1226 Summary: 上传雅思阅读复盘文件到服务器，支持 token 模式（进个人主页）和匿名模式。当用户想要上传已有的复盘 JSON、查看个人复盘仪表板时使用。触发词：上传复盘、上传复盘文件、sync review、upload review、查看我的复盘记录、我的仪表板、dashboard、tuyaya 上传、批量同步。 Tags: latest:1.3.2 Version history: v1.3.2 | 2026-06-23T03:07:10.308Z | user v1.3.2: 域名迁移 tuyaya.online → www.liuxue.online（旧域名因 ICP 备案审核已全站 403 不可用）。sync-review.sh/upload.js 默认 API 地址、所有提示文案、README/S","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"echo \"${IELTS_USER_TOKEN:0:20}...\"  # 只显示前 20 位避免泄漏"},{"language":"text","snippet":"你还没配置 IELTS_USER_TOKEN，上传后数据不会进个人主页进度图。\n\n🔧 一键授权（推荐）：\nbash ~/.workbuddy/skills/ielts-reading-review/scripts/setup-client-mode.sh\n\n脚本会：\n1. 在本机起一个随机端口的 HTTP 服务监听回调\n2. 自动唤起浏览器到 www.liuxue.online/authorize.html\n3. 你在网页点【授权】按钮，token 通过 <img> 请求回传到本机\n4. 校验通过后写入 ~/.zshrc 并 source 生效\n5. token 永远不离开你的电脑（不进 URL bar、不走第三方）\n\n兜底（浏览器/网络异常时）：\nbash setup-client-mode.sh --manual    # 走 F12 复制 token 老流程\n\n要不要现在跑一下，还是先走匿名模式？"},{"language":"json","snippet":"{\n  \"book\": 5,\n  \"test\": 4,\n  \"passage\": 1,\n  \"score\": 11,\n  \"total\": 13,\n  \"date\": \"2026-04-09\",\n  \"duration\": 2050,\n  \"wrongQuestions\": [3, 7, 12]\n}"},{"language":"json","snippet":"{\n  \"version\": \"4.0.0\",\n  \"source\": {\"book\": 5, \"test\": 4, \"passage\": 1, \"title\": \"...\", \"titleCN\": \"...\"},\n  \"score\": {\"correct\": 11, \"total\": 13, \"band\": \"6.5-7.0\"},\n  \"timing\": {\"minutes\": 34.2, \"formatted\": \"34:10\"},\n  \"date\": \"2026-04-09\",\n  \"wrongQuestions\": [...],\n  \"synonyms\": [...],\n  \"vocabulary\": [...]\n}"},{"language":"bash","snippet":"bash ~/.workbuddy/skills/ielts-review-upload/scripts/sync-review.sh <path-to-data.json>"},{"language":"bash","snippet":"bash sync-review.sh data.json --token-mode    # 强制走 token，没 token 直接报错\nbash sync-review.sh data.json --anon-mode     # 强制走匿名（即使有 token）"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: ielts-tuyaya-upload\ndescription: \"上传雅思阅读复盘文件到服务器，支持 token 模式（进个人主页）和匿名模式。当用户想要上传已有的复盘 JSON、查看个人复盘仪表板时使用。触发词：上传复盘、上传复盘文件、sync review、upload review、查看我的复盘记录、我的仪表板、dashboard、tuyaya 上传、批量同步。\"\n---\n\n# IELTS Review Upload Skill\n\n## Purpose\n\n把已有的雅思阅读复盘 JSON 上传到 www.liuxue.online。支持两种通道：\n\n| 模式 | 触发条件 | 通道 | 数据落点 | 适用 |\n|---|---|---|---|---|\n| **Token 模式（推荐）** | 设置了 `IELTS_USER_TOKEN` 环境变量 | `POST /api/ielts {action:'batchImport', token}` | 主库 + **进个人主页进度图/词汇本** | 登录用户（dengjiawei / lishuzhuo / 其他注册账号） |\n| **匿名模式（兜底）** | 没有 token | `POST /ielts-api/skill-review` (x-api-key) | 匿名 dashboard 表 | 访客试用、未注册账号 |\n\n**默认走 token 模式**。脚本会自动检测 `IELTS_USER_TOKEN`，没设置时 v1.3.0 起会**直接弹起浏览器授权页**让用户一键完成绑定（OAuth 风格），完全无需 F12。\n\n## What's New in v1.3.2 — 域名迁移到 liuxue.online\n\n**⚠️ v1.3.2（2026-06-23）**：旧域名 `tuyaya.online` 因 ICP 备案审核已全站 403 不可用，所有默认 API/授权/登录地址迁移到 `www.liuxue.online`。`sync-review.sh` / `upload.js` / `setup-client-mode.sh`（含 CORS Allow-Origin）默认值全部更新。**老用户必须 `clawhub install ielts-tuyaya-upload --force` 更新**，否则上传会撞旧域名 403 失败。已存的 token 仍有效，无需重新授权。\n\n## What's New in v1.3.0 — 浏览器授权流\n\n跟随 ielts-reading-review v5.4.0 升级：\n\n- ❌ **告别 F12 复制 token**：不再需要打开 DevTools → Console 手动 `localStorage.ielts_user_token`\n- ✅ **一键浏览器授权**：缺 token 时 `sync-review.sh` 自动调起 `setup-client-mode.sh` → 浏览器弹 `www.liuxue.online/authorize.html` → 点【授权】完事\n- 🔒 **token 全程在本机**：通过 `<img src=http://127.0.0.1:port/cb?token=...>` 回传，不进 URL bar，不走第三方\n- 🛡️ **CSRF 防护**：state 随机串 + 回调白名单（仅 127.0.0.1/localhost）\n- 🪟 **三系统支持**：macOS `open` / Linux `xdg-open` / 兜底打印链接手动粘贴\n\n## When to Activate\n\n- 用户说\"上传复盘\"、\"上传复盘文件\"\n- 用户说 \"sync review\"、\"upload review\"\n- 用户想查看个人复盘仪表板\n- 用户说\"查看我的复盘记录\"、\"我的仪表板\"\n\n## Workflow\n\n### Step 0: 确认 token 是否就位\n\n第一步先检查 `IELTS_USER_TOKEN`：\n\n```bash\necho \"${IELTS_USER_TOKEN:0:20}...\"  # 只显示前 20 位避免泄漏\n```\n\n- **有输出** → 走 token 模式，数据进个人主页 ✅\n- **没输出** → 走 v1.3.0 浏览器授权流（OAuth 风格，30 秒搞定）：\n\n```\n你还没配置 IELTS_USER_TOKEN，上传后数据不会进个人主页进度图。\n\n🔧 一键授权（推荐）：\nbash ~/.workbuddy/skills/ielts-reading-review/scripts/setup-client-mode.sh\n\n脚本会：\n1. 在本机起一个随机端口的 HTTP 服务监听回调\n2. 自动唤起浏览器到 www.liuxue.online/authorize.html\n3. 你在网页点【授权】按钮，token 通过 <img> 请求回传到本机\n4. 校验通过后写入 ~/.zshrc 并 source 生效\n5. token 永远不离开你的电脑（不进 URL bar、不走第三方）\n\n兜底（浏览器/网络异常时）：\nbash setup-client-mode.sh --manual    # 走 F12 复制 token 老流程\n\n要不要现在跑一下，还是先走匿名模式？\n```\n\n**v1.3.0 起 sync-review.sh 自动检测 token，没设置时直接调起 setup-client-mode.sh，全程不用手动复制。**\n\n### Step 1: 收集 JSON 文件路径\n\n询问用户要上传的 JSON 文件路径。\n\n**JSON 格式支持两种**：\n\n**扁平格式（最简）**：\n```json\n{\n  \"book\": 5,\n  \"test\": 4,\n  \"passage\": 1,\n  \"score\": 11,\n  \"total\": 13,\n  \"date\": \"2026-04-09\",\n  \"duration\": 2050,\n  \"wrongQuestions\": [3, 7, 12]\n}\n```\n\n**v4.0 富格式（推荐，复盘 skill 直接产出）**：\n```json\n{\n  \"version\": \"4.0.0\",\n  \"source\": {\"book\": 5, \"test\": 4, \"passage\": 1, \"title\": \"...\", \"titleCN\": \"...\"},\n  \"score\": {\"correct\": 11, \"total\": 13, \"band\": \"6.5-7.0\"},\n  \"timing\": {\"minutes\": 34.2, \"formatted\": \"34:10\"},\n  \"date\": \"2026-04-09\",\n  \"wrongQuestions\": [...],\n  \"synonyms\": [...],\n  \"vocabulary\": [...]\n}\n```\n\n服务端 schemaUpgrader 会自动识"},{"path":"README.md","content":"# IELTS Tuyaya Upload\n\n把本地雅思阅读复盘 JSON 一键上传到 [www.liuxue.online](https://www.liuxue.online/ielts/)，告别手动拖文件。\n\n## 🆕 v1.3.0 — 浏览器一键授权（告别 F12）\n\n跟随 `ielts-reading-review` v5.4.0 同步升级，**绑定账号体验彻底重做**：\n\n| 旧流程 (≤v1.2) | 新流程 (v1.3+) |\n|---|---|\n| 打开 www.liuxue.online 登录 | 同左 |\n| F12 → Console → `localStorage.ielts_user_token` | ❌ 不再需要 |\n| 手动复制 token 字符串 | ❌ 不再需要 |\n| 打开 ~/.zshrc 手动 `export IELTS_USER_TOKEN=...` | ❌ 不再需要 |\n| `source ~/.zshrc` | ❌ 不再需要 |\n| —— | ✅ 浏览器弹授权页，点一下【授权】完事 |\n\n**触发方式**：跑任何上传命令（如 `node scripts/upload.js --batch xxx`），脚本检测到没设 `IELTS_USER_TOKEN` 就会自动调起 `setup-client-mode.sh`，几秒后浏览器弹出 OAuth 风格的授权卡片。\n\n**安全保障**：\n- token 通过 `<img src=http://127.0.0.1:随机端口/cb?token=...>` 回传到本机，永远不离开你的电脑\n- 回调地址白名单：仅接受 `127.0.0.1 / localhost / ::1`\n- CSRF state 校验：每次启动随机生成 16 字节，防止跨站攻击\n- token 不进浏览器 URL bar、不走第三方服务器\n\n如果浏览器异常，可手动跑 `bash setup-client-mode.sh --manual` 走 F12 老流程兜底。\n\n---\n\n## 适合谁用？\n\n- 用 `ielts-reading-review` skill 生成了一堆 JSON 复盘文件\n- 想把成绩同步到 www.liuxue.online 云端，在任何设备打开网页查看\n- 不想手动一个个拖到 submit 页面\n- 有一堆旧笔记（HTML/Markdown/截图）想一次性导入成绩看趋势图\n\n## 🚀 端到端一条龙（推荐）\n\n如果你的复盘还是散在文件夹里的旧笔记，推荐配合 `ielts-reading-review` v3.4.0+ 一起用：**自动扫 → 生成 JSON → 自动上传**，一条 prompt 搞定。\n\n### Step 1：装两个 skill（只做一次）\n\n```bash\nclawhub install ielts-reading-review\nclawhub install ielts-tuyaya-upload\n```\n\n### Step 2：把下面这段 prompt 整段发给你的 AI Buddy\n\n**不用改任何内容，复制粘贴直接发就行。**\n\n```\n帮我一条龙处理我的历史雅思复盘。\n\n流程：\n\n【A. 自动找复盘文件夹】\n1. 用 ielts-reading-review skill 的 scan-legacy-reviews.js --auto 扫我电脑常见位置\n2. 把推荐目录和其他候选报给我，让我确认用哪个\n\n【B. 生成 JSON】\n3. 对确认后的目录做深扫（--deep），列出识别到的篇目清单，让我再确认一次\n4. 逐篇生成 v3.0 schema 的 JSON，输出到 ./batch-output/\n5. 字段缺失的地方不要瞎编，缺就置空\n6. 汇报成功几篇、数据缺失几篇\n\n【C. 上传到 www.liuxue.online】\n7. 用 ielts-tuyaya-upload skill 检查登录状态（--whoami）\n   - 如果我还没账号：引导我 --register 注册（我会自己输入用户名密码）\n   - 如果已登录：继续\n8. 先跑 --diff ./batch-output/ 给我看差量（哪些是新的、哪些服务器已有）\n9. 我确认后，跑 --batch ./batch-output/ 批量上传\n10. 上传完告诉我成功几条，给我 https://www.liuxue.online/ielts/ 的链接让我去看成绩\n\n规则：\n- 每一步之间要停下来等我确认，别一口气全跑完\n- 注册/登录时让我自己在终端输入密码，你不要替我生成\n- 上传过程中有失败的，列出来让我决定要不要重试\n```\n\n### Step 3：按 Buddy 提示逐步确认\n\nAI 会每一步停下来让你确认：路径对不对 → 篇目清单对不对 → 上传差量对不对 → 最后给你成绩链接。\n\n### 全流程示意\n\n```\n  你      ─▶  我发 prompt\n                │\n                ▼\n  Buddy   ─▶  🔍 auto 扫电脑\n                │\n                ▼\n  你      ─▶  确认\"用这个目录\"\n                │\n                ▼\n  Buddy   ─▶  📂 深扫列出所有篇目\n                │\n                ▼\n  你      ─▶  确认\"篇目没错\"\n                │\n                ▼\n  Buddy   ─▶  ✍️  逐篇生成 JSON 到 batch-output/\n                │\n                ▼\n  Buddy   ─▶  🔑 检查 tuyaya 账号\n                │\n                ▼\n  你      ─▶  （首次）注册账号 / 已有直接登录\n                │\n                ▼\n  Buddy   ─▶  📊 diff 差量给你看\n                │\n                ▼\n  你      ─▶  \"上传吧\"\n                │\n                ▼\n  Buddy   ─▶  🚀 批量上传\n                │\n                ▼\n  你      ─▶  🎯 去 www.liuxue.online 看成绩\n```\n\n### 各阶段预计耗时\n\n| 阶段 | 时间 |\n|------|------|\n| 🔍 自动发现 | 3-5 秒 |\n| 📂 深扫 + 确认篇目 | 10-30 秒 |\n| ✍️ 生成 JSON（每篇） | 1-3 分钟 |\n| 🔑 注册/登录（首次） | 30 秒 |\n| 📊 diff | 5 秒 |\n| 🚀 批量上传 | 每篇 1-2 秒"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7dr93fbgrvymnk8d9r9y0tws83mhrk\",\n  \"slug\": \"ielts-tuyaya-upload\",\n  \"version\": \"1.3.2\",\n  \"publishedAt\": 1782184030308\n}"},{"path":"skill-card.md","content":"## Description:\n\nUploads local IELTS reading review JSON files to www.liuxue.online, with token-based account sync and an anonymous fallback mode.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dengjiawei1226](https://clawhub.ai/user/dengjiawei1226)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nLearners and agents use this skill to upload existing IELTS reading review JSON files, compare local and server records, and view synchronized review progress on www.liuxue.online.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill uploads IELTS review data to www.liuxue.online and uses local account tokens for token mode.\n\nMitigation: Install and run it only after accepting that data flow, and review local token storage before using account sync.\n\nRisk: Anonymous mode can send a persistent local identifier and OS username.\n\nMitigation: Prefer token mode for normal use, or set explicit anonymous identifiers only after deciding that disclosure is acceptable.\n\nRisk: The publishing helper can modify local skill installations and is intended for maintainers.\n\nMitigation: Do not run publish-clawhub.sh unless maintaining the package and prepared for its local install changes.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/dengjiawei1226/skills/ielts-tuyaya-upload)\n- [www.liuxue.online IELTS dashboard](https://www.liuxue.online/ielts/)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands and JSON examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May guide execution of local shell or Node.js upload commands that send JSON review data to www.liuxue.online.]\n\n## Skill Version(s):\n\n1.3.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1109,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T02:59:24.035Z","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-11T02:59:24.035Z","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-11T05:38:49.721Z","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"}]}}}