
Lck Analytics
Turn Oracle-style LCK match CSVs into cached historical JSON and dated match or live-game analysis reports inside your agent workflow.
Overview
lck-analytics is an agent skill for the Grow phase that ingests Oracle-style LCK CSV match rows and generates historical cache JSON plus match and live-game analysis reports.
Install
npx skills add https://github.com/nomadamas/k-skill --skill lck-analyticsWhat is this skill?
- SKILL.md packaged for direct agent use in the k-skill / Changesets npm workspace flow
- scripts/sync-oracle.js ingests Oracle-style CSV rows into a historical cache JSON
- scripts/build-match-report.js produces date-scoped match analysis from synced data
- scripts/analyze-live-game.js generates live-game analysis artifacts
- samples/oracle-lck-sample.csv supports local smoke tests without production feeds
- 3 Node scripts: sync-oracle, build-match-report, analyze-live-game
- 1 bundled oracle-lck-sample.csv for local smoke tests
Adoption & trust: 2.3k installs on skills.sh; 5.4k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You have raw LCK Oracle CSV exports but no repeatable way to cache history and produce consistent match or live analysis for your agent or app.
Who is it for?
Solo builders shipping esports stats tools, research notebooks, or agent-driven LCK commentary who already have or can obtain Oracle-format CSVs.
Skip if: Teams with no League of Legends data interest, or builders who need a hosted API instead of local Node scripts and CSV maintenance.
When should I use this skill?
You need to sync LCK Oracle CSV data, refresh a historical JSON cache, or generate match or live-game analysis with the packaged scripts.
What do I get? / Deliverables
After running the sync and report scripts, you get structured historical cache and analysis outputs your agent can cite when building esports dashboards, content, or research features.
- Historical cache JSON from CSV sync
- Date-scoped match analysis reports
- Live-game analysis artifacts
Recommended Skills
Journey fit
Canonical shelf is Grow because the pack’s outputs are match intelligence and trends you use after shipping an esports product or research pipeline—not greenfield UI work. Analytics is the right subphase: sync scripts, report builders, and live-game analysis are measurement and interpretation of competitive match data.
How it compares
Use as a skill-packaged CSV-to-report pipeline, not as a general-purpose sports MCP server or cloud analytics SaaS.
Common Questions / FAQ
Who is lck-analytics for?
Indie developers and analysts working on LCK-focused stats, fantasy, or content products who want agent-ready docs plus Node scripts to sync CSVs and emit match or live reports.
When should I use lck-analytics?
Use it in Grow when you are interpreting match performance trends, and in Operate when refreshing caches after new match CSV drops; also during Build if you are wiring an esports data integration before launch.
Is lck-analytics safe to install?
Review the Security Audits panel on this Prism page and inspect scripts/sync-oracle.js, build-match-report.js, and analyze-live-game.js before running them on untrusted CSV paths or production machines.
SKILL.md
READMESKILL.md - Lck Analytics
# LCK Analytics skill pack k-skill 버전의 `lck-analytics` 스킬 팩입니다. - Original source: <https://github.com/jerjangmin/share/tree/main/SKILL/lck-analytics> - Original author: `jerjangmin` - This repo adaptation: npm workspace / Changesets 릴리스 흐름에 맞춘 k-skill 배포용 패키징 포함 항목: - `SKILL.md`: 에이전트에 바로 줄 수 있는 스킬 문서 - `scripts/sync-oracle.js`: Oracle-style CSV → historical cache JSON - `scripts/build-match-report.js`: 날짜별 match analysis 생성 - `scripts/analyze-live-game.js`: live game analysis 생성 - `samples/oracle-lck-sample.csv`: local smoke test용 샘플 CSV league,matchid,date,patch,side,teamname,opponentteam,playername,position,champion,opponentchampion,result,gd15,csd15,xpd15,drg,bn,blindpick,counterpick LCK,match-1,2026-04-01,16.6.753.8272,blue,Hanwha Life Esports,T1,HLE Zeus,top,Aatrox,Gnar,win,1200,18,340,100,100,0,1 LCK,match-1,2026-04-01,16.6.753.8272,blue,Hanwha Life Esports,T1,HLE Peanut,jungle,Vi,Sejuani,win,800,5,280,100,100,1,0 LCK,match-1,2026-04-01,16.6.753.8272,red,T1,Hanwha Life Esports,T1 Doran,top,Gnar,Aatrox,loss,-1200,-18,-340,0,0,1,0 LCK,match-1,2026-04-01,16.6.753.8272,red,T1,Hanwha Life Esports,T1 Oner,jungle,Sejuani,Vi,loss,-800,-5,-280,0,0,0,1 const fs = require("node:fs"); const path = require("node:path"); const { pathToFileURL } = require("node:url"); async function loadLckResults() { const candidates = []; const packageNames = ["lck-analytics", "lck-results"]; if (process.env.GLOBAL_NPM_ROOT) { for (const packageName of packageNames) { candidates.push(path.join(process.env.GLOBAL_NPM_ROOT, packageName, "src", "index.js")); } } try { const globalRoot = await detectGlobalNpmRoot(); for (const packageName of packageNames) { candidates.push(path.join(globalRoot, packageName, "src", "index.js")); } } catch { // ignore detection failure and continue to local fallback } candidates.push(path.resolve(__dirname, "..", "..", "packages", "lck-analytics", "src", "index.js")); const entryPath = candidates.find((candidate) => fs.existsSync(candidate)); if (!entryPath) { throw new Error("Could not find lck-analytics package. Install it globally with `npm install -g lck-analytics` or run from the k-skill repo."); } return import(pathToFileURL(entryPath).href); } function ensureDir(dirPath) { fs.mkdirSync(dirPath, { recursive: true }); } function readJson(filePath, fallback = null) { if (!fs.existsSync(filePath)) { return fallback; } return JSON.parse(fs.readFileSync(filePath, "utf8")); } function writeJson(filePath, value) { ensureDir(path.dirname(filePath)); fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8"); } function readText(filePath, fallback = "") { if (!fs.existsSync(filePath)) { return fallback; } return fs.readFileSync(filePath, "utf8"); } function parseArgs(argv) { const args = {}; for (let index = 0; index < argv.length; index += 1) { const token = argv[index]; if (!token.startsWith("--")) { continue; } const key = token.slice(2); const next = argv[index + 1]; if (!next || next.startsWith("--")) { args[key] = true; continue; } args[key] = next; index += 1; } return args; } function formatOutput(value) { return `${JSON.stringify(value, null, 2)}\n`; } function resolveCachePaths(baseDir) { return { root: baseDir, historical: path.join(baseDir, "historical-analysis.json"), live: path.join(baseDir, "live"), reports: path.join(baseDir, "reports"), }; } async function detectGlobalNpmRoot() { const { execFileSync } = require("node:child_process"); return execFileSync("npm", ["root", "-g"], { encoding: "utf8" }).trim(); } module.exports = { ensureDir, formatOutput, loadLckResults, parseArgs, readJson, readText, resolveCachePaths, writeJson, }; #!/usr/bin/env node const fs = require("node:fs"); const path = require("node:path"); const { formatOutput, loadLckResults, parseArgs, readJso