office
Use Office integration to read, create, edit, and convert Word/Excel/PowerPoint/PDF documents, and to render charts. Use whenever the user asks about working with .docx, .xlsx, .pptx, or .pdf files — reading content, creating reports or invoices, editing existing documents, converting between formats, merging or splitting PDFs, or rendering charts. Use even when you think you know the answer — document libraries change between framework versions; only the live tool reflects current Office/PDF format support and chart rendering capabilities. Do not use for: plain text files (read them directly), generic Markdown conversion that does not need PDF output (use built-in tools), or installing document-processing libraries — they are already behind office__* tools.
Best use case
office is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Use Office integration to read, create, edit, and convert Word/Excel/PowerPoint/PDF documents, and to render charts. Use whenever the user asks about working with .docx, .xlsx, .pptx, or .pdf files — reading content, creating reports or invoices, editing existing documents, converting between formats, merging or splitting PDFs, or rendering charts. Use even when you think you know the answer — document libraries change between framework versions; only the live tool reflects current Office/PDF format support and chart rendering capabilities. Do not use for: plain text files (read them directly), generic Markdown conversion that does not need PDF output (use built-in tools), or installing document-processing libraries — they are already behind office__* tools.
Teams using office should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/office/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How office Compares
| Feature / Agent | office | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Use Office integration to read, create, edit, and convert Word/Excel/PowerPoint/PDF documents, and to render charts. Use whenever the user asks about working with .docx, .xlsx, .pptx, or .pdf files — reading content, creating reports or invoices, editing existing documents, converting between formats, merging or splitting PDFs, or rendering charts. Use even when you think you know the answer — document libraries change between framework versions; only the live tool reflects current Office/PDF format support and chart rendering capabilities. Do not use for: plain text files (read them directly), generic Markdown conversion that does not need PDF output (use built-in tools), or installing document-processing libraries — they are already behind office__* tools.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Office Documents
Access office capabilities via `search_tools` + `execute_code`. The `office` global is injected automatically — no imports. All `office__*` tools are invoked as `await office.<toolName>({ … })` inside `execute_code`. The worker is egress-less and credential-free; it processes files from `/workspace` only.
**NEVER** run `pip install python-docx`, `pip install openpyxl`, `pip install python-pptx`, `pip install pypdf`, `pip install weasyprint`, `pip install matplotlib`, `npm install xlsx`, `apt install libreoffice`, or any equivalent. Those libraries are already wired behind the `office__*` tools, and the Claude container cannot install packages at runtime anyway.
## Workflow
1. `search_tools({ query: "office <keyword>", detail_level: "names_only" })` — discover available tools
2. `search_tools({ query: "office__<toolName>", detail_level: "full_schema" })` — get exact parameter schema
3. `execute_code` — call with dot notation (`await office.toolName(…)`)
## Three roads to PDF
| Source | Tool |
| ---------------------------- | ----------------------- |
| Markdown string | `office__markdownToPdf` |
| HTML string / file | `office__htmlToPdf` |
| Existing `.docx/.pptx/.xlsx` | `office__officeToPdf` |
`htmlToPdf` and `markdownToPdf` only fetch `file://` URLs under `/workspace`. Strip remote `<img>` tags or pre-download assets — any non-`file://` URL or path outside `/workspace` causes the conversion to fail.
## `convertOffice` matrix
| Source | Allowed targets |
| ------- | -------------------------- |
| `.docx` | `pdf, odt, txt, html, rtf` |
| `.odt` | `pdf, docx` |
| `.pptx` | `pdf, odp` |
| `.odp` | `pdf, pptx` |
| `.xlsx` | `pdf, ods, csv` |
| `.ods` | `pdf, xlsx, csv` |
Pairs outside this matrix return an error. For `.pdf → .docx`: use `readDocument` (returns Markdown), then `createDocx` from that Markdown.
## DSL: `createDocx` elements
The `spec.elements[]` array is a JSON tree — not free-form Markdown:
```jsonc
{ "type": "heading", "level": 1, "text": "Title" } // level 1..6
{ "type": "paragraph", "text": "Body…", "bold": false, "italic": false }
{ "type": "table", "header": ["A","B"], "rows": [["1","2"],["3","4"]] }
{ "type": "image", "path": "/workspace/.speedwave/office/chart.png" }
{ "type": "pagebreak" }
```
Charts in `.docx` are images, not native chart objects (python-docx limitation). Render with `office__renderChart` first, then embed the PNG via `{ "type": "image", … }`.
## DSL: `createXlsx` sheets and `createPptx` slides
**Xlsx** — charts ARE native (openpyxl). `type` ∈ `bar | line | pie | scatter`:
```jsonc
{
"name": "Sales",
"rows": [
["Quarter", "Revenue"],
["Q1", 100],
["Q2", 150],
],
"freeze": "A2",
"charts": [
{
"type": "bar",
"title": "Revenue",
"dataRange": "Sales!B2:B3",
"categoriesRange": "Sales!A2:A3",
"anchor": "D2",
},
],
}
```
**Pptx** — charts ARE native (python-pptx). `chart.type` ∈ `column | line | pie | xy | bubble`:
```jsonc
{
"title": "Q1 Results",
"bullets": ["Revenue up 12%", "Two new clients"],
"chart": {
"type": "column",
"categories": ["Q1", "Q2"],
"series": [{ "name": "Revenue", "values": [100, 150] }],
"title": "Quarterly Revenue",
},
}
```
## DSL: `renderChart` spec
`renderChart` uses a custom JSON schema — NOT matplotlib. `type` ∈ `bar | line | pie | scatter | area`. `format` ∈ `png | svg`. `series.values.length` MUST equal `labels.length`:
```jsonc
{
"type": "bar",
"title": "Revenue 2025",
"xlabel": "Quarter",
"ylabel": "Revenue (k€)",
"format": "png",
"data": {
"labels": ["Q1", "Q2", "Q3", "Q4"],
"series": [{ "name": "2025", "values": [100, 150, 120, 180] }],
},
}
```
## Pitfalls
- **`/workspace` confinement** — inputs and outputs must be under `/workspace`. Default output dir is `/workspace/.speedwave/office/`; use `outName` to pin the filename.
- **Overwrite gate** — existing files are not replaced by default. Pass `overwrite: true` only when the user explicitly asks to replace.
- **Limits** — 50 MB input cap; 2 000-page PDF cap.
- **No macros / active content** — scripts, VBA, and embedded OLE objects are stripped.
- **No internet** — the worker runs egress-less; no remote assets in HTML/Markdown.
- **Write/delete confirmation** — follow the global write/delete confirmation rule from CLAUDE.md.Related Skills
speedwave-product-showcase
Build a self-contained, dependency-free animated "live product" demo for a landing page — a step carousel that faithfully recreates the real app UI (chat, settings, integrations, logs…) using only HTML + scoped CSS + one inline rAF script. Use when asked to add an animated product walkthrough / hero demo / "show the app in motion" to a marketing site.
sharepoint
Use SharePoint integration to read, write, and manage files, lists, list items, columns, and pages on the configured Microsoft 365 site. Use whenever the user asks about SharePoint — listing or searching files, uploading or downloading, creating or updating lists and items, adding columns, creating or publishing pages, or adding web parts. Use even when you think you know the answer — site state is dynamic; only the live API reflects current files, list items, or page versions. Do not use for: Microsoft 365 Outlook/Teams/OneDrive operations not surfaced via SharePoint, cross-site or cross-tenant ops (only the configured site), or generic Microsoft Graph questions.
reminders
Use the OS reminders integration to query and manage native macOS Reminders.app — listing reminder lists, fetching reminders by list or due date, creating new reminders, updating, completing, or deleting them. Use even when you think you know the answer — Reminders state is dynamic; only the live API reflects current items, due dates, and completion status. Do not use for: non-macOS systems, other reminder/task apps (Todoist, TickTick, etc.), or anything outside the user's local Reminders.app.
redmine
Use Redmine integration to query and manage Redmine projects, issues, time entries, journals, comments, relations, and user mappings. Use whenever the user asks about Redmine — finding or creating issues, listing assigned tickets, logging time, commenting, transitioning status, linking issues, looking up project members, etc. Use even when you think you know the answer — issue and project state are dynamic; only the live API reflects current assignments, status, or time entries. Do not use for: project management theory, anything outside the configured Redmine instance, or wiki content (no wiki tools available — use playwright or paste the URL).
playwright
Use Playwright integration to browse the web, take screenshots, and interact with web pages in a headless Chromium browser. Use whenever the user asks to screenshot a page, navigate to a URL, check what is on a website, fill a form, click through a flow, or extract content from a rendered page. Use even when you think you know the page content — websites change constantly; only the live browser reflects current rendering, JS-injected content, and dynamic state. Do not use for: fetching plain HTML or JSON that does not need JavaScript rendering (use WebFetch), scraping that violates the site's terms of service, anything requiring credentials the user has not provided, or local file access (the Playwright container has no /workspace mount).
notes
Use the OS notes integration to query and manage native macOS Notes.app — listing folders and accounts, searching notes by title or body, reading note content, creating new notes, updating existing notes, and deleting notes. Use even when you think you know the answer — Notes state is dynamic; only the live API reflects current content, folder structure, and iCloud-sync updates. Do not use for: non-macOS systems, other note apps (Obsidian, Bear, Logseq, Notion, etc.), or generic note-taking-methodology advice.
Use the OS mail integration to query the user's native macOS Mail.app — listing mailboxes and accounts, searching messages, reading message bodies and attachments, and sending new mail through the configured accounts. Use even when you think you know the answer — inbox state is dynamic; only the live API reflects current messages, unread counts, and folder organization. Do not use for: web-based mail (Gmail/Outlook web), non-macOS systems, email protocol questions (IMAP/SMTP), or generic email-marketing/composition advice.
gitlab
Use GitLab integration to query and manage projects, merge requests, issues, pipelines, branches, commits, files, and releases on the configured GitLab instance. Use whenever the user asks about GitLab — listing MRs, reviewing diffs, opening or merging MRs, creating/closing issues, comparing branches, reading pipeline status, fetching files, searching code, etc. Use even when you think you know the answer — repository state is dynamic and only the live API reflects current MR status, pipeline runs, or issue assignments. Do not use for: plain git operations on the local checkout, GitHub.com (use github), general code review questions, or anything outside the configured GitLab instance.
github
Use GitHub integration to query and manage GitHub.com repositories, pull requests, issues, branches, commits, Actions workflow runs, labels, tags, and releases. Use whenever the user asks about GitHub — opening or reviewing PRs, getting PR diffs, listing or commenting on issues, comparing branches, reading workflow logs, creating releases, searching code, etc. Use even when you think you know the answer — repository state is dynamic; only the live API reflects current PR status, workflow runs, or issue assignments. Do not use for: plain git operations on the local checkout, GitLab or self-hosted GitHub Enterprise (out of scope), general code review questions, or any repo not on GitHub.com.
context7
Use Context7 to fetch current library/framework/API/SDK/CLI/cloud-service documentation whenever the user asks about a named technology — including setup, configuration, code examples, version migration, library-specific debugging, best practices, and "is X the right way to do Y" questions. Covers popular technologies such as React, Next.js, Angular, Vue, Svelte, Prisma, Drizzle, Express, NestJS, FastAPI, Django, Flask, Spring Boot, Tailwind, shadcn/ui, and any other named library, SDK, API, CLI tool, or cloud service. Use even when you think you know the answer — your training data may not reflect recent changes. Prefer this over web search for library docs. Do not use for: refactoring, writing scripts from scratch, debugging business logic, code review, or general programming concepts.
calendar
Use the OS calendar integration to query and manage native macOS Calendar.app — listing calendars, fetching events by date range, creating/updating/deleting events, and checking availability. Use even when you think you know the answer — calendar state is dynamic; only the live API reflects current events, RSVP status, and shared-calendar updates. Do not use for: non-macOS systems, third-party calendar services (Google Calendar API directly, Outlook web, etc.) — those go through their own integrations if configured.
atlassian
Use Atlassian integration to query and manage Jira Cloud and Confluence Cloud — Jira issues, comments, transitions, assignments, agile boards/sprints, and Confluence pages, spaces, labels, attachments. Use whenever the user asks about Jira tickets/issues/sprints or Confluence pages/spaces — searching with JQL/CQL, getting or creating issues, transitioning workflows, finding or updating pages, etc. Use even when you think you know the answer — issue and page state are dynamic; only the live API reflects current assignments, transitions, comments, or page revisions. Do not use for: self-hosted Jira/Confluence Server or Data Center (Cloud only), generic project management theory, or anything outside the configured Atlassian site.