From plone-doc-style
Use when writing, editing, or planning Plone or Plone-ecosystem documentation — including style enforcement, Diataxis quadrant classification, MyST markup choices, table-of-contents planning, or auditing existing docs for gaps.
How this skill is triggered — by the user, by Claude, or both
Slash command
/plone-doc-style:author [plan|tutorial|how-to|explanation|reference] topic[plan|tutorial|how-to|explanation|reference] topicThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill encodes Plone's documentation standards: the Microsoft Writing Style Guide, American English, the Diataxis framework, MyST/Sphinx markup, and planning conventions.
This skill encodes Plone's documentation standards: the Microsoft Writing Style Guide, American English, the Diataxis framework, MyST/Sphinx markup, and planning conventions. Apply every section precisely when writing, editing, or planning Plone or Plone-ecosystem documentation.
Mode detection: Determine the mode from the user's request or argument:
plan or words like "plan", "structure", "organize", "audit", "outline", "TOC" -> Section 10 (Planning mode).tutorial, how-to, explanation, reference -> Apply the corresponding Diataxis quadrant from Section 2.Plone follows the Microsoft Writing Style Guide.
## Configure the add-on## Configure The Add-On-), never underscores..md.Prose and voice
Headings and filenames
Code blocks
...) in code blocks -- they break syntax highlighting and are rarely valid.Links
{seealso} instead).Plone organizes documentation using the Diataxis framework (https://diataxis.fr/). Content is classified by what the reader needs, not by user role. Each page must belong to exactly one quadrant.
| Acquisition (study/learning) | Application (work/doing) | |
|---|---|---|
| Action (practical) | Tutorial | How-to guide |
| Cognition (theory) | Explanation | Reference |
Crossing these boundaries is the single most common documentation failure. Every piece you write must sit cleanly in one quadrant.
Purpose: A guided lesson where a beginner acquires skills by doing. The stated goal (build X) differs from the real goal (learn skills A, B, C).
Analogy: Teaching a child to cook. The dish is the vehicle; knife skills, timing, and food safety are the actual learning outcomes.
Ask: "Does this follow one guaranteed-safe path that a beginner can complete?" If yes -> Tutorial.
Purpose: Directions guiding a competent user through a real-world problem toward a specific result.
Analogy: A recipe. Professional cooks use recipes not because they lack skill, but for precision. Recipes define outcomes, address questions, exclude teaching, and focus on execution.
other-guide."reference-section for the complete option list."Ask: "Does this solve a specific real-world problem for someone who already has the skill?" If yes -> How-to guide.
Purpose: Accurate, complete, austere technical description of the machinery. Facts only.
Analogy: A map. It describes the territory without telling you where to go.
timeout parameter accepts an integer in seconds."Ask: "Is this boring, unmemorable, and purely factual?" (That is good -- it means it is Reference.)
Purpose: Discursive, reflective treatment that deepens understanding through context and connections. The only docs you can read "in the bath."
Ask: "Could you read this in the bath and find it enlightening?" If yes -> Explanation.
When classifying or writing content, use this:
| Question | If yes... |
|---|---|
| Follows one guaranteed-safe path for a beginner? | Tutorial |
| Solves a specific real-world problem? | How-to guide |
| Boring, factual, structured like the code? | Reference |
| Illuminating, discursive, readable away from keyboard? | Explanation |
| Is it for someone learning? | Tutorial or Explanation |
| Is it for someone working? | How-to or Reference |
| Is it practical (doing)? | Tutorial or How-to |
| Is it theoretical (knowing)? | Explanation or Reference |
---
myst:
html_meta:
"description": "Description of the page content."
"property=og:description": "Description of the page content."
"property=og:title": "Page Title"
"keywords": "Plone, keyword1, keyword2"
---
The description and property=og:description values must be identical.
Scope:
plone/documentation): required on every page. This matches the policy stated in the Plone authors guide.Realism notes:
make html_meta will only insert empty stubs. Empty stubs add no value; fill them or skip them.keywords field is SEO-dead (Google ignores it; Bing treats it as a spam signal). Include it on core docs for consistency with the policy; do not bother adding it elsewhere.sphinxext-opengraph (used by Plone) generates reasonable fallbacks from the H1 and first paragraph when html_meta is absent, so missing metadata on body pages degrades gracefully.og:title + og:description on pages that get linked externally (install, getting-started, top-level indexes). Prioritize there if you are triaging.# Page title (H1) -- exactly one per page
## Major section (H2)
### Subsection (H3)
#### Sub-subsection (H4)
Create a target above any heading:
(my-label-name)=
## My heading
Reference it:
{ref}`my-label-name`
{ref}`Custom display text <my-label-name>`
Link to another document:
{doc}`/path/to/document`
index.md./_static/ with section-named subdirectories./_inc/.Markup is a tool of attention. Reaching for a directive signals "look here, this is different from prose." Overuse trains readers to skip the signal.
note, tip, warning, important, seealso): use sparingly -- aim for at most 1-2 per page.
warning -- the reader can break something (data loss, irreversible action, security).important -- the reader must do this or the result is wrong, but nothing breaks.note -- a side fact that does not fit the flow but matters.tip -- an optional optimization or shortcut.seealso -- a related link cluster.
If a note only restates the previous paragraph, delete it and let the prose carry the point.pip vs hatch vs uv, or macOS vs Linux vs Windows). Do not use tabs when the outcomes differ -- those are separate pages.{ref}, {doc}, {term}): always reference, never duplicate. If two pages need the same fact, one owns it and the other links. Duplicated facts drift.{guilabel} and {menuselection}: use whenever naming a real UI element. They render as visual badges and improve scanability for both readers and screen readers.`code`) for filenames, identifiers, short literals, command flags. A code block is for anything multi-line or anything needing syntax highlighting.{eval-rst} .. figure::) when the visual needs a caption that survives outside the immediate context (search results, mobile linearization). Plain {image} for decorative or inline visuals.{versionremoved}, {versionadded}, {deprecated}: prefer over prose ("This was removed in 6.0") -- the directive renders as a styled badge and is machine-readable for changelog tooling.Basic:
```python
from plone import api
```
With options:
```{code-block} python
:linenos:
:emphasize-lines: 1, 3
from plone import api
site = api.portal.get()
```
| Use case | Lexer |
|---|---|
| Terminal commands (no output) | shell |
| Terminal session with output | console |
| Python | python |
| XML (if highlighting fails) | try html |
| Nothing works | text |
shell lexer, never include prompts ($, #, %).```{note}
Content here.
Content here.
Content here.
Content here.
Related links and references.
Custom title:
```markdown
```{admonition} Custom Title
:class: tip
Content here.
### Nesting directives
Outer fence must use more backticks than inner:
`````markdown
````{note}
Outer note.
```{tip}
Inner tip.
````{tab-set}
```{tab-item} Label1
Content 1
```
```{tab-item} Label2
Content 2
```
Synchronized tabs:
````markdown
````{tab-set}
:sync-group: category
```{tab-item} Label1
:sync: key1
Content
```
### GUI elements
```markdown
{guilabel}`Save`
{menuselection}`File --> Preferences --> Settings`
```
### Glossary terms
```markdown
{term}`content type`
```
Terms defined in `/glossary.md`.
### Definition lists
```markdown
Term
: Definition text here.
```
### Text formatting
```markdown
**bold**
*italic*
`inline code`
~~strikethrough~~
```
### Cards (sphinx-design)
````markdown
````{card}
```{image} /_static/image.png
:alt: Description
```
+++
Caption text
### Grids (sphinx-design)
`````markdown
`````{grid} 1 1 2 2
````{grid-item-card}
:link: install/index
:link-type: doc
Content
```{image} /_static/path/to/image.png
:alt: Description of the image
- Max width: **740 pixels**.
- For Volto screenshots: browser width 1180px.
- Alt text is **required** (accessibility).
### Figures (with captions)
````markdown
```{eval-rst}
.. figure:: /_static/path/to/diagram.png
:alt: Description
Caption text here.
### Inline images
```html
<img alt="description" src="path" class="inline">
```
### Videos
Local `.mp4`:
````markdown
```{video} /_static/path/to/video.mp4
:alt: Description
```
YouTube (privacy mode):
```{youtube} VIDEO_ID
:privacy_mode:
:url_parameters: ?privacy_mode=1
```
```{mermaid}
:alt: Description
:caption: Title
graph TD
A --> B
```
```{eval-rst}
.. graphviz::
:align: center
digraph {
A -> B
}
```
| Extension | Purpose |
|---|---|
myst_parser | MyST Markdown |
sphinx-design | Grids, cards, tabs, badges, buttons, dropdowns |
sphinx-examples | Source + rendered side-by-side |
sphinx.ext.autodoc | Python docstring extraction |
sphinx.ext.intersphinx | Cross-project linking |
sphinx.ext.graphviz | Graphviz diagrams |
sphinxcontrib.mermaid | Mermaid diagrams |
sphinxcontrib.video | Local HTML5 video |
sphinxcontrib.youtube | YouTube embedding |
sphinxcontrib.httpdomain | HTTP API domain |
sphinxcontrib.httpexample | curl/wget/httpie/python-requests examples |
sphinx_copybutton | Copy button on code blocks |
sphinx-tippy | Hover tooltips |
attrs_block, attrs_inline, colon_fence, deflist, html_image, linkify, strikethrough, substitution.
"plone": "https://6.docs.plone.org/"
"plone5": "https://5.docs.plone.org/"
"python": "https://docs.python.org/3/"
"training": "https://training.plone.org/"
All Plone ecosystem documentation must use plone-sphinx-theme.
It wraps sphinx-book-theme (which wraps pydata-sphinx-theme), adding Plone branding, styling, and custom directives.
pip install plone-sphinx-theme
Or in pyproject.toml:
[project.optional-dependencies]
docs = [
"plone-sphinx-theme",
]
Install sphinx-design separately if you need cards, grids, tabs, dropdowns:
pip install sphinx-design
extensions = [
"myst_parser",
"sphinx_copybutton",
"sphinx_design",
]
html_theme = "plone_sphinx_theme"
That single html_theme line is the only required theme setting. Everything else is optional.
html_logo = "_static/logo.svg"
html_favicon = "_static/favicon.ico"
html_sidebars = {
"**": [
"navbar-logo",
"search-button-field",
"sbt-sidebar-nav",
]
}
html_theme_options = {
"extra_footer": """<p>Your footer text.</p>""",
"footer_content_items": [
"author",
"copyright",
"last-updated",
"extra-footer",
"icon-links",
],
"icon_links": [
{
"name": "GitHub",
"url": "https://github.com/org/repo",
"icon": "fa-brands fa-square-github",
"type": "fontawesome",
},
],
"logo": {"text": "Project Name"},
"navigation_with_keys": True,
"path_to_docs": "docs",
"repository_branch": "main",
"repository_url": "https://github.com/org/repo",
"search_bar_text": "Search",
"show_toc_level": 2,
"use_edit_page_button": True,
"use_issues_button": True,
"use_repository_button": True,
}
# For "Edit this page" links
html_context = {
"edit_page_url_template": "https://github.com/org/repo/edit/main/docs/{{ file_name }}",
}
The theme adds a {versionremoved} directive (not in stock Sphinx):
```{versionremoved} 2.0
The `old_function` was removed. Use `new_function` instead.
```
Also available from stock Sphinx: {versionadded}, {versionchanged}, {deprecated}.
monokai (dark code blocks).{guilabel} and {menuselection}: rendered as bordered badges with info-color background.inline): rendered at 1.2em height.tippy_anchor_parent_selector = "article.bd-article"
tippy_enable_doitips = False
tippy_enable_wikitips = False
tippy_props = {
"interactive": True,
"placement": "auto-end",
}
Before submitting:
make html -- must produce zero warnings.make linkcheckbroken -- all links must resolve.make vale -- spelling, grammar, style (American English, Microsoft style).linkcheck_ignore in conf.py.When the user asks you to write or edit documentation:
make html, make vale, and make linkcheckbroken.Use this mode when the user wants to plan, structure, audit, or outline documentation for a project, package, feature, or entire site.
For each topic area, fill in this grid to find gaps:
Topic area: [e.g., "Content types"]
┌─────────────────────┬─────────────────────┐
│ TUTORIAL │ HOW-TO GUIDE │
│ "Learn content │ "How to create a │
│ types by building │ custom content │
│ one from scratch" │ type with behavior" │
│ Status: [missing] │ Status: [exists] │
├─────────────────────┼─────────────────────┤
│ EXPLANATION │ REFERENCE │
│ "About content │ "Content type │
│ types: FTI, schema, │ schema fields │
│ behaviors, and why" │ and directives" │
│ Status: [partial] │ Status: [exists] │
└─────────────────────┴─────────────────────┘
Produce one grid per topic area. Mark each cell:
Deliver the plan as a structured document with these sections:
The coverage matrix (section 10b) for every identified topic area. Highlight gaps and mixed-quadrant pages that need splitting.
A proposed file/folder structure. Use Plone conventions:
docs/
├── index.md # Landing page with grid cards
├── tutorials/
│ ├── index.md
│ ├── first-content-type.md # Tutorial
│ └── first-viewlet.md # Tutorial
├── how-to/
│ ├── index.md
│ ├── create-custom-content-type.md # How-to
│ └── configure-caching.md # How-to
├── explanation/
│ ├── index.md
│ ├── content-types.md # Explanation
│ └── caching-architecture.md # Explanation
└── reference/
├── index.md
├── schema-fields.md # Reference
└── configuration-options.md # Reference
Each entry states:
.md).For each planned page, provide:
Page: how-to/create-custom-content-type.md
Quadrant: How-to guide
Title: "How to create a custom content type"
Opening: "This guide shows you how to create a custom content type with a schema and a behavior."
Audience: Developers with basic Plone knowledge
Prerequisites: Working Plone installation
Sections (estimated):
1. Define the schema
2. Register the FTI
3. Add a behavior
4. Verify in the control panel
Estimated length: ~120 lines
Cross-references: {ref}`content-type-explanation`, {ref}`schema-fields-reference`
Order pages by priority and dependency:
Within each phase, list pages in dependency order (prerequisite pages first).
This planning framework works for any Sphinx/MyST documentation project. When planning docs outside the Plone core documentation repository:
html_meta frontmatter is Plone-specific; other projects may use different metadata.Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Applies a firm's KYC/AML rules grid to parsed onboarding records: assigns risk rating, checks required documents, outputs rule outcomes with citations, and routes for escalation.
Generates daily or weekly digests of activity from connected sources (chat, email, docs, tasks, CRM), highlighting action items, decisions, mentions, and project updates.
npx claudepluginhub plone/plone-doc-style-skill --plugin plone-doc-style