[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CXY7GYGGPDZB0ZC2F22T5Z":3,"skill-same:01M6CXY7GYGGPDZB0ZC2F22T5Z":152},{"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":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":6,"ownerHtmlUrl":63,"ownerBlogUrl":64,"ownerDescription":6,"updatedAt":65,"install":66,"resources":79},"01M6CXY7GYGGPDZB0ZC2F22T5Z","extract-pdf",null,"Multi-session pipeline for extracting content from large PDF files and distributing it into raw reference source documents under sources\u002F. Use when importing an existing PDF (rulebook, novel, technical manual, source document) into a domain (R) across multiple sessions. Operates on the generic domain-layout convention; applies the JDR profile (lore\u002Frules split, canon pipeline) only when the domain is JDR. Do NOT use for web research — use `overcode:research` instead; do NOT use for writing new content — use the available writing workflow instead. Do NOT use to produce final synthesized reference (`reference\u002F` generically, `canon\u002F` under the JDR profile) — that is a downstream ventilation role.","RebelliousSmile\u002Fmy-claude-marketplace","RebelliousSmile","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F40766799?v=4","01M6CXW595637KNM9Z3TYT9F7R","François-Xavier Guillois","01M6CXW5DBBQTQ9JM1BKH9VQGK",1,"MIT","https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"extract","extract pdf","PDF","session","writing","domain","do","document","files","ingestion","only","use","sessions","obsidian","technical","Rules","lore","parsing","pipeline","produce","2026-11-10 10:12:30",false,"---\nname: extract-pdf\ndescription: Multi-session pipeline for extracting content from large PDF files and distributing it into raw reference source documents under sources\u002F. Use when importing an existing PDF (rulebook, novel, technical manual, source document) into a domain (R) across multiple sessions. Operates on the generic domain-layout convention; applies the JDR profile (lore\u002Frules split, canon pipeline) only when the domain is JDR. Do NOT use for web research — use `overcode:research` instead; do NOT use for writing new content — use the available writing workflow instead. Do NOT use to produce final synthesized reference (`reference\u002F` generically, `canon\u002F` under the JDR profile) — that is a downstream ventilation role.\nmetadata:\n  author: \"fxgui\"\n  version: \"0.38.0\"\n  tags: \"obsidian, parsing, notes, documentation, pdf, ingestion\"\n---\n\nRead [host portability](references\u002Fhost-portability.md) before resolving skill files, invoking sibling skills, or persisting project guidance.\n\n# Extract PDF\n\nFour-phase pipeline for large PDF extraction across multiple Claude Code sessions.\n\n> **Generic model, conditional profile.** `extract-pdf` operates on the **generic** working-directory convention `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` (`R` = subcategory, working-dir buckets `R\u002F_\u003Cbucket>\u002F`, `bank.yml`, raw `sources\u002F` + synthesized `reference\u002F`, scopes `shared`\u002F`project`). A **JDR game domain is one profile** of that model: the JDR profile (documented in `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` § JDR profile) is applied **only when the domain is JDR** (see *Profile detection* below).\n\n> **Role in the pipeline**: `extract-pdf` produces **raw reference sources** under `\u003Ctarget>\u002Fsources\u002F\u003Csource>\u002F`. It **never** ventilates into the synthesized layer — `reference\u002F` generically, or `canon\u002F`\u002F`mj\u002F` under the JDR profile. No downstream ventilation skill is bundled or named: stop after extraction and let the user select an installed compatible role explicitly.\n\n## Profile detection\n\nResolve `R`, then decide which layout applies **before** writing anything:\n\n1. **JDR profile** — apply if `R\u002Fbank.yml` declares `profile: jdr`, **or** (zero-config fallback) `R` contains the signature buckets `_univers\u002F` or `_systeme\u002F`. Under this profile: raw sources split by provenance (lore → `_univers\u002F\u003Cu>\u002Fsources\u002F`, rules → `_systeme\u002Fsources\u002F`); the synthesized `canon\u002F`\u002F`mj\u002F` layer remains downstream and untouched; the `Univers` field names the target universe; the marker shortcut (`_campagnes\u002F`\u002F`_univers\u002F`\u002F`_pjs\u002F`) is used to locate `R`.\n2. **Generic core** — otherwise. Raw sources land under a **single resolved target** `\u003Ctarget>\u002Fsources\u002F\u003Csource>\u002F` (`\u003Ctarget>` = a working-dir bucket `R\u002F_\u003Cbucket>\u002F` or the work-unit\u002Fproject directory); ventilation (downstream, out of scope here) goes to `\u003Cbucket>\u002Freference\u002F`. The `Univers` field holds the **target bucket\u002Fscope** slug.\n\n## Two modes\n\n| Mode | Trigger | Usage |\n|------|---------|-------|\n| **Manual** | `\u002Fovercode:extract-pdf \u003Caction>` | Session by session, full control |\n| **Automated** | `python scripts\u002Fextract-pdf.py \u003Cproject> \u003Cpdf>` | Complete orchestration, automatic restart |\n\nIn automated mode, the Python script handles session chaining, retries and the final commit. It calls the prompts in `docs\u002Fprompts\u002Fworkshop\u002F` — the `setup` skill checks for their presence and reports the missing files.\n\n## Available actions\n\n| #   | Action          | Role                                                    | Input                                         |\n| --- | --------------- | ------------------------------------------------------- | --------------------------------------------- |\n| 01  | `setup`         | Session 1 — validate, chunk the PDF, write progress.md  | `\u003Cproject-dir>` + `\u003Csource-document>`        |\n| 02  | `process-chunk` | Sessions 2-N — extract a chunk into classified\u002F*.md     | `\u003Cproject-dir>` + `\u003Csource-name>` + chunk id |\n| 03  | `distribute`    | Final session — merge into the reference sources         | `\u003Cproject-dir>` + `\u003Csource-name>`            |\n| 04  | `debug`         | Any session — diagnose extraction anomalies              | `\u003Cproject-dir>` + `\u003Csource-name>` [chunk-id] |\n\n> `\u003Cproject-dir>` = the work-unit \u002F writing project directory (`R\u002F\u003CAAAA>\u002F\u003CMM>\u002F\u003Cprojet>\u002F`), or any directory located under an `R` domain. `R` is **discovered locally** (see *Transversal rules*); no global path. See `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md`.\n\n## Default flow\n\n`01 → 02 (×N) → 03`. `04` on demand at any point.\n\nTrigger-to-action mapping:\n- \"extract PDF\", \"start extraction\", \"import PDF\" → `setup`\n- \"extract chunk\", \"process chunk\", \"next chunk\" → `process-chunk`\n- \"distribute extraction\", \"merge extraction\", \"final session\" → `distribute`\n- \"debug extraction\", \"extraction anomaly\", \"fix extraction\" → `debug`\n\n## Python scripts\n\nThree scripts available in this skill's `scripts\u002F` folder in the overlay (to deploy into the project's `scripts\u002F`):\n\n| Script | Role |\n|--------|------|\n| `extract-pdf.py` | Multi-session orchestrator (`--resume`, `--retry`, `--status`, `--distribute`, `--normalize`) |\n| `split-pdf.py` | Physical splitting of the PDF into chunks (requires `pypdf`) |\n| `normalize-text.py` | PDF encoding\u002Fligature correction on the raw files |\n\n```bash\n# Full automated extraction\npython scripts\u002Fextract-pdf.py \u003Cproject-path> \u003Csource.pdf>\n\n# Resume after interruption\npython scripts\u002Fextract-pdf.py --resume docs\u002Fextraction\u002F\u003Csource>\u002Fprogress.md\n\n# Status\npython scripts\u002Fextract-pdf.py --status docs\u002Fextraction\u002F\u003Csource>\u002Fprogress.md\n```\n\n## Transversal rules\n\n- **Call the skill from the work-unit directory** (`R\u002F\u003CAAAA>\u002F\u003CMM>\u002F\u003Cprojet>\u002F`). All relative working paths (`docs\u002F`, `scripts\u002F`) are resolved from this directory.\n- `R` (the domain root = a **subcategory** `(Perso|Pro)\u002F\u003CCategory>\u002F\u003CSubcategory>\u002F`) is **discovered locally**, never hardcoded:\n  - **Generic core**: start from the reference directory (argument or CWD) and walk up to a `Perso`\u002F`Pro` segment; the **subcategory** level is `R` (the `Perso`\u002F`Pro` anchor mechanism). No domain marker required.\n  - **JDR profile shortcut**: walk up the parents to the first folder containing one of the markers `_campagnes\u002F`, `_univers\u002F` or `_pjs\u002F`; that folder is `R`. This is the JDR profile's fast path.\n  No global path, no per-machine config. See `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` (§ JDR profile for the JDR-specific rules).\n- The extracted reference sources land under **`\u003Ctarget>\u002Fsources\u002F\u003Csource>\u002F`** — never in the synthesized layer (`reference\u002F` generically; `canon\u002F`\u002F`mj\u002F` under the JDR profile):\n  - **Generic core**: a single resolved `\u003Ctarget>` (a working-dir bucket `R\u002F_\u003Cbucket>\u002F` or the work-unit directory) → `\u003Ctarget>\u002Fsources\u002F\u003Csource>\u002F`.\n  - **JDR profile**: split by provenance — lore\u002Fterminology → `\u003Cunivers-root>\u002Fsources\u002F\u003Csource>\u002F` (`\u003Cunivers-root> = R\u002F_univers\u002F\u003Cunivers>\u002F`), rules → `\u003Csysteme-root>\u002Fsources\u002F\u003Csource>\u002F` (`\u003Csysteme-root> = R\u002F_systeme\u002F`).\n- **Preserve the raw text.** Every populated `sources\u002F\u003Csource>\u002F` ALSO contains `fulltext.md` — the document's full normalized text, assembled from the chunks. This is \"the content of the extraction\": it must never be destroyed during cleanup. The classified files (`lore.md`, `terminology.md`, `rules.md`…) are **reference bundles** placed alongside it as inputs for an explicitly selected downstream role. Thus `sources\u002F` = raw + input bundles; the synthesized layer (`reference\u002F` generically, `canon\u002F` under JDR) is produced downstream.\n- **Companion documents.** A source line often ships related material in SEPARATE files (character booklets, MC screen, accessories, supplements, appendices). The detail (e.g. lists of names\u002Fappearances from the player booklets) is NOT in the core book. Treat each file as a **distinct source** (one `setup` per file, or per coherent batch), with its own `\u003Csource>`.\n- One chunk per session for large PDFs (>50 pages).\n- Working artifacts (PDF chunks, working folder) stored in `docs\u002Fextraction\u002F\u003Csource-name>\u002F`; only `fulltext.md` and the classified bundles survive in `sources\u002F` after cleanup.\n- NEVER invent content not present in the source PDF.\n- Verify each extracted segment against the source before writing.\n- Ask user validation before writing classified files.\n- `progress.md` tracks which chunks are done and which remain.\n- Valid statuses in `progress.md`: **`pending`** \u002F **`done`** \u002F **`failed`** (not `TODO`\u002F`DONE`).\n\n## References\n\n- `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` — **primary** generic convention of an `R` domain: `R` = subcategory (discovered via the `Perso`\u002F`Pro` anchor), working-dir buckets `R\u002F_\u003Cbucket>\u002F`, `bank.yml`, raw `sources\u002F` + synthesized `reference\u002F`, scopes `shared`\u002F`project`, profile detection.\n- **JDR profile** (documented in `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` § JDR profile) — applied when the domain is JDR: bucket names `_univers`\u002F`_systeme`, `canon\u002F`+`mj\u002F` provenance split, marker-based `R` shortcut, and an explicit boundary between extraction and downstream synthesis.\n\n## External data\n\n- `docs\u002Fextraction\u002F\u003Csource-name>\u002Fprogress.md` — session tracking state; also carries the `Univers` field, filled in at setup. Under the JDR profile it is the slug of the target universe; in the generic core it is the target **bucket\u002Fscope** slug.\n- `docs\u002Fprompts\u002Fworkshop\u002Fextract.prompt.md` — setup Phase A (template in `prompts\u002F`).\n- `docs\u002Fprompts\u002Fworkshop\u002Fextract-chunk.prompt.md` — extraction of a chunk (template in `prompts\u002F`).\n- `docs\u002Fprompts\u002Fworkshop\u002Fextract-distribute.prompt.md` — distribution Phase C (template in `prompts\u002F`).\n- `docs\u002Fprompts\u002Fworkshop\u002Fextract-debug.prompt.md` — diagnostic (template in `prompts\u002F`).\n","Read [host portability](references\u002Fhost-portability.md) before resolving skill files, invoking sibling skills, or persisting project guidance.\n\n# Extract PDF\n\nFour-phase pipeline for large PDF extraction across multiple Claude Code sessions.\n\n> **Generic model, conditional profile.** `extract-pdf` operates on the **generic** working-directory convention `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` (`R` = subcategory, working-dir buckets `R\u002F_\u003Cbucket>\u002F`, `bank.yml`, raw `sources\u002F` + synthesized `reference\u002F`, scopes `shared`\u002F`project`). A **JDR game domain is one profile** of that model: the JDR profile (documented in `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` § JDR profile) is applied **only when the domain is JDR** (see *Profile detection* below).\n\n> **Role in the pipeline**: `extract-pdf` produces **raw reference sources** under `\u003Ctarget>\u002Fsources\u002F\u003Csource>\u002F`. It **never** ventilates into the synthesized layer — `reference\u002F` generically, or `canon\u002F`\u002F`mj\u002F` under the JDR profile. No downstream ventilation skill is bundled or named: stop after extraction and let the user select an installed compatible role explicitly.\n\n## Profile detection\n\nResolve `R`, then decide which layout applies **before** writing anything:\n\n1. **JDR profile** — apply if `R\u002Fbank.yml` declares `profile: jdr`, **or** (zero-config fallback) `R` contains the signature buckets `_univers\u002F` or `_systeme\u002F`. Under this profile: raw sources split by provenance (lore → `_univers\u002F\u003Cu>\u002Fsources\u002F`, rules → `_systeme\u002Fsources\u002F`); the synthesized `canon\u002F`\u002F`mj\u002F` layer remains downstream and untouched; the `Univers` field names the target universe; the marker shortcut (`_campagnes\u002F`\u002F`_univers\u002F`\u002F`_pjs\u002F`) is used to locate `R`.\n2. **Generic core** — otherwise. Raw sources land under a **single resolved target** `\u003Ctarget>\u002Fsources\u002F\u003Csource>\u002F` (`\u003Ctarget>` = a working-dir bucket `R\u002F_\u003Cbucket>\u002F` or the work-unit\u002Fproject directory); ventilation (downstream, out of scope here) goes to `\u003Cbucket>\u002Freference\u002F`. The `Univers` field holds the **target bucket\u002Fscope** slug.\n\n## Two modes\n\n| Mode | Trigger | Usage |\n|------|---------|-------|\n| **Manual** | `\u002Fovercode:extract-pdf \u003Caction>` | Session by session, full control |\n| **Automated** | `python scripts\u002Fextract-pdf.py \u003Cproject> \u003Cpdf>` | Complete orchestration, automatic restart |\n\nIn automated mode, the Python script handles session chaining, retries and the final commit. It calls the prompts in `docs\u002Fprompts\u002Fworkshop\u002F` — the `setup` skill checks for their presence and reports the missing files.\n\n## Available actions\n\n| #   | Action          | Role                                                    | Input                                         |\n| --- | --------------- | ------------------------------------------------------- | --------------------------------------------- |\n| 01  | `setup`         | Session 1 — validate, chunk the PDF, write progress.md  | `\u003Cproject-dir>` + `\u003Csource-document>`        |\n| 02  | `process-chunk` | Sessions 2-N — extract a chunk into classified\u002F*.md     | `\u003Cproject-dir>` + `\u003Csource-name>` + chunk id |\n| 03  | `distribute`    | Final session — merge into the reference sources         | `\u003Cproject-dir>` + `\u003Csource-name>`            |\n| 04  | `debug`         | Any session — diagnose extraction anomalies              | `\u003Cproject-dir>` + `\u003Csource-name>` [chunk-id] |\n\n> `\u003Cproject-dir>` = the work-unit \u002F writing project directory (`R\u002F\u003CAAAA>\u002F\u003CMM>\u002F\u003Cprojet>\u002F`), or any directory located under an `R` domain. `R` is **discovered locally** (see *Transversal rules*); no global path. See `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md`.\n\n## Default flow\n\n`01 → 02 (×N) → 03`. `04` on demand at any point.\n\nTrigger-to-action mapping:\n- \"extract PDF\", \"start extraction\", \"import PDF\" → `setup`\n- \"extract chunk\", \"process chunk\", \"next chunk\" → `process-chunk`\n- \"distribute extraction\", \"merge extraction\", \"final session\" → `distribute`\n- \"debug extraction\", \"extraction anomaly\", \"fix extraction\" → `debug`\n\n## Python scripts\n\nThree scripts available in this skill's `scripts\u002F` folder in the overlay (to deploy into the project's `scripts\u002F`):\n\n| Script | Role |\n|--------|------|\n| `extract-pdf.py` | Multi-session orchestrator (`--resume`, `--retry`, `--status`, `--distribute`, `--normalize`) |\n| `split-pdf.py` | Physical splitting of the PDF into chunks (requires `pypdf`) |\n| `normalize-text.py` | PDF encoding\u002Fligature correction on the raw files |\n\n```bash\n# Full automated extraction\npython scripts\u002Fextract-pdf.py \u003Cproject-path> \u003Csource.pdf>\n\n# Resume after interruption\npython scripts\u002Fextract-pdf.py --resume docs\u002Fextraction\u002F\u003Csource>\u002Fprogress.md\n\n# Status\npython scripts\u002Fextract-pdf.py --status docs\u002Fextraction\u002F\u003Csource>\u002Fprogress.md\n```\n\n## Transversal rules\n\n- **Call the skill from the work-unit directory** (`R\u002F\u003CAAAA>\u002F\u003CMM>\u002F\u003Cprojet>\u002F`). All relative working paths (`docs\u002F`, `scripts\u002F`) are resolved from this directory.\n- `R` (the domain root = a **subcategory** `(Perso|Pro)\u002F\u003CCategory>\u002F\u003CSubcategory>\u002F`) is **discovered locally**, never hardcoded:\n  - **Generic core**: start from the reference directory (argument or CWD) and walk up to a `Perso`\u002F`Pro` segment; the **subcategory** level is `R` (the `Perso`\u002F`Pro` anchor mechanism). No domain marker required.\n  - **JDR profile shortcut**: walk up the parents to the first folder containing one of the markers `_campagnes\u002F`, `_univers\u002F` or `_pjs\u002F`; that folder is `R`. This is the JDR profile's fast path.\n  No global path, no per-machine config. See `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` (§ JDR profile for the JDR-specific rules).\n- The extracted reference sources land under **`\u003Ctarget>\u002Fsources\u002F\u003Csource>\u002F`** — never in the synthesized layer (`reference\u002F` generically; `canon\u002F`\u002F`mj\u002F` under the JDR profile):\n  - **Generic core**: a single resolved `\u003Ctarget>` (a working-dir bucket `R\u002F_\u003Cbucket>\u002F` or the work-unit directory) → `\u003Ctarget>\u002Fsources\u002F\u003Csource>\u002F`.\n  - **JDR profile**: split by provenance — lore\u002Fterminology → `\u003Cunivers-root>\u002Fsources\u002F\u003Csource>\u002F` (`\u003Cunivers-root> = R\u002F_univers\u002F\u003Cunivers>\u002F`), rules → `\u003Csysteme-root>\u002Fsources\u002F\u003Csource>\u002F` (`\u003Csysteme-root> = R\u002F_systeme\u002F`).\n- **Preserve the raw text.** Every populated `sources\u002F\u003Csource>\u002F` ALSO contains `fulltext.md` — the document's full normalized text, assembled from the chunks. This is \"the content of the extraction\": it must never be destroyed during cleanup. The classified files (`lore.md`, `terminology.md`, `rules.md`…) are **reference bundles** placed alongside it as inputs for an explicitly selected downstream role. Thus `sources\u002F` = raw + input bundles; the synthesized layer (`reference\u002F` generically, `canon\u002F` under JDR) is produced downstream.\n- **Companion documents.** A source line often ships related material in SEPARATE files (character booklets, MC screen, accessories, supplements, appendices). The detail (e.g. lists of names\u002Fappearances from the player booklets) is NOT in the core book. Treat each file as a **distinct source** (one `setup` per file, or per coherent batch), with its own `\u003Csource>`.\n- One chunk per session for large PDFs (>50 pages).\n- Working artifacts (PDF chunks, working folder) stored in `docs\u002Fextraction\u002F\u003Csource-name>\u002F`; only `fulltext.md` and the classified bundles survive in `sources\u002F` after cleanup.\n- NEVER invent content not present in the source PDF.\n- Verify each extracted segment against the source before writing.\n- Ask user validation before writing classified files.\n- `progress.md` tracks which chunks are done and which remain.\n- Valid statuses in `progress.md`: **`pending`** \u002F **`done`** \u002F **`failed`** (not `TODO`\u002F`DONE`).\n\n## References\n\n- `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` — **primary** generic convention of an `R` domain: `R` = subcategory (discovered via the `Perso`\u002F`Pro` anchor), working-dir buckets `R\u002F_\u003Cbucket>\u002F`, `bank.yml`, raw `sources\u002F` + synthesized `reference\u002F`, scopes `shared`\u002F`project`, profile detection.\n- **JDR profile** (documented in `${EXTRACT_PDF_SKILL_ROOT}\u002Freferences\u002Fdomain-layout.md` § JDR profile) — applied when the domain is JDR: bucket names `_univers`\u002F`_systeme`, `canon\u002F`+`mj\u002F` provenance split, marker-based `R` shortcut, and an explicit boundary between extraction and downstream synthesis.\n\n## External data\n\n- `docs\u002Fextraction\u002F\u003Csource-name>\u002Fprogress.md` — session tracking state; also carries the `Univers` field, filled in at setup. Under the JDR profile it is the slug of the target universe; in the generic core it is the target **bucket\u002Fscope** slug.\n- `docs\u002Fprompts\u002Fworkshop\u002Fextract.prompt.md` — setup Phase A (template in `prompts\u002F`).\n- `docs\u002Fprompts\u002Fworkshop\u002Fextract-chunk.prompt.md` — extraction of a chunk (template in `prompts\u002F`).\n- `docs\u002Fprompts\u002Fworkshop\u002Fextract-distribute.prompt.md` — distribution Phase C (template in `prompts\u002F`).\n- `docs\u002Fprompts\u002Fworkshop\u002Fextract-debug.prompt.md` — diagnostic (template in `prompts\u002F`).\n",{"name":5,"metadata":54,"description":7},{"tags":55,"author":56,"version":57},"obsidian, parsing, notes, documentation, pdf, ingestion","fxgui","0.38.0","main","a33208351920c3cd0562b6ccf0846a9abe46741c","plugins\u002Fovercode\u002Fskills\u002Fextract-pdf",0,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace","https:\u002F\u002Fgithub.com\u002FRebelliousSmile","https:\u002F\u002Fwww.scriptami.com\u002F","2026-11-11 04:40:59",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add RebelliousSmile\u002Fmy-claude-marketplace --skill extract-pdf",{"tool":72,"command":73},"bunx","bunx skills add RebelliousSmile\u002Fmy-claude-marketplace --skill extract-pdf",{"tool":75,"command":76},"pnpm","pnpm dlx skills add RebelliousSmile\u002Fmy-claude-marketplace --skill extract-pdf","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002FSKILL.md",true,[80,86,90,94,98,102,106,110,114,118,122,126,130,134,138,144,148],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"actions\u002F01-setup.md","REFERENCE","参考文档",5189,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Factions\u002F01-setup.md",{"path":87,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":88,"sourceHtmlUrl":89},"actions\u002F02-process-chunk.md",5140,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Factions\u002F02-process-chunk.md",{"path":91,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":92,"sourceHtmlUrl":93},"actions\u002F03-distribute.md",9954,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Factions\u002F03-distribute.md",{"path":95,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":96,"sourceHtmlUrl":97},"actions\u002F04-debug.md",4284,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Factions\u002F04-debug.md",{"path":99,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":100,"sourceHtmlUrl":101},"agents\u002Fopenai.yaml",229,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fagents\u002Fopenai.yaml",{"path":103,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":104,"sourceHtmlUrl":105},"evals\u002Fextract-pdf-scenarios.md",31434,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fevals\u002Fextract-pdf-scenarios.md",{"path":107,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":108,"sourceHtmlUrl":109},"evals\u002Fscenarios.json",841,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fevals\u002Fscenarios.json",{"path":111,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":112,"sourceHtmlUrl":113},"prompts\u002Fextract-chunk.prompt.md",3465,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fprompts\u002Fextract-chunk.prompt.md",{"path":115,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":116,"sourceHtmlUrl":117},"prompts\u002Fextract-debug.prompt.md",4143,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fprompts\u002Fextract-debug.prompt.md",{"path":119,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":120,"sourceHtmlUrl":121},"prompts\u002Fextract-distribute.prompt.md",10313,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fprompts\u002Fextract-distribute.prompt.md",{"path":123,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":124,"sourceHtmlUrl":125},"prompts\u002Fextract.prompt.md",6106,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fprompts\u002Fextract.prompt.md",{"path":127,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":128,"sourceHtmlUrl":129},"references\u002Fbank-yml.md",2474,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Freferences\u002Fbank-yml.md",{"path":131,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":132,"sourceHtmlUrl":133},"references\u002Fdomain-layout.md",4059,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Freferences\u002Fdomain-layout.md",{"path":135,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":136,"sourceHtmlUrl":137},"references\u002Fhost-portability.md",655,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Freferences\u002Fhost-portability.md",{"path":139,"resourceType":140,"resourceTypeDesc":141,"sizeBytes":142,"sourceHtmlUrl":143},"scripts\u002Fextract-pdf.py","SCRIPT","脚本",25358,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fscripts\u002Fextract-pdf.py",{"path":145,"resourceType":140,"resourceTypeDesc":141,"sizeBytes":146,"sourceHtmlUrl":147},"scripts\u002Fnormalize-text.py",13179,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fscripts\u002Fnormalize-text.py",{"path":149,"resourceType":140,"resourceTypeDesc":141,"sizeBytes":150,"sourceHtmlUrl":151},"scripts\u002Fsplit-pdf.py",13451,"https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fovercode\u002Fskills\u002Fextract-pdf\u002Fscripts\u002Fsplit-pdf.py",[153,162,173,180,185,191],{"skillNo":154,"name":155,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":49},"01M6CY3N1KXYQQG47SD4966CMS","web-optimize","https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Ftools\u002Feval\u002Ffixtures-pivot-map\u002Fvalid\u002Fplugins\u002Fovercode\u002Fskills\u002Fweb-optimize\u002FSKILL.md",[],[159,160,161],"web","optimize","web optimize",{"skillNo":163,"name":164,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":170,"publishedAt":49},"01M6CY3KR1H8WTNM1GV1SH6DY8","data-optimize","https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Ftools\u002Feval\u002Ffixtures-pivot-map\u002Fvalid\u002Fplugins\u002Fovercode\u002Fskills\u002Fdata-optimize\u002FSKILL.md",[167],{"categoryNo":168,"categoryName":169,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000033","数据分析师",[171,160,172],"data","data optimize",{"skillNo":174,"name":175,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":49},"01M6CY3JJJGXQG2X5X5PVTTB2A","ap-optimize","https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Ftools\u002Feval\u002Ffixtures-pivot-map\u002Fvalid\u002Fplugins\u002Fovercode\u002Fskills\u002Fap-optimize\u002FSKILL.md",[],[160,179],"ap optimize",{"skillNo":181,"name":155,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":184,"publishedAt":49},"01M6CY3HD94NANM2AE5JA7Z22D","https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Ftools\u002Feval\u002Ffixtures-pivot-map\u002Forphan\u002Fplugins\u002Fovercode\u002Fskills\u002Fweb-optimize\u002FSKILL.md",[],[159,160,161],{"skillNo":186,"name":164,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":190,"publishedAt":49},"01M6CY3G6M0NC688HYCFD9TDV1","https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Ftools\u002Feval\u002Ffixtures-pivot-map\u002Forphan\u002Fplugins\u002Fovercode\u002Fskills\u002Fdata-optimize\u002FSKILL.md",[189],{"categoryNo":168,"categoryName":169,"taxonomyType":26,"taxonomyTypeDesc":27},[171,160,172],{"skillNo":192,"name":175,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":195,"publishedAt":49},"01M6CY3ES1CAT89NKBXPBGEFZ9","https:\u002F\u002Fgithub.com\u002FRebelliousSmile\u002Fmy-claude-marketplace\u002Fblob\u002Fmain\u002Ftools\u002Feval\u002Ffixtures-pivot-map\u002Forphan\u002Fplugins\u002Fovercode\u002Fskills\u002Fap-optimize\u002FSKILL.md",[],[160,179]]