Skill: dengjiawei1226/ielts-review-upload (version 2.1.0)

--- name: ielts-review-upload description: "上传雅思阅读复盘文件到服务器，查看个人进步趋势。当用户想要上传已有的复盘文件（JSON）到云端，或者查看个人复盘仪表板时使用。触发词：上传复盘、上传复盘文件、sync review、upload review、查看我的复盘记录、我的仪表板、dashboard。" --- # IELTS Review Upload Skill ## Purpose 上传已有的雅思阅读复盘数据（JSON）到云端服务器，并在个人仪表板上查看所有复盘记录和进步趋势。 ## ⚠️ 重要提示：告知用户查看结果的入口 **上传完成后，必须明确告知用户去哪里看复盘结果：** 🔗 **在线阅读复盘首页：https://tuyaya.online/ielts/reading.html** 在这里可以： - 查看所有历史复盘记录（按时间排列） - 查看进步趋势图表 - 跨设备访问（手机/电脑都能看） 每次上传完成后，回复中必须包含仪表板链接。 ## When to Activate - 用户说"上传复盘"、"上传复盘文件" - 用户说"sync review"、"upload review" - 用户想查看个人复盘仪表板 - 用户说"查看我的复盘记录"、"我的仪表板" ## Workflow ### Step 1: Collect Input 询问用户要上传的 JSON 数据文件路径。 **JSON 文件格式要求**： ```json { "book": 5, "test": 4, "passage": 1, "score": 11, "total": 13, "date": "2026-04-09", "band": "6.5-7.0", "timeSpent": "34:10", "wrongQuestions": [3, 7, 12], "errorCategories": ["synonym_failure", "over_inference"] } ``` ### Step 2: Run Upload Script 运行上传脚本： ```bash bash scripts/sync-review.sh <path-to-data.json> ``` **脚本功能**： - 自动生成稳定的匿名用户 ID（基于机器的 hostname + username 的 SHA256 哈希） - 上传数据到私有后端（需要 API key 认证） - 打印个性化仪表板 URL **如果脚本不存在**： 从当前 Skill 目录复制，或者从 GitHub 下载： ```bash curl -o scripts/sync-review.sh https://raw.githubusercontent.com/dengjiawei1226/ielts-reading-review/main/scripts/sync-review.sh chmod +x scripts/sync-review.sh ``` ### Step 3: Return Dashboard URL 上传完成后，告诉用户他们的仪表板 URL： **首次用户**： ``` ✅ 上传成功！ 你的个人复盘仪表板： https://tuyaya.online/ielts/reading.html?user=xxx&key=xxx 建议收藏这个链接，方便随时查看你的进步趋势。 ``` **返回用户**： ``` ✅ 上传成功！已同步到你的仪表板。 查看所有复盘记录： https://tuyaya.online/ielts/reading.html?user=xxx&key=xxx ``` ### Step 4: View Dashboard (Optional) 如果用户想立即查看仪表板，可以： 1. 打开浏览器访问仪表板 URL 2. 或者生成二维码方便手机访问 ## Configuration ### API Key 脚本中已内置默认的 API key：[REDACTED_SECRET] 如果需要更换 API key，编辑 `scripts/sync-review.sh` 文件，修改 `API_KEY` 变量。 ### Backend URL 默认后端 URL：`https://tuyaya.online/ielts-api` 如果需要更换，编辑 `scripts/sync-review.sh` 文件，修改 `API_BASE` 变量。 ### User ID Generation 用户 ID 是自动生成的，基于： - 机器的 hostname - 当前用户名 生成算法： ```bash echo -n "$(hostname)-$(whoami)" | shasum -a 256 | cut -c1-16 ``` 同样的机器总是生成同样的用户 ID。 ## Reference Files | File | Purpose | |------|---------| | `scripts/sync-review.sh` | 上传脚本（bash） | ## Troubleshooting ### "file not found" Error 确保你提供的 JSON 文件路径是正确的。 ### "Upload failed" Error 检查： 1. 网络连接是否正常 2. API key 是否有效 3. 后端服务器是否可访问 ### "JSON file must contain..." Error 确保你的 JSON 文件包含必要的字段：`book`, `test`, `passage`, `score`, `total` ## Style Guidelines - 简洁直接 — 不要多余的解释 - 功能导向 — 每个句子都应该帮助用户完成上传 - 中文是主要语言，英文术语保留原样 - 上传完成后，总是提供仪表板 URL

path: scripts/sync-review.sh
content: #!/bin/bash
# sync-review.sh — Upload Skill-generated review data to the web backend
#
# Usage:
#   bash sync-review.sh <json-file> [--html review.html] [--bilingual bilingual.html]
#
# The JSON file must contain: book, test, passage, score, total
# Optional: band, date, timeSpent, wrongQuestions, errorCategories
#
# Multi-tenant: automatically generates a stable user ID from hostname + username.
# Each user gets their own data space on the web dashboard.
#
# Environment variables (or edit defaults below):
#   IELTS_API_BASE — API base URL (default: https://tuyaya.online/ielts-api)
#   IELTS_API_KEY  — API key for authentication
#   IELTS_USER_ID  — Override auto-generated user ID (optional)

