GitHub Copilot ChatGPT Claude Codex CLI Cursor opencode Skill Text

wiki-vitepress

Packages generated wiki Markdown into a VitePress static site with dark theme, dark-mode Mermaid diagrams with click-to-zoom, and production build output. Use when the user wants to create a browsable website from generated wiki pages.

Ciza · 0 points · 26 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download microsoft-skills-.github_plugins_deep-wiki_skills_wiki-vitepress-e58528d.zip · 2 KB
Part of microsoft/skills — 195 skills

Install

skills CLI npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/deep-wiki/skills/wiki-vitepress
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart
Git git clone https://github.com/microsoft/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole microsoft/skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Wiki VitePress Packager

Transform generated wiki Markdown files into a polished VitePress static site with dark theme and interactive Mermaid diagrams.

When to Activate

  • User asks to "build a site" or "package as VitePress"
  • User runs the /deep-wiki:build command
  • User wants a browsable HTML output from generated wiki pages

VitePress Scaffolding

Generate the following structure in a wiki-site/ directory:

wiki-site/
├── .vitepress/
│   ├── config.mts
│   └── theme/
│       ├── index.ts
│       └── custom.css
├── public/
├── [generated .md pages]
├── package.json
└── index.md

Config Requirements (config.mts)

  • Use withMermaid wrapper from vitepress-plugin-mermaid
  • Set appearance: 'dark' for dark-only theme
  • Configure themeConfig.nav and themeConfig.sidebar from the catalogue structure
  • Mermaid config must set dark theme variables:
mermaid: {
  theme: 'dark',
  themeVariables: {
    primaryColor: '#1e3a5f',
    primaryTextColor: '#e0e0e0',
    primaryBorderColor: '#4a9eed',
    lineColor: '#4a9eed',
    secondaryColor: '#2d4a3e',
    tertiaryColor: '#2d2d3d',
    background: '#1a1a2e',
    mainBkg: '#1e3a5f',
    nodeBorder: '#4a9eed',
    clusterBkg: '#16213e',
    titleColor: '#e0e0e0',
    edgeLabelBackground: '#1a1a2e'
  }
}

Dark-Mode Mermaid: Three-Layer Fix

Layer 1: Theme Variables (in config.mts)

Set via mermaid.themeVariables as shown above.

Layer 2: CSS Overrides (custom.css)

Target Mermaid SVG elements with !important:

