[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7C0C0APAM14TXWJQFS5PMWS":3,"skill-same:01M7C0C0APAM14TXWJQFS5PMWS":45},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":6,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":30,"install":31,"resources":44},"01M7C0C0APAM14TXWJQFS5PMWS","python-scala-idioms",null,"Guide for writing idiomatic Scala when translating from Python. Use when the goal is not just syntactic translation but producing clean, idiomatic Scala code. Covers immutability, expression-based style, sealed hierarchies, and common Scala conventions.","linyouxue\u002Fskill-repair-benchmark","linyouxue","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F216151464?v=4","01M7BJEVCXKD74KH6FG9CBVSQB","林宥学","01M7BJEVE02NP217V93BKZFC0J",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fevaluation\u002Fresults\u002FSkillHone\u002Ftasks\u002Fpython-scala-translation\u002Frepaired_skill\u002Fskills\u002Fpython-scala-idioms\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: python-scala-idioms\ndescription: Guide for writing idiomatic Scala when translating from Python. Use when the goal is not just syntactic translation but producing clean, idiomatic Scala code. Covers immutability, expression-based style, sealed hierarchies, and common Scala conventions.\n---\n\n# Python to Idiomatic Scala Translation\n\n## Core Principles\n\nWhen translating Python to Scala, aim for idiomatic Scala, not literal translation:\n\n1. **Prefer immutability** - Use `val` over `var`, immutable collections\n2. **Expression-based** - Everything returns a value, minimize statements\n3. **Type safety** - Leverage Scala's type system, avoid `Any`\n4. **Pattern matching** - Use instead of if-else chains\n5. **Avoid null** - Use `Option`, `Either`, `Try`\n\n## Immutability First\n\n```python\n# Python - mutable by default\nclass Counter:\n    def __init__(self):\n        self.count = 0\n\n    def increment(self):\n        self.count += 1\n        return self.count\n```\n\n```scala\n\u002F\u002F Scala - immutable approach\ncase class Counter(count: Int = 0) {\n  def increment: Counter = copy(count = count + 1)\n}\n\n\u002F\u002F Usage\nval c1 = Counter()\nval c2 = c1.increment  \u002F\u002F Counter(1)\nval c3 = c2.increment  \u002F\u002F Counter(2)\n\u002F\u002F c1 is still Counter(0)\n```\n\n## Expression-Based Style\n\n```python\n# Python - statement-based\ndef get_status(code):\n    if code == 200:\n        status = \"OK\"\n    elif code == 404:\n        status = \"Not Found\"\n    else:\n        status = \"Unknown\"\n    return status\n```\n\n```scala\n\u002F\u002F Scala - expression-based\ndef getStatus(code: Int): String = code match {\n  case 200 => \"OK\"\n  case 404 => \"Not Found\"\n  case _ => \"Unknown\"\n}\n\n\u002F\u002F No intermediate variable, match is an expression\n```\n\n## Sealed Hierarchies for Domain Modeling\n\n```python\n# Python - loose typing\ndef process_payment(method: str, amount: float):\n    if method == \"credit\":\n        # process credit\n        pass\n    elif method == \"debit\":\n        # process debit\n        pass\n    elif method == \"crypto\":\n        # process crypto\n        pass\n```\n\n```scala\n\u002F\u002F Scala - sealed trait for exhaustive matching\nsealed trait PaymentMethod\ncase class CreditCard(number: String, expiry: String) extends PaymentMethod\ncase class DebitCard(number: String) extends PaymentMethod\ncase class Crypto(walletAddress: String) extends PaymentMethod\n\ndef processPayment(method: PaymentMethod, amount: Double): Unit = method match {\n  case CreditCard(num, exp) => \u002F\u002F process credit\n  case DebitCard(num) => \u002F\u002F process debit\n  case Crypto(addr) => \u002F\u002F process crypto\n}\n\u002F\u002F Compiler warns if you miss a case!\n```\n\n## Replace Null Checks with Option\n\n```python\n# Python\ndef find_user(id):\n    user = db.get(id)\n    if user is None:\n        return None\n    profile = user.get(\"profile\")\n    if profile is None:\n        return None\n    return profile.get(\"email\")\n```\n\n```scala\n\u002F\u002F Scala - Option chaining\ndef findUser(id: Int): Option[String] = for {\n  user \u003C- db.get(id)\n  profile \u003C- user.profile\n  email \u003C- profile.email\n} yield email\n\n\u002F\u002F Or with flatMap\ndef findUser(id: Int): Option[String] =\n  db.get(id)\n    .flatMap(_.profile)\n    .flatMap(_.email)\n```\n\n## Prefer Methods on Collections\n\n```python\n# Python\nresult = []\nfor item in items:\n    if item.active:\n        result.append(item.value * 2)\n```\n\n```scala\n\u002F\u002F Scala - use collection methods\nval result = items\n  .filter(_.active)\n  .map(_.value * 2)\n```\n\n## Avoid Side Effects in Expressions\n\n```python\n# Python\nitems = []\nfor x in range(10):\n    items.append(x * 2)\n    print(f\"Added {x * 2}\")\n```\n\n```scala\n\u002F\u002F Scala - separate side effects\nval items = (0 until 10).map(_ * 2).toList\nitems.foreach(x => println(s\"Value: $x\"))\n\n\u002F\u002F Or use tap for debugging\nval items = (0 until 10)\n  .map(_ * 2)\n  .tapEach(x => println(s\"Value: $x\"))\n  .toList\n```\n\n## Use Named Parameters for Clarity\n\n```python\n# Python\ndef create_user(name, email, admin=False, active=True):\n    pass\n\nuser = create_user(\"Alice\", \"alice@example.com\", admin=True)\n```\n\n```scala\n\u002F\u002F Scala - named parameters work the same\ndef createUser(\n  name: String,\n  email: String,\n  admin: Boolean = false,\n  active: Boolean = true\n): User = ???\n\nval user = createUser(\"Alice\", \"alice@example.com\", admin = true)\n\n\u002F\u002F Case class with defaults is often better\ncase class User(\n  name: String,\n  email: String,\n  admin: Boolean = false,\n  active: Boolean = true\n)\n\nval user = User(\"Alice\", \"alice@example.com\", admin = true)\n```\n\n## Scala Naming Conventions\n\n| Python | Scala |\n|--------|-------|\n| `snake_case` (variables, functions) | `camelCase` |\n| `SCREAMING_SNAKE` (constants) | `CamelCase` or `PascalCase` |\n| `PascalCase` (classes) | `PascalCase` |\n| `_private` | `private` keyword |\n| `__very_private` | `private[this]` |\n\n```python\n# Python\nMAX_RETRY_COUNT = 3\ndef calculate_total_price(items):\n    pass\n\nclass ShoppingCart:\n    def __init__(self):\n        self._items = []\n```\n\n```scala\n\u002F\u002F Scala\nval MaxRetryCount = 3  \u002F\u002F or final val MAX_RETRY_COUNT\ndef calculateTotalPrice(items: List[Item]): Double = ???\n\nclass ShoppingCart {\n  private var items: List[Item] = Nil\n}\n```\n\n## Avoid Returning Unit\n\n```python\n# Python - None return is common\ndef save_user(user):\n    db.save(user)\n    # implicit None return\n```\n\n```scala\n\u002F\u002F Scala - consider returning useful information\ndef saveUser(user: User): Either[Error, UserId] = {\n  db.save(user) match {\n    case Right(id) => Right(id)\n    case Left(err) => Left(err)\n  }\n}\n\n\u002F\u002F Or at minimum, use Try\ndef saveUser(user: User): Try[Unit] = Try {\n  db.save(user)\n}\n```\n\n## Use Apply for Factory Methods\n\n```python\n# Python\nclass Parser:\n    def __init__(self, config):\n        self.config = config\n\n    @classmethod\n    def default(cls):\n        return cls(Config())\n```\n\n```scala\n\u002F\u002F Scala - companion object with apply\nclass Parser(config: Config)\n\nobject Parser {\n  def apply(config: Config): Parser = new Parser(config)\n  def apply(): Parser = new Parser(Config())\n}\n\n\u002F\u002F Usage\nval parser = Parser()  \u002F\u002F Calls apply()\nval parser = Parser(customConfig)\n```\n\n## Cheat Sheet: Common Transformations\n\n| Python Pattern | Idiomatic Scala |\n|---------------|-----------------|\n| `if x is None` | `x.isEmpty` or pattern match |\n| `if x is not None` | `x.isDefined` or `x.nonEmpty` |\n| `x if x else default` | `x.getOrElse(default)` |\n| `[x for x in xs if p(x)]` | `xs.filter(p)` |\n| `[f(x) for x in xs]` | `xs.map(f)` |\n| `any(p(x) for x in xs)` | `xs.exists(p)` |\n| `all(p(x) for x in xs)` | `xs.forall(p)` |\n| `next(x for x in xs if p(x), None)` | `xs.find(p)` |\n| `dict(zip(keys, values))` | `keys.zip(values).toMap` |\n| `isinstance(x, Type)` | `x.isInstanceOf[Type]` or pattern match |\n| `try: ... except: ...` | `Try { ... }` or pattern match |\n| Mutable accumulator loop | `foldLeft` \u002F `foldRight` |\n| `for i, x in enumerate(xs)` | `xs.zipWithIndex` |\n\n## Anti-Patterns to Avoid\n\n```scala\n\u002F\u002F DON'T: Use null\nval name: String = null  \u002F\u002F Bad!\n\n\u002F\u002F DO: Use Option\nval name: Option[String] = None\n\n\u002F\u002F DON'T: Use Any or type casts\nval data: Any = getData()\nval name = data.asInstanceOf[String]\n\n\u002F\u002F DO: Use proper types and pattern matching\nsealed trait Data\ncase class UserData(name: String) extends Data\nval data: Data = getData()\ndata match {\n  case UserData(name) => \u002F\u002F use name\n}\n\n\u002F\u002F DON'T: Nested if-else chains\nif (x == 1) ... else if (x == 2) ... else if (x == 3) ...\n\n\u002F\u002F DO: Pattern matching\nx match {\n  case 1 => ...\n  case 2 => ...\n  case 3 => ...\n}\n\n\u002F\u002F DON'T: var with mutation\nvar total = 0\nfor (x \u003C- items) total += x\n\n\u002F\u002F DO: fold\nval total = items.sum\n\u002F\u002F or\nval total = items.foldLeft(0)(_ + _)\n```\n","# Python to Idiomatic Scala Translation\n\n## Core Principles\n\nWhen translating Python to Scala, aim for idiomatic Scala, not literal translation:\n\n1. **Prefer immutability** - Use `val` over `var`, immutable collections\n2. **Expression-based** - Everything returns a value, minimize statements\n3. **Type safety** - Leverage Scala's type system, avoid `Any`\n4. **Pattern matching** - Use instead of if-else chains\n5. **Avoid null** - Use `Option`, `Either`, `Try`\n\n## Immutability First\n\n```python\n# Python - mutable by default\nclass Counter:\n    def __init__(self):\n        self.count = 0\n\n    def increment(self):\n        self.count += 1\n        return self.count\n```\n\n```scala\n\u002F\u002F Scala - immutable approach\ncase class Counter(count: Int = 0) {\n  def increment: Counter = copy(count = count + 1)\n}\n\n\u002F\u002F Usage\nval c1 = Counter()\nval c2 = c1.increment  \u002F\u002F Counter(1)\nval c3 = c2.increment  \u002F\u002F Counter(2)\n\u002F\u002F c1 is still Counter(0)\n```\n\n## Expression-Based Style\n\n```python\n# Python - statement-based\ndef get_status(code):\n    if code == 200:\n        status = \"OK\"\n    elif code == 404:\n        status = \"Not Found\"\n    else:\n        status = \"Unknown\"\n    return status\n```\n\n```scala\n\u002F\u002F Scala - expression-based\ndef getStatus(code: Int): String = code match {\n  case 200 => \"OK\"\n  case 404 => \"Not Found\"\n  case _ => \"Unknown\"\n}\n\n\u002F\u002F No intermediate variable, match is an expression\n```\n\n## Sealed Hierarchies for Domain Modeling\n\n```python\n# Python - loose typing\ndef process_payment(method: str, amount: float):\n    if method == \"credit\":\n        # process credit\n        pass\n    elif method == \"debit\":\n        # process debit\n        pass\n    elif method == \"crypto\":\n        # process crypto\n        pass\n```\n\n```scala\n\u002F\u002F Scala - sealed trait for exhaustive matching\nsealed trait PaymentMethod\ncase class CreditCard(number: String, expiry: String) extends PaymentMethod\ncase class DebitCard(number: String) extends PaymentMethod\ncase class Crypto(walletAddress: String) extends PaymentMethod\n\ndef processPayment(method: PaymentMethod, amount: Double): Unit = method match {\n  case CreditCard(num, exp) => \u002F\u002F process credit\n  case DebitCard(num) => \u002F\u002F process debit\n  case Crypto(addr) => \u002F\u002F process crypto\n}\n\u002F\u002F Compiler warns if you miss a case!\n```\n\n## Replace Null Checks with Option\n\n```python\n# Python\ndef find_user(id):\n    user = db.get(id)\n    if user is None:\n        return None\n    profile = user.get(\"profile\")\n    if profile is None:\n        return None\n    return profile.get(\"email\")\n```\n\n```scala\n\u002F\u002F Scala - Option chaining\ndef findUser(id: Int): Option[String] = for {\n  user \u003C- db.get(id)\n  profile \u003C- user.profile\n  email \u003C- profile.email\n} yield email\n\n\u002F\u002F Or with flatMap\ndef findUser(id: Int): Option[String] =\n  db.get(id)\n    .flatMap(_.profile)\n    .flatMap(_.email)\n```\n\n## Prefer Methods on Collections\n\n```python\n# Python\nresult = []\nfor item in items:\n    if item.active:\n        result.append(item.value * 2)\n```\n\n```scala\n\u002F\u002F Scala - use collection methods\nval result = items\n  .filter(_.active)\n  .map(_.value * 2)\n```\n\n## Avoid Side Effects in Expressions\n\n```python\n# Python\nitems = []\nfor x in range(10):\n    items.append(x * 2)\n    print(f\"Added {x * 2}\")\n```\n\n```scala\n\u002F\u002F Scala - separate side effects\nval items = (0 until 10).map(_ * 2).toList\nitems.foreach(x => println(s\"Value: $x\"))\n\n\u002F\u002F Or use tap for debugging\nval items = (0 until 10)\n  .map(_ * 2)\n  .tapEach(x => println(s\"Value: $x\"))\n  .toList\n```\n\n## Use Named Parameters for Clarity\n\n```python\n# Python\ndef create_user(name, email, admin=False, active=True):\n    pass\n\nuser = create_user(\"Alice\", \"alice@example.com\", admin=True)\n```\n\n```scala\n\u002F\u002F Scala - named parameters work the same\ndef createUser(\n  name: String,\n  email: String,\n  admin: Boolean = false,\n  active: Boolean = true\n): User = ???\n\nval user = createUser(\"Alice\", \"alice@example.com\", admin = true)\n\n\u002F\u002F Case class with defaults is often better\ncase class User(\n  name: String,\n  email: String,\n  admin: Boolean = false,\n  active: Boolean = true\n)\n\nval user = User(\"Alice\", \"alice@example.com\", admin = true)\n```\n\n## Scala Naming Conventions\n\n| Python | Scala |\n|--------|-------|\n| `snake_case` (variables, functions) | `camelCase` |\n| `SCREAMING_SNAKE` (constants) | `CamelCase` or `PascalCase` |\n| `PascalCase` (classes) | `PascalCase` |\n| `_private` | `private` keyword |\n| `__very_private` | `private[this]` |\n\n```python\n# Python\nMAX_RETRY_COUNT = 3\ndef calculate_total_price(items):\n    pass\n\nclass ShoppingCart:\n    def __init__(self):\n        self._items = []\n```\n\n```scala\n\u002F\u002F Scala\nval MaxRetryCount = 3  \u002F\u002F or final val MAX_RETRY_COUNT\ndef calculateTotalPrice(items: List[Item]): Double = ???\n\nclass ShoppingCart {\n  private var items: List[Item] = Nil\n}\n```\n\n## Avoid Returning Unit\n\n```python\n# Python - None return is common\ndef save_user(user):\n    db.save(user)\n    # implicit None return\n```\n\n```scala\n\u002F\u002F Scala - consider returning useful information\ndef saveUser(user: User): Either[Error, UserId] = {\n  db.save(user) match {\n    case Right(id) => Right(id)\n    case Left(err) => Left(err)\n  }\n}\n\n\u002F\u002F Or at minimum, use Try\ndef saveUser(user: User): Try[Unit] = Try {\n  db.save(user)\n}\n```\n\n## Use Apply for Factory Methods\n\n```python\n# Python\nclass Parser:\n    def __init__(self, config):\n        self.config = config\n\n    @classmethod\n    def default(cls):\n        return cls(Config())\n```\n\n```scala\n\u002F\u002F Scala - companion object with apply\nclass Parser(config: Config)\n\nobject Parser {\n  def apply(config: Config): Parser = new Parser(config)\n  def apply(): Parser = new Parser(Config())\n}\n\n\u002F\u002F Usage\nval parser = Parser()  \u002F\u002F Calls apply()\nval parser = Parser(customConfig)\n```\n\n## Cheat Sheet: Common Transformations\n\n| Python Pattern | Idiomatic Scala |\n|---------------|-----------------|\n| `if x is None` | `x.isEmpty` or pattern match |\n| `if x is not None` | `x.isDefined` or `x.nonEmpty` |\n| `x if x else default` | `x.getOrElse(default)` |\n| `[x for x in xs if p(x)]` | `xs.filter(p)` |\n| `[f(x) for x in xs]` | `xs.map(f)` |\n| `any(p(x) for x in xs)` | `xs.exists(p)` |\n| `all(p(x) for x in xs)` | `xs.forall(p)` |\n| `next(x for x in xs if p(x), None)` | `xs.find(p)` |\n| `dict(zip(keys, values))` | `keys.zip(values).toMap` |\n| `isinstance(x, Type)` | `x.isInstanceOf[Type]` or pattern match |\n| `try: ... except: ...` | `Try { ... }` or pattern match |\n| Mutable accumulator loop | `foldLeft` \u002F `foldRight` |\n| `for i, x in enumerate(xs)` | `xs.zipWithIndex` |\n\n## Anti-Patterns to Avoid\n\n```scala\n\u002F\u002F DON'T: Use null\nval name: String = null  \u002F\u002F Bad!\n\n\u002F\u002F DO: Use Option\nval name: Option[String] = None\n\n\u002F\u002F DON'T: Use Any or type casts\nval data: Any = getData()\nval name = data.asInstanceOf[String]\n\n\u002F\u002F DO: Use proper types and pattern matching\nsealed trait Data\ncase class UserData(name: String) extends Data\nval data: Data = getData()\ndata match {\n  case UserData(name) => \u002F\u002F use name\n}\n\n\u002F\u002F DON'T: Nested if-else chains\nif (x == 1) ... else if (x == 2) ... else if (x == 3) ...\n\n\u002F\u002F DO: Pattern matching\nx match {\n  case 1 => ...\n  case 2 => ...\n  case 3 => ...\n}\n\n\u002F\u002F DON'T: var with mutation\nvar total = 0\nfor (x \u003C- items) total += x\n\n\u002F\u002F DO: fold\nval total = items.sum\n\u002F\u002F or\nval total = items.foldLeft(0)(_ + _)\n```\n",{"name":5,"description":7},"main","cdcb6d230f3b15c3c33f8a2bdd16439f43602cbe","evaluation\u002Fresults\u002FSkillHone\u002Ftasks\u002Fpython-scala-translation\u002Frepaired_skill\u002Fskills\u002Fpython-scala-idioms",1,"https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark","https:\u002F\u002Fgithub.com\u002Flinyouxue","2026-11-14 20:28:35",{"source":8,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add linyouxue\u002Fskill-repair-benchmark --skill python-scala-idioms",{"tool":37,"command":38},"bunx","bunx skills add linyouxue\u002Fskill-repair-benchmark --skill python-scala-idioms",{"tool":40,"command":41},"pnpm","pnpm dlx skills add linyouxue\u002Fskill-repair-benchmark --skill python-scala-idioms","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fevaluation\u002Fresults\u002FSkillHone\u002Ftasks\u002Fpython-scala-translation\u002Frepaired_skill\u002Fskills\u002Fpython-scala-idioms\u002FSKILL.md",true,[],[46,53,60,67,72,77],{"skillNo":47,"name":48,"nameZh":6,"description":49,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":52,"publishedAt":19},"01M7E1HGVRY73NBJ022CJG13X6","video-frame-extraction","Extract frames from video files and save them as images using OpenCV","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_03\u002Finputs\u002Fskills\u002Fvideo-frame-extraction\u002FSKILL.md",[],[],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":19},"01M7E1HAG5R7CJ9C8NYJS771MB","openai-vision","Analyze images and multi-frame sequences using OpenAI GPT vision models","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_03\u002Finputs\u002Fskills\u002Fopenai-vision\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M7E1H7DADKB6QBWKC2KQ63SZ","image-ocr","Extract text content from images using Tesseract OCR via Python, including structured field extraction from receipts and forms","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_03\u002Finputs\u002Fskills\u002Fimage-ocr\u002FSKILL.md",[],[],{"skillNo":68,"name":48,"nameZh":6,"description":49,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":19},"01M7E1H0WBNT43TENGQY7AVZHD","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_02\u002Finputs\u002Fskills\u002Fvideo-frame-extraction\u002FSKILL.md",[],[],{"skillNo":73,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M7E1GTC7D4N4Q2EF03875J9E","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_02\u002Finputs\u002Fskills\u002Fopenai-vision\u002FSKILL.md",[],[],{"skillNo":78,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":19},"01M7E1GQ92CWFMGH53KSSE4WER","https:\u002F\u002Fgithub.com\u002Flinyouxue\u002Fskill-repair-benchmark\u002Fblob\u002Fmain\u002Fjpg-ocr-stat\u002Fresult\u002Fskilltta-claude4.7\u002Fgroup_03\u002Frun_02\u002Finputs\u002Fskills\u002Fimage-ocr\u002FSKILL.md",[],[]]