[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KFTWRKBX308KASD4MMK8FE":3,"skill-same:01M6KFTWRKBX308KASD4MMK8FE":57},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":38,"repositoryHtmlUrl":39,"repositoryHomepageUrl":40,"ownerHtmlUrl":41,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":42,"install":43,"resources":56},"01M6KFTWRKBX308KASD4MMK8FE","run2_circe-json",null,"Using Circe for JSON tokenization and dot-path navigation in Scala, with the exact APIs needed to replace Python's json module and dict traversal.","cxcscmu\u002FSkillLearnBench","cxcscmu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F142838272?v=4","01M6KCQDFQWPDSN0MKZY96MSQP","01M6KCQDM7G70TKJ28NTSQC0RZ",92,"MIT","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb2-self-feedback-claude-sonnet-4-6\u002Fpython-scala-translation\u002Frun2_circe-json\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29],"json","run2 circe json","python","scala","dot","navigation","module","dict","Tokenization","with","path","for","2026-11-10 10:12:30",false,"---\nname: run2_circe-json\ndescription: Using Circe for JSON tokenization and dot-path navigation in Scala, with the exact APIs needed to replace Python's json module and dict traversal.\n---\n\n# Circe JSON Library (replacing Python's json module)\n\n## Setup (build.sbt)\n\n```scala\nlibraryDependencies ++= Seq(\n  \"io.circe\" %% \"circe-core\"    % \"0.14.6\",\n  \"io.circe\" %% \"circe-generic\" % \"0.14.6\",\n  \"io.circe\" %% \"circe-parser\"  % \"0.14.6\"\n)\n```\n\n## Imports\n\n```scala\nimport io.circe.Json\nimport io.circe.parser._   \u002F\u002F for parse()\nimport io.circe.syntax._   \u002F\u002F for .asJson (not needed for tokenizer)\n```\n\n## Serialization\n\nPython:\n```python\njson.dumps(value)            # compact\njson.dumps(value, indent=2)  # pretty\n```\n\nCirce:\n```scala\nvalue.noSpaces   \u002F\u002F compact — equivalent to json.dumps(value)\nvalue.spaces2    \u002F\u002F 2-space indent — equivalent to json.dumps(value, indent=2)\nvalue.spaces4    \u002F\u002F 4-space indent\n```\n\n## Parsing\n\n```scala\nval json: Either[io.circe.Error, Json] = parse(\"\"\"{\"key\": \"value\"}\"\"\")\nval json: Json = parse(\"\"\"{\"key\": \"value\"}\"\"\").getOrElse(Json.Null)\n```\n\n## Key Json Navigation APIs\n\n```scala\njson.asObject             \u002F\u002F Option[JsonObject] — access if json is an object\njsonObj.apply(\"key\")      \u002F\u002F Option[Json] — get field by name\njson.asArray              \u002F\u002F Option[Vector[Json]] — access if json is an array\narr.lift(idx)             \u002F\u002F Option[Json] — safe array index (None if out of bounds)\njson.asString             \u002F\u002F Option[String]\njson.asNumber             \u002F\u002F Option[JsonNumber]\njson.asBoolean            \u002F\u002F Option[Boolean]\nJson.Null                 \u002F\u002F null Json value\n```\n\n## Dot-Path Navigation (replacing Python dict\u002Flist traversal)\n\nPython:\n```python\ndef tokenize_path(self, value: JsonValue, path: str) -> Token | None:\n    parts = path.split(\".\")\n    current = value\n    for part in parts:\n        if isinstance(current, dict) and part in current:\n            current = current[part]\n        elif isinstance(current, list) and part.isdigit():\n            idx = int(part)\n            current = current[idx] if 0 \u003C= idx \u003C len(current) else return None\n        else:\n            return None\n    return self.tokenize(current)\n```\n\nScala with Circe (functional foldLeft):\n```scala\ndef tokenizePath(value: Json, path: String): Option[Token] = {\n  val parts = path.split(\"\\\\.\").toList\n  val leaf  = parts.foldLeft(Option(value)) { (current, part) =>\n    current.flatMap { json =>\n      json.asObject.flatMap(_.apply(part))\n        .orElse(\n          part.toIntOption.flatMap(idx =>\n            json.asArray.flatMap(arr => arr.lift(idx))\n          )\n        )\n    }\n  }\n  leaf.map(tokenize)\n}\n```\n\nKey idiomatic choices:\n- `Option[Json]` as the accumulator — `None` propagates failures automatically\n- `flatMap` chains: each step returns `None` if navigation fails, `foldLeft` propagates it\n- `part.toIntOption` (Scala 2.13+) — safe string-to-int, replaces `part.isdigit()` + `int(part)`\n- `arr.lift(idx)` — safe array access (None if out of bounds), replaces bounds check\n\n## Complete JsonTokenizer\n\n```scala\nfinal class JsonTokenizer(pretty: Boolean = false) {\n\n  def tokenize(value: Json): Token = {\n    val jsonStr = if (pretty) value.spaces2 else value.noSpaces\n    Token(jsonStr, TokenType.STRUCTURED, Map(\"json\" -> true))\n  }\n\n  def tokenizePath(value: Json, path: String): Option[Token] = {\n    val parts = path.split(\"\\\\.\").toList\n    parts.foldLeft(Option(value)) { (current, part) =>\n      current.flatMap { json =>\n        json.asObject.flatMap(_.apply(part))\n          .orElse(part.toIntOption.flatMap(idx =>\n            json.asArray.flatMap(_.lift(idx))\n          ))\n      }\n    }.map(tokenize)\n  }\n}\n```\n","# Circe JSON Library (replacing Python's json module)\n\n## Setup (build.sbt)\n\n```scala\nlibraryDependencies ++= Seq(\n  \"io.circe\" %% \"circe-core\"    % \"0.14.6\",\n  \"io.circe\" %% \"circe-generic\" % \"0.14.6\",\n  \"io.circe\" %% \"circe-parser\"  % \"0.14.6\"\n)\n```\n\n## Imports\n\n```scala\nimport io.circe.Json\nimport io.circe.parser._   \u002F\u002F for parse()\nimport io.circe.syntax._   \u002F\u002F for .asJson (not needed for tokenizer)\n```\n\n## Serialization\n\nPython:\n```python\njson.dumps(value)            # compact\njson.dumps(value, indent=2)  # pretty\n```\n\nCirce:\n```scala\nvalue.noSpaces   \u002F\u002F compact — equivalent to json.dumps(value)\nvalue.spaces2    \u002F\u002F 2-space indent — equivalent to json.dumps(value, indent=2)\nvalue.spaces4    \u002F\u002F 4-space indent\n```\n\n## Parsing\n\n```scala\nval json: Either[io.circe.Error, Json] = parse(\"\"\"{\"key\": \"value\"}\"\"\")\nval json: Json = parse(\"\"\"{\"key\": \"value\"}\"\"\").getOrElse(Json.Null)\n```\n\n## Key Json Navigation APIs\n\n```scala\njson.asObject             \u002F\u002F Option[JsonObject] — access if json is an object\njsonObj.apply(\"key\")      \u002F\u002F Option[Json] — get field by name\njson.asArray              \u002F\u002F Option[Vector[Json]] — access if json is an array\narr.lift(idx)             \u002F\u002F Option[Json] — safe array index (None if out of bounds)\njson.asString             \u002F\u002F Option[String]\njson.asNumber             \u002F\u002F Option[JsonNumber]\njson.asBoolean            \u002F\u002F Option[Boolean]\nJson.Null                 \u002F\u002F null Json value\n```\n\n## Dot-Path Navigation (replacing Python dict\u002Flist traversal)\n\nPython:\n```python\ndef tokenize_path(self, value: JsonValue, path: str) -> Token | None:\n    parts = path.split(\".\")\n    current = value\n    for part in parts:\n        if isinstance(current, dict) and part in current:\n            current = current[part]\n        elif isinstance(current, list) and part.isdigit():\n            idx = int(part)\n            current = current[idx] if 0 \u003C= idx \u003C len(current) else return None\n        else:\n            return None\n    return self.tokenize(current)\n```\n\nScala with Circe (functional foldLeft):\n```scala\ndef tokenizePath(value: Json, path: String): Option[Token] = {\n  val parts = path.split(\"\\\\.\").toList\n  val leaf  = parts.foldLeft(Option(value)) { (current, part) =>\n    current.flatMap { json =>\n      json.asObject.flatMap(_.apply(part))\n        .orElse(\n          part.toIntOption.flatMap(idx =>\n            json.asArray.flatMap(arr => arr.lift(idx))\n          )\n        )\n    }\n  }\n  leaf.map(tokenize)\n}\n```\n\nKey idiomatic choices:\n- `Option[Json]` as the accumulator — `None` propagates failures automatically\n- `flatMap` chains: each step returns `None` if navigation fails, `foldLeft` propagates it\n- `part.toIntOption` (Scala 2.13+) — safe string-to-int, replaces `part.isdigit()` + `int(part)`\n- `arr.lift(idx)` — safe array access (None if out of bounds), replaces bounds check\n\n## Complete JsonTokenizer\n\n```scala\nfinal class JsonTokenizer(pretty: Boolean = false) {\n\n  def tokenize(value: Json): Token = {\n    val jsonStr = if (pretty) value.spaces2 else value.noSpaces\n    Token(jsonStr, TokenType.STRUCTURED, Map(\"json\" -> true))\n  }\n\n  def tokenizePath(value: Json, path: String): Option[Token] = {\n    val parts = path.split(\"\\\\.\").toList\n    parts.foldLeft(Option(value)) { (current, part) =>\n      current.flatMap { json =>\n        json.asObject.flatMap(_.apply(part))\n          .orElse(part.toIntOption.flatMap(idx =>\n            json.asArray.flatMap(_.lift(idx))\n          ))\n      }\n    }.map(tokenize)\n  }\n}\n```\n",{"name":5,"description":7},"main","726e1f79b96b0cb3d729d0e55a1c847e0b5353ae","skills\u002Fb2-self-feedback-claude-sonnet-4-6\u002Fpython-scala-translation\u002Frun2_circe-json",7,"https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench","https:\u002F\u002Fcxcscmu.github.io\u002FSkillLearnBench","https:\u002F\u002Fgithub.com\u002Fcxcscmu","2026-10-02 22:55:36",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add cxcscmu\u002FSkillLearnBench --skill run2_circe-json",{"tool":49,"command":50},"bunx","bunx skills add cxcscmu\u002FSkillLearnBench --skill run2_circe-json",{"tool":52,"command":53},"pnpm","pnpm dlx skills add cxcscmu\u002FSkillLearnBench --skill run2_circe-json","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb2-self-feedback-claude-sonnet-4-6\u002Fpython-scala-translation\u002Frun2_circe-json\u002FSKILL.md",true,[],[58,76,100,118,137,149],{"skillNo":59,"name":60,"nameZh":6,"description":61,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":69,"publishedAt":30},"01M6KM5KH175P5ABP5JMX2SBDQ","object_counter","Count occurrences of an object in the image using computer vision algorithm.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Fvideo-object-counting\u002Fobject_counter\u002FSKILL.md",[64],{"categoryNo":65,"categoryName":66,"taxonomyType":67,"taxonomyTypeDesc":68},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[70,71,72,73,74,75],"object counter","object","vision","computer","Computer Vision","image",{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":85,"publishedAt":30},"01M6KM51TMVXG79MMPCS6Y8G86","travel-planning-workflow","Invoke this skill when performing travel planning. It defines a structured workflow for generating itineraries. Following this workflow is essential to ensure the final plan satisfies user requirements.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Ftravel-planning-workflow\u002FSKILL.md",[82],{"categoryNo":83,"categoryName":84,"taxonomyType":67,"taxonomyTypeDesc":68},"01JBSEEDCAT000000000000023","Skill与智能体开发",[86,87,88,89,90,91,92,93,94,29,95,96,97,98,99],"workflow","planning","planning workflow","travel","travel planning","travel planning workflow","structured","performing","plan","user","it","requirements","essential","itineraries",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":30},"01M6KM4DY820XHS9YTSK5QP5HD","bundled-dataset-search-tool","invoke this skill when you need to perform database search for travel planning. This skill provides some useful pre-packaged tools to look up accommodations, attractions, cities, driving distance, flights, and restaurants from the bundled dataset.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftravel-planning\u002Fbundled-dataset-search-tool\u002FSKILL.md",[],[107,108,109,110,111,112,113,89,114,115,90,116,29,117,87],"search","tool","dataset","bundled dataset search tool","restaurants","Tools","up","look","flights","you","database",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":30},"01M6KM465BB9PQ0B548HQSVAWZ","glm-output","Output-processing guidance for GLM tasks. Especially useful after glm-basics and glm-calibration when you need verifier-matching metrics from output.nc and a final \u002Froot\u002Fmetrics.json.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-output\u002FSKILL.md",[],[125,126,127,29,128,129,18,130,131,132,133,134,116,135,136],"glm output","output","glm","tasks","metrics","basics","guidance","matching","verifier","processing","root","calibration",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":144,"publishedAt":30},"01M6KM40KY3QWDW5W97S39R2BC","glm-calibration","Calibration guidance for GLM tasks. Often most effective after glm-basics has clarified the setup; glm-output is the companion skill for exact final metric computation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-calibration\u002FSKILL.md",[143],{"categoryNo":83,"categoryName":84,"taxonomyType":67,"taxonomyTypeDesc":68},[145,136,127,126,131,130,128,146,147,29,148],"glm calibration","setup","companion","metric",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":30},"01M6KM3VHHVSGMGHJQB3PPT6YG","glm-basics","A good starting point for GLM calibration tasks. Use to inspect glm3.nml, confirm how GLM runs, and identify the relevant files before moving on to calibration and output evaluation.","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fhuman_authored\u002Ftemperature-simulation\u002Fglm-basics\u002FSKILL.md",[],[156,127,130,157,145,136,29,126,158,159,160,161,162,163,128],"glm basics","inspect","relevant","files","good","use","how","Evaluation"]