VuePress Plume Config Skill
This skill generates, manages, and writes VuePress Plume theme configuration files based on the official documentation. It supports .vuepress/config.ts, .vuepress/config.js, and .vuepress/plume.config.ts.
When to Invoke
- Initialize or update Plume theme configuration
- Configure collections (post/doc types), navbar, sidebar, locales
- Setup plugins (search, comments, watermark, llmstxt, etc.)
- Configure encryption, bulletin, copyright, and other advanced features
- Write the generated configuration into a specified target file
Documentation Sources
- Theme Configuration
- Locales Configuration
- Collections Configuration
- Navbar
- Sidebar
- Markdown
- Plugins
- Frontmatter - Basic
- Frontmatter - Post
- Frontmatter - Home
- Frontmatter - Friend
Configuration Files
The theme supports two configuration approaches:
1. .vuepress/config.ts (Recommended for full control)
tsimport { defineUserConfig } from 'vuepress' import { plumeTheme } from 'vuepress-theme-plume' export default defineUserConfig({ // Site-level config: lang, title, description, base, head, locales theme: plumeTheme({ // Full theme config available, including plugins, markdown, search, comment, etc. }) })
2. .vuepress/plume.config.ts (Recommended for clean separation)
tsimport { defineThemeConfig } from 'vuepress-theme-plume' export default defineThemeConfig({ // Supported fields: hostname, home, logo, logoDark, appearance, profile, social, // navbarSocialInclude, navbar, collections, sidebar, sidebarScrollbar, aside, outline, // transition, footer, bulletin, copyright, prevPage, nextPage, createTime, locales, // docsRepo/docsBranch/docsDir, autoFrontmatter, editLinkPattern })
::: warning Fields NOT supported in plume.config.ts
plugins, markdown, codeHighlighter, search, comment, watermark, readingTime, copyCode, replaceAssets, editLink, lastUpdated, contributors, changelog, cache, hostname, configFile, encrypt, llmstxt
:::
Input Schema
json{ "type": "object", "required": ["format", "target_file"], "properties": { "format": { "type": "string", "enum": ["plume-config-ts", "vuepress-config-ts", "vuepress-config-js"], "description": "Output file type and configuration style" }, "target_file": { "type": "string", "description": "Target file path to write (relative to project root or absolute)" }, "site": { "type": "object", "description": "VuePress site-level config (config.ts/js only)", "properties": { "lang": { "type": "string", "default": "zh-CN" }, "title": { "type": "string" }, "description": { "type": "string" }, "base": { "type": "string" }, "head": { "type": "array" }, "locales": { "type": "object" } } }, "theme": { "type": "object", "description": "Plume theme configuration", "properties": { "hostname": { "type": "string", "default": "" }, "configFile": { "type": "string", "default": "" }, "autoFrontmatter": { "type": ["object", "boolean"], "default": { "permalink": true, "createTime": true, "title": true }, "properties": { "permalink": { "type": ["boolean", "string"], "default": true }, "createTime": { "type": "boolean", "default": true }, "title": { "type": "boolean", "default": true } } }, "cache": { "type": ["string", "boolean"], "enum": ["memory", "filesystem", false], "default": "filesystem" }, "docsRepo": { "type": "string", "default": "" }, "docsBranch": { "type": "string", "default": "" }, "docsDir": { "type": "string", "default": "" }, "editLink": { "type": "boolean", "default": true }, "editLinkPattern": { "type": "string", "default": "" }, "lastUpdated": { "type": ["object", "boolean"], "default": { "formatOptions": { "dateStyle": "short", "timeStyle": "short" } } }, "contributors": { "type": ["boolean", "object"], "default": true }, "changelog": { "type": ["boolean", "object"], "default": false }, "home": { "type": ["string", "boolean"], "default": "/" }, "logo": { "type": ["string", "boolean"], "default": false }, "logoDark": { "type": ["string", "boolean"], "default": false }, "appearance": { "type": ["string", "boolean"], "enum": [true, false, "dark", "force-dark"], "default": true }, "profile": { "type": "object", "properties": { "avatar": { "type": "string" }, "name": { "type": "string" }, "description": { "type": "string" }, "circle": { "type": "boolean" }, "location": { "type": "string" }, "organization": { "type": "string" }, "layout": { "type": "string", "enum": ["left", "right"], "default": "right" } } }, "social": { "type": ["array", "boolean"], "default": false, "items": { "type": "object", "properties": { "icon": { "type": ["string", "object"] }, "link": { "type": "string" }, "ariaLabel": { "type": "string" } }, "required": ["icon", "link"] } }, "navbarSocialInclude": { "type": "array", "default": ["github", "twitter", "discord", "facebook"], "items": { "type": "string" } }, "navbar": { "type": "array", "default": [], "items": { "type": ["string", "object"], "properties": { "text": { "type": "string" }, "link": { "type": "string" }, "prefix": { "type": "string" }, "items": { "type": "array" }, "icon": { "type": ["string", "object"] }, "badge": { "type": ["string", "object"] }, "activeMatch": { "type": "string" } } } }, "collections": { "type": "array", "default": [], "description": "Content collections (post/doc)", "items": { "type": "object", "required": ["type", "dir", "title"], "properties": { "type": { "type": "string", "enum": ["post", "doc"] }, "dir": { "type": "string" }, "title": { "type": "string" }, "linkPrefix": { "type": "string" }, "tagsTheme": { "type": "string", "enum": ["colored", "gray", "brand"], "default": "colored" }, "autoFrontmatter": { "type": ["object", "boolean"] }, "include": { "type": "array", "items": { "type": "string" } }, "exclude": { "type": "array", "items": { "type": "string" } }, "pagination": { "type": ["boolean", "number", "object"] }, "link": { "type": "string" }, "postList": { "type": "boolean", "default": true }, "tags": { "type": "boolean", "default": true }, "tagsLink": { "type": "string" }, "tagsText": { "type": "string" }, "archives": { "type": "boolean", "default": true }, "archivesLink": { "type": "string" }, "archivesText": { "type": "string" }, "categories": { "type": "boolean", "default": true }, "categoriesLink": { "type": "string" }, "categoriesText": { "type": "string" }, "categoriesExpand": { "type": ["number", "string"], "default": "deep" }, "categoriesTransform": { "type": "string" }, "postCover": { "type": ["string", "object"] }, "profile": { "type": ["object", "boolean"] }, "social": { "type": ["array", "boolean"] }, "sidebar": { "type": ["string", "array"] }, "sidebarScrollbar": { "type": "boolean", "default": true }, "sidebarCollapsed": { "type": "boolean", "default": false } } } }, "sidebar": { "type": ["object", "boolean"] }, "sidebarScrollbar": { "type": "boolean", "default": true }, "aside": { "type": ["boolean", "string"], "enum": [true, false, "left"], "default": true }, "outline": { "type": ["boolean", "number", "array", "string"], "default": [2, 3] }, "transition": { "type": ["boolean", "object"], "default": true, "properties": { "page": { "type": "boolean", "default": true }, "postList": { "type": "boolean", "default": true }, "appearance": { "type": ["boolean", "string"], "default": "fade" } } }, "footer": { "type": ["boolean", "object"], "default": false, "properties": { "message": { "type": "string" }, "copyright": { "type": "string" } } }, "bulletin": { "type": ["boolean", "object"], "default": false, "properties": { "layout": { "type": "string", "enum": ["top-left", "top-right", "bottom-left", "bottom-right", "center"], "default": "top-right" }, "border": { "type": "boolean", "default": true }, "enablePage": { "type": ["boolean", "string"] }, "lifetime": { "type": "string", "enum": ["session", "always", "once"], "default": "always" }, "id": { "type": "string" }, "title": { "type": "string" }, "content": { "type": "string" }, "contentType": { "type": "string", "enum": ["markdown", "text"], "default": "text" }, "contentFile": { "type": "string" } } }, "copyright": { "type": ["boolean", "string", "object"], "default": false, "properties": { "license": { "type": ["string", "object"] }, "author": { "type": ["string", "object"] }, "creation": { "type": "string", "enum": ["original", "translate", "reprint"], "default": "original" } } }, "prevPage": { "type": "boolean", "default": true }, "nextPage": { "type": "boolean", "default": true }, "createTime": { "type": ["boolean", "string"], "enum": [true, false, "only-posts"], "default": true }, "locales": { "type": "object" }, "plugins": { "type": "object" }, "markdown": { "type": "object" }, "codeHighlighter": { "type": ["object", "boolean"] }, "search": { "type": ["object", "boolean"] }, "comment": { "type": ["object", "boolean"] }, "watermark": { "type": ["object", "boolean"] }, "readingTime": { "type": ["object", "boolean"] }, "copyCode": { "type": ["object", "boolean"] }, "replaceAssets": { "type": ["object", "boolean"] }, "llmstxt": { "type": ["object", "boolean"] }, "encrypt": { "type": ["object", "boolean"], "properties": { "global": { "type": "boolean", "default": false }, "admin": { "type": "array", "items": { "type": "string" } }, "rules": { "type": "object" } } } } } } }
Collections Configuration
Collections are the core concept for organizing content. Each collection points to a specific folder in the source directory.
Post Collection (Blog, Columns)
ts{ type: 'post', dir: 'blog', title: '博客', link: '/blog/', linkPrefix: '/article/', postCover: 'top', // 'left' | 'right' | 'odd-left' | 'odd-right' | 'top' tags: true, archives: true, categories: true, pagination: { perPage: 15 }, profile: { name: '博主', avatar: '/avatar.png' }, social: [{ icon: 'github', link: 'https://github.com/username' }] }
Doc Collection (Documentation, Notes)
ts{ type: 'doc', dir: 'guide', title: '指南', sidebar: 'auto', // or manual sidebar config sidebarScrollbar: true, sidebarCollapsed: false }
Built-in Plugins
The theme includes these plugins (configured in plugins field):
| Plugin | Description |
|---|---|
@vuepress/plugin-nprogress | Page loading progress bar |
@vuepress/plugin-photo-swipe | Image preview |
@vuepress/plugin-reading-time | Article reading time |
@vuepress/plugin-watermark | Article watermark |
@vuepress-plume/plugin-search | Local search |
@vuepress/plugin-docsearch | Algolia DocSearch |
@vuepress/plugin-copy-code | Code copy |
@vuepress/plugin-shiki | Code highlighting |
@vuepress/plugin-comment | Article comments |
@vuepress/plugin-markdown-hint | Markdown hints |
@vuepress/plugin-markdown-image | Markdown image |
@vuepress/plugin-markdown-math | Markdown math |
@vuepress/plugin-markdown-include | Markdown include |
@vuepress/plugin-markdown-chart | Markdown charts (chartjs/echarts/mermaid/flowchart/markmap/plantuml) |
@vuepress/plugin-replace-assets | Asset link replacement |
vuepress-plugin-md-power | Markdown Power |
@vuepress/plugin-git | Git commit info |
@vuepress/plugin-cache | Page compilation cache |
@vuepress/plugin-seo | SEO optimization |
@vuepress/plugin-sitemap | Sitemap |
@vuepress/plugin-llms | LLMs txt support |
Markdown Configuration
Configure markdown features in markdown field:
tsmarkdown: { hint: true, // Info, tip, warning, caution containers alert: true, // GitHub-style alerts fileTree: true, // File tree container plot: true, // Hidden text (spoiler) icons: true, // Icons support math: { type: 'katex' }, // Math formulas include: true, // Include markdown files annotation: false, // Inline annotations abbr: false, // Abbreviations mark: 'eager', // Mark/highlight text codeTabs: true, // Code block tabs tabs: true, // General tabs npmTo: false, // npm/yarn/pnpm switcher timeline: false, // Timeline container collapse: false, // Collapsible sections chat: false, // Chat dialog demo: false, // Demo container pdf: false, // PDF embed bilibili: false, // Bilibili video youtube: false, // YouTube video artPlayer: false, // ArtPlayer video audioReader: false,// Audio codepen: false, // CodePen codeSandbox: false,// CodeSandbox jsfiddle: false, // JSFiddle repl: false, // REPL caniuse: false, // Can I Use embed imageSize: false, // Auto image dimensions chartjs: false, // Chart.js echarts: false, // ECharts mermaid: false, // Mermaid markmap: false, // Markmap plantuml: false, // PlantUML flowchart: false, // Flowchart }
Code Highlighter Configuration
tscodeHighlighter: { lineNumbers: true, // Enable line numbers globally whitespace: false, // Show whitespace globally collapsedLines: false, // Collapse lines globally theme: { light: 'github-light', dark: 'github-dark' }, languages: ['js', 'ts', 'vue', 'bash', 'json'], twoslash: false, // TypeScript twoslash }
Search Configuration
Local Search (Default)
tssearch: { provider: 'local', // Additional options... }
Algolia DocSearch
tssearch: { provider: 'algolia', appId: 'YOUR_APP_ID', apiKey: 'YOUR_API_KEY', indexName: 'YOUR_INDEX_NAME' }
Comments Configuration
Giscus
tscomment: { provider: 'Giscus', repo: 'owner/repo', repoId: '...', category: 'Announcements', categoryId: '...' }
Waline
tscomment: { provider: 'Waline', serverURL: 'https://your-waline-server.vercel.app' }
Twikoo
tscomment: { provider: 'Twikoo', envId: 'your-env-id' }
Artalk
tscomment: { provider: 'Artalk', server: 'https://your-artalk-server.com' }
LLMs txt Configuration
Generate LLM-friendly content for AI assistants:
tsllmstxt: { locale: '/', // Additional options... }
This generates:
/llms.txt- Brief overview with links/llms-full.txt- Full content- Individual markdown files for each page
Encryption Configuration
Global Encryption
tsencrypt: { global: true, admin: ['password1', 'password2'] }
Partial Encryption
tsencrypt: { rules: { 'secret/': 'password', '/article/secret/': ['pass1', 'pass2'], '^/private/': 'private-pass' // Regex pattern } }
Watermark Configuration
tswatermark: { enabled: true, content: 'Your Name', opacity: 0.1, zIndex: 999 }
Replace Assets Configuration
Replace asset URLs for CDN deployment:
tsreplaceAssets: { image: 'https://cdn.example.com/images/', js: 'https://cdn.example.com/js/' }
Common Configuration Patterns
Blog Setup
tsexport default defineUserConfig({ theme: plumeTheme({ collections: [ { type: 'post', dir: 'blog', title: '博客', link: '/blog/', postCover: 'right', tags: true, archives: true, categories: true } ], profile: { name: '博主名称', description: '博主描述', avatar: '/avatar.png' }, social: [ { icon: 'github', link: 'https://github.com/username' } ] }) })
Documentation Setup
tsexport default defineUserConfig({ theme: plumeTheme({ collections: [ { type: 'doc', dir: 'guide', title: '指南', sidebar: 'auto' } ], navbar: [ { text: '指南', link: '/guide/', icon: 'mdi:book-open-outline' } ] }) })
Multi-language Setup
tsexport default defineUserConfig({ locales: { '/': { lang: 'zh-CN', title: '中文站点' }, '/en/': { lang: 'en-US', title: 'English Site' } }, theme: plumeTheme({ locales: { '/': { selectLanguageName: '简体中文', collections: [ { type: 'doc', dir: 'guide', title: '指南', sidebar: 'auto' } ] }, '/en/': { selectLanguageName: 'English', collections: [ { type: 'doc', dir: 'en/guide', title: 'Guide', sidebar: 'auto' } ] } } }) })
Validation and Hints
- Check consistency between
formatandtarget_fileextension - If
format=plume-config-tsand input contains fields only supported in config.ts/js:- Exclude these fields:
plugins,markdown,codeHighlighter,search,comment,watermark,readingTime,copyCode,replaceAssets,editLink,lastUpdated,contributors,changelog,cache,hostname,configFile,encrypt,llmstxt - Report them as ignored with reasons
- Exclude these fields:
- In
collections,typemust bepostordoc;dirandtitleare required navbaraccepts strings (paths) and objects (withtext/link)- Keys in
localesshould be path prefixes like'/','/en/','/zh/' - For
encrypt.rules, keys can be: file paths, directory paths, URL paths, or regex patterns (starting with^) - For
copyright, support both preset licenses (CC-BY-4.0, etc.) and custom { name, url } format
Execution Feedback
- Written file path and format type
- Summary of generated fields (collections count, navbar items, locales count)
- Ignored fields list with reasons
- For cache to take effect, remind removing
--clean-cachefrom dev script - For encrypt to work properly, remind HTTPS requirement for partial content encryption
References
- Theme: theme.md
- Locales: locales.md
- Collections: collections.md
- Navbar: navbar.md
- Sidebar: sidebar.md
- Markdown: markdown.md
- Plugins: plugins/README.md
- Encryption: encryption.md
- Bulletin: bulletin.md
- Copyright: copyright.md
- LLMs txt: llmstxt.md

