[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KJBTSHTNHC3J84PHHHN0E8":3,"skill-same:01M6KJBTSHTNHC3J84PHHHN0E8":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":13,"repositoryHtmlUrl":41,"repositoryHomepageUrl":6,"ownerHtmlUrl":42,"ownerBlogUrl":6,"ownerDescription":43,"updatedAt":44,"install":45,"resources":58},"01M6KJBTSHTNHC3J84PHHHN0E8","pdf-extraction-fallbacks",null,"Multi-fallback PDF\u002Ftext extraction with early failure detection and sequential tool fallbacks","AG064\u002FOpenSpace","AG064","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F184930299?v=4","01M6KHVFG7TB73NHX3RDYSTMH2","01M6KHVFMM7XA2PZA9Z83PHS3V",0,"MIT","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fpdf-extraction-fallbacks\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32],"PDF","extraction","pdf extraction","pdf extraction fallbacks","detection","tool","text","fallback","multi","with","2026-11-10 10:12:30",false,"---\nname: pdf-extraction-fallbacks\ndescription: Multi-fallback PDF\u002Ftext extraction with early failure detection and sequential tool fallbacks\n---\n\n# PDF Extraction with Multi-Fallback Strategy\n\n## Purpose\n\nWhen extracting text from PDFs (especially regulatory documents, handbooks, or protected content), single-method approaches often fail due to JavaScript protection, CORS restrictions, encoding issues, or corrupted downloads. This skill provides a robust multi-fallback workflow that detects failures early and tries sequential extraction methods.\n\n## Core Pattern\n\n1. **Download with validation** - Check file size and content sanity immediately\n2. **Sequential extraction attempts** - Try multiple tools in order of reliability\n3. **Early failure detection** - Don't proceed with obviously corrupt files\n4. **Document fallback path** - Log which method succeeded for future reference\n\n## Step-by-Step Instructions\n\n### Step 1: Download and Validate\n\nBefore attempting extraction, validate the downloaded file:\n\n```bash\n# Download the PDF\ncurl -L -o document.pdf \"$URL\"\n\n# Check file size (reject if \u003C 1KB - likely error page)\nFILE_SIZE=$(stat -f%z document.pdf 2>\u002Fdev\u002Fnull || stat -c%s document.pdf 2>\u002Fdev\u002Fnull)\nif [ \"$FILE_SIZE\" -lt 1024 ]; then\n    echo \"ERROR: File too small ($FILE_SIZE bytes) - likely not a valid PDF\"\n    # Check if it's an HTML error page\n    head -c 200 document.pdf | grep -i \"\u003Chtml\\|\u003C!doctype\\|error\\|access denied\" && \\\n        echo \"Detected HTML error page instead of PDF\"\n    exit 1\nfi\n\n# Check PDF magic bytes\nHEAD_BYTES=$(head -c 4 document.pdf)\nif [ \"$HEAD_BYTES\" != \"%PDF\" ]; then\n    echo \"ERROR: File does not start with PDF magic bytes\"\n    head -c 100 document.pdf\n    exit 1\nfi\n```\n\n### Step 2: Primary Extraction (pdftotext)\n\n```bash\n# Try pdftotext first (fastest, most reliable for simple PDFs)\nif command -v pdftotext &> \u002Fdev\u002Fnull; then\n    pdftotext -layout document.pdf output.txt 2>\u002Fdev\u002Fnull\n    if [ -s output.txt ]; then\n        WORD_COUNT=$(wc -w \u003C output.txt)\n        if [ \"$WORD_COUNT\" -gt 50 ]; then\n            echo \"SUCCESS: pdftotext extracted $WORD_COUNT words\"\n            exit 0\n        fi\n    fi\nfi\n```\n\n### Step 3: Fallback 1 (PyMuPDF\u002Ffitz)\n\n```python\n# Try PyMuPDF - handles more complex PDFs\nimport fitz  # pymupdf\n\ntry:\n    doc = fitz.open(\"document.pdf\")\n    text = \"\"\n    for page in doc:\n        text += page.get_text()\n    \n    if len(text.strip()) > 500:  # Sanity check\n        with open(\"output.txt\", \"w\") as f:\n            f.write(text)\n        print(f\"SUCCESS: PyMuPDF extracted {len(text)} characters\")\n    else:\n        print(\"WARNING: PyMuPDF extraction too short, trying next method\")\nexcept Exception as e:\n    print(f\"PyMuPDF failed: {e}\")\n```\n\n### Step 4: Fallback 2 (pdfplumber)\n\n```python\n# Try pdfplumber - better for tables and structured content\nimport pdfplumber\n\ntry:\n    text = \"\"\n    with pdfplumber.open(\"document.pdf\") as pdf:\n        for page in pdf.pages:\n            page_text = page.extract_text()\n            if page_text:\n                text += page_text + \"\\n\"\n    \n    if len(text.strip()) > 500:\n        with open(\"output.txt\", \"w\") as f:\n            f.write(text)\n        print(f\"SUCCESS: pdfplumber extracted {len(text)} characters\")\n    else:\n        print(\"WARNING: pdfplumber extraction too short\")\nexcept Exception as e:\n    print(f\"pdfplumber failed: {e}\")\n```\n\n### Step 5: Handle JavaScript-Protected Pages\n\nIf all methods fail, the PDF may be JavaScript-protected:\n\n```python\n# Check for JavaScript in PDF\nimport fitz\n\ndoc = fitz.open(\"document.pdf\")\nhas_js = False\nfor page in doc:\n    if page.get_java_script():\n        has_js = True\n        break\n\nif has_js:\n    print(\"WARNING: PDF contains JavaScript - may be protected\")\n    # Try rendering pages as images and OCR (requires additional tools)\n    # Or try alternative download source\n```\n\n### Step 6: Alternative Sources\n\nIf the primary URL fails:\n- Try alternative domains (e.g., `.gov` mirrors, archive.org)\n- Check if the document is available via API\n- Look for HTML version of the same content\n- Search for the document title + \"pdf\" to find mirrors\n\n## Decision Tree\n\n```\nDownload PDF\n    │\n    ├─→ File \u003C 1KB? → REJECT (likely error page)\n    ├─→ No %PDF header? → REJECT (not a PDF)\n    │\n    └─→ Valid PDF\n         │\n         ├─→ pdftotext → >50 words? → SUCCESS\n         │              └─→ Try next\n         │\n         ├─→ PyMuPDF → >500 chars? → SUCCESS\n         │             └─→ Try next\n         │\n         ├─→ pdfplumber → >500 chars? → SUCCESS\n         │                 └─→ Try next\n         │\n         └─→ All failed → Check for JS protection, try alternative sources\n```\n\n## Common Failure Modes\n\n| Symptom | Likely Cause | Solution |\n|---------|-------------|----------|\n| File \u003C 100 bytes | JavaScript error page | Check CORS, try different user-agent |\n| File ~1-5KB | HTML error\u002Fwarning page | Parse HTML for actual PDF link |\n| pdftotext returns empty | Encrypted\u002Fprotected PDF | Try PyMuPDF with password handling |\n| Garbled text output | Encoding issue | Try pdfplumber, specify encoding |\n| Extraction very short | Images-only PDF | Need OCR (tesseract) |\n\n## Example Complete Workflow Script\n\nSave as `extract_pdf_robust.sh`:\n\n```bash\n#!\u002Fbin\u002Fbash\nset -e\n\nURL=\"$1\"\nOUTPUT=\"${2:-output.txt}\"\nTEMP_PDF=\"temp_download.pdf\"\n\necho \"Downloading from: $URL\"\ncurl -L -A \"Mozilla\u002F5.0\" -o \"$TEMP_PDF\" \"$URL\"\n\n# Validate\nSIZE=$(stat -c%s \"$TEMP_PDF\" 2>\u002Fdev\u002Fnull || stat -f%z \"$TEMP_PDF\")\necho \"Downloaded: $SIZE bytes\"\n\nif [ \"$SIZE\" -lt 1024 ]; then\n    echo \"ERROR: File too small - checking content...\"\n    head -200 \"$TEMP_PDF\"\n    exit 1\nfi\n\nif ! head -c 4 \"$TEMP_PDF\" | grep -q \"%PDF\"; then\n    echo \"ERROR: Not a valid PDF file\"\n    head -100 \"$TEMP_PDF\"\n    exit 1\nfi\n\n# Try extraction methods\npython3 \u003C\u003C 'PYTHON'\nimport sys\nimport fitz\nimport pdfplumber\n\npdf_path = \"temp_download.pdf\"\noutput_path = \"output.txt\"\n\n# Method 1: PyMuPDF\ntry:\n    doc = fitz.open(pdf_path)\n    text = \"\".join(page.get_text() for page in doc)\n    if len(text.strip()) > 500:\n        with open(output_path, \"w\") as f:\n            f.write(text)\n        print(f\"PyMuPDF: {len(text)} chars\")\n        sys.exit(0)\nexcept Exception as e:\n    print(f\"PyMuPDF failed: {e}\")\n\n# Method 2: pdfplumber\ntry:\n    text = \"\"\n    with pdfplumber.open(pdf_path) as pdf:\n        for page in pdf.pages:\n            txt = page.extract_text()\n            if txt:\n                text += txt + \"\\n\"\n    if len(text.strip()) > 500:\n        with open(output_path, \"w\") as f:\n            f.write(text)\n        print(f\"pdfplumber: {len(text)} chars\")\n        sys.exit(0)\nexcept Exception as e:\n    print(f\"pdfplumber failed: {e}\")\n\nprint(\"All extraction methods failed\")\nsys.exit(1)\nPYTHON\n```\n\n## Best Practices\n\n1. **Always validate** - Never assume a download succeeded\n2. **Log the path taken** - Record which method worked for debugging\n3. **Set reasonable thresholds** - 50 words \u002F 500 chars minimum for \"success\"\n4. **Keep raw PDF** - Don't delete the original until extraction is confirmed\n5. **Retry with variations** - Different user-agents, referer headers, or mirrors\n\n## Dependencies\n\n- `curl` - For downloading\n- `poppler-utils` (pdftotext) - Optional, fast extraction\n- `PyMuPDF` (`fitz`) - `pip install pymupdf`\n- `pdfplumber` - `pip install pdfplumber`","# PDF Extraction with Multi-Fallback Strategy\n\n## Purpose\n\nWhen extracting text from PDFs (especially regulatory documents, handbooks, or protected content), single-method approaches often fail due to JavaScript protection, CORS restrictions, encoding issues, or corrupted downloads. This skill provides a robust multi-fallback workflow that detects failures early and tries sequential extraction methods.\n\n## Core Pattern\n\n1. **Download with validation** - Check file size and content sanity immediately\n2. **Sequential extraction attempts** - Try multiple tools in order of reliability\n3. **Early failure detection** - Don't proceed with obviously corrupt files\n4. **Document fallback path** - Log which method succeeded for future reference\n\n## Step-by-Step Instructions\n\n### Step 1: Download and Validate\n\nBefore attempting extraction, validate the downloaded file:\n\n```bash\n# Download the PDF\ncurl -L -o document.pdf \"$URL\"\n\n# Check file size (reject if \u003C 1KB - likely error page)\nFILE_SIZE=$(stat -f%z document.pdf 2>\u002Fdev\u002Fnull || stat -c%s document.pdf 2>\u002Fdev\u002Fnull)\nif [ \"$FILE_SIZE\" -lt 1024 ]; then\n    echo \"ERROR: File too small ($FILE_SIZE bytes) - likely not a valid PDF\"\n    # Check if it's an HTML error page\n    head -c 200 document.pdf | grep -i \"\u003Chtml\\|\u003C!doctype\\|error\\|access denied\" && \\\n        echo \"Detected HTML error page instead of PDF\"\n    exit 1\nfi\n\n# Check PDF magic bytes\nHEAD_BYTES=$(head -c 4 document.pdf)\nif [ \"$HEAD_BYTES\" != \"%PDF\" ]; then\n    echo \"ERROR: File does not start with PDF magic bytes\"\n    head -c 100 document.pdf\n    exit 1\nfi\n```\n\n### Step 2: Primary Extraction (pdftotext)\n\n```bash\n# Try pdftotext first (fastest, most reliable for simple PDFs)\nif command -v pdftotext &> \u002Fdev\u002Fnull; then\n    pdftotext -layout document.pdf output.txt 2>\u002Fdev\u002Fnull\n    if [ -s output.txt ]; then\n        WORD_COUNT=$(wc -w \u003C output.txt)\n        if [ \"$WORD_COUNT\" -gt 50 ]; then\n            echo \"SUCCESS: pdftotext extracted $WORD_COUNT words\"\n            exit 0\n        fi\n    fi\nfi\n```\n\n### Step 3: Fallback 1 (PyMuPDF\u002Ffitz)\n\n```python\n# Try PyMuPDF - handles more complex PDFs\nimport fitz  # pymupdf\n\ntry:\n    doc = fitz.open(\"document.pdf\")\n    text = \"\"\n    for page in doc:\n        text += page.get_text()\n    \n    if len(text.strip()) > 500:  # Sanity check\n        with open(\"output.txt\", \"w\") as f:\n            f.write(text)\n        print(f\"SUCCESS: PyMuPDF extracted {len(text)} characters\")\n    else:\n        print(\"WARNING: PyMuPDF extraction too short, trying next method\")\nexcept Exception as e:\n    print(f\"PyMuPDF failed: {e}\")\n```\n\n### Step 4: Fallback 2 (pdfplumber)\n\n```python\n# Try pdfplumber - better for tables and structured content\nimport pdfplumber\n\ntry:\n    text = \"\"\n    with pdfplumber.open(\"document.pdf\") as pdf:\n        for page in pdf.pages:\n            page_text = page.extract_text()\n            if page_text:\n                text += page_text + \"\\n\"\n    \n    if len(text.strip()) > 500:\n        with open(\"output.txt\", \"w\") as f:\n            f.write(text)\n        print(f\"SUCCESS: pdfplumber extracted {len(text)} characters\")\n    else:\n        print(\"WARNING: pdfplumber extraction too short\")\nexcept Exception as e:\n    print(f\"pdfplumber failed: {e}\")\n```\n\n### Step 5: Handle JavaScript-Protected Pages\n\nIf all methods fail, the PDF may be JavaScript-protected:\n\n```python\n# Check for JavaScript in PDF\nimport fitz\n\ndoc = fitz.open(\"document.pdf\")\nhas_js = False\nfor page in doc:\n    if page.get_java_script():\n        has_js = True\n        break\n\nif has_js:\n    print(\"WARNING: PDF contains JavaScript - may be protected\")\n    # Try rendering pages as images and OCR (requires additional tools)\n    # Or try alternative download source\n```\n\n### Step 6: Alternative Sources\n\nIf the primary URL fails:\n- Try alternative domains (e.g., `.gov` mirrors, archive.org)\n- Check if the document is available via API\n- Look for HTML version of the same content\n- Search for the document title + \"pdf\" to find mirrors\n\n## Decision Tree\n\n```\nDownload PDF\n    │\n    ├─→ File \u003C 1KB? → REJECT (likely error page)\n    ├─→ No %PDF header? → REJECT (not a PDF)\n    │\n    └─→ Valid PDF\n         │\n         ├─→ pdftotext → >50 words? → SUCCESS\n         │              └─→ Try next\n         │\n         ├─→ PyMuPDF → >500 chars? → SUCCESS\n         │             └─→ Try next\n         │\n         ├─→ pdfplumber → >500 chars? → SUCCESS\n         │                 └─→ Try next\n         │\n         └─→ All failed → Check for JS protection, try alternative sources\n```\n\n## Common Failure Modes\n\n| Symptom | Likely Cause | Solution |\n|---------|-------------|----------|\n| File \u003C 100 bytes | JavaScript error page | Check CORS, try different user-agent |\n| File ~1-5KB | HTML error\u002Fwarning page | Parse HTML for actual PDF link |\n| pdftotext returns empty | Encrypted\u002Fprotected PDF | Try PyMuPDF with password handling |\n| Garbled text output | Encoding issue | Try pdfplumber, specify encoding |\n| Extraction very short | Images-only PDF | Need OCR (tesseract) |\n\n## Example Complete Workflow Script\n\nSave as `extract_pdf_robust.sh`:\n\n```bash\n#!\u002Fbin\u002Fbash\nset -e\n\nURL=\"$1\"\nOUTPUT=\"${2:-output.txt}\"\nTEMP_PDF=\"temp_download.pdf\"\n\necho \"Downloading from: $URL\"\ncurl -L -A \"Mozilla\u002F5.0\" -o \"$TEMP_PDF\" \"$URL\"\n\n# Validate\nSIZE=$(stat -c%s \"$TEMP_PDF\" 2>\u002Fdev\u002Fnull || stat -f%z \"$TEMP_PDF\")\necho \"Downloaded: $SIZE bytes\"\n\nif [ \"$SIZE\" -lt 1024 ]; then\n    echo \"ERROR: File too small - checking content...\"\n    head -200 \"$TEMP_PDF\"\n    exit 1\nfi\n\nif ! head -c 4 \"$TEMP_PDF\" | grep -q \"%PDF\"; then\n    echo \"ERROR: Not a valid PDF file\"\n    head -100 \"$TEMP_PDF\"\n    exit 1\nfi\n\n# Try extraction methods\npython3 \u003C\u003C 'PYTHON'\nimport sys\nimport fitz\nimport pdfplumber\n\npdf_path = \"temp_download.pdf\"\noutput_path = \"output.txt\"\n\n# Method 1: PyMuPDF\ntry:\n    doc = fitz.open(pdf_path)\n    text = \"\".join(page.get_text() for page in doc)\n    if len(text.strip()) > 500:\n        with open(output_path, \"w\") as f:\n            f.write(text)\n        print(f\"PyMuPDF: {len(text)} chars\")\n        sys.exit(0)\nexcept Exception as e:\n    print(f\"PyMuPDF failed: {e}\")\n\n# Method 2: pdfplumber\ntry:\n    text = \"\"\n    with pdfplumber.open(pdf_path) as pdf:\n        for page in pdf.pages:\n            txt = page.extract_text()\n            if txt:\n                text += txt + \"\\n\"\n    if len(text.strip()) > 500:\n        with open(output_path, \"w\") as f:\n            f.write(text)\n        print(f\"pdfplumber: {len(text)} chars\")\n        sys.exit(0)\nexcept Exception as e:\n    print(f\"pdfplumber failed: {e}\")\n\nprint(\"All extraction methods failed\")\nsys.exit(1)\nPYTHON\n```\n\n## Best Practices\n\n1. **Always validate** - Never assume a download succeeded\n2. **Log the path taken** - Record which method worked for debugging\n3. **Set reasonable thresholds** - 50 words \u002F 500 chars minimum for \"success\"\n4. **Keep raw PDF** - Don't delete the original until extraction is confirmed\n5. **Retry with variations** - Different user-agents, referer headers, or mirrors\n\n## Dependencies\n\n- `curl` - For downloading\n- `poppler-utils` (pdftotext) - Optional, fast extraction\n- `PyMuPDF` (`fitz`) - `pip install pymupdf`\n- `pdfplumber` - `pip install pdfplumber`",{"name":5,"description":7},"main","ff671ef61ed6587c49bd54c81cdc751c0b99e363","gdpval_bench\u002Fskills\u002Fpdf-extraction-fallbacks","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace","https:\u002F\u002Fgithub.com\u002FAG064","AG064, E.Mi.\r\n\r\nA person who thinks all the time, yet all they have to think is nothing. I want to improve the world and work on open source projects","2026-10-08 06:53:48",{"source":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add AG064\u002FOpenSpace --skill pdf-extraction-fallbacks",{"tool":51,"command":52},"bunx","bunx skills add AG064\u002FOpenSpace --skill pdf-extraction-fallbacks",{"tool":54,"command":55},"pnpm","pnpm dlx skills add AG064\u002FOpenSpace --skill pdf-extraction-fallbacks","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fpdf-extraction-fallbacks\u002FSKILL.md",true,[59],{"path":60,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":63,"sourceHtmlUrl":64},".skill_id","OTHER","其他",38,"https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fpdf-extraction-fallbacks\u002F.skill_id",[66,90,106,115,145,161],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":33},"01M6KKMPWA0B5SCCH766F8M5EA","write-special-chars-ts-check","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, plus a reliable TypeScript type-checking step that filters output to only the newly-written files to avoid being misled by pre-existing errors.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-ts-check\u002FSKILL.md",[],[73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89],"write special chars ts check","check","write","filters","Existing","type-checking","for","errors","script","output","type","files","only","template","file","python","typescript",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":33},"01M6KKMJXVBNVEY3TRK055F4A7","write-special-chars-readback","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, with mandatory post-write verification via read_file and cleanup of \u002Ftmp helper scripts.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-readback\u002FSKILL.md",[],[97,98,75,86,99,100,87,88,101,102,103,104,105,79,81,32],"readback","write special chars readback","cleanup","read","scripts","verification","via","post","helper",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":33},"01M6KKMEGX9M9NC105J0W3Q5B9","write-special-chars-heredoc","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) by using a Python heredoc script executed via shell.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-heredoc\u002FSKILL.md",[],[75,113,88,79,103,86,114,87,81],"write special chars heredoc","shell",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":126,"publishedAt":33},"01M6KKM8EJ2AATVHZBNB916WT0","worldmonitor-reference","Curated architecture index of the WorldMonitor open-source dashboard. Reference for extracting patterns — vanilla TypeScript, Panel class hierarchy, service layer, CSS grid, API edge functions, refresh scheduler, and 60+ data source integrations.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fworldmonitor-reference\u002FSKILL.md",[121],{"categoryNo":122,"categoryName":123,"taxonomyType":124,"taxonomyTypeDesc":125},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[127,128,129,130,89,131,132,133,134,135,79,136,137,138,139,140,141,142,143,144],"reference","worldmonitor","worldmonitor reference","dashboard","css","architecture","extracting","hierarchy","source","layer","panel","patterns","edge functions","integrations","open","api","data","scheduler",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":33},"01M6KKM39PHYK627F19GE2B9XN","virtual-list","Implement efficient virtual scrolling for rendering large lists with DOM recycling, chunk-based rendering, and performance optimizations","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fvirtual-list\u002FSKILL.md",[],[152,153,154,155,79,156,32,157,158,159,160],"virtual list","list","virtual","chunk","dom","rendering","recycling","implement","performance",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":33},"01M6KKKY7T2P61Y0JH54CDEJKQ","verify-directory-structure","Diagnose and resolve file access issues by first verifying the directory structure.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fverify-directory-structure\u002FSKILL.md",[],[168,169,170,171,172,173,87,174,175,176],"directory","verify","structure","verify directory structure","access","first","issues","diagnose","file access"]