[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KHCJS44XPZTXS7M495HV3V":3,"skill-same:01M6KHCJS44XPZTXS7M495HV3V":68},{"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":27,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":51,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M6KHCJS44XPZTXS7M495HV3V","fill-docx-template",null,"Use this skill to fill placeholders in a .docx template file with data from a JSON file, handle conditional sections, and save the result. Covers body paragraphs, tables, and headers\u002Ffooters.","cxcscmu\u002FSkillLearnBench","cxcscmu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F142838272?v=4","01M6KCQDFQWPDSN0MKZY96MSQP","01M6KCQDM7G70TKJ28NTSQC0RZ",93,"MIT","https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb3-teacher-feedback-claude-sonnet-4-6\u002Foffer-letter-generator\u002Frun3_fill-docx-template\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39,40],"docx","template","fill","fill docx template","file","data","save","json","use","with","headers","tables","conditional","2026-11-10 10:12:30",false,"---\nname: fill-docx-template\ndescription: Use this skill to fill placeholders in a .docx template file with data from a JSON file, handle conditional sections, and save the result. Covers body paragraphs, tables, and headers\u002Ffooters.\n---\n\n# Fill DOCX Template with JSON Data\n\n## Overview\nThis skill fills `{{PLACEHOLDER}}` tokens in a Word `.docx` template using data from a JSON file. It handles:\n- Body paragraphs and table cells\n- Headers and footers in all sections\n- Split-run placeholders (where a token is split across multiple runs)\n- Conditional blocks `{{IF_KEY}}...{{END_IF_KEY}}`\n\n## Implementation\n\n```python\nimport json\nimport re\nfrom docx import Document\nfrom docx.oxml.ns import qn\nfrom copy import deepcopy\n\n\ndef load_data(json_path):\n    with open(json_path, \"r\") as f:\n        return json.load(f)\n\n\ndef rebuild_para_text(para):\n    \"\"\"Return full text of paragraph, concatenating all runs.\"\"\"\n    return \"\".join(run.text for run in para.runs)\n\n\ndef set_para_text_replacing(para, old, new):\n    \"\"\"\n    Replace all occurrences of `old` with `new` in a paragraph,\n    preserving run formatting as much as possible.\n    First, consolidate split tokens, then replace.\n    \"\"\"\n    full_text = rebuild_para_text(para)\n    if old not in full_text:\n        return False\n\n    # Strategy: merge all runs into the first run, replace, redistribute\n    # This is safe for header\u002Ffooter paragraphs too.\n    if not para.runs:\n        return False\n\n    # Consolidate: put everything into runs[0], clear the rest\n    new_full = full_text.replace(old, new)\n\n    # Distribute new text: put all in first run, blank the others\n    para.runs[0].text = new_full\n    for run in para.runs[1:]:\n        run.text = \"\"\n    return True\n\n\ndef fix_split_placeholders(para):\n    \"\"\"\n    If a placeholder like {{KEY}} is split across runs, merge those runs\n    into one run so replacement works cleanly.\n    \"\"\"\n    full_text = rebuild_para_text(para)\n    # Check if there are any placeholders potentially split\n    if \"{{\" not in full_text:\n        return\n\n    # Rebuild: merge all run texts, assign back to first run\n    if len(para.runs) \u003C= 1:\n        return\n\n    # Only consolidate if a placeholder might be split\n    combined = \"\".join(r.text for r in para.runs)\n    if re.search(r'\\{\\{[^}]*$', combined) or re.search(r'^[^{]*\\}\\}', combined):\n        # There's a split — merge all into first run\n        para.runs[0].text = combined\n        for run in para.runs[1:]:\n            run.text = \"\"\n\n\ndef replace_in_paragraph(para, data):\n    \"\"\"Replace all known placeholders in a paragraph.\"\"\"\n    fix_split_placeholders(para)\n    for key, value in data.items():\n        placeholder = f\"{{{{{key}}}}}\"\n        set_para_text_replacing(para, placeholder, str(value))\n\n\ndef iter_all_paragraphs(doc):\n    \"\"\"\n    Yield every paragraph in the document:\n    - Body paragraphs\n    - Table cell paragraphs (all nesting levels)\n    - Header and footer paragraphs for every section\n    \"\"\"\n    # Body paragraphs\n    for para in doc.paragraphs:\n        yield para\n\n    # Table cells\n    for table in doc.tables:\n        for row in table.rows:\n            for cell in row.cells:\n                for para in cell.paragraphs:\n                    yield para\n                # nested tables\n                for nested_table in cell.tables:\n                    for nrow in nested_table.rows:\n                        for ncell in nrow.cells:\n                            for para in ncell.paragraphs:\n                                yield para\n\n    # Headers and footers for each section\n    for section in doc.sections:\n        # Header\n        if section.header:\n            for para in section.header.paragraphs:\n                yield para\n            for table in section.header.tables:\n                for row in table.rows:\n                    for cell in row.cells:\n                        for para in cell.paragraphs:\n                            yield para\n        # Footer\n        if section.footer:\n            for para in section.footer.paragraphs:\n                yield para\n            for table in section.footer.tables:\n                for row in table.rows:\n                    for cell in row.cells:\n                        for para in cell.paragraphs:\n                            yield para\n        # First page header\u002Ffooter\n        if section.first_page_header:\n            for para in section.first_page_header.paragraphs:\n                yield para\n        if section.first_page_footer:\n            for para in section.first_page_footer.paragraphs:\n                yield para\n        # Even page header\u002Ffooter\n        if section.even_page_header:\n            for para in section.even_page_header.paragraphs:\n                yield para\n        if section.even_page_footer:\n            for para in section.even_page_footer.paragraphs:\n                yield para\n\n\ndef handle_conditional_sections(doc, data):\n    \"\"\"\n    Handle {{IF_KEY}}...{{END_IF_KEY}} blocks.\n    - If data[KEY] == 'Yes': keep content, remove marker paragraphs\n    - If data[KEY] != 'Yes': remove entire block including markers\n    \"\"\"\n    # We need to work on the XML level for reliable paragraph removal\n    # Collect paragraph elements with their text\n    body = doc.element.body\n    paras = list(body)  # includes paragraphs and tables etc.\n\n    # Find all IF keys used in the document\n    full_body_text = \"\\n\".join(\n        \"\".join(run.text for run in p.runs)\n        for p in doc.paragraphs\n    )\n\n    if_keys = re.findall(r'\\{\\{IF_(\\w+)\\}\\}', full_body_text)\n\n    for key in set(if_keys):\n        start_marker = f\"{{{{IF_{key}}}}}\"\n        end_marker = f\"{{{{END_IF_{key}}}}}\"\n        condition_value = data.get(key, \"No\")\n        keep_content = (str(condition_value).strip().lower() == \"yes\")\n\n        # Find paragraph indices\n        all_body_paras = list(doc.element.body)\n        start_idx = None\n        end_idx = None\n\n        for i, elem in enumerate(all_body_paras):\n            # Get text of element\n            if elem.tag.endswith('}p'):\n                text = \"\".join(t.text or \"\" for t in elem.iter() if t.tag.endswith('}t'))\n                if start_marker in text:\n                    start_idx = i\n                if end_marker in text:\n                    end_idx = i\n\n        if start_idx is None or end_idx is None:\n            continue\n\n        if keep_content:\n            # Remove only the marker paragraphs (start and end)\n            # Remove end first (higher index), then start\n            end_elem = all_body_paras[end_idx]\n            start_elem = all_body_paras[start_idx]\n            end_elem.getparent().remove(end_elem)\n            start_elem.getparent().remove(start_elem)\n        else:\n            # Remove everything from start_idx to end_idx inclusive\n            to_remove = all_body_paras[start_idx:end_idx + 1]\n            for elem in to_remove:\n                elem.getparent().remove(elem)\n\n\ndef fill_template(template_path, json_path, output_path):\n    doc = Document(template_path)\n    data = load_data(json_path)\n\n    # Step 1: Handle conditional sections first (before placeholder replacement)\n    handle_conditional_sections(doc, data)\n\n    # Step 2: Replace all placeholders everywhere (body + tables + headers + footers)\n    for para in iter_all_paragraphs(doc):\n        replace_in_paragraph(para, data)\n\n    # Step 3: Save\n    doc.save(output_path)\n    print(f\"Saved filled offer letter to {output_path}\")\n\n\nif __name__ == \"__main__\":\n    fill_template(\n        template_path=\"offer_letter_template.docx\",\n        json_path=\"employee_data.json\",\n        output_path=\"\u002Froot\u002Foffer_letter_filled.docx\",\n    )\n```\n\n## Key Points\n\n- **`iter_all_paragraphs`** explicitly yields paragraphs from `section.header`, `section.footer`, `section.first_page_header`, `section.first_page_footer`, `section.even_page_header`, and `section.even_page_footer` for every section — this ensures `DOC_ID` and other header\u002Ffooter placeholders are replaced.\n- **`fix_split_placeholders`** merges run text before replacement to handle tokens split across runs.\n- **`handle_conditional_sections`** processes `{{IF_KEY}}...{{END_IF_KEY}}` blocks before placeholder replacement to avoid leaving stale markers.\n- Conditional check is case-insensitive (`\"yes\"` match).","# Fill DOCX Template with JSON Data\n\n## Overview\nThis skill fills `{{PLACEHOLDER}}` tokens in a Word `.docx` template using data from a JSON file. It handles:\n- Body paragraphs and table cells\n- Headers and footers in all sections\n- Split-run placeholders (where a token is split across multiple runs)\n- Conditional blocks `{{IF_KEY}}...{{END_IF_KEY}}`\n\n## Implementation\n\n```python\nimport json\nimport re\nfrom docx import Document\nfrom docx.oxml.ns import qn\nfrom copy import deepcopy\n\n\ndef load_data(json_path):\n    with open(json_path, \"r\") as f:\n        return json.load(f)\n\n\ndef rebuild_para_text(para):\n    \"\"\"Return full text of paragraph, concatenating all runs.\"\"\"\n    return \"\".join(run.text for run in para.runs)\n\n\ndef set_para_text_replacing(para, old, new):\n    \"\"\"\n    Replace all occurrences of `old` with `new` in a paragraph,\n    preserving run formatting as much as possible.\n    First, consolidate split tokens, then replace.\n    \"\"\"\n    full_text = rebuild_para_text(para)\n    if old not in full_text:\n        return False\n\n    # Strategy: merge all runs into the first run, replace, redistribute\n    # This is safe for header\u002Ffooter paragraphs too.\n    if not para.runs:\n        return False\n\n    # Consolidate: put everything into runs[0], clear the rest\n    new_full = full_text.replace(old, new)\n\n    # Distribute new text: put all in first run, blank the others\n    para.runs[0].text = new_full\n    for run in para.runs[1:]:\n        run.text = \"\"\n    return True\n\n\ndef fix_split_placeholders(para):\n    \"\"\"\n    If a placeholder like {{KEY}} is split across runs, merge those runs\n    into one run so replacement works cleanly.\n    \"\"\"\n    full_text = rebuild_para_text(para)\n    # Check if there are any placeholders potentially split\n    if \"{{\" not in full_text:\n        return\n\n    # Rebuild: merge all run texts, assign back to first run\n    if len(para.runs) \u003C= 1:\n        return\n\n    # Only consolidate if a placeholder might be split\n    combined = \"\".join(r.text for r in para.runs)\n    if re.search(r'\\{\\{[^}]*$', combined) or re.search(r'^[^{]*\\}\\}', combined):\n        # There's a split — merge all into first run\n        para.runs[0].text = combined\n        for run in para.runs[1:]:\n            run.text = \"\"\n\n\ndef replace_in_paragraph(para, data):\n    \"\"\"Replace all known placeholders in a paragraph.\"\"\"\n    fix_split_placeholders(para)\n    for key, value in data.items():\n        placeholder = f\"{{{{{key}}}}}\"\n        set_para_text_replacing(para, placeholder, str(value))\n\n\ndef iter_all_paragraphs(doc):\n    \"\"\"\n    Yield every paragraph in the document:\n    - Body paragraphs\n    - Table cell paragraphs (all nesting levels)\n    - Header and footer paragraphs for every section\n    \"\"\"\n    # Body paragraphs\n    for para in doc.paragraphs:\n        yield para\n\n    # Table cells\n    for table in doc.tables:\n        for row in table.rows:\n            for cell in row.cells:\n                for para in cell.paragraphs:\n                    yield para\n                # nested tables\n                for nested_table in cell.tables:\n                    for nrow in nested_table.rows:\n                        for ncell in nrow.cells:\n                            for para in ncell.paragraphs:\n                                yield para\n\n    # Headers and footers for each section\n    for section in doc.sections:\n        # Header\n        if section.header:\n            for para in section.header.paragraphs:\n                yield para\n            for table in section.header.tables:\n                for row in table.rows:\n                    for cell in row.cells:\n                        for para in cell.paragraphs:\n                            yield para\n        # Footer\n        if section.footer:\n            for para in section.footer.paragraphs:\n                yield para\n            for table in section.footer.tables:\n                for row in table.rows:\n                    for cell in row.cells:\n                        for para in cell.paragraphs:\n                            yield para\n        # First page header\u002Ffooter\n        if section.first_page_header:\n            for para in section.first_page_header.paragraphs:\n                yield para\n        if section.first_page_footer:\n            for para in section.first_page_footer.paragraphs:\n                yield para\n        # Even page header\u002Ffooter\n        if section.even_page_header:\n            for para in section.even_page_header.paragraphs:\n                yield para\n        if section.even_page_footer:\n            for para in section.even_page_footer.paragraphs:\n                yield para\n\n\ndef handle_conditional_sections(doc, data):\n    \"\"\"\n    Handle {{IF_KEY}}...{{END_IF_KEY}} blocks.\n    - If data[KEY] == 'Yes': keep content, remove marker paragraphs\n    - If data[KEY] != 'Yes': remove entire block including markers\n    \"\"\"\n    # We need to work on the XML level for reliable paragraph removal\n    # Collect paragraph elements with their text\n    body = doc.element.body\n    paras = list(body)  # includes paragraphs and tables etc.\n\n    # Find all IF keys used in the document\n    full_body_text = \"\\n\".join(\n        \"\".join(run.text for run in p.runs)\n        for p in doc.paragraphs\n    )\n\n    if_keys = re.findall(r'\\{\\{IF_(\\w+)\\}\\}', full_body_text)\n\n    for key in set(if_keys):\n        start_marker = f\"{{{{IF_{key}}}}}\"\n        end_marker = f\"{{{{END_IF_{key}}}}}\"\n        condition_value = data.get(key, \"No\")\n        keep_content = (str(condition_value).strip().lower() == \"yes\")\n\n        # Find paragraph indices\n        all_body_paras = list(doc.element.body)\n        start_idx = None\n        end_idx = None\n\n        for i, elem in enumerate(all_body_paras):\n            # Get text of element\n            if elem.tag.endswith('}p'):\n                text = \"\".join(t.text or \"\" for t in elem.iter() if t.tag.endswith('}t'))\n                if start_marker in text:\n                    start_idx = i\n                if end_marker in text:\n                    end_idx = i\n\n        if start_idx is None or end_idx is None:\n            continue\n\n        if keep_content:\n            # Remove only the marker paragraphs (start and end)\n            # Remove end first (higher index), then start\n            end_elem = all_body_paras[end_idx]\n            start_elem = all_body_paras[start_idx]\n            end_elem.getparent().remove(end_elem)\n            start_elem.getparent().remove(start_elem)\n        else:\n            # Remove everything from start_idx to end_idx inclusive\n            to_remove = all_body_paras[start_idx:end_idx + 1]\n            for elem in to_remove:\n                elem.getparent().remove(elem)\n\n\ndef fill_template(template_path, json_path, output_path):\n    doc = Document(template_path)\n    data = load_data(json_path)\n\n    # Step 1: Handle conditional sections first (before placeholder replacement)\n    handle_conditional_sections(doc, data)\n\n    # Step 2: Replace all placeholders everywhere (body + tables + headers + footers)\n    for para in iter_all_paragraphs(doc):\n        replace_in_paragraph(para, data)\n\n    # Step 3: Save\n    doc.save(output_path)\n    print(f\"Saved filled offer letter to {output_path}\")\n\n\nif __name__ == \"__main__\":\n    fill_template(\n        template_path=\"offer_letter_template.docx\",\n        json_path=\"employee_data.json\",\n        output_path=\"\u002Froot\u002Foffer_letter_filled.docx\",\n    )\n```\n\n## Key Points\n\n- **`iter_all_paragraphs`** explicitly yields paragraphs from `section.header`, `section.footer`, `section.first_page_header`, `section.first_page_footer`, `section.even_page_header`, and `section.even_page_footer` for every section — this ensures `DOC_ID` and other header\u002Ffooter placeholders are replaced.\n- **`fix_split_placeholders`** merges run text before replacement to handle tokens split across runs.\n- **`handle_conditional_sections`** processes `{{IF_KEY}}...{{END_IF_KEY}}` blocks before placeholder replacement to avoid leaving stale markers.\n- Conditional check is case-insensitive (`\"yes\"` match).",{"name":5,"description":7},"main","726e1f79b96b0cb3d729d0e55a1c847e0b5353ae","skills\u002Fb3-teacher-feedback-claude-sonnet-4-6\u002Foffer-letter-generator\u002Frun3_fill-docx-template",8,"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":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add cxcscmu\u002FSkillLearnBench --skill fill-docx-template",{"tool":60,"command":61},"bunx","bunx skills add cxcscmu\u002FSkillLearnBench --skill fill-docx-template",{"tool":63,"command":64},"pnpm","pnpm dlx skills add cxcscmu\u002FSkillLearnBench --skill fill-docx-template","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcxcscmu\u002FSkillLearnBench\u002Fblob\u002Fmain\u002Fskills\u002Fb3-teacher-feedback-claude-sonnet-4-6\u002Foffer-letter-generator\u002Frun3_fill-docx-template\u002FSKILL.md",true,[],[69,85,110,128,147,159],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":78,"publishedAt":41},"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",[75],{"categoryNo":76,"categoryName":77,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",[79,80,81,82,83,84],"object counter","object","vision","computer","Computer Vision","image",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":94,"publishedAt":41},"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",[91],{"categoryNo":92,"categoryName":93,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[95,96,97,98,99,100,101,102,103,104,105,106,107,108,109],"workflow","planning","planning workflow","travel","travel planning","travel planning workflow","structured","performing","plan","for","user","it","requirements","essential","itineraries",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":41},"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",[],[117,118,119,120,121,122,123,98,124,125,99,126,104,127,96],"search","tool","dataset","bundled dataset search tool","restaurants","Tools","up","look","flights","you","database",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":41},"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",[],[135,136,137,104,138,139,35,140,141,142,143,144,126,145,146],"glm output","output","glm","tasks","metrics","basics","guidance","matching","verifier","processing","root","calibration",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":154,"publishedAt":41},"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",[153],{"categoryNo":92,"categoryName":93,"taxonomyType":20,"taxonomyTypeDesc":21},[155,146,137,136,141,140,138,156,157,104,158],"glm calibration","setup","companion","metric",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":41},"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",[],[166,137,140,167,155,146,104,136,168,169,170,36,171,172,138],"glm basics","inspect","relevant","files","good","how","Evaluation"]