{"id":"11d7ff75-e99f-4bc8-8c85-03b28973eb19","entityType":"agent","slug":"clawhub-slearnai-iwork2md","name":"iwork2md","canonicalUrl":"https://www.xpersona.co/agent/clawhub-slearnai-iwork2md","canonicalPath":"/agent/clawhub-slearnai-iwork2md","generatedAt":"2026-10-09T20:20:34.469Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:56:41.882Z","emptyReason":null},"description":"Convert Apple iWork documents (Pages .pages, Numbers .numbers, Keynote .key) into Markdown. Use whenever the user wants to read, extract, or translate the content of an iWork file into text/markdown, for example 'convert this .pages file to markdown', 'extract text from a Numbers sheet', 'read a Keynote file', or 'open a .key/.numbers/.pages and turn it into markdown'. Handles the iWork '13+ format (bundle containing Index.zip with .iwa files that wrap Snappy-framed Protobuf) with no third-party dependencies.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.7K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s171srzvxc5431ssbjh7vggsvs884354:iwork2md","sourceUrl":"https://clawhub.ai/slearnai/iwork2md","homepage":"https://clawhub.ai/slearnai/skills/iwork2md","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/slearnai/iwork2md","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/slearnai/skills/iwork2md","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":69,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"iwork2md technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:56:41.882Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:56:41.882Z","emptyReason":null},"stars":null,"forks":null,"downloads":2722,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"2.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:56:41.882Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T11:56:41.882Z","lastCrawledAt":"2026-10-09T11:56:41.882Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T11:56:41.882Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-07-29T13:03:53.340Z","changelog":"Initial release: Convert Apple iWork files (.pages, .numbers, .key) to Markdown using a pure standard library Python parser. - Supports extraction of all readable content, tables, and slide text from iWork '13+ format documents. - Dependency-free: uses only Python 3.8+ standard library (no third-party packages required). - Handles non-standard iWork Snappy framing and Protobuf containers to recover UTF-8 text. - CLI supports file conversion, text extraction, printing to stdout, and media listing. - Does not support encrypted documents or visual layout reconstruction.","fileCount":12,"zipByteSize":20777}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s171srzvxc5431ssbjh7vggsvs884354:iwork2md","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s171srzvxc5431ssbjh7vggsvs884354:iwork2md` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/slearnai/iwork2md before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T20:20:34.468Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-slearnai-iwork2md/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:56:41.882Z","emptyReason":null},"readme":"Skill: iwork2md\n\nOwner: slearnai\n\nSummary: Convert Apple iWork documents (Pages .pages, Numbers .numbers, Keynote .key) into Markdown. Use whenever the user wants to read, extract, or translate the content of an iWork file into text/markdown, for example 'convert this .pages file to markdown', 'extract text from a Numbers sheet', 'read a Keynote file', or 'open a .key/.numbers/.pages and turn it into markdown'. Handles the iWork '13+ format (bundle containing Index.zip with .iwa files that wrap Snappy-framed Protobuf) with no third-party dependencies.\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-07-29T13:03:53.340Z | auto\n\nInitial release: Convert Apple iWork files (.pages, .numbers, .key) to Markdown using a pure standard library Python parser.\n\n- Supports extraction of all readable content, tables, and slide text from iWork '13+ format documents.\n- Dependency-free: uses only Python 3.8+ standard library (no third-party packages required).\n- Handles non-standard iWork Snappy framing and Protobuf containers to recover UTF-8 text.\n- CLI supports file conversion, text extraction, printing to stdout, and media listing.\n- Does not support encrypted documents or visual layout reconstruction.\n\nArchive index:\n\nArchive v0.1.0: 12 files, 20777 bytes\n\nFiles: .gitignore (85b), LICENSE.txt (1068b), README.md (3728b), references (0b), references/FORMAT.md (4115b), scripts (0b), scripts/iwa.py (19873b), scripts/iwork2md.py (10455b), scripts/test_iwa.py (3117b), skill-card.md (2297b), SKILL.md (4298b), _meta.json (127b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: iwork2md\nslug: iwork2md\nversion: 1.0.0\ndisplayName: iWork to Markdown\ndescription: \"Convert Apple iWork documents (Pages .pages, Numbers .numbers, Keynote .key) into Markdown. Use whenever the user wants to read, extract, or translate the content of an iWork file into text/markdown, for example 'convert this .pages file to markdown', 'extract text from a Numbers sheet', 'read a Keynote file', or 'open a .key/.numbers/.pages and turn it into markdown'. Handles the iWork '13+ format (bundle containing Index.zip with .iwa files that wrap Snappy-framed Protobuf) with no third-party dependencies.\"\nlicense: MIT\nsummary: Convert Apple iWork (.pages/.numbers/.key) documents to Markdown with a dependency-free Python parser.\ntags:\n  - iwork\n  - pages\n  - numbers\n  - keynote\n  - markdown\n  - conversion\n---\n\n# iwork2md — iWork (.pages / .numbers / .key) to Markdown\n\nConvert Apple Pages / Numbers / Keynote documents to Markdown. The parser is in\n`scripts/iwa.py` (pure stdlib); the converter CLI is `scripts/iwork2md.py`.\n\n## When to use\n\n- User provides a `.pages`, `.numbers`, or `.key` file and wants its text,\n  tables, or slides as Markdown (or just to *read* the content).\n- User asks to \"extract text / convert / translate / open\" an iWork file.\n- Do NOT use for: password-protected/encrypted iWork docs (unsupported),\n  or for reconstructing exact visual layout (not the goal).\n\n## How to run\n\n```bash\n# Write a .md next to the source (auto-named)\npython3 scripts/iwork2md.py path/to/Doc.pages\n\n# Explicit output path\npython3 scripts/iwork2md.py Doc.numbers out.md\n\n# Print to stdout\npython3 scripts/iwork2md.py Doc.key --stdout\n\n# Debug: dump every recovered text fragment\npython3 scripts/iwork2md.py Doc.numbers --texts\n\n# List embedded media (images/video)\npython3 scripts/iwork2md.py Doc.pages --media\n```\n\nFrom inside a chat, invoke with `exec` (or tell the user to run it). The script\nis dependency-free (Python 3.8+, stdlib only: `zipfile`, `struct`, `io`,\n`plistlib`).\n\n## What it does\n\n1. Opens the bundle ZIP; finds `Index.zip` (or `.iwa` files directly under\n   `Index/`).\n2. For each `.iwa`: removes the iWork **Snappy framing** (chunk type + 3-byte\n   LE length, no stream-id, no CRC), then raw-Snappy-decompresses the body.\n3. Parses the **Protobuf container** (`varint len + ArchiveInfo {identifier,\n   message_infos[]}` then payloads), and generically walks every message to\n   collect UTF-8 string fields — recovering ~100% of readable content without\n   needing the app-specific schema map (TSPRegistry).\n4. Renders Markdown: document title (from `Metadata/Properties.plist` or first\n   heading), an embedded-media list, reconstructed **Numbers tables** (rows\n   stored as `\"a | b | c\"` become proper markdown tables, deduped across\n   mirrored components), a body block (largest multi-line text), and remaining\n   text fragments.\n\n## Key facts you need (so you don't re-derive them)\n\n- iWork `.iwa` Snappy framing is **non-standard**: type byte `0x00`, 3-byte LE\n  length, then a **raw** Snappy block (NOT an official framed stream). No\n  stream-identifier chunk, no CRC. (`iwa.iwa_unframe`)\n- Raw Snappy: uncompressed-length varint, then LZ77 (literals + copies). Copies\n  have 1/2/4-byte offsets. (`iwa.snappy_decompress`)\n- Payload `type` ids map to schemas inside the iWork binaries and vary by\n  app/version — Protobuf is not self-describing, so we decode generically by\n  string fields. See `references/FORMAT.md` for the full spec and limits.\n- Numbers table rows serialize as a single `\"cell | cell | cell\"` string per\n  row → the CLI groups consecutive such rows into a markdown table.\n\n## Output quality & limits\n\n- ✅ Recovers all text, Numbers table structure, slide text, media inventory.\n- ❌ No exact layout/fonts/colors/merged-cell geometry/charts/shapes.\n- ❌ Encrypted (password-locked) documents are not readable.\n- If a user needs perfect structural fidelity, note that it requires extracting\n  the TSPRegistry type map for their iWork version; the generic walker here is\n  the reliable, dependency-free fallback.\n\n## Testing / validating\n\n`scripts/test_iwa.py` round-trips a synthetic `.iwa` (encoder + parser) to prove\nthe Snappy framing, raw-Snappy copy path, and Protobuf container logic. Run:\n`python3 scripts/test_iwa.py`.\n\nFile v0.1.0:README.md\n\n# iwork2md\n\nConvert Apple iWork documents — **Pages (`.pages`)**, **Numbers (`.numbers`)**, and **Keynote (`.key`)** — into Markdown. Pure Python, **no third-party dependencies**.\n\n`iwork2md` reads the iWork '13+ bundle format directly:\n\n```\nfile.pages / file.numbers / file.key   (ZIP or directory bundle)\n└── Index.zip\n    └── *.iwa                           (Snappy-framed Protobuf payloads)\n```\n\nIt decodes the non-standard Snappy framing and Protobuf containers, extracts text and media references, and **reconstructs modern Numbers tables** (row/column grids with strings, numbers, and formulas).\n\n---\n\n## Features\n\n- **No dependencies** — pure Python 3 standard library (`zipfile`, `struct`, `re`). Works on any macOS/Linux/Windows box.\n- **Text extraction** — Pages body text, Numbers cell/header text, Keynote slide text, speaker notes, and comments.\n- **Numbers table reconstruction** — resolves `Table (6001)` → `DataList (6005)` linkages and rebuilds the full grid, decoding:\n  - **strings** (field 3)\n  - **numbers** (IEEE-754 doubles, field 5 → `f42`)\n  - **formulas** (rendered as `=formula`)\n  - empty cells are padded so the layout is preserved\n- **Robust layout handling** — works on both ZIP-bundle files and `.pages` directory packages.\n- **Noise filtering** — drops locale codes (`en_HK`), timezones, month-name lists, and number-format strings that would otherwise pollute the output.\n- **SkillHub-ready** — ships with `SKILL.md` (slug/version/displayName), `LICENSE.txt` (MIT), and a `references/FORMAT.md` format note.\n\n---\n\n## Installation\n\nClone the repo:\n\n```bash\ngit clone https://github.com/slearnAI/iwork2md.git\ncd iwork2md\n```\n\nNo `pip install` required — just run the script. (Optional: `chmod +x scripts/iwork2md.py`.)\n\n---\n\n## Usage\n\nConvert a single file:\n\n```bash\npython3 scripts/iwork2md.py path/to/document.numbers\n```\n\nWrite to a specific output path:\n\n```bash\npython3 scripts/iwork2md.py path/to/deck.key output.md\n```\n\nIf no output path is given, Markdown is printed to **stdout**.\n\n### As an OpenClaw skill\n\nDrop the folder into your skills directory:\n\n```bash\ncp -r iwork2md ~/.qclaw/skills/\n```\n\nThen ask naturally: *\"convert this .pages file to markdown\"*, *\"extract text from my Numbers sheet\"*, *\"read that Keynote file\"* — the skill triggers and runs the bundled converter.\n\n---\n\n## Output format\n\n- **Pages / Keynote** → headings, paragraphs, lists, and a `## Media` section listing referenced images/video by filename.\n- **Numbers** → a `## Tables` section with one Markdown table per sheet, plus any stray text fragments under `## Other text`.\n\nExample (Numbers):\n\n```markdown\n# My Spreadsheet\n\n## Tables\n\n| 南航積分 | 酒店積分 | 曼谷 |\n| --- | --- | --- |\n| CZ3062 | 機票 | 稅費 |\n| =formula |  |  |\n```\n\n---\n\n## How it works\n\nThe underlying decoder (`scripts/iwa.py`) handles three layers:\n\n1. **Bundle** — unzip the `.iwa` files (or walk a directory package).\n2. **Snappy framing** — each `.iwa` is a sequence of chunks: `1-byte type` + `3-byte little-endian length` + raw Snappy stream. The raw stream begins with an uncompressed-length varint.\n3. **Protobuf container** — `varint(archiveInfoLength)` + `ArchiveInfo{identifier, message_infos[]}` + payload. The message `type` selects the schema; `Table (6001)` and `DataList (6005)` drive table reconstruction.\n\nSee [`references/FORMAT.md`](references/FORMAT.md) for the full field-by-field mapping and the engineering notes behind table extraction.\n\n---\n\n## Testing\n\nA self-test decodes a synthetic `.iwa` round-trip:\n\n```bash\npython3 scripts/test_iwa.py\n# OK: parser decodes synthetic .iwa correctly\n```\n\n---\n\n## License\n\n[MIT](LICENSE.txt) © 2026 Stephen Lau\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn70217mcwqf7ya07qzw4xv5rd8014q7\",\n  \"slug\": \"iwork2md\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1785330233340\n}\n\nFile v0.1.0:references/FORMAT.md\n\n# iWork File Format Reference (Pages / Numbers / Keynote)\n\nThis skill targets the **iWork '13+** format used by current Pages (.pages),\nNumbers (.numbers) and Keynote (.key) documents.\n\n## Physical layout\n\nThe document is a **bundle** = a ZIP archive containing:\n\n```\nMyDoc.pages/                (outer ZIP)\n├── Index.zip               (all serialized objects, see below)\n├── Data/                   (embedded media: images, video, etc.)\n│   └── 143917994_2881x1992-small.jpg\n├── Metadata/\n│   ├── Properties.plist    (title / metadata)\n│   ├── DocumentIdentifier\n│   └── BuildVersionHistory.plist\n├── preview.jpg             (preview thumbnails, top level)\n├── preview-web.jpg\n└── preview-micro.jpg\n```\n\n> Note: some iWork versions place the `.iwa` files **directly** under `Index/`\n> inside the outer ZIP instead of inside a nested `Index.zip`. The parser\n> (`iwa.open_iwa_sources`) handles both layouts.\n\n## Index.zip -> .iwa\n\nInside `Index.zip` are many `.iwa` files (one or more per Component):\n`Document.iwa`, `MasterSlide-1.iwa`, `CalculationEngine.iwa`, etc.\n\n- The iWork ZIP writer uses **no compression** and no Zip64. Re-zipping with a\n  normal tool can break the document, but reading is standard ZIP.\n\n## .iwa = Protobuf stream wrapped in non-standard Snappy framing\n\n### Snappy framing (iWork variant — NOT the official spec)\n\nBack-to-back chunks:\n\n```\n[1 byte type][3-byte LE chunk length][length bytes data]\n```\n\n- iWork only emits **type 0x00** (compressed).\n- It **omits** the mandatory stream-identifier chunk (`0xFF \"sNaPpY\"`).\n- It **omits** the CRC-32C checksum that the official framing prepends to\n  compressed data.\n- For type 0x00, the chunk **data is a raw Snappy block** (starts with an\n  uncompressed-length varint), not an officially-framed stream.\n\n`iwa.iwa_unframe()` implements this exact variant.\n\n### Raw Snappy block\n\n```\nvarint uncompressed_length\n<LZ77 stream: literals + back-references>\n```\n\nElements start with a tag byte; lower 2 bits = type:\n- `00` literal (len in upper 6 bits, or 1–4 follow bytes for len ≥ 61)\n- `01` copy, 1-byte offset (len 4–11, offset 0–2047)\n- `10` copy, 2-byte offset (len 1–64, offset 0–65535)\n- `11` copy, 4-byte offset (len 1–64, offset 0–2^32)\n\n`iwa.snappy_decompress()` implements the block format.\n\n### Protobuf container stream (after unframing)\n\nObjects are concatenated:\n\n```\nvarint archive_info_len\nArchiveInfo {                      # message\n  field 1: identifier (uint64)     # unique id across the document\n  field 2: repeated MessageInfo\n}\n<for each MessageInfo, the payload bytes>\n```\n\n`MessageInfo`:\n```\nfield 1: type    (uint32)  # selects the payload's protobuf schema\nfield 2: version (packed uint32)\nfield 3: length  (uint32)  # payload byte length\nfield 5: object_references (packed uint64)\nfield 6: data_references   (packed uint64)\n```\n\n`type` -> schema mapping (the **TSPRegistry**) is embedded inside the iWork\nbinaries and differs per app/version. Because Protobuf is not self-describing,\nperfect decoding requires that map.\n\n## What this skill does without the TSPRegistry\n\nProtobuf string fields are stored as UTF-8, so a **generic walk** of the message\ntree recovers essentially all human-readable text:\n\n- Pages: body paragraphs, titles, headings, text boxes.\n- Numbers: table cell text (each row serializes as `\"a | b | c\"`; the CLI\n  reconstructs proper markdown tables), sheet/sheet-title names.\n- Keynote: slide titles, body text, speaker notes, table text.\n- All: embedded media inventory from `Data/`.\n\n## Limits\n\n- **Password-protected (encrypted) documents** use AES-128 + PKCS7 and cannot\n  be read by this skill.\n- Layout, fonts, colors, exact cell-merge geometry, shapes, and charts are\n  *not* reconstructed — only textual content and table structure.\n- For full structural fidelity, recover the `TSPRegistry` type map for the\n  specific iWork version (see `obriensp/iWorkFileFormat` / `proto-dump`) and\n  decode payloads per-schema. The generic walker is a reliable fallback that\n  preserves 100% of readable text.\n\nFile v0.1.0:skill-card.md\n\n## Description:\n\nConvert Apple iWork documents (Pages .pages, Numbers .numbers, Keynote .key) into Markdown.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[slearnai](https://clawhub.ai/user/slearnai)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers, engineers, and other agents use this skill to read, extract, or convert Apple iWork Pages, Numbers, and Keynote documents into text or Markdown.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Malicious or very large iWork documents may cause excessive memory use or long processing time.\n\nMitigation: Use the skill only for files you intentionally provide, avoid untrusted oversized documents, and run conversion with agent-enforced memory and time limits.\n\nRisk: Converted Markdown may be written beside the source document when no explicit destination is provided.\n\nMitigation: Prefer --stdout or an explicit output path so the user and agent know where converted content is written.\n\nRisk: Encrypted iWork files and exact visual layout reconstruction are unsupported.\n\nMitigation: Use the output for readable text, tables, slide text, and media inventory; require a different workflow when password-protected documents or pixel-accurate layout are needed.\n\n## Reference(s):\n\n- [iWork file format reference](references/FORMAT.md)\n- [Server-resolved GitHub repository](https://github.com/slearnAI/iwork2md)\n- [Server-resolved GitHub commit](https://github.com/slearnAI/iwork2md/tree/de2fbb57e58d6643908e2823bfd42a8c005da357)\n- [ClawHub skill page](https://clawhub.ai/slearnai/skills/iwork2md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Files, Shell commands, Guidance]\n\n**Output Format:** [Markdown, plain text, file paths, or concise shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May write a Markdown file next to the source document, write to an explicit output path, or print to stdout.]\n\n## Skill Version(s):\n\n0.1.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.0:LICENSE.txt\n\nMIT License\n\nCopyright (c) 2026 Stephen Lau\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.","readmeExcerpt":"Skill: iwork2md Owner: slearnai Summary: Convert Apple iWork documents (Pages .pages, Numbers .numbers, Keynote .key) into Markdown. Use whenever the user wants to read, extract, or translate the content of an iWork file into text/markdown, for example 'convert this .pages file to markdown', 'extract text from a Numbers sheet', 'read a Keynote file', or 'open a .key/.numbers/.pages and turn it into markdown'. Handles","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# Write a .md next to the source (auto-named)\npython3 scripts/iwork2md.py path/to/Doc.pages\n\n# Explicit output path\npython3 scripts/iwork2md.py Doc.numbers out.md\n\n# Print to stdout\npython3 scripts/iwork2md.py Doc.key --stdout\n\n# Debug: dump every recovered text fragment\npython3 scripts/iwork2md.py Doc.numbers --texts\n\n# List embedded media (images/video)\npython3 scripts/iwork2md.py Doc.pages --media"},{"language":"text","snippet":"file.pages / file.numbers / file.key   (ZIP or directory bundle)\n└── Index.zip\n    └── *.iwa                           (Snappy-framed Protobuf payloads)"},{"language":"bash","snippet":"git clone https://github.com/slearnAI/iwork2md.git\ncd iwork2md"},{"language":"bash","snippet":"python3 scripts/iwork2md.py path/to/document.numbers"},{"language":"bash","snippet":"python3 scripts/iwork2md.py path/to/deck.key output.md"},{"language":"bash","snippet":"cp -r iwork2md ~/.qclaw/skills/"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: iwork2md\nslug: iwork2md\nversion: 1.0.0\ndisplayName: iWork to Markdown\ndescription: \"Convert Apple iWork documents (Pages .pages, Numbers .numbers, Keynote .key) into Markdown. Use whenever the user wants to read, extract, or translate the content of an iWork file into text/markdown, for example 'convert this .pages file to markdown', 'extract text from a Numbers sheet', 'read a Keynote file', or 'open a .key/.numbers/.pages and turn it into markdown'. Handles the iWork '13+ format (bundle containing Index.zip with .iwa files that wrap Snappy-framed Protobuf) with no third-party dependencies.\"\nlicense: MIT\nsummary: Convert Apple iWork (.pages/.numbers/.key) documents to Markdown with a dependency-free Python parser.\ntags:\n  - iwork\n  - pages\n  - numbers\n  - keynote\n  - markdown\n  - conversion\n---\n\n# iwork2md — iWork (.pages / .numbers / .key) to Markdown\n\nConvert Apple Pages / Numbers / Keynote documents to Markdown. The parser is in\n`scripts/iwa.py` (pure stdlib); the converter CLI is `scripts/iwork2md.py`.\n\n## When to use\n\n- User provides a `.pages`, `.numbers`, or `.key` file and wants its text,\n  tables, or slides as Markdown (or just to *read* the content).\n- User asks to \"extract text / convert / translate / open\" an iWork file.\n- Do NOT use for: password-protected/encrypted iWork docs (unsupported),\n  or for reconstructing exact visual layout (not the goal).\n\n## How to run\n\n```bash\n# Write a .md next to the source (auto-named)\npython3 scripts/iwork2md.py path/to/Doc.pages\n\n# Explicit output path\npython3 scripts/iwork2md.py Doc.numbers out.md\n\n# Print to stdout\npython3 scripts/iwork2md.py Doc.key --stdout\n\n# Debug: dump every recovered text fragment\npython3 scripts/iwork2md.py Doc.numbers --texts\n\n# List embedded media (images/video)\npython3 scripts/iwork2md.py Doc.pages --media\n```\n\nFrom inside a chat, invoke with `exec` (or tell the user to run it). The script\nis dependency-free (Python 3.8+, stdlib only: `zipfile`, `struct`, `io`,\n`plistlib`).\n\n## What it does\n\n1. Opens the bundle ZIP; finds `Index.zip` (or `.iwa` files directly under\n   `Index/`).\n2. For each `.iwa`: removes the iWork **Snappy framing** (chunk type + 3-byte\n   LE length, no stream-id, no CRC), then raw-Snappy-decompresses the body.\n3. Parses the **Protobuf container** (`varint len + ArchiveInfo {identifier,\n   message_infos[]}` then payloads), and generically walks every message to\n   collect UTF-8 string fields — recovering ~100% of readable content without\n   needing the app-specific schema map (TSPRegistry).\n4. Renders Markdown: document title (from `Metadata/Properties.plist` or first\n   heading), an embedded-media list, reconstructed **Numbers tables** (rows\n   stored as `\"a | b | c\"` become proper markdown tables, deduped across\n   mirrored components), a body block (largest multi-line text), and remaining\n   text fragments.\n\n## Key facts you need (so you don't re-derive them)\n\n- iWork `.iwa` Snappy framing is **non-standard**: type byte `0x00`, 3-byte LE"},{"path":"README.md","content":"# iwork2md\n\nConvert Apple iWork documents — **Pages (`.pages`)**, **Numbers (`.numbers`)**, and **Keynote (`.key`)** — into Markdown. Pure Python, **no third-party dependencies**.\n\n`iwork2md` reads the iWork '13+ bundle format directly:\n\n```\nfile.pages / file.numbers / file.key   (ZIP or directory bundle)\n└── Index.zip\n    └── *.iwa                           (Snappy-framed Protobuf payloads)\n```\n\nIt decodes the non-standard Snappy framing and Protobuf containers, extracts text and media references, and **reconstructs modern Numbers tables** (row/column grids with strings, numbers, and formulas).\n\n---\n\n## Features\n\n- **No dependencies** — pure Python 3 standard library (`zipfile`, `struct`, `re`). Works on any macOS/Linux/Windows box.\n- **Text extraction** — Pages body text, Numbers cell/header text, Keynote slide text, speaker notes, and comments.\n- **Numbers table reconstruction** — resolves `Table (6001)` → `DataList (6005)` linkages and rebuilds the full grid, decoding:\n  - **strings** (field 3)\n  - **numbers** (IEEE-754 doubles, field 5 → `f42`)\n  - **formulas** (rendered as `=formula`)\n  - empty cells are padded so the layout is preserved\n- **Robust layout handling** — works on both ZIP-bundle files and `.pages` directory packages.\n- **Noise filtering** — drops locale codes (`en_HK`), timezones, month-name lists, and number-format strings that would otherwise pollute the output.\n- **SkillHub-ready** — ships with `SKILL.md` (slug/version/displayName), `LICENSE.txt` (MIT), and a `references/FORMAT.md` format note.\n\n---\n\n## Installation\n\nClone the repo:\n\n```bash\ngit clone https://github.com/slearnAI/iwork2md.git\ncd iwork2md\n```\n\nNo `pip install` required — just run the script. (Optional: `chmod +x scripts/iwork2md.py`.)\n\n---\n\n## Usage\n\nConvert a single file:\n\n```bash\npython3 scripts/iwork2md.py path/to/document.numbers\n```\n\nWrite to a specific output path:\n\n```bash\npython3 scripts/iwork2md.py path/to/deck.key output.md\n```\n\nIf no output path is given, Markdown is printed to **stdout**.\n\n### As an OpenClaw skill\n\nDrop the folder into your skills directory:\n\n```bash\ncp -r iwork2md ~/.qclaw/skills/\n```\n\nThen ask naturally: *\"convert this .pages file to markdown\"*, *\"extract text from my Numbers sheet\"*, *\"read that Keynote file\"* — the skill triggers and runs the bundled converter.\n\n---\n\n## Output format\n\n- **Pages / Keynote** → headings, paragraphs, lists, and a `## Media` section listing referenced images/video by filename.\n- **Numbers** → a `## Tables` section with one Markdown table per sheet, plus any stray text fragments under `## Other text`.\n\nExample (Numbers):\n\n```markdown\n# My Spreadsheet\n\n## Tables\n\n| 南航積分 | 酒店積分 | 曼谷 |\n| --- | --- | --- |\n| CZ3062 | 機票 | 稅費 |\n| =formula |  |  |\n```\n\n---\n\n## How it works\n\nThe underlying decoder (`scripts/iwa.py`) handles three layers:\n\n1. **Bundle** — unzip the `.iwa` files (or walk a directory package).\n2. **Snappy framing** — each `.iwa` is a sequence of chunks: `1-byte type` + `3-byte little-endian l"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70217mcwqf7ya07qzw4xv5rd8014q7\",\n  \"slug\": \"iwork2md\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1785330233340\n}"},{"path":"references/FORMAT.md","content":"# iWork File Format Reference (Pages / Numbers / Keynote)\n\nThis skill targets the **iWork '13+** format used by current Pages (.pages),\nNumbers (.numbers) and Keynote (.key) documents.\n\n## Physical layout\n\nThe document is a **bundle** = a ZIP archive containing:\n\n```\nMyDoc.pages/                (outer ZIP)\n├── Index.zip               (all serialized objects, see below)\n├── Data/                   (embedded media: images, video, etc.)\n│   └── 143917994_2881x1992-small.jpg\n├── Metadata/\n│   ├── Properties.plist    (title / metadata)\n│   ├── DocumentIdentifier\n│   └── BuildVersionHistory.plist\n├── preview.jpg             (preview thumbnails, top level)\n├── preview-web.jpg\n└── preview-micro.jpg\n```\n\n> Note: some iWork versions place the `.iwa` files **directly** under `Index/`\n> inside the outer ZIP instead of inside a nested `Index.zip`. The parser\n> (`iwa.open_iwa_sources`) handles both layouts.\n\n## Index.zip -> .iwa\n\nInside `Index.zip` are many `.iwa` files (one or more per Component):\n`Document.iwa`, `MasterSlide-1.iwa`, `CalculationEngine.iwa`, etc.\n\n- The iWork ZIP writer uses **no compression** and no Zip64. Re-zipping with a\n  normal tool can break the document, but reading is standard ZIP.\n\n## .iwa = Protobuf stream wrapped in non-standard Snappy framing\n\n### Snappy framing (iWork variant — NOT the official spec)\n\nBack-to-back chunks:\n\n```\n[1 byte type][3-byte LE chunk length][length bytes data]\n```\n\n- iWork only emits **type 0x00** (compressed).\n- It **omits** the mandatory stream-identifier chunk (`0xFF \"sNaPpY\"`).\n- It **omits** the CRC-32C checksum that the official framing prepends to\n  compressed data.\n- For type 0x00, the chunk **data is a raw Snappy block** (starts with an\n  uncompressed-length varint), not an officially-framed stream.\n\n`iwa.iwa_unframe()` implements this exact variant.\n\n### Raw Snappy block\n\n```\nvarint uncompressed_length\n<LZ77 stream: literals + back-references>\n```\n\nElements start with a tag byte; lower 2 bits = type:\n- `00` literal (len in upper 6 bits, or 1–4 follow bytes for len ≥ 61)\n- `01` copy, 1-byte offset (len 4–11, offset 0–2047)\n- `10` copy, 2-byte offset (len 1–64, offset 0–65535)\n- `11` copy, 4-byte offset (len 1–64, offset 0–2^32)\n\n`iwa.snappy_decompress()` implements the block format.\n\n### Protobuf container stream (after unframing)\n\nObjects are concatenated:\n\n```\nvarint archive_info_len\nArchiveInfo {                      # message\n  field 1: identifier (uint64)     # unique id across the document\n  field 2: repeated MessageInfo\n}\n<for each MessageInfo, the payload bytes>\n```\n\n`MessageInfo`:\n```\nfield 1: type    (uint32)  # selects the payload's protobuf schema\nfield 2: version (packed uint32)\nfield 3: length  (uint32)  # payload byte length\nfield 5: object_references (packed uint64)\nfield 6: data_references   (packed uint64)\n```\n\n`type` -> schema mapping (the **TSPRegistry**) is embedded inside the iWork\nbinaries and differs per app/version. Because Protobuf is not self-describing,\nperfect decoding"},{"path":"skill-card.md","content":"## Description:\n\nConvert Apple iWork documents (Pages .pages, Numbers .numbers, Keynote .key) into Markdown.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[slearnai](https://clawhub.ai/user/slearnai)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers, engineers, and other agents use this skill to read, extract, or convert Apple iWork Pages, Numbers, and Keynote documents into text or Markdown.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Malicious or very large iWork documents may cause excessive memory use or long processing time.\n\nMitigation: Use the skill only for files you intentionally provide, avoid untrusted oversized documents, and run conversion with agent-enforced memory and time limits.\n\nRisk: Converted Markdown may be written beside the source document when no explicit destination is provided.\n\nMitigation: Prefer --stdout or an explicit output path so the user and agent know where converted content is written.\n\nRisk: Encrypted iWork files and exact visual layout reconstruction are unsupported.\n\nMitigation: Use the output for readable text, tables, slide text, and media inventory; require a different workflow when password-protected documents or pixel-accurate layout are needed.\n\n## Reference(s):\n\n- [iWork file format reference](references/FORMAT.md)\n- [Server-resolved GitHub repository](https://github.com/slearnAI/iwork2md)\n- [Server-resolved GitHub commit](https://github.com/slearnAI/iwork2md/tree/de2fbb57e58d6643908e2823bfd42a8c005da357)\n- [ClawHub skill page](https://clawhub.ai/slearnai/skills/iwork2md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Files, Shell commands, Guidance]\n\n**Output Format:** [Markdown, plain text, file paths, or concise shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May write a Markdown file next to the source document, write to an explicit output path, or print to stdout.]\n\n## Skill Version(s):\n\n0.1.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1759,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T11:56:41.882Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T11:56:41.882Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T20:20:34.469Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}