Skill v1.0.0
currentLLM-judged scan90/100version: "1.0.0" name: doc-ingest description: "Read existing documents (PDF, Word, PowerPoint, Excel, HTML) and convert them into clean Markdown/plain text the agent can reason over: extract text, ingest a file, summarize a document. Use whenever the user wants to READ, extract, ingest, transcribe, or summarize the contents of an existing file (not create one)." license: MIT (Code Buddy original skill) nativeEngine: triggers:
- extract text
- convert to markdown
- to markdown
- markdown
- ingest
- read this file
- read document
- summarize
- résume
- résumé
- extrais
- transcribe
- ocr
Ingest existing documents into Markdown / text
Turn a document the user already has (PDF, Word, PowerPoint, Excel, HTML) into clean Markdown or plain text so you can quote, summarize, or transform it. This is the read counterpart to the create skills (xlsx/docx/pptx/pdf).
Work one visible step at a time and verify before reporting.
Two backends — prefer the lean one
- Lean (always available, no extra install): the bundled libraries
pypdf, python-docx, python-pptx, openpyxl read the common Office/PDF formats with python3 -c "import pypdf, docx, pptx, openpyxl". Use this path by default.
- Rich (optional, `prepare:python:extras`):
markitdownadds HTML, images
(OCR), EPUB, ZIP and more, and emits tidy Markdown directly. Only reach for it when the lean path can't read the format.
Workflow (one step at a time)
- Identify the file and its type (extension).
- Extract: run a short Python script (heredoc via the
bashtool) that
reads the file with the matching library and prints — or writes — Markdown/text.
- Verify: assert the output is non-empty (e.g.
assert len(text) > 0) and
print a length + first lines so the extraction is visibly correct.
- Report: the extracted text (or the saved
.mdpath) and a one-line summary.
Lean extraction (covers PDF / Word / PowerPoint / Excel)
python3 - "$FILE" <<'PY'import sys, ossrc = sys.argv[1]ext = os.path.splitext(src)[1].lower()def pdf(p):from pypdf import PdfReaderreturn "\n\n".join((pg.extract_text() or "") for pg in PdfReader(p).pages)def docx(p):import docxd = docx.Document(p)return "\n".join(par.text for par in d.paragraphs)def pptx(p):from pptx import Presentationout = []for i, sl in enumerate(Presentation(p).slides, 1):out.append(f"## Slide {i}")for sh in sl.shapes:if sh.has_text_frame:out.append(sh.text_frame.text)return "\n".join(out)def xlsx(p):from openpyxl import load_workbookwb = load_workbook(p, data_only=True)out = []for ws in wb.worksheets:out.append(f"## {ws.title}")for row in ws.iter_rows(values_only=True):out.append(" | ".join("" if c is None else str(c) for c in row))return "\n".join(out)handlers = {".pdf": pdf, ".docx": docx, ".pptx": pptx, ".xlsx": xlsx}fn = handlers.get(ext)if not fn:sys.exit(f"Lean path can't read {ext}; enable the rich backend (prepare:python:extras) for markitdown.")text = fn(src)assert text and text.strip(), "extraction produced no text"print(f"[{len(text)} chars]")print("\n".join(text.splitlines()[:40]))PY
Rich backend (markitdown — optional)
python3 - <<'PY'try:from markitdown import MarkItDownexcept ModuleNotFoundError:raise SystemExit("markitdown not installed. Run `npm run prepare:python:extras` in cowork/ ""to add the optional ingestion backend (HTML, images/OCR, EPUB, ...).")md = MarkItDown()res = md.convert("INPUT_PATH")assert res.text_content, "markitdown produced no content"print(res.text_content[:4000])PY
Notes
- Never invent content — only report what the extractor returned.
- For large files, summarize after extraction rather than dumping everything.
- To then produce a new document from what you read, hand off to the
xlsx/docx/pptx/pdf create skills.