diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index db1c07b..745eead 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,12 +1,12 @@ -name: Deploy docs to GitHub Pages +name: Deploy VitePress to GitHub Pages on: push: branches: [main] paths: - "docs/**" - - "README.md" - - "_config.yml" + - "package.json" + - ".github/workflows/pages.yml" workflow_dispatch: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages @@ -26,17 +26,22 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Setup Pages - uses: actions/configure-pages@v5 - - - name: Build with Jekyll - uses: actions/jekyll-build-pages@v1 + - name: Setup Node.js + uses: actions/setup-node@v4 with: - source: ./docs - destination: ./_site + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build VitePress + run: npm run docs:build - name: Upload artifact uses: actions/upload-pages-artifact@v3 + with: + path: .vitepress-dist deploy: environment: diff --git a/.gitignore b/.gitignore index bc37afe..d6dc4c5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ dist/ .worktree/ +.vitepress-dist/ diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts new file mode 100644 index 0000000..ace10df --- /dev/null +++ b/docs/.vitepress/config.ts @@ -0,0 +1,140 @@ +import { defineConfig } from 'vitepress' +import { readdirSync, statSync } from 'node:fs' +import { join } from 'node:path' +import type { DefaultTheme } from 'vitepress' + +function getSidebar(): DefaultTheme.Sidebar { + const docsDir = join(import.meta.dirname, '..') + const sidebar: DefaultTheme.Sidebar = {} + + const dirLabels: Record = { + guides: '使用指南', + adr: '架构决策记录', + dev: '开发文档', + prd: '产品需求文档', + } + + for (const dir of ['guides', 'adr', 'dev', 'prd']) { + const fullDir = join(docsDir, dir) + const items: DefaultTheme.SidebarItem[] = [] + const entries = readdirSync(fullDir).sort() + for (const entry of entries) { + if (entry.startsWith('.')) continue + const fullPath = join(fullDir, entry) + if (entry.endsWith('.md')) { + const name = entry.replace('.md', '') + items.push({ + text: name.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + link: `/${dir}/${name}`, + }) + } else if (statSync(fullPath).isDirectory()) { + const subEntries = readdirSync(fullPath).sort().filter(e => e.endsWith('.md')) + if (subEntries.length > 0) { + items.push({ + text: entry.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + collapsed: dir === 'dev' && entry === 'tasks', + items: subEntries.map(e => ({ + text: e.replace('.md', '').replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + link: `/${dir}/${entry}/${e.replace('.md', '')}`, + })), + }) + } + } + } + if (items.length > 0) { + sidebar[`/${dir}/`] = [{ text: dirLabels[dir] || dir, items }] + } + } + + return sidebar +} + +export default defineConfig({ + title: 'opencode-cabbage', + description: '全流程开发 OpenCode 插件 — 需求→设计→任务→编码→测试→审查→自动合并', + srcDir: '.', + outDir: '../.vitepress-dist', + lastUpdated: true, + cleanUrls: true, + + themeConfig: { + nav: [ + { text: '首页', link: '/' }, + { text: '快速开始', link: '/guides/quickstart' }, + { + text: '使用指南', + items: [ + { text: '快速开始', link: '/guides/quickstart' }, + { text: '配置指南', link: '/guides/configuration' }, + { text: '使用指南', link: '/guides/usage' }, + { text: '架构概览', link: '/guides/architecture' }, + ], + }, + { + text: '开发', + items: [ + { text: '贡献指南', link: '/dev/guides/contributing' }, + { text: '技术方案', link: '/dev/specs/opencode-cabbage-docs-and-pages' }, + { text: 'VitePress 迁移', link: '/dev/specs/vitepress-docs-migration' }, + { text: 'Out of Scope', link: '/dev/out-of-scope' }, + ], + }, + { + text: 'ADR', + items: [ + { text: '0001 - 替换 OpenSpec', link: '/adr/0001-replace-openspec-with-full-flow' }, + { text: '0002 - Jekyll 文档站', link: '/adr/2026-07-10-jekyll-github-pages-docs' }, + { text: '0003 - 迁移 VitePress', link: '/adr/2026-07-10-jekyll-to-vitepress' }, + ], + }, + { + text: 'PRD', + items: [ + { text: 'Docs & Pages', link: '/prd/opencode-cabbage-docs-and-pages' }, + { text: 'VitePress 迁移', link: '/prd/vitepress-docs-migration' }, + ], + }, + ], + + sidebar: getSidebar(), + + search: { + provider: 'local', + options: { + translations: { + button: { + buttonText: '搜索', + buttonAriaLabel: '搜索文档', + }, + modal: { + displayDetails: '显示详情', + noResultsText: '未找到相关结果', + resetButtonTitle: '清除搜索', + footer: { + selectText: '选择', + navigateText: '切换', + closeText: '关闭', + }, + }, + }, + }, + }, + + socialLinks: [ + { icon: 'github', link: 'https://github.com/devcxl/opencode-cabbage' }, + ], + + editLink: { + pattern: 'https://github.com/devcxl/opencode-cabbage/edit/main/docs/:path', + }, + + lastUpdated: { + text: '最后更新', + }, + + docFooter: { + prev: '上一页', + next: '下一页', + }, + }, +}) diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 64f927c..0000000 --- a/docs/_config.yml +++ /dev/null @@ -1,18 +0,0 @@ -title: opencode-cabbage -description: 全流程开发 OpenCode 插件 -theme: jekyll-theme-cayman -markdown: GFM -highlighter: rouge -plugins: - - jekyll-relative-links -relative_links: - enabled: true - collections: true -include: - - CONTRIBUTING.md - - README.md - - LICENSE - - index.md - - guides/ - - adr/ - - dev/ diff --git a/docs/adr/2026-07-10-jekyll-github-pages-docs.md b/docs/adr/2026-07-10-jekyll-github-pages-docs.md index 6869633..8d645df 100644 --- a/docs/adr/2026-07-10-jekyll-github-pages-docs.md +++ b/docs/adr/2026-07-10-jekyll-github-pages-docs.md @@ -1,6 +1,6 @@ # ADR 0002: 使用 Jekyll + GitHub Pages 部署文档站点 -**状态:** Accepted +**状态:** Superseded(被 [ADR 0003](/adr/2026-07-10-jekyll-to-vitepress) 替代) **日期:** 2026-07-10 ## 背景 diff --git a/docs/adr/2026-07-10-jekyll-to-vitepress.md b/docs/adr/2026-07-10-jekyll-to-vitepress.md new file mode 100644 index 0000000..9fcdff3 --- /dev/null +++ b/docs/adr/2026-07-10-jekyll-to-vitepress.md @@ -0,0 +1,68 @@ +# ADR 0003: 从 Jekyll 迁移到 VitePress + +**状态:** Accepted +**日期:** 2026-07-10 +**上级:** [ADR 0002](/adr/2026-07-10-jekyll-github-pages-docs)(被替代) + +## 背景 + +[ADR 0002](/adr/2026-07-10-jekyll-github-pages-docs) 选择了 Jekyll + GitHub Pages 作为文档站方案,理由是"零运维成本、push 即部署"。但在实际使用中暴露了以下问题: + +1. **Ruby 生态割裂**:项目是 TypeScript/Vite 技术栈,Jekyll 需要 Ruby 环境和 Bundler,贡献者本地调试需要额外安装 Ruby,增加了入门门槛 +2. **构建受限**:Jekyll 的 GitHub Pages 构建基于 GitHub 的托管环境,无法自定义构建流程,Gemfile 依赖受限 +3. **搜索缺失**:Jekyll 默认不提供全文搜索,需要集成第三方插件(如 lunr.js),而 GitHub Pages 不运行自定义插件 +4. **开发体验差**:Jekyll 的 livereload 需要额外配置,修改配置后需要重启 + +## 决策 + +将文档站从 Jekyll 迁移到 **VitePress**,使用 GitHub Actions 构建并部署到 GitHub Pages。 + +## 选择 VitePress 的原因 + +| 维度 | VitePress | Jekyll | +|------|-----------|--------| +| 技术栈 | TypeScript + Vite,与项目一致 | Ruby,与项目割裂 | +| 开发体验 | 热更新 < 1s,配置热重载 | 需手动刷新,配置需重启 | +| 搜索 | 内置 minisearch,零配置 | 需第三方插件 | +| 构建速度 | Vite 二次构建极快 | Jekyll 每次全量构建 | +| 维护方 | Vue 团队(Evan You) | 社区 | +| 导航/侧边栏 | 内置自动生成 | 需手动配置或插件 | +| 主题 | 默认主题即开即用 | 受 GitHub Pages 支持列表限制 | + +## 备选方案 + +| 方案 | 未采纳原因 | +|------|-----------| +| 保留 Jekyll | 已暴露上述问题,且文档站有 19 个 `.md` 文件,搜索和导航需求日益迫切 | +| Docusaurus | 功能丰富但偏重,对于 19 个页面的文档站是过度设计;React 技术栈与项目 Vue 倾向不一致 | +| Nextra | 依赖 Next.js,引入额外框架依赖 | +| 纯 HTML | 维护成本高,不符合"文档站"定位 | + +## 迁移范围 + +- **保留**:全部 19 个 `.md` 文件内容不变,目录结构不变 +- **新增**:`docs/.vitepress/config.ts`(VitePress 配置)、`.github/workflows/pages.yml`(CI 构建部署) +- **删除**:`docs/_config.yml`(Jekyll 配置) +- **改造**:`docs/index.md`(从 Jekyll 首页改为 VitePress 首页布局) +- **不修改**:文档内容、目录结构、文件名 + +## 后果 + +### 正向 + +- 技术栈统一:贡献者无需安装 Ruby,仅需 Node.js >= 18 +- 开发体验提升:`npm run docs:dev` 即可启动热更新开发服务器 +- 全文搜索:内置 minisearch,用户在文档站内即可搜索全部内容 +- 自动侧边栏:按目录结构自动生成,新增文档无需手动注册 +- 构建可控:GitHub Actions 上自定义构建流程,不受 GitHub Pages 托管限制 +- 未来扩展:VitePress 支持自定义主题、Vue 组件嵌入,为后续扩展留空间 + +### 风险 + +- 需要创建 GitHub Actions workflow(`.github/workflows/pages.yml`),而非 Jekyll 的自动构建 +- 需要在仓库 Settings → Pages 中将 Build source 从 "Deploy from a branch" 改为 "GitHub Actions" +- 旧版 Jekyll 链接(如有外部引用)需要重定向(影响极小,文档站尚未广泛传播) + +## 技术方案 + +详见 [VitePress 文档站迁移技术方案](/dev/specs/vitepress-docs-migration)。 \ No newline at end of file diff --git a/docs/dev/out-of-scope.md b/docs/dev/out-of-scope.md index 92485d6..b8501cd 100644 --- a/docs/dev/out-of-scope.md +++ b/docs/dev/out-of-scope.md @@ -8,3 +8,12 @@ - 多语言/国际化文档 — 非必要 - 文档搜索功能 — 可通过 GitHub Pages 搜索替代 - 版本化文档(多版本切换) — 待项目成熟后再考虑 + +## VitePress 文档站迁移 + +以下需求在访谈中明确排除,记录于此供后续参考: + +- 自定义 VitePress 主题 — 使用默认主题 +- 自定义域名配置 +- 多语言支持 +- 文档内容重写/重组 — 仅迁移,不修改内容 diff --git a/docs/dev/specs/vitepress-docs-migration.md b/docs/dev/specs/vitepress-docs-migration.md new file mode 100644 index 0000000..434afcf --- /dev/null +++ b/docs/dev/specs/vitepress-docs-migration.md @@ -0,0 +1,590 @@ +# VitePress 文档站迁移 — 技术方案 + +## 概述 + +将现有 Jekyll 文档站迁移到 VitePress,与项目已有的 TypeScript/Vite 技术栈统一,获得内置全文搜索、更快的 HMR 开发体验和更简洁的 CI/CD 构建流程。 + +## 1. 依赖安装 + +```bash +npm install -D vitepress +``` + +版本约束:`vitepress@^1`(最新稳定版 1.x),要求 Node.js >= 18。 + +## 2. package.json scripts + +新增 3 个 script: + +```json +{ + "scripts": { + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" + } +} +``` + +## 3. 目录结构 + +``` +docs/ +├── .vitepress/ +│ └── config.ts # 新增:VitePress 配置 +├── index.md # 保留:VitePress 首页 +├── adr/ # 保留:架构决策记录 +├── dev/ # 保留:开发文档 +├── guides/ # 保留:使用指南 +├── prd/ # 保留:产品需求文档 +├── _config.yml # 删除:Jekyll 残留 +``` + +- VitePress 的 `srcDir` 设为 `docs/`,`outDir` 设为 `../.vitepress-dist`(构建产物放在项目根目录,不污染 `docs/`) +- 所有 `.md` 文件无需移动,目录结构不变 + +## 4. VitePress 配置 + +文件:`docs/.vitepress/config.ts` + +### 4.1 基本配置 + +```ts +import { defineConfig } from 'vitepress' +import pkg from '../../package.json' + +export default defineConfig({ + title: 'opencode-cabbage', + description: '全流程开发 OpenCode 插件 — 需求→设计→任务→编码→测试→审查→自动合并', + srcDir: '.', + outDir: '../.vitepress-dist', + lastUpdated: true, + cleanUrls: true, + // ... +}) +``` + +- `title`:作为站点标题,显示在导航栏和浏览器标签 +- `srcDir: '.'`:以 `docs/` 为 VitePress 源目录 +- `outDir: '../.vitepress-dist'`:构建产物输出到项目根目录的 `.vitepress-dist/`,避免与文档源文件混淆 +- `lastUpdated: true`:基于 git 显示每页最后更新时间 +- `cleanUrls: true`:URL 去掉 `.html` 后缀 + +### 4.2 首页配置 + +VitePress 默认首页布局(hero + features): + +```ts +themeConfig: { + // ... +} +``` + +在 `docs/index.md` 中使用 frontmatter 配置首页: + +```yaml +--- +layout: home + +hero: + name: opencode-cabbage + text: 全流程开发 OpenCode 插件 + tagline: 需求→设计→任务→编码→测试→审查→自动合并 + actions: + - theme: brand + text: 快速开始 + link: /guides/quickstart + - theme: alt + text: 配置指南 + link: /guides/configuration + +features: + - title: 全流程覆盖 + details: 从需求到发布,9 个 slash command 覆盖完整开发生命周期 + - title: 自动编排 + details: @dev-lifecycle 一键触发全流程自动执行 + - title: 并行 Subagent + details: 编码阶段自动拆分任务并行执行,提升效率 +--- +``` + +版本号展示:在 hero 区域的 `name` 或 `tagline` 中通过 `{{ version }}` 引用。由于 VitePress 首页是静态 Markdown + frontmatter,无法直接使用模板变量。替代方案:在主页 `# 开源 cabbage` 标题下方用 Markdown 显示 Badge 和版本号: + +```markdown +--- +layout: home +# ... hero 配置 +--- + +

