[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HXRQ9P1PDCE93S5F3HB93G":3,"skill-same:01M6HXRQ9P1PDCE93S5F3HB93G":68},{"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":23,"publishedAt":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":46,"ownerDescription":6,"updatedAt":47,"install":48,"resources":61},"01M6HXRQ9P1PDCE93S5F3HB93G","pdf-verification-check-112b09",null,"Verify generated PDF files using PyPDF2 to check page counts and integrity","HKUDS\u002FAgentPilot","HKUDS","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F118165258?v=4","01M6HW8VRNZP64G0P4MVJW2KKQ","✨Data Intelligence Lab@HKU✨","01M6HW8VWZVHBRHYH3T330PFWV",8029,"MIT","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fgdpval_bench\u002Fskills\u002Fpdf-verification-check-112b09\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34],"PDF","verification","check","pdf verification check 112b09","pdf verification check","pdf verification","integrity","verify","page","generated","files","2026-11-10 10:12:30",false,"---\nname: pdf-verification-check-112b09\ndescription: Verify generated PDF files using PyPDF2 to check page counts and integrity\n---\n\n# PDF Verification Check\n\nAfter generating PDF files, always programmatically verify their structure and integrity before declaring task completion. This catches formatting errors, incorrect page counts, and corrupted files early.\n\n## When to Use\n\nUse this skill whenever your task involves:\n- Generating PDF documents\n- Creating PDFs with specific page count requirements\n- Producing multi-part PDF outputs (e.g., listings + maps)\n\n## Verification Steps\n\n### 1. Install PyPDF2 (if not available)\n\n```bash\npip install PyPDF2\n```\n\n### 2. Verify PDF Page Count and Integrity\n\nCreate a verification script or run inline Python:\n\n```python\nfrom PyPDF2 import PdfReader\nimport os\n\ndef verify_pdf(pdf_path, expected_pages=None):\n    \"\"\"Verify PDF file exists, is readable, and has expected page count.\"\"\"\n    try:\n        # Check file exists\n        if not os.path.exists(pdf_path):\n            return False, f\"File not found: {pdf_path}\"\n        \n        # Check file size (non-empty)\n        file_size = os.path.getsize(pdf_path)\n        if file_size == 0:\n            return False, f\"Empty file: {pdf_path}\"\n        \n        # Open and verify PDF structure\n        reader = PdfReader(pdf_path)\n        actual_pages = len(reader.pages)\n        \n        # Check page count if expected\n        if expected_pages is not None and actual_pages != expected_pages:\n            return False, f\"Expected {expected_pages} pages, got {actual_pages}\"\n        \n        return True, f\"Valid PDF with {actual_pages} page(s)\"\n        \n    except Exception as e:\n        return False, f\"PDF verification failed: {str(e)}\"\n\n# Example usage\npdf_files = [\n    (\"listings.pdf\", 2),\n    (\"map.pdf\", 1),\n]\n\nall_valid = True\nfor pdf_path, expected in pdf_files:\n    valid, message = verify_pdf(pdf_path, expected)\n    print(f\"{pdf_path}: {'✓' if valid else '✗'} {message}\")\n    if not valid:\n        all_valid = False\n\nif not all_valid:\n    raise Exception(\"PDF verification failed - review and regenerate\")\n```\n\n### 3. Use run_shell for Verification\n\nExecute the verification using `run_shell`:\n\n```bash\npython -c \"\nfrom PyPDF2 import PdfReader\nimport sys\n\npdf_path = 'output.pdf'\nexpected = 2\n\ntry:\n    reader = PdfReader(pdf_path)\n    actual = len(reader.pages)\n    if actual != expected:\n        print(f'ERROR: Expected {expected} pages, got {actual}')\n        sys.exit(1)\n    print(f'OK: {pdf_path} has {actual} page(s)')\nexcept Exception as e:\n    print(f'ERROR: {e}')\n    sys.exit(1)\n\"\n```\n\n### 4. Verify Before Completion\n\n**Critical:** Only mark your task as complete after ALL PDF verification checks pass. If verification fails:\n\n1. Examine the error message\n2. Regenerate the PDF with corrected formatting\n3. Re-run verification\n4. Repeat until all checks pass\n\n## Common Issues Caught\n\n- Wrong page counts (e.g., content spilling to extra pages)\n- Empty or corrupted PDF files\n- PDFs that fail to open properly\n- Missing expected sections due to formatting errors\n\n## Example Workflow\n\n```python\n# 1. Generate PDF\ngenerate_pdf(\"listings.pdf\", content)\n\n# 2. Verify before completion\nvalid, msg = verify_pdf(\"listings.pdf\", expected_pages=2)\nif not valid:\n    # Fix and regenerate\n    regenerate_pdf(\"listings.pdf\", corrected_content)\n    valid, msg = verify_pdf(\"listings.pdf\", expected_pages=2)\n\n# 3. Only complete if verification passes\nassert valid, f\"Cannot complete: {msg}\"\n```","# PDF Verification Check\n\nAfter generating PDF files, always programmatically verify their structure and integrity before declaring task completion. This catches formatting errors, incorrect page counts, and corrupted files early.\n\n## When to Use\n\nUse this skill whenever your task involves:\n- Generating PDF documents\n- Creating PDFs with specific page count requirements\n- Producing multi-part PDF outputs (e.g., listings + maps)\n\n## Verification Steps\n\n### 1. Install PyPDF2 (if not available)\n\n```bash\npip install PyPDF2\n```\n\n### 2. Verify PDF Page Count and Integrity\n\nCreate a verification script or run inline Python:\n\n```python\nfrom PyPDF2 import PdfReader\nimport os\n\ndef verify_pdf(pdf_path, expected_pages=None):\n    \"\"\"Verify PDF file exists, is readable, and has expected page count.\"\"\"\n    try:\n        # Check file exists\n        if not os.path.exists(pdf_path):\n            return False, f\"File not found: {pdf_path}\"\n        \n        # Check file size (non-empty)\n        file_size = os.path.getsize(pdf_path)\n        if file_size == 0:\n            return False, f\"Empty file: {pdf_path}\"\n        \n        # Open and verify PDF structure\n        reader = PdfReader(pdf_path)\n        actual_pages = len(reader.pages)\n        \n        # Check page count if expected\n        if expected_pages is not None and actual_pages != expected_pages:\n            return False, f\"Expected {expected_pages} pages, got {actual_pages}\"\n        \n        return True, f\"Valid PDF with {actual_pages} page(s)\"\n        \n    except Exception as e:\n        return False, f\"PDF verification failed: {str(e)}\"\n\n# Example usage\npdf_files = [\n    (\"listings.pdf\", 2),\n    (\"map.pdf\", 1),\n]\n\nall_valid = True\nfor pdf_path, expected in pdf_files:\n    valid, message = verify_pdf(pdf_path, expected)\n    print(f\"{pdf_path}: {'✓' if valid else '✗'} {message}\")\n    if not valid:\n        all_valid = False\n\nif not all_valid:\n    raise Exception(\"PDF verification failed - review and regenerate\")\n```\n\n### 3. Use run_shell for Verification\n\nExecute the verification using `run_shell`:\n\n```bash\npython -c \"\nfrom PyPDF2 import PdfReader\nimport sys\n\npdf_path = 'output.pdf'\nexpected = 2\n\ntry:\n    reader = PdfReader(pdf_path)\n    actual = len(reader.pages)\n    if actual != expected:\n        print(f'ERROR: Expected {expected} pages, got {actual}')\n        sys.exit(1)\n    print(f'OK: {pdf_path} has {actual} page(s)')\nexcept Exception as e:\n    print(f'ERROR: {e}')\n    sys.exit(1)\n\"\n```\n\n### 4. Verify Before Completion\n\n**Critical:** Only mark your task as complete after ALL PDF verification checks pass. If verification fails:\n\n1. Examine the error message\n2. Regenerate the PDF with corrected formatting\n3. Re-run verification\n4. Repeat until all checks pass\n\n## Common Issues Caught\n\n- Wrong page counts (e.g., content spilling to extra pages)\n- Empty or corrupted PDF files\n- PDFs that fail to open properly\n- Missing expected sections due to formatting errors\n\n## Example Workflow\n\n```python\n# 1. Generate PDF\ngenerate_pdf(\"listings.pdf\", content)\n\n# 2. Verify before completion\nvalid, msg = verify_pdf(\"listings.pdf\", expected_pages=2)\nif not valid:\n    # Fix and regenerate\n    regenerate_pdf(\"listings.pdf\", corrected_content)\n    valid, msg = verify_pdf(\"listings.pdf\", expected_pages=2)\n\n# 3. Only complete if verification passes\nassert valid, f\"Cannot complete: {msg}\"\n```",{"name":5,"description":7},"main","6b84b0689ca0d9e7b1e4061188ff6b60758e0f8a","openspace\u002Flegacy\u002Fv1\u002Fgdpval_bench\u002Fskills\u002Fpdf-verification-check-112b09",944,"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot","https:\u002F\u002Fgithub.com\u002FHKUDS","https:\u002F\u002Fsites.google.com\u002Fview\u002Fchaoh","2026-11-12 22:26:39",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add HKUDS\u002FAgentPilot --skill pdf-verification-check-112b09",{"tool":54,"command":55},"bunx","bunx skills add HKUDS\u002FAgentPilot --skill pdf-verification-check-112b09",{"tool":57,"command":58},"pnpm","pnpm dlx skills add HKUDS\u002FAgentPilot --skill pdf-verification-check-112b09","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fgdpval_bench\u002Fskills\u002Fpdf-verification-check-112b09\u002FSKILL.md",true,[62],{"path":63,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":66,"sourceHtmlUrl":67},".skill_id","OTHER","其他",43,"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fgdpval_bench\u002Fskills\u002Fpdf-verification-check-112b09\u002F.skill_id",[69,89,108,131,155,176],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":35},"01M6HYB297NDABRERJRVG0K8R0","agentpilot","Set up AgentPilot and use its single entry to prepare missing inputs and run configured RSI experiments. Use when the user requests AgentPilot installation or work with AgentPilot.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fplugins\u002Fagentpilot\u002Fskills\u002Fagentpilot\u002FSKILL.md",[],[71,76,77,78,79,80,81,82,83,84,85,86,87,88],"prepare","requests","with","missing","installation","rsi","up","use","user","work","SET","run","experiments",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":35},"01M6HYAYWXTTE1J7DJM0MFNQ4H","remember","Review auto-memory entries and propose promotions to OPENSPACE.md, OPENSPACE.local.md, or retained auto-memory topics; detect duplicates, stale facts, conflicts, and ambiguous entries before making changes.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fskills\u002Fremember\u002FSKILL.md",[],[91,96,97,98,99,100,101,102,103,104,105,106,107],"memory","review","auto","openspace","changes","facts","detect","entries","local","conflicts","stale","duplicates",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":117,"publishedAt":35},"01M6HYAVMPM4SBDV60R2B5HPV8","skill-discovery","Search reusable OpenSpace skills locally, and browse cloud packages step by step when a cloud skill may help. Reusing proven skills saves tokens, improves reliability, and extends your capabilities beyond built-in tools.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fhost_skills\u002Fskill-discovery\u002FSKILL.md",[114],{"categoryNo":115,"categoryName":116,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[118,119,120,99,121,122,123,124,125,126,127,128,129,130],"skill discovery","discovery","reusable","step by step","tokens","packages","help","cloud","reliability","capabilities","browse","search","Tools",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":138,"publishedAt":35},"01M6HYAR811B3RB0M50RBEDGN6","delegate-task","Delegate tasks to OpenSpace — a full-stack autonomous worker for coding, DevOps, web research, and desktop automation, backed by an extensive MCP tool and skill library. Skills auto-improve through use, reducing token consumption over time. A cloud community lets agents share and collectively evolve reusable skills.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fhost_skills\u002Fdelegate-task\u002FSKILL.md",[137],{"categoryNo":115,"categoryName":116,"taxonomyType":21,"taxonomyTypeDesc":22},[139,140,141,99,142,143,144,145,146,120,98,83,147,148,149,150,151,152,153,154],"delegate","task","delegate task","time","improve","desktop automation","worker","community","autonomous","tool","stack","for","share","tasks","automation","MCP",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":35},"01M6HYAM9FSGV6E52AYENDQXYH","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\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-ts-check\u002FSKILL.md",[],[162,163,26,164,34,165,166,167,168,169,170,171,172,173,150,174,175],"write special chars ts check","write","type","filters","only","template","file","python","typescript","output","Existing","type-checking","errors","script",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":35},"01M6HYAH05HGV7SVWSVR8PJRQD","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\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-readback\u002FSKILL.md",[],[183,184,163,78,150,175,185,186,187,188,189,167,168,25,190,169],"write special chars readback","readback","helper","post","via","scripts","read","cleanup"]