.claude/skills/sync-notion-pages/SKILL.md
--- context: fork --- # /sync-notion-pages Bidirectional sync between Obsidian notes and Notion pages for collaborative planning. ## Usage ``` /sync-notion-pages # Check all tracked pages for changes /sync-notion-pages <note> # Sync a specific note /sync-notion-pages --push <note> # Force push to Notion /sync-notion-pages --pull <note> # Force pull from Notion /sync-notion-pages --link <note> <url> # Link note to Notion page /sync-notion-page
npx skillsauth add DavidROliverBA/ArchitectKB .claude/skills/sync-notion-pagesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Bidirectional sync between Obsidian notes and Notion pages for collaborative planning.
/sync-notion-pages # Check all tracked pages for changes
/sync-notion-pages <note> # Sync a specific note
/sync-notion-pages --push <note> # Force push to Notion
/sync-notion-pages --pull <note> # Force pull from Notion
/sync-notion-pages --link <note> <url> # Link note to Notion page
/sync-notion-pages --unlink <note> # Remove sync tracking from note
/sync-notion-pages --status # Show sync status dashboard
mcp__MCP_DOCKER__API-retrieve-a-page)notionPageId in frontmatter to be trackedIdentify operation mode:
<note>: Sync specific note (detect direction automatically)--push <note>: Force push local → Notion--pull <note>: Force pull Notion → local--link <note> <url>: Link existing note to Notion page--unlink <note>: Remove sync tracking--status: Show dashboardIf note specified, find it:
notionPageId)Read .claude/sync/notion-pages-manifest.json:
{
"version": "1.0",
"lastFullSync": "2026-01-20T14:00:00Z",
"trackedPages": {
"<pageId>": {
"localFile": "Trip - Lisbon March 2026.md",
"notionUrl": "https://...",
"notionLastEdited": "2026-01-20T14:30:00Z",
"localLastModified": "2026-01-20T15:00:00Z",
"lastSynced": "2026-01-20T14:00:00Z",
"syncStatus": "local-ahead"
}
}
}
--link)Parse Notion URL to extract page ID:
https://www.notion.so/Page-Title-<pageId> or https://www.notion.so/<pageId>Fetch page from Notion using mcp__MCP_DOCKER__API-retrieve-a-page:
page_id: "<extracted-page-id>"
Add sync fields to note frontmatter:
notionPageId: "<pageId>"
notionUrl: "<full-url>"
lastSynced: null
syncStatus: unsynced
Add entry to manifest
Report success
--status)For each tracked page in manifest:
last_edited_timeDisplay dashboard:
# Notion Page Sync Status
| Note | Status | Local Modified | Notion Modified | Last Synced |
| ------------- | ----------- | ---------------- | ---------------- | ---------------- |
| Trip - Lisbon | local-ahead | 2026-01-21 10:00 | 2026-01-20 14:30 | 2026-01-20 14:00 |
Summarise:
For each tracked page (or specific note):
Fetch Notion metadata:
mcp__MCP_DOCKER__API-retrieve-a-page with page_id
Extract last_edited_time
Get local file modified time:
modified in frontmatterCompare against lastSynced:
localChanged = localModified > lastSynced
remoteChanged = notionLastEdited > lastSynced
Status:
- synced: !localChanged && !remoteChanged
- local-ahead: localChanged && !remoteChanged
- remote-ahead: !localChanged && remoteChanged
- conflict: localChanged && remoteChanged
Take action based on status:
synced: Report "No changes"local-ahead: Auto-push to Notionremote-ahead: Auto-pull from Notionconflict: Prompt user for resolution--push or auto-push)Read local note content:
Convert Markdown → Notion blocks:
| Markdown | Notion Block Type |
| ------------ | ---------------------- | --- | ----- |
| # H1 | heading_1 |
| ## H2 | heading_2 |
| ### H3 | heading_3 |
| paragraph | paragraph |
| - item | bulleted_list_item |
| 1. item | numbered_list_item |
| - [ ] task | to_do (checked: false) |
| - [x] task | to_do (checked: true) |
| > quote | quote |
| code | code |
| | table | | table |
Clear existing Notion blocks:
mcp__MCP_DOCKER__API-get-block-childrenmcp__MCP_DOCKER__API-delete-a-blockAppend new blocks:
mcp__MCP_DOCKER__API-patch-block-children to add converted blocksUpdate timestamps:
lastSynced to nowsyncStatus: synced--pull or auto-pull)Fetch Notion page content:
mcp__MCP_DOCKER__API-retrieve-a-page with page_id
mcp__MCP_DOCKER__API-get-block-children with block_id=page_id
Convert Notion blocks → Markdown:
For each block, convert to markdown:
function blockToMarkdown(block) {
switch (block.type) {
case "heading_1":
return `# ${getRichText(block.heading_1.rich_text)}`;
case "heading_2":
return `## ${getRichText(block.heading_2.rich_text)}`;
case "heading_3":
return `### ${getRichText(block.heading_3.rich_text)}`;
case "paragraph":
return getRichText(block.paragraph.rich_text);
case "bulleted_list_item":
return `- ${getRichText(block.bulleted_list_item.rich_text)}`;
case "numbered_list_item":
return `1. ${getRichText(block.numbered_list_item.rich_text)}`;
case "to_do":
const checked = block.to_do.checked ? "x" : " ";
return `- [${checked}] ${getRichText(block.to_do.rich_text)}`;
case "quote":
return `> ${getRichText(block.quote.rich_text)}`;
case "code":
return `\`\`\`${block.code.language}\n${getRichText(block.code.rich_text)}\n\`\`\``;
case "divider":
return "---";
default:
return "";
}
}
function getRichText(richTextArray) {
return richTextArray.map((t) => t.plain_text).join("");
}
Preserve frontmatter:
modified to todaylastSynced to nowsyncStatus: syncedPreserve local-only sections:
> [!info])Write updated note
Update manifest
When both sides changed since last sync:
Show diff summary:
## Conflict Detected: Trip - Lisbon March 2026
**Local changes since 2026-01-20 14:00:**
- Modified flights section
- Added new activities
**Notion changes since 2026-01-20 14:00:**
- Collaborator added restaurant suggestions
- Updated accommodation notes
Offer resolution options using AskUserQuestion:
Execute chosen resolution:
conflict# Notion Page Sync Report
**Synced at:** 2026-01-21T10:30:00Z
## Summary
| Action | Count |
| ------------------- | ----- |
| Synced (no changes) | 2 |
| Pushed to Notion | 1 |
| Pulled from Notion | 0 |
| Conflicts | 0 |
| Errors | 0 |
## Details
### Pushed: Trip - Lisbon March 2026
- Local modified: 2026-01-21 10:00
- Notion updated: 2026-01-21 10:30
## Next Steps
- Review synced content in Notion
- Check for any formatting issues
> [!info], > [!warning])[[Note Name]])[[Note]] to plain text when pushing| Error | Action | | ----------------------- | ----------------------------------- | | Notion API rate limited | Wait and retry | | Page not found | Remove from tracking, notify user | | Invalid page ID | Report error, suggest re-linking | | Network timeout | Retry once, then report | | Malformed blocks | Skip block, continue, report at end |
.claude/sync/notion-pages-manifest.json
This is separate from the Confluence sync manifest at .claude/sync/manifest.json.
User: /sync-notion-pages --link "Trip - Lisbon March 2026" https://www.notion.so/Lisbon-March-2026-2ee76da238c981459c88ca451e112c39
Claude:
1. Extracts page ID: 2ee76da238c981459c88ca451e112c39
2. Fetches Notion page to verify
3. Updates note frontmatter with sync fields
4. Adds to manifest
5. Reports: "Linked Trip - Lisbon March 2026 to Notion page"
User: /sync-notion-pages
Claude:
1. Loads manifest
2. For each tracked page, checks timestamps
3. Reports status for all pages
4. Offers to sync any that need it
User: /sync-notion-pages --push "Trip - Lisbon March 2026"
Claude:
1. Reads local note
2. Converts to Notion blocks
3. Updates Notion page
4. Updates timestamps
5. Reports success
tools
--- context: fork --- # /youtube Save a YouTube video as both a Weblink (quick reference) and a detailed Page (full analysis). ## Usage ``` /youtube <url> /youtube <url> <optional title override> ``` ## Examples ``` /youtube https://www.youtube.com/watch?v=0TpON5T-Sw4 /youtube https://youtu.be/abc123 AWS re:Invent Keynote ``` ## Prerequisites This skill uses the MCP Docker YouTube tools: - `mcp__MCP_DOCKER__get_video_info` - Video metadata - `mcp__MCP_DOCKER__get_transcript` - Full trans
data-ai
Create and manage git worktrees for parallel agent sessions
testing
--- context: fork --- # /wipe Generate a context handoff summary, clear the session, and resume in a fresh conversation. Detects environment and provides automated (tmux) or manual workflow. ## Usage ``` /wipe /wipe quick # Minimal handoff, just essentials /wipe detailed # Comprehensive handoff with full context ``` ## Instructions When the user invokes `/wipe`: ### Phase 1: Detect Environment First, check the terminal environment: ```bash echo "Environment Detection:"
data-ai
--- context: fork --- # /weekly-summary Generate comprehensive weekly summary from daily notes, meetings, tasks, and project updates using parallel sub-agents. ## Usage ``` /weekly-summary /weekly-summary --last-week /weekly-summary --from 2026-01-01 --to 2026-01-07 /weekly-summary --output page # Create Page note instead of just outputting ``` ## Instructions This skill uses **5 parallel sub-agents** to gather data concurrently from different vault areas, then synthesizes a comprehensi