From scrum-master
Bidirectional sync between local Markdown files and Confluence pages. Use this skill when the user wants to push a .md file to Confluence, pull a Confluence page as .md, batch-push a directory of markdown files, or check sync status. Trigger on requests like "push this doc to Confluence", "pull the PRD from Confluence as markdown", "sync docs to Confluence", "convert this markdown to a Confluence page", or "batch push all docs".
npx claudepluginhub nexussema/omg-marketplace --plugin scrum-masterThis skill uses the workspace's default tool permissions.
Bidirectional sync between local Markdown (`.md`) files and Confluence pages. Converts markdown ↔ Confluence storage XHTML and manages page creation/updates via the REST API v2.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Analyzes BMad project state from catalog CSV, configs, artifacts, and query to recommend next skills or answer questions. Useful for help requests, 'what next', or starting BMad.
Bidirectional sync between local Markdown (.md) files and Confluence pages. Converts markdown ↔ Confluence storage XHTML and manages page creation/updates via the REST API v2.
Same Atlassian credentials as all other Atlassian skills:
ATLASSIAN_EMAIL="${ATLASSIAN_EMAIL:-$(grep 'export ATLASSIAN_EMAIL' ~/.zshrc ~/.bashrc ~/.bash_profile 2>/dev/null | head -1 | sed 's/.*=\"//;s/\".*//')}"
ATLASSIAN_API_TOKEN="${ATLASSIAN_API_TOKEN:-$(grep 'export ATLASSIAN_API_TOKEN' ~/.zshrc ~/.bashrc ~/.bash_profile 2>/dev/null | head -1 | sed 's/.*=\"//;s/\".*//')}"
ATLASSIAN_INSTANCE="${ATLASSIAN_INSTANCE:-$(grep 'export ATLASSIAN_INSTANCE' ~/.zshrc ~/.bashrc ~/.bash_profile 2>/dev/null | head -1 | sed 's/.*=\"//;s/\".*//' || echo 'yourcompany.atlassian.net')}"
Every synced .md file uses YAML frontmatter to track its Confluence target:
---
confluence_title: "Page Title"
confluence_space_id: "12345"
confluence_parent_id: "67890"
confluence_page_id: "11111"
confluence_version: 3
---
| Field | Required | Description |
|---|---|---|
confluence_title | Yes | Page title on Confluence |
confluence_space_id | For create | Numeric space ID (use List Spaces to find it) |
confluence_parent_id | No | Parent page ID (omit for top-level pages) |
confluence_page_id | For update | Set automatically after first push; if present, updates instead of creates |
confluence_version | No | Tracks the last-synced version (set by pull) |
Convert a local markdown file to Confluence XHTML and create or update a page.
${CLAUDE_PLUGIN_ROOT}/scripts/push-md-to-confluence.sh <file.md> "description of changes"
The script:
.md filemd-to-confluence-storage.sh to convert → XHTMLconfluence_page_id is set → fetches current version, increments, PUTs updateconfluence_space_idconfluence_page_id back into the frontmatterIf you need more control, you can push manually:
Step 1 — Convert markdown to XHTML:
${CLAUDE_PLUGIN_ROOT}/scripts/md-to-confluence-storage.sh <file.md> /tmp/output.html
Step 2 — Create or update the page using the Confluence API (see the confluence skill in the SDLC plugin for raw API templates).
Fetch a Confluence page and convert it to a local markdown file with frontmatter.
${CLAUDE_PLUGIN_ROOT}/scripts/pull-confluence-to-md.sh <page_id> [output.md]
The script:
?body-format=storage)confluence_page_id, confluence_space_id, confluence_title, confluence_version<!-- Confluence macro: name -->)Push all .md files in a directory to Confluence:
for f in <directory>/*.md; do
echo "--- Pushing: $f ---"
${CLAUDE_PLUGIN_ROOT}/scripts/push-md-to-confluence.sh "$f" "Batch sync"
done
Each file must have frontmatter with at least confluence_title and confluence_space_id (for new pages) or confluence_page_id (for existing pages).
| Markdown | Confluence XHTML |
|---|---|
# Heading 1 | <h1>Heading 1</h1> |
## Heading 2 | <h2>Heading 2</h2> |
**bold** | <strong>bold</strong> |
*italic* | <em>italic</em> |
`code` | <code>code</code> |
[text](url) | <a href="url">text</a> |
 | <ac:image><ri:url ri:value="url" /></ac:image> |
--- | <hr /> |
- item | <ul><li>item</li></ul> |
1. item | <ol><li>item</li></ol> |
```lang ... ``` | <ac:structured-macro ac:name="code"><ac:parameter ac:name="language">lang</ac:parameter><ac:plain-text-body><![CDATA[...]]></ac:plain-text-body></ac:structured-macro> |
| a | b | | <table><tr><td>a</td><td>b</td></tr></table> |
| Confluence XHTML | Markdown |
|---|---|
<h1> – <h6> | # – ###### |
<strong>, <b> | **text** |
<em>, <i> | *text* |
<code> | `text` |
<a href="url"> | [text](url) |
<ac:image> |  |
<hr /> | --- |
<ul><li> | - item |
<ol><li> | 1. item |
| Code macro | ```lang ... ``` |
<table> | Markdown table |
| Unknown macros | <!-- Confluence macro: name --> |
List spaces (to get confluence_space_id):
ATLASSIAN_EMAIL="${ATLASSIAN_EMAIL:-$(grep 'export ATLASSIAN_EMAIL' ~/.zshrc ~/.bashrc 2>/dev/null | head -1 | sed 's/.*=\"//;s/\".*//')}"
ATLASSIAN_API_TOKEN="${ATLASSIAN_API_TOKEN:-$(grep 'export ATLASSIAN_API_TOKEN' ~/.zshrc ~/.bashrc 2>/dev/null | head -1 | sed 's/.*=\"//;s/\".*//')}"
ATLASSIAN_INSTANCE="${ATLASSIAN_INSTANCE:-$(grep 'export ATLASSIAN_INSTANCE' ~/.zshrc ~/.bashrc 2>/dev/null | head -1 | sed 's/.*=\"//;s/\".*//' || echo 'yourcompany.atlassian.net')}"
curl -s -u "$ATLASSIAN_EMAIL:$ATLASSIAN_API_TOKEN" \
"https://$ATLASSIAN_INSTANCE/wiki/api/v2/spaces" \
| python3 -c "
import json, sys
d = json.load(sys.stdin)
for s in d.get('results', []):
print(f\"{s['id']}\t{s['key']}\t{s['name']}\")
"
Extract page ID from URL:
https://{instance}/wiki/spaces/myproject/pages/3711631361/Page+Title
^^^^^^^^^^^
This is the page ID