+ + npm version + +

+``` + +这样通过 npm badge 自动展示最新版本号,无需手动维护。 + +### 4.3 导航栏 + +```ts +themeConfig: { + nav: [ + { text: '首页', link: '/' }, + { text: '快速开始', link: '/guides/quickstart' }, + { + text: '文档', + items: [ + { text: '使用指南', items: [ + { text: '快速开始', link: '/guides/quickstart' }, + { text: '配置指南', link: '/guides/configuration' }, + { text: '使用指南', link: '/guides/usage' }, + { text: '架构概览', link: '/guides/architecture' }, + ]}, + { text: '开发文档', items: [ + { text: '贡献指南', link: '/dev/guides/contributing' }, + { text: '技术方案', link: '/dev/specs/opencode-cabbage-docs-and-pages' }, + { text: 'Out of Scope', link: '/dev/out-of-scope' }, + ]}, + { text: 'ADR', items: [ + { text: 'ADR 0001', link: '/adr/0001-replace-openspec-with-full-flow' }, + { text: 'ADR 0002', link: '/adr/2026-07-10-jekyll-github-pages-docs' }, + { text: 'ADR 0003', link: '/adr/2026-07-10-jekyll-to-vitepress' }, + ]}, + { text: 'PRD', items: [ + { text: 'Docs & Pages', link: '/prd/opencode-cabbage-docs-and-pages' }, + { text: 'VitePress 迁移', link: '/prd/vitepress-docs-migration' }, + ]}, + ], + }, + ], +} +``` + +### 4.4 自动侧边栏 + +按目录自动生成侧边栏,使用 `getSidebar()` 工具函数: + +```ts +import { readdirSync, statSync } from 'node:fs' +import { join, relative } from 'node:path' +import type { DefaultTheme } from 'vitepress' + +function getSidebar(): DefaultTheme.Sidebar { + const docsDir = join(import.meta.dirname, '..') + const sidebar: DefaultTheme.Sidebar = {} + + function walk(dir: string, base: string) { + const entries = readdirSync(dir).sort() + for (const entry of entries) { + if (entry.startsWith('.') || entry === 'index.md') continue + const fullPath = join(dir, entry) + const relativePath = relative(docsDir, fullPath) + + if (statSync(fullPath).isDirectory()) { + const items = walk(fullPath, base) + if (items.length > 0) { + sidebar[`/${relativePath}/`] = items + } + } else if (entry.endsWith('.md')) { + // 返回 { text, link } 对象,后续由调用方组装 + // 此处简化:直接返回路径列表 + } + } + } + + // 为每个目录生成侧边栏 + ;['guides', 'dev', 'adr', 'prd'].forEach(dir => { + const fullDir = join(docsDir, dir) + const items: DefaultTheme.SidebarItem[] = [] + const entries = readdirSync(fullDir).sort() + for (const entry of entries) { + if (entry.startsWith('.')) continue + const fullPath = join(fullDir, entry) + if (entry.endsWith('.md')) { + const name = entry.replace('.md', '') + items.push({ + text: name.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + link: `/${dir}/${name}`, + }) + } else if (statSync(fullPath).isDirectory()) { + const subEntries = readdirSync(fullPath).sort() + const subItems: DefaultTheme.SidebarItem[] = subEntries + .filter(e => e.endsWith('.md')) + .map(e => ({ + text: e.replace('.md', '').replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + link: `/${dir}/${entry}/${e.replace('.md', '')}`, + })) + if (subItems.length > 0) { + items.push({ + text: entry.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + collapsed: false, + items: subItems, + }) + } + } + } + if (items.length > 0) { + sidebar[`/${dir}/`] = [{ text: dir.charAt(0).toUpperCase() + dir.slice(1), items }] + } + }) + + return sidebar +} +``` + +### 4.5 搜索配置 + +VitePress 内置 minisearch,无需额外配置即可启用。在 `themeConfig` 中配置: + +```ts +themeConfig: { + search: { + provider: 'local', + options: { + translations: { + button: { + buttonText: '搜索', + buttonAriaLabel: '搜索文档', + }, + modal: { + displayDetails: '显示详情', + noResultsText: '未找到相关结果', + resetButtonTitle: '清除搜索', + footer: { + selectText: '选择', + navigateText: '切换', + closeText: '关闭', + }, + }, + }, + }, + }, +} +``` + +### 4.6 完整配置 + +```ts +// docs/.vitepress/config.ts +import { defineConfig } from 'vitepress' +import { readdirSync, statSync } from 'node:fs' +import { join, relative } from 'node:path' +import type { DefaultTheme } from 'vitepress' + +function getSidebar(): DefaultTheme.Sidebar { + const docsDir = join(import.meta.dirname, '..') + const sidebar: DefaultTheme.Sidebar = {} + + const dirLabels: Record = { + guides: '使用指南', + adr: '架构决策记录', + dev: '开发文档', + prd: '产品需求文档', + } + + for (const dir of ['guides', 'adr', 'dev', 'prd']) { + const fullDir = join(docsDir, dir) + const items: DefaultTheme.SidebarItem[] = [] + const entries = readdirSync(fullDir).sort() + for (const entry of entries) { + if (entry.startsWith('.')) continue + const fullPath = join(fullDir, entry) + if (entry.endsWith('.md')) { + const name = entry.replace('.md', '') + items.push({ + text: name.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + link: `/${dir}/${name}`, + }) + } else if (statSync(fullPath).isDirectory()) { + const subEntries = readdirSync(fullPath).sort().filter(e => e.endsWith('.md')) + if (subEntries.length > 0) { + items.push({ + text: entry.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + collapsed: false, + items: subEntries.map(e => ({ + text: e.replace('.md', '').replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + link: `/${dir}/${entry}/${e.replace('.md', '')}`, + })), + }) + } + } + } + if (items.length > 0) { + sidebar[`/${dir}/`] = [{ text: dirLabels[dir] || dir, items }] + } + } + + return sidebar +} + +export default defineConfig({ + title: 'opencode-cabbage', + description: '全流程开发 OpenCode 插件 — 需求→设计→任务→编码→测试→审查→自动合并', + srcDir: '.', + outDir: '../.vitepress-dist', + lastUpdated: true, + cleanUrls: true, + + themeConfig: { + nav: [ + { text: '首页', link: '/' }, + { text: '快速开始', link: '/guides/quickstart' }, + { + text: '使用指南', + items: [ + { text: '快速开始', link: '/guides/quickstart' }, + { text: '配置指南', link: '/guides/configuration' }, + { text: '使用指南', link: '/guides/usage' }, + { text: '架构概览', link: '/guides/architecture' }, + ], + }, + { + text: '开发', + items: [ + { text: '贡献指南', link: '/dev/guides/contributing' }, + { text: '技术方案', link: '/dev/specs/opencode-cabbage-docs-and-pages' }, + { text: 'VitePress 迁移', link: '/dev/specs/vitepress-docs-migration' }, + { text: 'Out of Scope', link: '/dev/out-of-scope' }, + { text: '任务拆解', link: '/dev/tasks/pages-deployment-workflow' }, + ], + }, + { + text: 'ADR', + items: [ + { text: '0001 - 替换 OpenSpec', link: '/adr/0001-replace-openspec-with-full-flow' }, + { text: '0002 - Jekyll 文档站', link: '/adr/2026-07-10-jekyll-github-pages-docs' }, + { text: '0003 - 迁移 VitePress', link: '/adr/2026-07-10-jekyll-to-vitepress' }, + ], + }, + { + text: 'PRD', + items: [ + { text: 'Docs & Pages', link: '/prd/opencode-cabbage-docs-and-pages' }, + { text: 'VitePress 迁移', link: '/prd/vitepress-docs-migration' }, + ], + }, + ], + + sidebar: getSidebar(), + + search: { + provider: 'local', + options: { + translations: { + button: { + buttonText: '搜索', + buttonAriaLabel: '搜索文档', + }, + modal: { + displayDetails: '显示详情', + noResultsText: '未找到相关结果', + resetButtonTitle: '清除搜索', + footer: { + selectText: '选择', + navigateText: '切换', + closeText: '关闭', + }, + }, + }, + }, + }, + + socialLinks: [ + { icon: 'github', link: 'https://github.com/devcxl/opencode-cabbage' }, + ], + + editLink: { + pattern: 'https://github.com/devcxl/opencode-cabbage/edit/main/docs/:path', + }, + + lastUpdated: { + text: '最后更新', + }, + + docFooter: { + prev: '上一页', + next: '下一页', + }, + }, +}) +``` + +## 5. 首页改造 + +文件:`docs/index.md` + +将现有 Jekyll 首页内容替换为 VitePress 首页布局: + +```markdown +--- +layout: home + +hero: + name: opencode-cabbage + text: 全流程开发 OpenCode 插件 + tagline: 需求→设计→任务→编码→测试→审查→自动合并 + actions: + - theme: brand + text: 快速开始 + link: /guides/quickstart + - theme: alt + text: 配置指南 + link: /guides/configuration + +features: + - title: 全流程覆盖 + details: 从需求到发布,9 个 slash command 覆盖完整开发生命周期 + icon: 🔄 + - title: 自动编排 + details: 需求确认后输入 @dev-lifecycle,全自动完成剩余流程 + icon: 🤖 + - title: 并行 Subagent + details: 编码阶段自动拆分任务并行执行,大幅提升开发效率 + icon: ⚡ + - title: 双轴审查 + details: 规范审查 + 规格审查,确保代码质量与需求一致性 + icon: ✅ +--- + +

+ + npm version + + + license + +

+ +## 命令一览 + +| 命令 | 阶段 | 产出 | +|------|------|------| +| `/setup` | 初始化 | docs/ 目录结构、环境验证 | +| `/requirements` | 需求 | PRD → GitHub Issue | +| `/design` | 设计 | 技术方案 + ADR | +| `/tasks` | 任务拆解 | DAG 任务 + Sub Issues | +| `/code` | 编码 | 分支 + 代码 + PR | +| `/test` | 测试 | CI + 监控 + 汇报 | +| `/review` | 审查 | 双轴审查 + 自动合并 | +| `/release` | ⚠️ 手动 | 版本 → Changelog → Release → npm publish | +| `/handoff` | 交接 | 打包上下文,跨会话传递 | + +## 快速安装 + +```json +{ + "plugin": ["@devcxl/opencode-cabbage"] +} +``` + +插件启动后自动注入 9 个 slash command、9 个 flow skill、5 个 agent。 +``` + +## 6. CI/CD 更新 + +当前不存在 `.github/workflows/pages.yml`,需新建。 + +文件:`.github/workflows/pages.yml` + +```yaml +name: Deploy VitePress to GitHub Pages + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build VitePress + run: npm run docs:build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: .vitepress-dist + + - name: Deploy to GitHub Pages + uses: actions/deploy-pages@v4 +``` + +关键点: +- `actions/upload-pages-artifact@v3` 上传 `.vitepress-dist/` 目录作为 Pages 部署源 +- 使用 `actions/deploy-pages@v4` 替代旧版 `peaceiris/actions-gh-pages`,这是 GitHub 官方推荐的 Pages 部署方式 +- `permissions` 配置 `pages: write` 和 `id-token: write` 是 `deploy-pages` action 的必需权限 +- `concurrency` 防止并发部署 + +## 7. Jekyll 残留清理 + +需删除/修改的文件: + +| 文件 | 操作 | 原因 | +|------|------|------| +| `docs/_config.yml` | 删除 | Jekyll 配置文件,不再需要 | +| `.nojekyll` | 无需创建 | VitePress 构建输出已包含 `.nojekyll`,或由 GitHub Pages Action 处理 | + +注意:GitHub Pages 在部署时,如果检测到 `_config.yml` 或 Jekyll 标记文件,会默认使用 Jekyll 构建。旧版 `peaceiris/actions-gh-pages` 需要手动添加 `.nojekyll`;但使用 `actions/upload-pages-artifact` + `actions/deploy-pages` 时,部署的是静态 HTML 产物,不会触发 Jekyll 构建,因此无需 `.nojekyll`。 + +## 8. 版本号读取方案 + +首页使用 npm badge 动态展示版本号,无需从 `package.json` 读取。VitePress 配置中如需读取版本号用于其他用途(如 `title` 后缀),可以在 `config.ts` 中直接 import: + +```ts +import pkg from '../../package.json' +// pkg.version → "0.1.0" +``` + +## 9. 实施计划 + +| 步骤 | 子任务 | 验收标准 | 预估影响文件 | +|------|--------|----------|-------------| +| 1 | 安装 vitepress | `npm ls vitepress` 显示版本 | `package.json` | +| 2 | 添加 scripts | `npm run docs:dev` 可启动 | `package.json` | +| 3 | 创建 VitePress 配置 | `docs/.vitepress/config.ts` 语法正确 | 新建 1 文件 | +| 4 | 改造首页 | 首页显示 hero + features + 命令一览 | 修改 `docs/index.md` | +| 5 | 创建 CI workflow | `.github/workflows/pages.yml` 存在 | 新建 1 文件 | +| 6 | 删除 Jekyll 配置 | `docs/_config.yml` 已删除 | 删除 1 文件 | +| 7 | 本地验证 | `npm run docs:dev` 可预览全部页面 | — | +| 8 | 构建验证 | `npm run docs:build` 成功,无 dead link | — | + +## 10. 风险与对策 + +| 风险 | 影响 | 对策 | +|------|------|------| +| VitePress 将 `.md` 内部链接的处理方式与 Jekyll 不同 | 部分链接可能 404 | 构建后使用 `vitepress build` 的 `ignoreDeadLinks` 检查,或手动遍历所有页面 | +| `actions/deploy-pages` 需要仓库 Settings 中开启 Pages 源为 "GitHub Actions" | 部署失败 | 在 PR 中注明需要手动配置 | +| 子目录 `dev/tasks/` 等有 7 个文件,侧边栏可能过长 | 导航体验差 | 使用 `collapsed: true` 默认折叠 tasks 子目录 | +| ESM 项目 (`"type": "module"`) 的 config.ts 文件扩展名冲突 | VitePress 配置加载失败 | VitePress 支持 `.ts` 配置文件,与 `"type": "module"` 兼容 | + +## 11. 技术选型与约束 + +- **VitePress 版本**: `^1.x`(最新稳定版) +- **Node.js**: >= 18(与项目现有约束一致) +- **构建输出**: `.vitepress-dist/`(Git 忽略) +- **部署方式**: GitHub Actions + GitHub Pages +- **主题**: 默认主题(不做自定义) +- **搜索**: 本地 minisearch(无需外部服务) \ No newline at end of file diff --git a/docs/dev/tasks/DAG.md b/docs/dev/tasks/DAG.md new file mode 100644 index 0000000..ec6606d --- /dev/null +++ b/docs/dev/tasks/DAG.md @@ -0,0 +1,90 @@ +--- +title: "VitePress 迁移 — DAG 任务依赖图" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/17" +--- + +## DAG 拓扑 + +``` +A (VitePress 初始化) +├── B (首页配置) +├── C (内容迁移) +├── D (侧边栏与导航栏) +└── E (CI/CD 更新) + └── F (Jekyll 清理) +``` + +## 任务列表 + +| 批次 | 任务 | 依赖 | 可并行 | +|------|------|------|--------| +| Batch 1 | A. VitePress 初始化 | 无 | — | +| Batch 2 | B. 首页配置 | A | ✓ | +| Batch 2 | C. 内容迁移 | A | ✓ | +| Batch 2 | D. 侧边栏与导航栏 | A | ✓ | +| Batch 2 | E. CI/CD 更新 | A | ✓ | +| Batch 3 | F. Jekyll 清理 | E | — | + +## 执行顺序 + +### Batch 1 — 基础设施 + +**A. VitePress 初始化** +- 安装 vitepress 依赖 +- 添加 npm scripts +- 创建 `docs/.vitepress/config.ts`(完整配置) +- 更新 `.gitignore` + +→ 验证:`npm run docs:dev` 可启动 + +### Batch 2 — 并行执行(4 个任务无相互依赖) + +**B. 首页配置** +- 替换 `docs/index.md` 为 VitePress 首页布局 +- 添加 hero、features、npm badge、命令一览表 + +**C. 内容迁移** +- 验证全部 21 个 `.md` 文件可访问 +- 修正内部链接(`.md` 后缀 → clean URL) + +**D. 侧边栏与导航栏** +- 验证 `getSidebar()` 自动生成正确 +- 验证导航栏下拉菜单链接全部可达 +- 调整 `dev/tasks/` 子目录默认折叠 + +**E. CI/CD 更新** +- 替换 `.github/workflows/pages.yml` 为 VitePress 构建流程 +- 使用 `actions/upload-pages-artifact@v3` + `actions/deploy-pages@v4` + +→ 验证:`npm run docs:build` 成功 + pages.yml 语法正确 + +### Batch 3 — 收尾 + +**F. Jekyll 清理** +- 删除 `docs/_config.yml` +- 确认无 Jekyll 残留 +- 验证 GitHub Pages 部署成功 + +→ 验证:线上站点显示 VitePress 页面 + +## 影响文件 + +| 文件 | 操作 | 任务 | +|------|------|------| +| `package.json` | 修改(deps + scripts) | A | +| `docs/.vitepress/config.ts` | 新建 | A | +| `.gitignore` | 修改(追加) | A | +| `docs/index.md` | 修改 | B | +| 各 `.md` 文件内部链接 | 修改(如有需要) | C | +| `.github/workflows/pages.yml` | 修改 | E | +| `docs/_config.yml` | 删除 | F | + +## 风险 + +| 风险 | 影响 | 对策 | 涉及任务 | +|------|------|------|----------| +| VitePress 内部链接处理与 Jekyll 不同 | 部分链接 404 | 构建后检查 dead link,任务 C 中修正 | C | +| `actions/deploy-pages` 需要 Pages Source 设为 "GitHub Actions" | 部署失败 | PR 中注明需手动配置仓库 Settings | E | +| `dev/tasks/` 7 个文件侧边栏过长 | 导航体验差 | 默认折叠(`collapsed: true`) | D | +| ESM 项目 `"type": "module"` 与配置文件兼容性 | 配置加载失败 | VitePress `.ts` 配置文件与 ESM 兼容 | A | \ No newline at end of file diff --git a/docs/dev/tasks/cicd-update.md b/docs/dev/tasks/cicd-update.md new file mode 100644 index 0000000..f626933 --- /dev/null +++ b/docs/dev/tasks/cicd-update.md @@ -0,0 +1,86 @@ +--- +title: "E. CI/CD 更新" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/17" +--- + +## 描述 + +将 `.github/workflows/pages.yml` 从 Jekyll 构建流程改为 VitePress 构建流程,保留 GitHub Pages 部署。 + +## 验收标准 + +- [ ] `.github/workflows/pages.yml` 使用 VitePress 构建而非 Jekyll +- [ ] workflow 包含 `npm ci` + `npm run docs:build` 步骤 +- [ ] 使用 `actions/upload-pages-artifact@v3` 上传 `.vitepress-dist` 目录 +- [ ] 使用 `actions/deploy-pages@v4` 部署到 GitHub Pages +- [ ] `permissions` 包含 `pages: write` 和 `id-token: write` +- [ ] `concurrency` 配置防止并发部署 +- [ ] push 到 main 分支时自动触发 + +## 实现要点 + +### 替换文件内容 + +将 `pages.yml` 完整替换为: + +```yaml +name: Deploy VitePress to GitHub Pages + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build VitePress + run: npm run docs:build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: .vitepress-dist + + - name: Deploy to GitHub Pages + uses: actions/deploy-pages@v4 +``` + +### 关键变更 + +| 旧 (Jekyll) | 新 (VitePress) | +|-------------|----------------| +| `actions/configure-pages@v5` | 移除(不需要) | +| `actions/jekyll-build-pages@v1` | `npm ci` + `npm run docs:build` | +| `upload-pages-artifact` 无 path | `path: .vitepress-dist` | +| `deploy` job 独立 | 合并到 `build` job | + +### 注意事项 + +- 仓库 Settings → Pages 需要设置 Source 为 "GitHub Actions" +- 现有 trigger 条件 `paths: docs/**, README.md, _config.yml` 需移除(或改为通用触发),因为 `_config.yml` 将被删除 +- Node.js 版本使用 20(与项目 `engines` 约束一致) +- 使用 `npm ci` 而非 `npm install`(更快、更可靠) \ No newline at end of file diff --git a/docs/dev/tasks/content-migration.md b/docs/dev/tasks/content-migration.md new file mode 100644 index 0000000..840c7c2 --- /dev/null +++ b/docs/dev/tasks/content-migration.md @@ -0,0 +1,63 @@ +--- +title: "C. 内容迁移" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/17" +--- + +## 描述 + +验证全部 21 个 `.md` 文件在 VitePress 下可正常访问,修复内部链接格式(`.md` 后缀 → clean URL),确保 frontmatter 兼容。 + +## 验收标准 + +- [ ] 全部 21 个 `.md` 文件在 `npm run docs:dev` 下可正常访问 +- [ ] 所有内部链接使用 clean URL 格式(不带 `.md` 后缀) +- [ ] 所有文件的 frontmatter 与 VitePress 兼容(无报错) +- [ ] 无 dead link(404 页面) + +## 文件清单 + +| 目录 | 文件 | 数量 | +|------|------|------| +| 根 | `docs/index.md` | 1 | +| guides/ | `quickstart.md`, `configuration.md`, `usage.md`, `architecture.md` | 4 | +| adr/ | `0001-replace-openspec-with-full-flow.md`, `2026-07-10-jekyll-github-pages-docs.md`, `2026-07-10-jekyll-to-vitepress.md` | 3 | +| dev/ | `out-of-scope.md` | 1 | +| dev/guides/ | `contributing.md` | 1 | +| dev/specs/ | `opencode-cabbage-docs-and-pages.md`, `vitepress-docs-migration.md` | 2 | +| dev/tasks/ | `pages-deployment-workflow.md`, `architecture-doc.md`, `site-index-and-config.md`, `quickstart-guide.md`, `usage-guide.md`, `readme-update.md`, `configuration-guide.md` | 7 | +| prd/ | `opencode-cabbage-docs-and-pages.md`, `vitepress-docs-migration.md` | 2 | + +**合计:21 个文件** + +## 实现要点 + +### 链接格式修正 + +全局搜索 `.md)` 后缀的内部链接,替换为 clean URL 格式: + +- `[快速开始](guides/quickstart.md)` → `[快速开始](/guides/quickstart)` +- `[贡献指南](dev/guides/contributing.md)` → `[贡献指南](/dev/guides/contributing)` + +搜索范围:`docs/` 下所有 `.md` 文件。 + +### 检查命令 + +```bash +# 搜索所有包含 .md 后缀的内部链接 +rg '\([^)]*\.md\)' docs/ --glob '*.md' +``` + +### 需要注意的文件 + +- `docs/guides/quickstart.md` — 可能包含对 `configuration.md` 等文件的引用 +- `docs/guides/usage.md` — 可能包含对其他 guide 文件的引用 +- `docs/guides/architecture.md` — 可能包含对实现文件的引用 +- `docs/index.md` (任务 B 处理) — 首页链接已处理 + +### 不需要修改的内容 + +- **文档内容**本身不做任何修改(Out of Scope) +- **frontmatter** 如已存在且格式正确,不做修改 +- **外部链接**(`https://` 开头)不做修改 +- **图片链接**(如 shields.io badge)不做修改 \ No newline at end of file diff --git a/docs/dev/tasks/homepage-config.md b/docs/dev/tasks/homepage-config.md new file mode 100644 index 0000000..a8aa358 --- /dev/null +++ b/docs/dev/tasks/homepage-config.md @@ -0,0 +1,67 @@ +--- +title: "B. 首页配置" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/17" +--- + +## 描述 + +将 `docs/index.md` 从 Jekyll 格式改造为 VitePress 首页布局(hero + features),展示 npm 版本号 badge 和命令一览表。 + +## 验收标准 + +- [ ] 首页显示 hero 区域:项目名称 + 描述 + 两个 CTA 按钮(快速开始、配置指南) +- [ ] 首页显示 features 区域:4 个功能卡片(全流程覆盖、自动编排、并行 Subagent、双轴审查) +- [ ] 首页显示 npm 版本号 badge(通过 shields.io) +- [ ] 首页显示命令一览表(9 个 slash command) +- [ ] 首页显示快速安装代码块 +- [ ] 首页无 Jekyll 残留内容 + +## 实现要点 + +### 首页 frontmatter + +```yaml +--- +layout: home +--- +``` + +### hero 配置 + +- `name`: `opencode-cabbage` +- `text`: `全流程开发 OpenCode 插件` +- `tagline`: `需求→设计→任务→编码→测试→审查→自动合并` +- `actions`: 两个按钮分别指向 `/guides/quickstart` 和 `/guides/configuration` + +### features 配置 + +4 个功能卡片,每个包含 `title`、`details`、`icon`。 + +### 版本号 + +使用 npm badge 动态展示,无需手动维护: + +```html +

+ + npm version + + + license + +

+``` + +### 命令一览表 + +保留现有 Markdown 表格,格式不做修改。 + +### 快速安装 + +保留现有代码块,不做修改。 + +### 注意事项 + +- VitePress 首页模式下,hero 和 features 通过 frontmatter 配置,其下方的 Markdown 内容(命令一览、安装代码块)会正常渲染在 features 下方 +- 旧 Jekyll 首页的 `[快速链接](guides/quickstart.md)` 格式需改为 `(/guides/quickstart)` 不带 `.md` 后缀(VitePress clean URLs) \ No newline at end of file diff --git a/docs/dev/tasks/jekyll-cleanup.md b/docs/dev/tasks/jekyll-cleanup.md new file mode 100644 index 0000000..cc090bb --- /dev/null +++ b/docs/dev/tasks/jekyll-cleanup.md @@ -0,0 +1,54 @@ +--- +title: "F. Jekyll 清理" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/17" +--- + +## 描述 + +删除 Jekyll 配置文件 `docs/_config.yml`,确认无 Jekyll 残留,确保 GitHub Pages 部署后使用 VitePress 构建产物。 + +## 验收标准 + +- [ ] `docs/_config.yml` 已删除 +- [ ] 无其他 Jekyll 相关文件残留(如 `Gemfile`、`Gemfile.lock`、`_layouts/`、`_includes/` 等) +- [ ] GitHub Pages 部署成功后,访问站点显示 VitePress 页面(而非 Jekyll 页面) +- [ ] `.vitepress-dist` 目录已加入 `.gitignore`(任务 A 处理) + +## 实现要点 + +### 删除文件 + +```bash +rm docs/_config.yml +``` + +### 检查 Jekyll 残留 + +```bash +# 检查是否存在 Jekyll 典型文件 +ls -la docs/_layouts docs/_includes docs/_posts docs/_data 2>/dev/null +ls -la Gemfile Gemfile.lock 2>/dev/null +``` + +### 注意事项 + +- 使用 `actions/upload-pages-artifact` + `actions/deploy-pages` 部署的是静态 HTML 产物,不会触发 Jekyll 构建,因此无需 `.nojekyll` 文件 +- 如果仓库 Settings 中 Pages Source 仍为 "Deploy from a branch",需改为 "GitHub Actions" +- 删除 `_config.yml` 后,GitHub Pages 不会自动触发 Jekyll 构建 + +### 部署验证 + +1. 合并 PR 到 main 分支 +2. 等待 GitHub Actions 完成部署 +3. 访问 `https://devcxl.github.io/opencode-cabbage/` 确认显示 VitePress 页面 +4. 检查首页是否显示 hero + features + npm badge +5. 检查侧边栏和导航栏是否正常工作 +6. 检查全文搜索是否可用 + +### 风险 + +| 风险 | 对策 | +|------|------| +| 部署后短暂 404 | 等待 GitHub Pages 缓存刷新(通常 1-2 分钟) | +| 旧 Jekyll 页面缓存 | 浏览器强制刷新(Ctrl+Shift+R) | \ No newline at end of file diff --git a/docs/dev/tasks/sidebar-nav-config.md b/docs/dev/tasks/sidebar-nav-config.md new file mode 100644 index 0000000..5cee519 --- /dev/null +++ b/docs/dev/tasks/sidebar-nav-config.md @@ -0,0 +1,67 @@ +--- +title: "D. 侧边栏与导航栏配置" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/17" +--- + +## 描述 + +验证 VitePress 配置中的自动侧边栏和导航栏在所有目录下正确工作,必要时调整 `getSidebar()` 函数和导航栏配置。 + +## 验收标准 + +- [ ] `guides/` 下 4 个文件在侧边栏中正确显示,标题为中文 +- [ ] `adr/` 下 3 个文件在侧边栏中正确显示,文件名转标题格式正确 +- [ ] `dev/` 下子目录(`guides/`、`specs/`、`tasks/`)在侧边栏中正确嵌套显示 +- [ ] `dev/tasks/` 子目录(7 个文件)默认折叠(`collapsed: true`) +- [ ] `prd/` 下 2 个文件在侧边栏中正确显示 +- [ ] 导航栏下拉菜单链接全部可达 +- [ ] 导航栏"首页"和"快速开始"链接正确 + +## 实现要点 + +### 侧边栏配置 + +使用 `getSidebar()` 函数自动遍历目录生成侧边栏,在 `config.ts` 中已实现(任务 A)。本任务重点验证: + +1. **目录标签映射**: + ```ts + const dirLabels: Record = { + guides: '使用指南', + adr: '架构决策记录', + dev: '开发文档', + prd: '产品需求文档', + } + ``` + +2. **文件名转标题**:`pages-deployment-workflow` → `Pages Deployment Workflow` + +3. **tasks 子目录默认折叠**:`collapsed: true` + +### 导航栏配置 + +已实现的导航栏结构: + +``` +首页 | 快速开始 | 使用指南 ▼ | 开发 ▼ | ADR ▼ | PRD ▼ +``` + +### 验证方法 + +```bash +# 启动开发服务器,逐一检查每个目录的侧边栏 +npm run docs:dev +``` + +需要人工验证的页面: +- `/guides/quickstart` — 侧边栏显示 4 个 guide 文件 +- `/adr/0001-replace-openspec-with-full-flow` — 侧边栏显示 3 个 ADR 文件 +- `/dev/guides/contributing` — 侧边栏嵌套显示 dev 子目录 +- `/dev/tasks/pages-deployment-workflow` — tasks 子目录默认折叠 +- `/prd/opencode-cabbage-docs-and-pages` — 侧边栏显示 2 个 PRD 文件 + +### 可能需要的调整 + +- 如果 `getSidebar()` 函数中 `readdirSync` 排序不符合预期,调整排序逻辑 +- 如果文件名转标题格式不美观,调整 `replace` 正则 +- 如果某些子目录不需要显示在侧边栏中,添加排除逻辑 \ No newline at end of file diff --git a/docs/dev/tasks/vitepress-init.md b/docs/dev/tasks/vitepress-init.md new file mode 100644 index 0000000..7310dec --- /dev/null +++ b/docs/dev/tasks/vitepress-init.md @@ -0,0 +1,59 @@ +--- +title: "A. VitePress 初始化" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/17" +--- + +## 描述 + +安装 VitePress 依赖,创建完整配置文件,添加 npm scripts,更新 `.gitignore`。 + +## 验收标准 + +- [ ] `npm ls vitepress` 显示 `vitepress@^1` 已安装 +- [ ] `package.json` 包含 `docs:dev`、`docs:build`、`docs:preview` 三个 scripts +- [ ] `docs/.vitepress/config.ts` 存在且语法正确 +- [ ] `.gitignore` 包含 `.vitepress-dist` +- [ ] `npm run docs:dev` 可启动 VitePress 开发服务器(首页可能空白,任务 B 完成后才显示内容) + +## 实现要点 + +### 安装依赖 + +```bash +npm install -D vitepress +``` + +### 添加 scripts + +在 `package.json` 的 `scripts` 中新增: + +```json +"docs:dev": "vitepress dev docs", +"docs:build": "vitepress build docs", +"docs:preview": "vitepress preview docs" +``` + +### 创建配置文件 + +`docs/.vitepress/config.ts` — 完整配置包含: + +- **基本配置**:`title`、`description`、`srcDir`、`outDir`、`lastUpdated`、`cleanUrls` +- **导航栏**:首页、快速开始、使用指南下拉、开发下拉、ADR 下拉、PRD 下拉 +- **自动侧边栏**:`getSidebar()` 函数遍历 `guides/`、`dev/`、`adr/`、`prd/` 目录生成侧边栏 +- **搜索**:本地 minisearch,中文翻译 +- **社交链接**:GitHub +- **编辑链接**:指向 GitHub 仓库 +- **页脚配置**:中文上下页文案 + +详见技术方案 4.6 节完整配置代码。 + +### 更新 .gitignore + +追加一行 `.vitepress-dist`。 + +### 特殊处理 + +- `dev/tasks/` 子目录有 7 个文件,侧边栏中设为 `collapsed: true` 默认折叠 +- 项目 `"type": "module"`,VitePress `.ts` 配置文件与之兼容 +- `outDir` 设为 `../.vitepress-dist`,构建产物在项目根目录 \ No newline at end of file diff --git a/docs/guides/quickstart.md b/docs/guides/quickstart.md index 152f367..8a79283 100644 --- a/docs/guides/quickstart.md +++ b/docs/guides/quickstart.md @@ -53,6 +53,6 @@ ## 下一步 -- [配置指南](configuration.md) — 了解所有配置选项 -- [使用指南](usage.md) — 命令详解与最佳实践 -- [架构概览](architecture.md) — 了解插件工作原理 +- [配置指南](/guides/configuration) — 了解所有配置选项 +- [使用指南](/guides/usage) — 命令详解与最佳实践 +- [架构概览](/guides/architecture) — 了解插件工作原理 diff --git a/docs/index.md b/docs/index.md index ba2be26..71e7395 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,43 +1,68 @@ -# @devcxl/opencode-cabbage +--- +layout: home -全流程开发 OpenCode 插件 — 覆盖需求→设计→任务→编码→测试→审查→发布完整开发生命周期,支持自动编排与并行 Subagent。 +hero: + name: opencode-cabbage + text: 全流程开发 OpenCode 插件 + tagline: 需求→设计→任务→编码→测试→审查→自动合并 + actions: + - theme: brand + text: 快速开始 + link: /guides/quickstart + - theme: alt + text: 配置指南 + link: /guides/configuration -## 快速链接 +features: + - title: 全流程覆盖 + details: 从需求到发布,9 个 slash command 覆盖完整开发生命周期 + icon: 🔄 + - title: 自动编排 + details: 需求确认后输入 @dev-lifecycle,全自动完成剩余流程 + icon: 🤖 + - title: 并行 Subagent + details: 编码阶段自动拆分任务并行执行,大幅提升开发效率 + icon: ⚡ + - title: 双轴审查 + details: 规范审查 + 规格审查,确保代码质量与需求一致性 + icon: ✅ +--- -| 文档 | 说明 | -|------|------| -| [快速开始](guides/quickstart.md) | 5 分钟上手 | -| [配置指南](guides/configuration.md) | 完整配置说明 | -| [使用指南](guides/usage.md) | 命令详解与最佳实践 | -| [架构概览](guides/architecture.md) | 插件设计与核心概念 | -| [贡献指南](dev/guides/contributing.md) | 如何参与开发 | +

+ + npm version + + + license + + + CI + + + GitHub Pages + +

## 命令一览 | 命令 | 阶段 | 产出 | |------|------|------| | `/setup` | 初始化 | docs/ 目录结构、环境验证 | -| `/requirements` | 需求 | PRD → `docs/prd/` + GitHub Issue | -| `/design` | 设计 | 技术方案 + ADR → `docs/dev/specs/` + `docs/adr/` | -| `/tasks` | 任务拆解 | DAG 任务 + Sub Issues → `docs/dev/tasks/` | -| `/code` | 编码 | 分支 + 代码 + 单测 + PR | -| `/test` | 测试 | 触发 CI + 监控 + 汇报 | +| `/requirements` | 需求 | PRD → GitHub Issue | +| `/design` | 设计 | 技术方案 + ADR | +| `/tasks` | 任务拆解 | DAG 任务 + Sub Issues | +| `/code` | 编码 | 分支 + 代码 + PR | +| `/test` | 测试 | CI + 监控 + 汇报 | | `/review` | 审查 | 双轴审查 + 自动合并 | -| `/release` | ⚠️ 手动发布 | 版本 → Changelog → Release → npm publish | +| `/release` | ⚠️ 手动 | 版本 → Changelog → Release → npm publish | | `/handoff` | 交接 | 打包上下文,跨会话传递 | ## 快速安装 ```json -// opencode.json { "plugin": ["@devcxl/opencode-cabbage"] } ``` 插件启动后自动注入 9 个 slash command、9 个 flow skill、5 个 agent。 - -## 两种模式 - -- **手动模式** — 按顺序逐一执行命令,适合精细控制 -- **自动模式** — 需求确认后输入 `@dev-lifecycle`,全自动完成剩余流程 diff --git a/docs/prd/vitepress-docs-migration.md b/docs/prd/vitepress-docs-migration.md new file mode 100644 index 0000000..ec3c28d --- /dev/null +++ b/docs/prd/vitepress-docs-migration.md @@ -0,0 +1,66 @@ +# VitePress 文档站迁移 + +## 概述 + +将现有 Jekyll 文档站迁移到 VitePress,获得更好的开发体验、更快的构建速度和更现代的交互能力。 + +## 用户故事 + +- 作为**开发者/贡献者**,我希望文档站加载快、支持全文搜索、有清晰的导航结构 +- 作为**项目维护者**,我希望文档站构建简单、与项目技术栈一致(TypeScript/Vite) + +## In Scope + +1. **Jekyll → VitePress 迁移** + - 初始化 VitePress 配置(默认主题) + - 迁移 `docs/` 下全部 `.md` 文件 + - 配置自动侧边栏 + 导航栏 + - 开启全文搜索 + +2. **首页改造** + - VitePress 默认首页布局 + - 展示 npm 版本号(`0.1.0`) + - 纯文字标题,无 Logo + +3. **CI/CD 更新** + - 更新 `.github/workflows/pages.yml`:Jekyll → VitePress 构建 + - 保留 GitHub Pages 部署 + +4. **清理** + - 删除 Jekyll 配置(`docs/_config.yml`) + - 确认无残留 Jekyll 依赖 + +## Out of Scope + +- 自定义 VitePress 主题 — 使用默认主题 +- 自定义域名配置 +- 多语言支持 +- 文档内容重写/重组 — 仅迁移,不修改内容 + +## 验收标准 + +- [x] 本地 `npm run docs:dev` 可正常预览 +- [x] 全部 18 个 `.md` 文件迁移无遗漏 +- [x] 侧边栏按目录结构自动生成 +- [x] 全文搜索可用 +- [x] 首页展示项目名称 + 版本号 +- [x] GitHub Pages 部署成功可访问 +- [x] 旧 Jekyll 文件已清理 + +## 技术约束 + +- 使用 VitePress 最新稳定版 +- 项目本身是 TypeScript 包,VitePress 构建与之兼容 +- Node.js >= 18 +- 部署到 GitHub Pages(现有 Pages 配置上修改) +- Jekyll 配置(`_config.yml`)需在构建前移除,否则 GitHub Pages 默认 Jekyll 会干扰 + +## 优先级 + +| 项 | 优先级 | +|----|--------| +| VitePress 初始化 + 配置 | P0 | +| 内容迁移 | P0 | +| CI/CD 更新 | P0 | +| 首页版本号 | P1 | +| Jekyll 清理 | P1 | diff --git a/package-lock.json b/package-lock.json index 752a688..83f9fc7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "devDependencies": { "@types/node": "^24.6.0", "typescript": "^5.9.3", + "vitepress": "^1.6.4", "vitest": "^3.2.4" } }, @@ -30,10 +31,369 @@ "node": ">=18" } }, + "node_modules/@algolia/abtesting": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.21.2.tgz", + "integrity": "sha512-uXj0rgk30EpsKvOpuS+R+1XFDrnm56hED1Lz56e8uBkZdKCxw99LS2U8eXBqAHYU8kpkbsnV1GC8velBG070Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.55.2.tgz", + "integrity": "sha512-y7Epol8HcjlBxKXHhyhfFPFhm78B3P6x9cCbCyGTdxjsdVCptXCy5hpkZWxjGpnaLHvWsHS4QRF0TiBOLst2xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.55.2.tgz", + "integrity": "sha512-8Pxj2VVmpM2d+UZufnlTq7T1QIcYPVugLV5XC50PnHsV5uRM9CSoYkg2Y+CwqwRk2La0xK5QsfZ0obIU+9XftQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.55.2.tgz", + "integrity": "sha512-9L4IpIYUqA63a7sw1trnHQGUvwiAjKz67nsgDnal98JGAc7wyposRb0Iag+eiMuyzFFaSHLe2/rGyIo+PafRBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.55.2.tgz", + "integrity": "sha512-ZBm2ytY5EHFcj+kjNsXxMNO/TGlOHe2fBFXGKHJOM1bk1rAy4o2YI+d9oV/w/jrqx44pvJMJlc8X6vKnCuDgUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.55.2.tgz", + "integrity": "sha512-3FGVW/jDk7sdYwqa2NKnF/qXWcttc4bvGrwNbvqz3VoWSRv42CNvRk+3Y9QJFIUf1vY50hAuVWUoFKdyc8vaXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.55.2.tgz", + "integrity": "sha512-JsG8LovDAYul5t8e533tZ3O1uZILxso5zsTtB7ONc5RJ8ACdTxAAC/jaOnsBNYb+x+STP7fzx/Iro55v5DNgoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.55.2.tgz", + "integrity": "sha512-5wDnoIfC75zJ2MSHv5SSzTlRL2z7jQMbqQ5jrzottuq2p3oBObv8pD/JpXWu8pRaimaxNr3/Bs/KZIGVXxJ7hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.55.2", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.55.2.tgz", + "integrity": "sha512-da+SC6ikpza98W7C5ChsKEQDvZc8PQLQ0sxmQ5yMRsHpdD3iPKnclJA6ViB5Nr5T9qOX+IDswC6AyqY4V3rtug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.55.2", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.55.2.tgz", + "integrity": "sha512-Y8kEcPqCiIEeaGv83l9RRA09mfYECqAJHNnOyEtZc9UirI6XBMUyFVss/sSeYUiV/Lf30hkbWcl00V1uXsf86Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.55.2.tgz", + "integrity": "sha512-5zmobuCQqFZkx+84Nt+suL7vo6jTh2CfAs2ndDSeTS2QHvnzP8YEEGWtWftjyACI0cK/FuH8urWwCHP+d2j8TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.55.2.tgz", + "integrity": "sha512-qnGUUuWG66dRMnr33owLsrYIh9fHVxtU4R2rd3SpneAHuoAUcGbDOWNrj05glVU6M8yOqo9gQ22K8zpz0I8Xpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.55.2.tgz", + "integrity": "sha512-lKZ5uhafMvR7dWCJEyuaeyZitid1I3ICx+k0vGf5x/ktdIQvc7bndCiOPpmIDqUmN26FE3jTehkAzSqee95G2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.55.2.tgz", + "integrity": "sha512-Zc90xvKWUvxcNicvvTO9Pr/hT2TAnkixOIzJm/KMj5Ptm2pKjk71ngTsdkbRtJQvhZ2Kr9N1YdIjLrNHB5P2xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -44,13 +404,13 @@ "aix" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -61,13 +421,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -78,13 +438,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -95,13 +455,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -112,13 +472,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -129,13 +489,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -146,13 +506,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -163,13 +523,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -180,13 +540,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -197,13 +557,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -214,13 +574,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -231,13 +591,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -248,13 +608,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -265,13 +625,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -282,13 +642,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -299,13 +659,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -316,30 +676,13 @@ "linux" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -350,30 +693,13 @@ "netbsd" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -384,30 +710,13 @@ "openbsd" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -418,13 +727,13 @@ "sunos" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -435,13 +744,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -452,13 +761,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -469,9 +778,26 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.89", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.89.tgz", + "integrity": "sha512-hRaCY5s2G5oWAIhc4LCGYn6g6RrwLL4zhoLOT+KUO3joVCxVlZKA+839bv/47Nbe9/ZD4UA6dznZ4XPYcI53wA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -983,6 +1309,93 @@ "win32" ] }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -996,32 +1409,112 @@ "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.13.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", + "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", "dev": true, "license": "MIT" }, - "node_modules/@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "node_modules/@ungap/structured-clone": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, "license": "MIT", - "dependencies": { - "undici-types": "~7.18.0" + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" } }, "node_modules/@vitest/expect": { @@ -1139,6 +1632,297 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vue/compiler-core": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.39.tgz", + "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.39", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz", + "integrity": "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.39.tgz", + "integrity": "sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.39", + "@vue/compiler-dom": "3.5.39", + "@vue/compiler-ssr": "3.5.39", + "@vue/shared": "3.5.39", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.39.tgz", + "integrity": "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.10.tgz", + "integrity": "sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.10" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.10.tgz", + "integrity": "sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.10", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.10.tgz", + "integrity": "sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.39.tgz", + "integrity": "sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.39.tgz", + "integrity": "sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.39.tgz", + "integrity": "sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.39", + "@vue/runtime-core": "3.5.39", + "@vue/shared": "3.5.39", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.39.tgz", + "integrity": "sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.39", + "@vue/shared": "3.5.39" + }, + "peerDependencies": { + "vue": "3.5.39" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.39.tgz", + "integrity": "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/algoliasearch": { + "version": "5.55.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.55.2.tgz", + "integrity": "sha512-OyacJsaeuLUvGWOynNqYc6sx88XvyoG39wMT8SYqL3l9wwaorDW/LPRbUPfhzw0bWsUWzNCZTnFYOrWFBKsUaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.21.2", + "@algolia/client-abtesting": "5.55.2", + "@algolia/client-analytics": "5.55.2", + "@algolia/client-common": "5.55.2", + "@algolia/client-insights": "5.55.2", + "@algolia/client-personalization": "5.55.2", + "@algolia/client-query-suggestions": "5.55.2", + "@algolia/client-search": "5.55.2", + "@algolia/ingestion": "1.55.2", + "@algolia/monitoring": "1.55.2", + "@algolia/recommend": "5.55.2", + "@algolia/requester-browser-xhr": "5.55.2", + "@algolia/requester-fetch": "5.55.2", + "@algolia/requester-node-http": "5.55.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -1149,6 +1933,16 @@ "node": ">=12" } }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -1159,6 +1953,17 @@ "node": ">=8" } }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chai": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", @@ -1176,6 +1981,28 @@ "node": ">=18" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/check-error": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", @@ -1186,6 +2013,33 @@ "node": ">= 16" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1200,6 +2054,13 @@ "node": ">= 8" } }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1228,6 +2089,16 @@ "node": ">=6" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -1238,6 +2109,20 @@ "node": ">=8" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/effect": { "version": "4.0.0-beta.83", "resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-beta.83.tgz", @@ -1256,6 +2141,26 @@ "yaml": "^2.9.0" } }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-module-lexer": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", @@ -1264,9 +2169,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1274,35 +2179,32 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18" + "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/estree-walker": { @@ -1371,6 +2273,16 @@ "integrity": "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==", "license": "MIT" }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1386,6 +2298,62 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ini": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-7.0.0.tgz", @@ -1395,6 +2363,19 @@ "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1437,6 +2418,143 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1515,6 +2633,18 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -1541,6 +2671,13 @@ "node": ">= 14.16" } }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1590,6 +2727,36 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/preact": { + "version": "10.29.7", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.7.tgz", + "integrity": "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact-render-to-string": ">=5" + }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/pure-rand": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.1.tgz", @@ -1606,6 +2773,40 @@ ], "license": "MIT" }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rollup": { "version": "4.62.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", @@ -1651,6 +2852,14 @@ "fsevents": "~2.3.2" } }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1672,6 +2881,23 @@ "node": ">=8" } }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -1689,6 +2915,27 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -1703,6 +2950,21 @@ "dev": true, "license": "MIT" }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-literal": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", @@ -1716,6 +2978,26 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "dev": true, + "license": "MIT" + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -1786,6 +3068,17 @@ "node": ">=20" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -1807,6 +3100,79 @@ "dev": true, "license": "MIT" }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/uuid": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", @@ -1820,25 +3186,52 @@ "uuid": "dist-node/bin/uuid" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", - "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.27.0 || ^0.28.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -1847,25 +3240,19 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "jiti": { - "optional": true - }, "less": { "optional": true }, @@ -1886,12 +3273,6 @@ }, "terser": { "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true } } }, @@ -1918,6 +3299,48 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, "node_modules/vitest": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz", @@ -1991,6 +3414,28 @@ } } }, + "node_modules/vue": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.39.tgz", + "integrity": "sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.39", + "@vue/compiler-sfc": "3.5.39", + "@vue/runtime-dom": "3.5.39", + "@vue/server-renderer": "3.5.39", + "@vue/shared": "3.5.39" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2046,6 +3491,17 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 1197f07..97a7ff3 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,10 @@ "build": "tsc -p tsconfig.json", "prepublishOnly": "npm test && npm run typecheck && npm run build", "typecheck": "tsc -p tsconfig.json --noEmit", - "test": "vitest run" + "test": "vitest run", + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" }, "dependencies": { "@opencode-ai/plugin": "^1.3.7", @@ -51,6 +54,7 @@ "devDependencies": { "@types/node": "^24.6.0", "typescript": "^5.9.3", + "vitepress": "^1.6.4", "vitest": "^3.2.4" } }