.mermaid .node rect,
.mermaid .node circle,
.mermaid .node polygon { fill: #1e3a5f !important; stroke: #4a9eed !important; }
.mermaid .edgeLabel { background-color: #1a1a2e !important; color: #e0e0e0 !important; }
.mermaid text { fill: #e0e0e0 !important; }
.mermaid .label { color: #e0e0e0 !important; }

Layer 3: Inline Style Replacement (theme/index.ts)

Mermaid inline style attributes override everything. Use onMounted + polling to replace them:

import { onMounted } from 'vue'

// In setup()
onMounted(() => {
  let attempts = 0
  const fix = setInterval(() => {
    document.querySelectorAll('.mermaid svg [style]').forEach(el => {
      const s = (el as HTMLElement).style
      if (s.fill && !s.fill.includes('#1e3a5f')) s.fill = '#1e3a5f'
      if (s.stroke && !s.stroke.includes('#4a9eed')) s.stroke = '#4a9eed'
      if (s.color) s.color = '#e0e0e0'
    })
    if (++attempts >= 20) clearInterval(fix)
  }, 500)
})

Use setup() with onMounted, NOT enhanceApp() — DOM doesn't exist during SSR.

Click-to-Zoom for Mermaid Diagrams

Wrap each .mermaid container in a clickable wrapper that opens a fullscreen modal:

document.querySelectorAll('.mermaid').forEach(el => {
  el.style.cursor = 'zoom-in'
  el.addEventListener('click', () => {
    const modal = document.createElement('div')
    modal.className = 'mermaid-zoom-modal'
    modal.innerHTML = el.outerHTML
    modal.addEventListener('click', () => modal.remove())
    document.body.appendChild(modal)
  })
})

Modal CSS:

.mermaid-zoom-modal {
  position: fixed; inset: 0;
  background: rgba(0,0,0,0.9);
  display: flex; align-items: center; justify-content: center;
  z-index: 9999; cursor: zoom-out;
}
.mermaid-zoom-modal .mermaid { transform: scale(1.5); }

Post-Processing Rules

Before VitePress build, scan all .md files and fix:

  • Replace <br/> with <br> (Vue template compiler compatibility)
  • Wrap bare <T> generic parameters in backticks outside code fences
  • Ensure every page has YAML frontmatter with title and description

Build

cd wiki-site && npm install && npm run docs:build

Output goes to wiki-site/.vitepress/dist/.

Known Gotchas

  • Mermaid renders async — SVGs don't exist when onMounted fires. Must poll.
  • isCustomElement compiler option for bare <T> causes worse crashes — do NOT use it
  • Node text in Mermaid uses inline style with highest specificity — CSS alone won't fix it
  • enhanceApp() runs during SSR where document doesn't exist — use setup() only
Files (skills)
  • SKILL.md 4.4 KB
    ---
    name: wiki-vitepress
    description: Packages generated wiki Markdown into a VitePress static site with dark theme, dark-mode Mermaid diagrams with click-to-zoom, and production build output. Use when the user wants to create a browsable website from generated wiki pages.
    license: MIT
    metadata:
      author: Microsoft
      version: "1.0.0"
    ---
    
    # Wiki VitePress Packager
    
    Transform generated wiki Markdown files into a polished VitePress static site with dark theme and interactive Mermaid diagrams.
    
    ## When to Activate
    
    - User asks to "build a site" or "package as VitePress"
    - User runs the `/deep-wiki:build` command
    - User wants a browsable HTML output from generated wiki pages
    
    ## VitePress Scaffolding
    
    Generate the following structure in a `wiki-site/` directory:
    
    ```
    wiki-site/
    ├── .vitepress/
    │   ├── config.mts
    │   └── theme/
    │       ├── index.ts
    │       └── custom.css
    ├── public/
    ├── [generated .md pages]
    ├── package.json
    └── index.md
    ```
    
    ## Config Requirements (`config.mts`)
    
    - Use `withMermaid` wrapper from `vitepress-plugin-mermaid`
    - Set `appearance: 'dark'` for dark-only theme
    - Configure `themeConfig.nav` and `themeConfig.sidebar` from the catalogue structure
    - Mermaid config must set dark theme variables:
    
    ```typescript
    mermaid: {
      theme: 'dark',
      themeVariables: {
        primaryColor: '#1e3a5f',
        primaryTextColor: '#e0e0e0',
        primaryBorderColor: '#4a9eed',
        lineColor: '#4a9eed',
        secondaryColor: '#2d4a3e',
        tertiaryColor: '#2d2d3d',
        background: '#1a1a2e',
        mainBkg: '#1e3a5f',
        nodeBorder: '#4a9eed',
        clusterBkg: '#16213e',
        titleColor: '#e0e0e0',
        edgeLabelBackground: '#1a1a2e'
      }
    }
    ```
    
    ## Dark-Mode Mermaid: Three-Layer Fix
    
    ### Layer 1: Theme Variables (in config.mts)
    Set via `mermaid.themeVariables` as shown above.
    
    ### Layer 2: CSS Overrides (`custom.css`)
    Target Mermaid SVG elements with `!important`:
    
    ```css
    .mermaid .node rect,
    .mermaid .node circle,
    .mermaid .node polygon { fill: #1e3a5f !important; stroke: #4a9eed !important; }
    .mermaid .edgeLabel { background-color: #1a1a2e !important; color: #e0e0e0 !important; }
    .mermaid text { fill: #e0e0e0 !important; }
    .mermaid .label { color: #e0e0e0 !important; }
    ```
    
    ### Layer 3: Inline Style Replacement (`theme/index.ts`)
    Mermaid inline `style` attributes override everything. Use `onMounted` + polling to replace them:
    
    ```typescript
    import { onMounted } from 'vue'
    
    // In setup()
    onMounted(() => {
      let attempts = 0
      const fix = setInterval(() => {
        document.querySelectorAll('.mermaid svg [style]').forEach(el => {
          const s = (el as HTMLElement).style
          if (s.fill && !s.fill.includes('#1e3a5f')) s.fill = '#1e3a5f'
          if (s.stroke && !s.stroke.includes('#4a9eed')) s.stroke = '#4a9eed'
          if (s.color) s.color = '#e0e0e0'
        })
        if (++attempts >= 20) clearInterval(fix)
      }, 500)
    })
    ```
    
    Use `setup()` with `onMounted`, NOT `enhanceApp()` — DOM doesn't exist during SSR.
    
    ## Click-to-Zoom for Mermaid Diagrams
    
    Wrap each `.mermaid` container in a clickable wrapper that opens a fullscreen modal:
    
    ```typescript
    document.querySelectorAll('.mermaid').forEach(el => {
      el.style.cursor = 'zoom-in'
      el.addEventListener('click', () => {
        const modal = document.createElement('div')
        modal.className = 'mermaid-zoom-modal'
        modal.innerHTML = el.outerHTML
        modal.addEventListener('click', () => modal.remove())
        document.body.appendChild(modal)
      })
    })
    ```
    
    Modal CSS:
    ```css
    .mermaid-zoom-modal {
      position: fixed; inset: 0;
      background: rgba(0,0,0,0.9);
      display: flex; align-items: center; justify-content: center;
      z-index: 9999; cursor: zoom-out;
    }
    .mermaid-zoom-modal .mermaid { transform: scale(1.5); }
    ```
    
    ## Post-Processing Rules
    
    Before VitePress build, scan all `.md` files and fix:
    - Replace `<br/>` with `<br>` (Vue template compiler compatibility)
    - Wrap bare `<T>` generic parameters in backticks outside code fences
    - Ensure every page has YAML frontmatter with `title` and `description`
    
    ## Build
    
    ```bash
    cd wiki-site && npm install && npm run docs:build
    ```
    
    Output goes to `wiki-site/.vitepress/dist/`.
    
    ## Known Gotchas
    
    - Mermaid renders async — SVGs don't exist when `onMounted` fires. Must poll.
    - `isCustomElement` compiler option for bare `<T>` causes worse crashes — do NOT use it
    - Node text in Mermaid uses inline `style` with highest specificity — CSS alone won't fix it
    - `enhanceApp()` runs during SSR where `document` doesn't exist — use `setup()` only
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related