set -e

# ─── Config ───
API_BASE="${IELTS_API_BASE:-https://tuyaya.online/ielts-api}"
[REDACTED_SECRET]"

# ─── Generate stable user ID ───
# Uses SHA256 of (hostname + system username) for anonymity + determinism
if [[ -n "$IELTS_USER_ID" ]]; then
  USER_ID="$IELTS_USER_ID"
else
  RAW_ID="$(hostname)-$(whoami)"
  if command -v shasum &>/dev/null; then
    USER_ID=$(echo -n "$RAW_ID" | shasum -a 256 | cut -c1-16)
  elif command -v sha256sum &>/dev/null; then
    USER_ID=$(echo -n "$RAW_ID" | sha256sum | cut -c1-16)
  else
    # Fallback: use raw string (less ideal but functional)
    USER_ID=$(echo -n "$RAW_ID" | md5sum 2>/dev/null | cut -c1-16 || echo "$RAW_ID")
  fi
fi

# Display name: system username (not sensitive, just a friendly label)
USER_NAME="${IELTS_USER_NAME:-$(whoami)}"

# ─── Parse args ───
JSON_FILE=""
HTML_FILE=""
BILINGUAL_FILE=""

while [[ $# -gt 0 ]]; do
  case "$1" in
    --html)     HTML_FILE="$2"; shift 2 ;;
    --bilingual) BILINGUAL_FILE="$2"; shift 2 ;;
    -*)         echo "Unknown option: $1"; exit 1 ;;
    *)          JSON_FILE="$1"; shift ;;
  esac
done

if [[ -z "$JSON_FILE" ]]; then
  echo "Usage: bash sync-review.sh <data.json> [--html review.html] [--bilingual bilingual.html]"
  exit 1
fi

if [[ ! -f "$JSON_FILE" ]]; then
  echo "Error: file not found: $JSON_FILE"
  exit 1
fi

echo "=== Syncing review to web ==="
echo "  JSON: $JSON_FILE"
echo "  User: $USER_NAME ($USER_ID)"

# ─── Read JSON and optionally embed HTML content ───
PAYLOAD=$(cat "$JSON_FILE")

# If HTML files provided, embed their content into the JSON payload
if [[ -n "$HTML_FILE" && -f "$HTML_FILE" ]]; then
  echo "  HTML: $HTML_FILE"
  PAYLOAD=$(python3 -c "
import json, sys
data = json.loads(sys.argv[1])
with open(sys.argv[2], 'r') as f:
    data['reviewHtml'] = f.read()
print(json.dumps(data))
" "$PAYLOAD" "$HTML_FILE")
fi

if [[ -n "$BILINGUAL_FILE" && -f "$BILINGUAL_FILE" ]]; then
  echo "  Bilingual: $BILINGUAL_FILE"
  PAYLOAD=$(python3 -c "
import json, sys
data = json.loads(sys.argv[1])
with open(sys.argv[2], 'r') as f:
    data['bilingualHtml'] = f.read()
print(json.dumps(data))
" "$PAYLOAD" "$BILINGUAL_FILE")
fi

# Add source marker
PAYLOAD=$(python3 -c "
import json, sys
data = json.loads(sys.argv[1])
data['source'] = 'skill'
print(json.dumps(data))
" "$PAYLOAD")

# ─── Upload ───
echo "  Uploading to $API_BASE/skill-review ..."
RESPONSE=$(curl -s -w "\n%{http_code}" \
  -X POST "$API_BASE/skill-review" \
  -H "Content-Type: application/json" \
  -H "x-[REDACTED_SECRET]" \
  -H "x-user-id: $USER_ID" \
  -H "x-user-name: $USER_NAME" \
  -d "$PAYLOAD")

HTTP_CODE=$(echo "$RESPONSE" | tail -1)
BODY=$(echo "$RESPONSE" | sed '$d')

if [[ "$HTTP_CODE" -ge 200 && "$HTTP_CODE" -lt 300 ]]; then
  echo "  ✅ Upload success ($HTTP_CODE): $BODY"
else
  echo "  ❌ Upload failed ($HTTP_CODE): $BODY"
  exit 1
fi

echo ""
echo "════════════════════════════════════════════"
echo "  📊 你的专属复盘看板："
echo "  $API_BASE/web/?user=$USER_ID&key=$API_KEY"
echo ""
echo "  💡 建议收藏这个链接，随时查看历史复盘记录"
echo "  🔑 你的用户 ID: $USER_ID"
echo "════════════════════════════════════════════"


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)