{
  "schemaVersion": "1.0",
  "item": {
    "slug": "wanikani-sync",
    "name": "Wanikani",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/mart1n-xyz/wanikani-sync",
    "canonicalUrl": "https://clawhub.ai/mart1n-xyz/wanikani-sync",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/wanikani-sync",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=wanikani-sync",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "scripts/sync.py",
      "scripts/queries.py",
      "references/example-queries.sql",
      "references/api-structure.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/wanikani-sync"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/wanikani-sync",
    "agentPageUrl": "https://openagent3.xyz/skills/wanikani-sync/agent",
    "manifestUrl": "https://openagent3.xyz/skills/wanikani-sync/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/wanikani-sync/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "WaniKani Sync",
        "body": "Sync your WaniKani progress data locally for analysis and insights generation."
      },
      {
        "title": "Overview",
        "body": "This skill provides tools to fetch your WaniKani learning progress via the API and store it locally in SQLite. Once synced, you (or other services) can query the data to generate statistics, track learning patterns, visualize progress, and more."
      },
      {
        "title": "Getting Your API Token",
        "body": "Log into WaniKani\nGo to Settings → API Tokens\nGenerate a new token (or use existing one)\nCopy the token (looks like a long alphanumeric string)\n\nSecurity Note: Keep your token private. Never commit it to git or share it publicly."
      },
      {
        "title": "Sync All Data",
        "body": "# Using environment variable (recommended)\nexport WANIKANI_API_TOKEN=\"your-token-here\"\npython3 scripts/sync.py\n\n# Or pass token directly (less secure)\npython3 scripts/sync.py --token \"your-token-here\"\n\n# Store in specific directory\npython3 scripts/sync.py --data-dir ~/wanikani-data"
      },
      {
        "title": "Sync Specific Data",
        "body": "# Only user info\npython3 scripts/sync.py --user-only\n\n# Only assignments (your progress on subjects)\npython3 scripts/sync.py --assignments-only\n\n# Only reviews\npython3 scripts/sync.py --reviews-only"
      },
      {
        "title": "Force Full Sync",
        "body": "By default, the script does incremental sync (only fetching data updated since last sync). To force a full refresh:\n\npython3 scripts/sync.py --full"
      },
      {
        "title": "Database Schema",
        "body": "The sync creates a wanikani.db SQLite database with these tables:"
      },
      {
        "title": "user",
        "body": "Your account info including level, subscription status, and start date."
      },
      {
        "title": "assignments",
        "body": "Your progress on each subject (radicals, kanji, vocabulary). Tracks SRS stage, unlock/start/pass/burn timestamps."
      },
      {
        "title": "level_progressions",
        "body": "Your journey through WaniKani levels with unlock/start/pass/completion timestamps."
      },
      {
        "title": "reviews",
        "body": "Your review history with correctness counts and SRS stage changes."
      },
      {
        "title": "review_statistics",
        "body": "Aggregated statistics per subject (correct/incorrect counts, streaks, percentages)."
      },
      {
        "title": "resets",
        "body": "Account reset history."
      },
      {
        "title": "subjects",
        "body": "The actual learning content (kanji, vocabulary, radicals) with characters, meanings, readings, and mnemonics.\n\nSync subjects with:\n\n# Sync all subjects (can be large!)\npython3 scripts/sync.py --subjects-only\n\n# Sync only specific levels (recommended)\npython3 scripts/sync.py --with-subjects --subject-levels 1,2,3,4,5\n\n# Include subjects in full sync\npython3 scripts/sync.py --with-subjects"
      },
      {
        "title": "sync_meta",
        "body": "Internal table tracking last sync timestamps for incremental updates."
      },
      {
        "title": "Common Queries",
        "body": "-- Current SRS stage distribution\nSELECT srs_stage, COUNT(*) FROM assignments GROUP BY srs_stage;\n\n-- Items burned per level\nSELECT level, COUNT(*) FROM assignments WHERE burned_at IS NOT NULL GROUP BY level;\n\n-- Average accuracy by subject type\nSELECT subject_type, AVG(percentage_correct) FROM review_statistics GROUP BY subject_type;\n\n-- Reviews done in last 7 days\nSELECT DATE(created_at) as day, COUNT(*) FROM reviews\nWHERE created_at > datetime('now', '-7 days') GROUP BY day;\n\n-- Time spent at each level\nSELECT level, started_at, passed_at,\n       CASE WHEN passed_at IS NOT NULL\n            THEN julianday(passed_at) - julianday(started_at)\n            ELSE NULL END as days_to_pass\nFROM level_progressions WHERE started_at IS NOT NULL;\n\n-- Most problematic items (with subject characters)\nSELECT \n    s.characters,\n    s.object as type,\n    rs.meaning_incorrect + rs.reading_incorrect as fails,\n    rs.percentage_correct as accuracy\nFROM review_statistics rs\nJOIN subjects s ON rs.subject_id = s.id\nWHERE rs.percentage_correct < 75\nORDER BY fails DESC\nLIMIT 20;\n\n-- Current leeches (Apprentice stage, failing often, with kanji)\nSELECT \n    s.characters,\n    s.object as type,\n    a.srs_stage,\n    rs.meaning_incorrect + rs.reading_incorrect as total_fails,\n    rs.percentage_correct\nFROM review_statistics rs\nJOIN assignments a ON rs.subject_id = a.subject_id\nJOIN subjects s ON rs.subject_id = s.id\nWHERE a.srs_stage BETWEEN 1 AND 4\n  AND rs.percentage_correct < 80\nORDER BY total_fails DESC\nLIMIT 15;"
      },
      {
        "title": "API Notes",
        "body": "Rate limit: 60 requests/minute\nAll API requests use the v2 revision 20170710\nIncremental sync uses updated_after filter to minimize API calls\nSee references/api-structure.md for complete endpoint documentation"
      },
      {
        "title": "Query Tools",
        "body": "After syncing, use the query helper for common reports:\n\n# Show your worst leeches (items that keep falling back)\npython3 scripts/queries.py leeches\n\n# Show SRS distribution (Apprentice/Guru/Master/etc counts)\npython3 scripts/queries.py srs\n\n# Show level progression timeline\npython3 scripts/queries.py levels\n\n# Show critical items at risk of falling back\npython3 scripts/queries.py critical\n\n# Show accuracy by subject type\npython3 scripts/queries.py accuracy\n\nSee references/example-queries.sql for raw SQL you can run directly on the database."
      },
      {
        "title": "Files",
        "body": "scripts/sync.py - Main sync tool with CLI\nscripts/queries.py - Query helper with common reports\nreferences/api-structure.md - WaniKani API reference\nreferences/example-queries.sql - SQL query examples"
      }
    ],
    "body": "WaniKani Sync\n\nSync your WaniKani progress data locally for analysis and insights generation.\n\nOverview\n\nThis skill provides tools to fetch your WaniKani learning progress via the API and store it locally in SQLite. Once synced, you (or other services) can query the data to generate statistics, track learning patterns, visualize progress, and more.\n\nGetting Your API Token\nLog into WaniKani\nGo to Settings → API Tokens\nGenerate a new token (or use existing one)\nCopy the token (looks like a long alphanumeric string)\n\nSecurity Note: Keep your token private. Never commit it to git or share it publicly.\n\nQuick Start\nSync All Data\n# Using environment variable (recommended)\nexport WANIKANI_API_TOKEN=\"your-token-here\"\npython3 scripts/sync.py\n\n# Or pass token directly (less secure)\npython3 scripts/sync.py --token \"your-token-here\"\n\n# Store in specific directory\npython3 scripts/sync.py --data-dir ~/wanikani-data\n\nSync Specific Data\n# Only user info\npython3 scripts/sync.py --user-only\n\n# Only assignments (your progress on subjects)\npython3 scripts/sync.py --assignments-only\n\n# Only reviews\npython3 scripts/sync.py --reviews-only\n\nForce Full Sync\n\nBy default, the script does incremental sync (only fetching data updated since last sync). To force a full refresh:\n\npython3 scripts/sync.py --full\n\nDatabase Schema\n\nThe sync creates a wanikani.db SQLite database with these tables:\n\nuser\n\nYour account info including level, subscription status, and start date.\n\nassignments\n\nYour progress on each subject (radicals, kanji, vocabulary). Tracks SRS stage, unlock/start/pass/burn timestamps.\n\nlevel_progressions\n\nYour journey through WaniKani levels with unlock/start/pass/completion timestamps.\n\nreviews\n\nYour review history with correctness counts and SRS stage changes.\n\nreview_statistics\n\nAggregated statistics per subject (correct/incorrect counts, streaks, percentages).\n\nresets\n\nAccount reset history.\n\nsubjects\n\nThe actual learning content (kanji, vocabulary, radicals) with characters, meanings, readings, and mnemonics.\n\nSync subjects with:\n\n# Sync all subjects (can be large!)\npython3 scripts/sync.py --subjects-only\n\n# Sync only specific levels (recommended)\npython3 scripts/sync.py --with-subjects --subject-levels 1,2,3,4,5\n\n# Include subjects in full sync\npython3 scripts/sync.py --with-subjects\n\nsync_meta\n\nInternal table tracking last sync timestamps for incremental updates.\n\nCommon Queries\n-- Current SRS stage distribution\nSELECT srs_stage, COUNT(*) FROM assignments GROUP BY srs_stage;\n\n-- Items burned per level\nSELECT level, COUNT(*) FROM assignments WHERE burned_at IS NOT NULL GROUP BY level;\n\n-- Average accuracy by subject type\nSELECT subject_type, AVG(percentage_correct) FROM review_statistics GROUP BY subject_type;\n\n-- Reviews done in last 7 days\nSELECT DATE(created_at) as day, COUNT(*) FROM reviews\nWHERE created_at > datetime('now', '-7 days') GROUP BY day;\n\n-- Time spent at each level\nSELECT level, started_at, passed_at,\n       CASE WHEN passed_at IS NOT NULL\n            THEN julianday(passed_at) - julianday(started_at)\n            ELSE NULL END as days_to_pass\nFROM level_progressions WHERE started_at IS NOT NULL;\n\n-- Most problematic items (with subject characters)\nSELECT \n    s.characters,\n    s.object as type,\n    rs.meaning_incorrect + rs.reading_incorrect as fails,\n    rs.percentage_correct as accuracy\nFROM review_statistics rs\nJOIN subjects s ON rs.subject_id = s.id\nWHERE rs.percentage_correct < 75\nORDER BY fails DESC\nLIMIT 20;\n\n-- Current leeches (Apprentice stage, failing often, with kanji)\nSELECT \n    s.characters,\n    s.object as type,\n    a.srs_stage,\n    rs.meaning_incorrect + rs.reading_incorrect as total_fails,\n    rs.percentage_correct\nFROM review_statistics rs\nJOIN assignments a ON rs.subject_id = a.subject_id\nJOIN subjects s ON rs.subject_id = s.id\nWHERE a.srs_stage BETWEEN 1 AND 4\n  AND rs.percentage_correct < 80\nORDER BY total_fails DESC\nLIMIT 15;\n\nAPI Notes\nRate limit: 60 requests/minute\nAll API requests use the v2 revision 20170710\nIncremental sync uses updated_after filter to minimize API calls\nSee references/api-structure.md for complete endpoint documentation\nQuery Tools\n\nAfter syncing, use the query helper for common reports:\n\n# Show your worst leeches (items that keep falling back)\npython3 scripts/queries.py leeches\n\n# Show SRS distribution (Apprentice/Guru/Master/etc counts)\npython3 scripts/queries.py srs\n\n# Show level progression timeline\npython3 scripts/queries.py levels\n\n# Show critical items at risk of falling back\npython3 scripts/queries.py critical\n\n# Show accuracy by subject type\npython3 scripts/queries.py accuracy\n\n\nSee references/example-queries.sql for raw SQL you can run directly on the database.\n\nFiles\nscripts/sync.py - Main sync tool with CLI\nscripts/queries.py - Query helper with common reports\nreferences/api-structure.md - WaniKani API reference\nreferences/example-queries.sql - SQL query examples"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/mart1n-xyz/wanikani-sync",
    "publisherUrl": "https://clawhub.ai/mart1n-xyz/wanikani-sync",
    "owner": "mart1n-xyz",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/wanikani-sync",
    "downloadUrl": "https://openagent3.xyz/downloads/wanikani-sync",
    "agentUrl": "https://openagent3.xyz/skills/wanikani-sync/agent",
    "manifestUrl": "https://openagent3.xyz/skills/wanikani-sync/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/wanikani-sync/agent.md"
  }
}