From c0cb449244ef2d07a598e9b585795d63edf4b7b8 Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Thu, 2 Jul 2026 17:39:55 +0800 Subject: [PATCH 01/80] =?UTF-8?q?chore(release):=20dev=20=E5=88=87?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E7=89=88=E5=BC=80=E5=8F=91=E5=8F=B7=200.10.0?= =?UTF-8?q?-dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0.9.0 正式版发布后,dev 按 -dev 规则切到下一版开发态标记 0.10.0-dev(lockfile 经 npm install 同步)。-dev 仅作开发标记,不打 tag、不发版。 Co-Authored-By: Claude Opus 4.8 --- apps/desktop/package.json | 2 +- package-lock.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 4747a2b4..07cda225 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@meebox/desktop", - "version": "0.9.0", + "version": "0.10.0-dev", "private": true, "description": "meebox Electron desktop app", "author": { diff --git a/package-lock.json b/package-lock.json index 5ba5dfe0..94300b80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ }, "apps/desktop": { "name": "@meebox/desktop", - "version": "0.9.0", + "version": "0.10.0-dev", "dependencies": { "@iconify-json/material-icon-theme": "^1.2.66", "@iconify/react": "^5.2.1", From 575bf96254008822b0887d4f0fdc66b514b20208 Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 09:36:14 +0800 Subject: [PATCH 02/80] =?UTF-8?q?fix(desktop):=20dev=20=E7=94=A8=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B=20AUMID=20=E9=81=BF=E5=85=8D=E6=B1=A1=E6=9F=93=20Wind?= =?UTF-8?q?ows=20=E4=BB=BB=E5=8A=A1=E6=A0=8F=E5=9B=BE=E6=A0=87=E7=BC=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dev 跑的是自带默认图标的 electron.exe,若与打包态共用同一 AppUserModelId,Windows 会把 Electron 图标缓存到该 AUMID 键上, 导致正式版安装后任务栏仍复用旧缓存、显示 Electron 图标。 按 app.isPackaged 分流:打包态保持原 appId,dev 改用 .dev 后缀, 二者互不污染;toast 通知所需的 AUMID 一致性在打包态不受影响。 Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/desktop/src/main/index.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/main/index.ts b/apps/desktop/src/main/index.ts index 4d140825..671049dc 100644 --- a/apps/desktop/src/main/index.ts +++ b/apps/desktop/src/main/index.ts @@ -240,8 +240,13 @@ class App { } // Windows toast 通知需 AppUserModelId 与安装包 appId 一致,否则系统可能不显示 / 归属错乱。 + // dev 另用 .dev 后缀:AUMID 是 Windows 任务栏图标/分组/固定的持久缓存键,dev 跑的是自带 + // 默认图标的 electron.exe,若与打包态共用同一 AUMID,会把 Electron 图标缓存到该键上 → + // 正式版安装后仍复用旧缓存、任务栏显示 Electron 图标。分开即互不污染。 if (process.platform === 'win32') { - app.setAppUserModelId('com.huhamhire.code-meeseeks'); + app.setAppUserModelId( + app.isPackaged ? 'com.huhamhire.code-meeseeks' : 'com.huhamhire.code-meeseeks.dev', + ); } // 原生窗口 chrome 跟随全局主题:Windows 据 nativeTheme 设 DWMWA_USE_IMMERSIVE_DARK_MODE(原生 From 60df6e2762e5da6f9c26da878a033666b19a8093 Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 10:11:56 +0800 Subject: [PATCH 03/80] =?UTF-8?q?docs(i18n):=20README=20=E6=8B=86=E5=88=86?= =?UTF-8?q?=E8=8B=B1=E6=96=87=E9=BB=98=E8=AE=A4=20+=20=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E5=8F=8C=E8=AF=AD=EF=BC=8C=E8=A1=A5=20ROADMAP=200.10.0=20?= =?UTF-8?q?=E8=A7=84=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README.md 改写为英文默认版,原中文迁至 README.zh-CN.md,两份互链语言切换 - 移除早期预览版(0.x)提示(自 0.10 起) - ROADMAP 补 0.10.0 国际化与品牌官网规划;外部集成与 CLI 归入已交付能力 Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 228 ++++++++++++++++++++++++------------------------ README.zh-CN.md | 226 +++++++++++++++++++++++++++++++++++++++++++++++ docs/ROADMAP.md | 33 ++++++- 3 files changed, 370 insertions(+), 117 deletions(-) create mode 100644 README.zh-CN.md diff --git a/README.md b/README.md index d878cffd..b1a6bf01 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ # Code Meeseeks -**PR Agent 的桌面 GUI · 面向 Reviewer 个人的本地化、半自动 AI 代码评审客户端** +**A desktop GUI for PR-Agent · A local, semi-automated AI code-review client for the individual reviewer** -社区版 [PR-Agent](https://docs.pr-agent.ai/) 的图形界面 (GUI) · Electron 桌面应用 · 数据全部留在本地 +Graphical interface (GUI) for the community [PR-Agent](https://docs.pr-agent.ai/) · Electron desktop app · All data stays on your machine [![Electron](https://img.shields.io/badge/Electron-2B2E3A?logo=electron&logoColor=9FEAF9)](https://www.electronjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) @@ -17,205 +17,205 @@ [![Bitbucket](https://img.shields.io/badge/Bitbucket-0052CC?logo=bitbucket&logoColor=white)](https://bitbucket.org/) [![GitLab](https://img.shields.io/badge/GitLab-FC6D26?logo=gitlab&logoColor=white)](https://gitlab.com/) -关键词 / Keywords:PR-Agent GUI · pr-agent desktop client · AI 代码评审 / AI code review · Pull Request & Merge Request review · Bitbucket / GitHub reviewer 工具 · 本地化 / 私有部署 / self-hosted +Keywords:PR-Agent GUI · pr-agent desktop client · AI code review · Pull Request & Merge Request review · Bitbucket / GitHub reviewer tool · local / self-hosted / private deployment + +**English** · [简体中文](README.zh-CN.md) --- -> ⚠️ **早期预览版(0.x)**:项目仍在快速迭代,功能、配置与数据格式可能发生不兼容变更,稳定性未经充分验证。请勿用于关键的生产评审流程,使用前请自行评估风险并做好数据备份。 - -Code Meeseeks(内部开发代号 `meebox`)是命令行工具 [pr-agent](https://docs.pr-agent.ai/) 的**桌面图形界面 (GUI)**:把 AI 辅助的代码评审装进一个桌面客户端 —— 拉取评审者待评审的 PR(Pull Request / Merge Request),本地跑 pr-agent 生成评审意见,由评审者**逐条确认 / 编辑后**再发布到代码托管平台(GitHub / Bitbucket / GitLab)。 +Code Meeseeks (internal codename `meebox`) is a **desktop graphical interface (GUI)** for the command-line tool [pr-agent](https://docs.pr-agent.ai/): it packages AI-assisted code review into a desktop client — it fetches the PRs (Pull Requests / Merge Requests) awaiting your review, runs pr-agent locally to generate review comments, and lets the reviewer **confirm / edit each one** before publishing it back to the code hosting platform (GitHub / Bitbucket / GitLab). -核心设计立场: +Core design stance: -- **决策权在人** —— 所有评论必须经评审者二次确认 / 编辑才会发到远端,AI 只做草稿。 -- **规则在本地** —— 评审者自行配置检查规则、风格偏好、LLM Provider。 -- **数据在本地** —— 仓库副本、PR 元数据、评论草稿都存在本机工作目录,企业内网友好。 +- **The human decides** — every comment must be confirmed / edited by the reviewer before it reaches the remote; the AI only drafts. +- **Rules stay local** — the reviewer configures their own check rules, style preferences, and LLM provider. +- **Data stays local** — repository mirrors, PR metadata, and comment drafts all live in a local working directory; friendly to corporate intranets. -> 灵感来自 _Rick and Morty_ 里的 Mr. Meeseeks:召之即来、专做一件事、做完即走。 +> Inspired by Mr. Meeseeks from _Rick and Morty_: summoned on demand, does exactly one thing, and vanishes once it's done. -## 适用场景 +## Where it fits -- ✅ 承担 code review 职责的工程师 / Tech Lead -- ✅ 希望借助 AI 提升评审效率,同时保留最终决策权、不将判断完全交由 bot -- ✅ 在企业内网环境中使用自建 Bitbucket / GitLab 的团队 +- ✅ Engineers / Tech Leads who take on code-review duties +- ✅ Those who want AI to speed up review while keeping the final decision, rather than handing judgment entirely to a bot +- ✅ Teams running self-hosted Bitbucket / GitLab inside a corporate intranet -## 不适用场景 +## Where it doesn't -- ❌ 不是在 CI 中自动运行的 review bot(该定位属于 pr-agent 本身) -- ❌ 不是团队协同评审平台(无服务端,不提供多用户同步) -- ❌ 不替代代码托管平台原生的评审界面 +- ❌ Not a review bot that runs automatically in CI (that role belongs to pr-agent itself) +- ❌ Not a collaborative team review platform (no server, no multi-user sync) +- ❌ Not a replacement for the code platform's native review interface --- -## 核心特性 +## Core features -#### 🌍 多平台接入 +#### 🌍 Multi-platform access -- **统一接入 GitHub / Bitbucket / GitLab** —— 自建 GitHub Enterprise / GitLab Self-Managed 直接填实例地址,按平台能力自适应(如 GitLab CE/EE 审批降级)。 -- **本地优先,开箱即用** —— 仓库副本、PR 元数据、评论草稿都存本机工作目录,企业内网友好;安装包内嵌 pr-agent,零外部依赖。 -- **网络代理** —— LLM 调用、代码平台、git 拉取统一经 HTTP 代理,本地地址自动直连。 +- **Unified access to GitHub / Bitbucket / GitLab** — for self-hosted GitHub Enterprise / GitLab Self-Managed, just enter the instance URL; capabilities adapt per platform (e.g. graceful degradation of GitLab CE/EE approvals). +- **Local-first, works out of the box** — repository mirrors, PR metadata, and comment drafts all live in a local working directory, friendly to corporate intranets; pr-agent is embedded in the installer, with zero external dependencies. +- **HTTP proxy** — LLM calls, code platforms, and git fetches all go through an HTTP proxy, with local addresses connecting directly. -#### 📥 PR 发现与浏览 +#### 📥 PR discovery and browsing -- **自动发现** —— 轮询拉取待评审 PR,按「待我评审 / 我创建」等分类与仓库分组,支持状态过滤与搜索。 -- **未读与点名标记** —— 新分配 / 新提交 / 被 @ / 被回复标未读,其中被点名的条数单独计数。 -- **历史与按需打开** —— 浏览已合并 / 已关闭的 PR,或按 URL 直接打开任意 PR(含补充评论、补跑评审)。 +- **Automatic discovery** — polls for PRs awaiting review, categorized ("to review / created by me", etc.) and grouped by repository, with status filtering and search. +- **Unread and mention markers** — new assignments / new commits / @-mentions / replies are marked unread, with mentions counted separately. +- **History and open-on-demand** — browse merged / closed PRs, or open any PR directly by URL (including adding comments and re-running review). -#### 🔍 本地 Diff 阅读 +#### 🔍 Local diff reading -- **并排 / 内联 diff** —— 编辑器级代码阅读体验:文件树(合并冲突标注)、按变更范围 / 单 commit 查看、滚动条总览标尺、blame、跨文件代码搜索。 -- **行内评论** —— 新增行与删除行均可评论;选中代码可作为上下文引用进提问。 +- **Side-by-side / inline diff** — an editor-grade reading experience: file tree (with merge-conflict markers), view by change range / single commit, scrollbar overview ruler, blame, and cross-file code search. +- **Inline comments** — comment on both added and removed lines; selected code can be referenced as context in a question. -#### 🤖 AI / Agentic 评审 +#### 🤖 AI / Agentic review -- **指令驱动 pr-agent** —— `/describe`、`/review`、`/improve`、`/ask` 对话式驱动,结果结构化成可操作的评审发现。 -- **复评闭环** —— 对评审建议发起 `/ask` 复评,按裁决(取代 / 保留 / 撤销)自动取代或关闭原评论。 -- **Agentic 自主编排** —— 自然语言驱动的规划 + 多工具编排 + 长期 Memory,过程可观测(think → tool → think 时间线),可中途追加输入、随时停止,让评审走向可累积上下文的协作。 -- **AutoPilot 预评审** —— 对待我评审·待处理的新 PR 自动预跑评审,进应用即见待确认草稿;写操作经逐项授权 + 红线校验把关(默认仅开放只读工具)。 +- **Command-driven pr-agent** — drive it conversationally with `/describe`, `/review`, `/improve`, `/ask`; results are structured into actionable review findings. +- **Re-review loop** — raise an `/ask` re-review on a review suggestion, and per the verdict (supersede / keep / withdraw) the original comment is automatically superseded or closed. +- **Agentic orchestration** — natural-language-driven planning + multi-tool orchestration + long-term Memory, with an observable process (a think → tool → think timeline); you can add input mid-run and stop at any time, turning review into collaboration with accumulating context. +- **AutoPilot pre-review** — automatically pre-runs review on new PRs pending your review, so drafts are ready for confirmation the moment you open the app; write actions are gated by per-item authorization + red-line checks (read-only tools only by default). -#### ✍️ 评审闭环与协作 +#### ✍️ Review loop and collaboration -- **确认 → 发布** —— 评审发现转草稿、行内编辑、单条 / 批量发布到远端;远端可合并状态可视、满足条件一键合并(亦可对话 `/merge`)。 -- **评论互动** —— 自己的评论可回复 / 编辑 / 删除;支持 emoji 反应、@ 提及补全、图片附件(粘贴 / 选取上传)、`:shortcode:` 表情渲染(随平台能力提供)。 -- **活动时间线** —— 评论 / 提交更新 / 评审决断归并为一条时间线(GitHub / Bitbucket)。 -- **消息通知** —— 新 PR、评论回复、被 @ 分类弹系统通知,仅对待处理 PR 提醒、不打扰已决断项;点击直达对应 PR 或代码行,macOS dock 角标显示待你回应的评论数。 +- **Confirm → publish** — turn findings into drafts, edit inline, and publish to the remote one by one or in bulk; the remote mergeable state is visible, and you can merge with one click when conditions are met (or via `/merge`). +- **Comment interaction** — reply to / edit / delete your own comments; supports emoji reactions, @-mention completion, image attachments (paste / pick to upload), and `:shortcode:` emoji rendering (as each platform allows). +- **Activity timeline** — comments / commit updates / review verdicts are merged into a single timeline (GitHub / Bitbucket). +- **Notifications** — categorized system notifications for new PRs, comment replies, and @-mentions, only for pending PRs and never for already-decided items; click to jump straight to the PR or code line, with a macOS dock badge showing how many comments await your response. -#### ⚙️ 模型与规则 +#### ⚙️ Models and rules -- **多 LLM Provider** —— OpenAI / openai-compatible / DeepSeek / Anthropic / 通义千问 / 火山方舟等(本地 Ollama 经 openai-compatible 的 `/v1` 接入);也可通过本机已授权的本地 CLI 工具(如 claude / codex)调用第三方模型。 -- **个性化规则** —— 每位 Reviewer 维护自己的规则目录(markdown + frontmatter,支持子目录递归组织),按项目 / 仓库 / 目标分支命中;命中的多条规则按 Ruleset 分段一并注入评审,`priority` 控制排序。 -- **运行参数可调** —— 评审任务并发、输入上下文长度、Agent 策略(自动追问开关、追问 / 代码建议数量)均可在设置页调整。 +- **Multiple LLM providers** — OpenAI / openai-compatible / DeepSeek / Anthropic / Tongyi Qianwen / Volcengine Ark, and more (local Ollama connects via the openai-compatible `/v1` endpoint); you can also call third-party models through an authorized local CLI tool (e.g. claude / codex). +- **Personalized rules** — each reviewer maintains their own rules directory (markdown + frontmatter, organized recursively into subdirectories), matched by project / repository / target branch; matched rules are injected into the review in Ruleset sections, ordered by `priority`. +- **Tunable runtime parameters** — review task concurrency, input context length, and agent strategy (auto follow-up toggle, number of follow-ups / code suggestions) are all adjustable on the settings page. -#### 🔌 外部集成与 CLI +#### 🔌 External integration and CLI -- **可供外部 Agent 集成** —— PR 评审能力经本机 HTTP 接口 + 跨平台 CLI 对外开放,让本机 agentic 工具(如 claude / codex)、脚本、CI 把 PR 发现 / 浏览 / 评审 Agent 操作纳入自动化流程。 -- **本地 API 服务** —— 可选开启一个本机 API,将 PR 发现 / 浏览 / diff / 评审 Agent 操作 / 评审写动作以语言无关的 HTTP 契约开放出来;默认仅本机可达、强制访问令牌鉴权,不开放合并与变更类工具。 -- **跨平台命令行工具 `meebox`** —— 随发布提供 Windows / macOS / Linux 客户端,经本地 API 浏览 PR、驱动评审 Agent 并执行评审写动作(approve / needswork / comment);`meebox login` 一次存好凭据即可免传参,**压缩包即 agent skill 目录、可直接投放到 agent 的 skills 目录**。用法见 **[CLI 命令行工具](docs/guide/06-cli.md)**。 +- **Integrable by external agents** — PR review capabilities are exposed via a local HTTP interface + a cross-platform CLI, letting local agentic tools (e.g. claude / codex), scripts, and CI fold PR discovery / browsing / review-agent operations into automated workflows. +- **Local API service** — optionally enable a local API that exposes PR discovery / browsing / diff / review-agent operations / review write actions over a language-agnostic HTTP contract; reachable only from localhost by default, with mandatory access-token auth, and no merge or mutating tools exposed. +- **Cross-platform CLI `meebox`** — Windows / macOS / Linux clients ship with each release to browse PRs, drive the review agent, and perform review write actions (approve / needswork / comment) via the local API; `meebox login` stores credentials once so you never pass them again, and **the archive is itself an agent skill directory that drops straight into an agent's skills folder**. See **[CLI tool](docs/guide/06-cli.md)** for usage. -#### 🎨 界面与体验 +#### 🎨 Interface and experience -- **主题与外观** —— 深色 / 浅色 / 跟随系统,多款编辑器配色主题,自定义等宽字体与字号。 -- **命令面板** —— `Ctrl/Cmd+Shift+P` 唤起,快速执行常用操作并归口分散功能。 -- **多语言界面** —— 简体中文 / English / 日本語 / Deutsch,AI 回复语言随界面语言。 -- **无边框窗口** —— 自绘标题栏(VS Code 风),展示品牌名与当前 PR 标题。 +- **Themes and appearance** — dark / light / follow system, several editor color themes, and a custom monospace font and size. +- **Command palette** — invoke with `Ctrl/Cmd+Shift+P` to quickly run common actions and centralize scattered features. +- **Multilingual UI** — Simplified Chinese / English / 日本語 / Deutsch, with the AI's reply language following the UI language. +- **Frameless window** — a custom-drawn title bar (VS Code style) showing the brand name and current PR title.
-Code Meeseeks 界面预览 +Code Meeseeks UI preview
--- -## 安装 +## Installation -到 [Releases](../../releases) 下载对应平台安装包: +Download the installer for your platform from [Releases](../../releases): -| 平台 | 产物 | 状态 | -| ----------- | ---------------------------------------------------- | ------- | -| Windows x64 | `code-meeseeks--win-x64.exe`(NSIS 安装包) | ✅ 可用 | -| macOS arm64 | `code-meeseeks--mac-arm64.dmg` | ✅ 可用 | +| Platform | Artifact | Status | +| ----------- | ---------------------------------------------------- | ----------- | +| Windows x64 | `code-meeseeks--win-x64.exe` (NSIS installer) | ✅ Available | +| macOS arm64 | `code-meeseeks--mac-arm64.dmg` | ✅ Available | -安装包已内嵌 pr-agent,安装后即可使用,无需额外环境。 +pr-agent is embedded in the installer, so it works right after installation with no extra environment setup. -> **macOS 首次打开**:安装包为 ad-hoc 签名、未做 Apple 公证(notarization),Gatekeeper 会拦下未知开发者的 App。首次使用请右键点击 App 选「打开」,或到「系统设置 → 隐私与安全性」点「仍要打开」,确认一次后即可正常启动。 +> **First launch on macOS**: the installer is ad-hoc signed and not Apple-notarized, so Gatekeeper will block the app from an unknown developer. On first use, right-click the app and choose "Open", or go to "System Settings → Privacy & Security" and click "Open Anyway"; after confirming once it launches normally. > -> 之所以未公证:本项目是**免费开源软件**,未购置 Apple Developer 付费账号(公证依赖该账号)。源码完全公开、可自行审计与构建,ad-hoc 签名不影响功能与安全。 +> Why it isn't notarized: this project is **free and open-source software** without a paid Apple Developer account (which notarization requires). The source is fully public, auditable, and buildable yourself; ad-hoc signing does not affect functionality or security. --- -## 快速上手 +## Quick start -1. **配置连接** —— 设置页填入代码平台地址 + 鉴权信息。 -2. **配置 LLM** —— 选择 Provider,填 API Key / base_url / 模型名。 -3. **发现 PR** —— 应用自动轮询拉取评审者待评审的 PR,左侧列表按仓库分组。 -4. **阅读 + 评审** —— 选中 PR 看 diff,点击自动评审按钮让 AI 生成评审发现;也可在对话框输入固定指令(如 `/describe`)或自然语言请求。 -5. **确认 + 发布** —— 把评审发现转成草稿、编辑措辞,单条或批量发布到远端。 +1. **Configure the connection** — enter the code platform URL + credentials on the settings page. +2. **Configure the LLM** — pick a provider and fill in the API key / base_url / model name. +3. **Discover PRs** — the app automatically polls for PRs awaiting your review, grouped by repository in the left list. +4. **Read + review** — select a PR to view the diff, and click the auto-review button to have the AI generate findings; you can also enter fixed commands (e.g. `/describe`) or a natural-language request in the dialog box. +5. **Confirm + publish** — turn findings into drafts, edit the wording, and publish to the remote one by one or in bulk. -配置存放在 `~/.code-meeseeks/config.yaml`;仓库镜像默认在 `~/.code-meeseeks/repos/`,可在设置页改到其他目录。 +Configuration lives in `~/.code-meeseeks/config.yaml`; repository mirrors default to `~/.code-meeseeks/repos/` and can be moved elsewhere on the settings page. -> **网络代理**(可选,内网用户):设置页「网络代理」填 HTTP 代理地址 / 端口 / Basic Auth,开启后 LLM 调用、代码平台、git 拉取统一经代理,本地地址自动直连(含「测试连通」按钮)。 +> **HTTP proxy** (optional, for intranet users): under "Network proxy" on the settings page, enter the HTTP proxy host / port / Basic Auth; once enabled, LLM calls, code platforms, and git fetches all go through the proxy, with local addresses connecting directly (includes a "Test connection" button). > -> **SSH 方式的 git 拉取**不走此配置,请在 `~/.ssh/config` 为对应 host 自配 `ProxyCommand`。 +> **Git fetches over SSH** do not use this setting; configure `ProxyCommand` for the relevant host in `~/.ssh/config` yourself. -各步的详细说明(安装与首次使用、PAT 权限与 Clone 协议、LLM 模型选择、网络代理)见 **[使用说明](docs/guide/README.md)**。 +For details on each step (installation and first use, PAT permissions and clone protocols, LLM model selection, HTTP proxy) see the **[User guide](docs/guide/README.md)**. --- -## 平台支持 +## Platform support -| 平台 | 状态 | +| Platform | Status | | ------------------------------ | --------------------------------------------------------------- | -| GitHub | ✅ 已验证(github.com + GitHub Enterprise Server,REST API v3) | -| Bitbucket Server / Data Center | ✅ 已支持(REST API v1,>= 7.0) | -| GitLab | ✅ 已支持(gitlab.com + Self-Managed,CE / EE,REST API v4,>= 13.8,推荐 15.6+) | +| GitHub | ✅ Verified (github.com + GitHub Enterprise Server, REST API v3) | +| Bitbucket Server / Data Center | ✅ Supported (REST API v1, >= 7.0) | +| GitLab | ✅ Supported (gitlab.com + Self-Managed, CE / EE, REST API v4, >= 13.8, 15.6+ recommended) | --- -## 模型支持 +## Model support -评审能力经 pr-agent(底层 litellm)接入,**理论上兼容任意 OpenAI 兼容 / litellm 支持的模型供应商**(在设置页选模型供应商,填 API Key、base_url、模型名即可)。下表为设置页内置的厂商选项及实测状态: +Review capabilities connect through pr-agent (backed by litellm), so it is **in principle compatible with any OpenAI-compatible / litellm-supported model provider** (pick the provider on the settings page and fill in the API key, base_url, and model name). The table below lists the built-in provider options on the settings page and their tested status: -| 模型供应商(厂商) | 说明 | 状态 | -| ------------------- | ------------------------------------------- | ------------------- | -| `openai` | OpenAI(GPT 系) | ✅ 已验证 | -| `anthropic` | Anthropic(Claude 系) | ✅ 已验证 | -| `deepseek` | DeepSeek | ✅ 已验证 | -| `dashscope` | 阿里百炼(DashScope,通义千问) | ✅ 已验证 | -| `volcengine-ark` | 火山方舟(Volcengine Ark,豆包) | ✅ 已验证 | -| `openai-compatible` | OpenAI 协议兼容(vLLM / 中转 / 自建 / 本地 Ollama 的 `/v1`) | ✅ 已验证 | -| `cli` | 通过本地 CLI 工具调用第三方模型 | ✅ 已验证 | +| Provider | Notes | Status | +| ------------------- | ------------------------------------------- | ------------ | +| `openai` | OpenAI (GPT family) | ✅ Verified | +| `anthropic` | Anthropic (Claude family) | ✅ Verified | +| `deepseek` | DeepSeek | ✅ Verified | +| `dashscope` | Alibaba Bailian (DashScope, Tongyi Qianwen) | ✅ Verified | +| `volcengine-ark` | Volcengine Ark (Doubao) | ✅ Verified | +| `openai-compatible` | OpenAI-protocol compatible (vLLM / gateway / self-hosted / local Ollama `/v1`) | ✅ Verified | +| `cli` | Call a third-party model via a local CLI tool | ✅ Verified | -> **本地 CLI 模式说明**:该模式不直连模型 API,而是把评审请求转交给使用者**自行安装并授权**的本地命令行工具,由其代为调用背后的第三方模型。需先在本机完成对应 CLI 工具的安装与登录授权,应用本身不负责其凭据管理与计费。 +> **About local CLI mode**: this mode does not call a model API directly; instead it hands the review request to a local command-line tool that you **install and authorize yourself**, which in turn calls the third-party model behind it. You must first install and log in to the corresponding CLI tool on your machine; the app itself does not manage its credentials or billing. -> 💸 **成本提示**:Agentic 评审与 AutoPilot 预评审会对每个 PR 串联多次模型调用(描述、评审、必要时追问、汇总),token 消耗显著高于单次手动评审。无论使用按量计费的 API、还是有额度上限的订阅 / 本地 CLI 账户,都请留意用量节奏,自行评估成本投入;每步的 token 用量已在评审时间线上分步展示,便于观察消耗。 +> 💸 **Cost note**: Agentic review and AutoPilot pre-review chain multiple model calls per PR (describe, review, follow-ups when needed, summarize), so token consumption is noticeably higher than a single manual review. Whether you use a pay-as-you-go API or a subscription / local CLI account with a quota cap, watch your usage pace and assess the cost yourself; per-step token usage is shown step by step on the review timeline for easy monitoring. --- -## 技术栈 +## Tech stack -- **桌面壳**:Electron + Vite(electron-vite) -- **渲染层**:React + TypeScript(strict) -- **编辑器**:Monaco(并排 / 内联 diff) -- **工程**:npm workspaces + Nx 单仓多包 -- **pr-agent 集成**:内嵌 Python 运行时子进程(缺失时回退系统 pr-agent CLI) +- **Desktop shell**: Electron + Vite (electron-vite) +- **Renderer**: React + TypeScript (strict) +- **Editor**: Monaco (side-by-side / inline diff) +- **Engineering**: npm workspaces + Nx monorepo +- **pr-agent integration**: an embedded Python-runtime subprocess (falls back to the system pr-agent CLI when absent) -> 📚 **延伸阅读** +> 📚 **Further reading** > -> - 已交付能力、规划与未决项见 **[Roadmap](docs/ROADMAP.md)** -> - 详细架构与各模块设计见 **[模块文档](docs/arch/README.md)** +> - Delivered capabilities, roadmap, and open items: **[Roadmap](docs/ROADMAP.md)** +> - Detailed architecture and per-module design: **[Module docs](docs/arch/README.md)** --- -## 开发 +## Development -环境准备、启动调试、构建打包步骤见 **[开发指南](docs/development/README.md)**。 +For environment setup, running in dev, and building / packaging, see the **[Development guide](docs/development/README.md)**. --- -## 隐私与数据 +## Privacy and data -- **本地优先**:除调用 LLM API 与访问所配置的 Git 平台外,不向任何第三方上报数据。 -- **工作目录**:应用数据固定在 `~/.code-meeseeks/`,仓库镜像目录可配置。 -- pr-agent 评审时仅把 PR diff + 评审者的规则发给评审者自行配置的 LLM;接入本地模型(如本地 Ollama)即可全程不出本机。 +- **Local-first**: apart from calling the LLM API and accessing the configured Git platform, no data is reported to any third party. +- **Working directory**: app data lives at `~/.code-meeseeks/`, with a configurable repository mirror directory. +- During review, pr-agent sends only the PR diff + the reviewer's rules to the reviewer's own configured LLM; wire up a local model (e.g. local Ollama) and nothing ever leaves your machine. --- -## 致谢 +## Acknowledgements -构建于 [PR-Agent](https://github.com/The-PR-Agent/pr-agent) 之上 —— Qodo 贡献给社区的开源版本(官网 [docs.pr-agent.ai](https://docs.pr-agent.ai/))。作为第三方依赖打包,按其自身许可证分发,**不在本项目重命名 / 改动范围内**。 +Built on top of [PR-Agent](https://github.com/The-PR-Agent/pr-agent) — the open-source version Qodo contributes to the community (site: [docs.pr-agent.ai](https://docs.pr-agent.ai/)). It is bundled as a third-party dependency, distributed under its own license, and **outside the renaming / modification scope of this project**. -## 许可证 +## License -本项目采用 [Apache License 2.0](LICENSE)。 +This project is licensed under the [Apache License 2.0](LICENSE). -打包分发的安装包内含第三方组件(PR-Agent、Electron 等),各按其自身许可证分发,归集见 [NOTICE](NOTICE);完整第三方许可(THIRD-PARTY-NOTICES)出包时自动生成并随安装包内置(位于 App 资源目录)。 +The distributed installers bundle third-party components (PR-Agent, Electron, etc.), each distributed under its own license, aggregated in [NOTICE](NOTICE); the full third-party license set (THIRD-PARTY-NOTICES) is generated automatically at build time and bundled into the installer (in the app's resources directory). -## 商标与免责声明 +## Trademarks and disclaimer -本项目为非官方、独立的开源工具,**与 _Rick and Morty_ 及其权利方无任何关联,亦未获其授权或认可**。「Rick and Morty」「Mr. Meeseeks」等名称、角色及相关元素的版权与商标归其各自权利人所有(Adult Swim / Warner Bros. Discovery 等)。本项目名称与图标仅出于致敬目的进行借用,不主张任何相关权利;如权利方有异议,将配合调整。 +This project is an unofficial, independent open-source tool, **not affiliated with, authorized by, or endorsed by _Rick and Morty_ or its rights holders in any way**. Names, characters, and related elements such as "Rick and Morty" and "Mr. Meeseeks" are the copyrights and trademarks of their respective owners (Adult Swim / Warner Bros. Discovery, etc.). This project's name and icon are borrowed purely as an homage and assert no related rights; should the rights holders object, we will adjust accordingly. --- diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 00000000..6b71ca7d --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,226 @@ +
+ +Code Meeseeks + +# Code Meeseeks + +**PR Agent 的桌面 GUI · 面向 Reviewer 个人的本地化、半自动 AI 代码评审客户端** + +社区版 [PR-Agent](https://docs.pr-agent.ai/) 的图形界面 (GUI) · Electron 桌面应用 · 数据全部留在本地 + +[![Electron](https://img.shields.io/badge/Electron-2B2E3A?logo=electron&logoColor=9FEAF9)](https://www.electronjs.org/) +[![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) +[![Python](https://img.shields.io/badge/Python-3776AB?logo=python&logoColor=white)](https://www.python.org/) +[![Release](https://img.shields.io/github/v/release/huhamhire/code-meeseeks?include_prereleases&sort=semver&label=release&color=4c9a40)](https://github.com/huhamhire/code-meeseeks/releases) + +[![GitHub](https://img.shields.io/badge/GitHub-181717?logo=github&logoColor=white)](https://github.com/) +[![Bitbucket](https://img.shields.io/badge/Bitbucket-0052CC?logo=bitbucket&logoColor=white)](https://bitbucket.org/) +[![GitLab](https://img.shields.io/badge/GitLab-FC6D26?logo=gitlab&logoColor=white)](https://gitlab.com/) + +关键词 / Keywords:PR-Agent GUI · pr-agent desktop client · AI 代码评审 / AI code review · Pull Request & Merge Request review · Bitbucket / GitHub reviewer 工具 · 本地化 / 私有部署 / self-hosted + +[English](README.md) · **简体中文** + +
+ +--- + +Code Meeseeks(内部开发代号 `meebox`)是命令行工具 [pr-agent](https://docs.pr-agent.ai/) 的**桌面图形界面 (GUI)**:把 AI 辅助的代码评审装进一个桌面客户端 —— 拉取评审者待评审的 PR(Pull Request / Merge Request),本地跑 pr-agent 生成评审意见,由评审者**逐条确认 / 编辑后**再发布到代码托管平台(GitHub / Bitbucket / GitLab)。 + +核心设计立场: + +- **决策权在人** —— 所有评论必须经评审者二次确认 / 编辑才会发到远端,AI 只做草稿。 +- **规则在本地** —— 评审者自行配置检查规则、风格偏好、LLM Provider。 +- **数据在本地** —— 仓库副本、PR 元数据、评论草稿都存在本机工作目录,企业内网友好。 + +> 灵感来自 _Rick and Morty_ 里的 Mr. Meeseeks:召之即来、专做一件事、做完即走。 + +## 适用场景 + +- ✅ 承担 code review 职责的工程师 / Tech Lead +- ✅ 希望借助 AI 提升评审效率,同时保留最终决策权、不将判断完全交由 bot +- ✅ 在企业内网环境中使用自建 Bitbucket / GitLab 的团队 + +## 不适用场景 + +- ❌ 不是在 CI 中自动运行的 review bot(该定位属于 pr-agent 本身) +- ❌ 不是团队协同评审平台(无服务端,不提供多用户同步) +- ❌ 不替代代码托管平台原生的评审界面 + +--- + +## 核心特性 + +#### 🌍 多平台接入 + +- **统一接入 GitHub / Bitbucket / GitLab** —— 自建 GitHub Enterprise / GitLab Self-Managed 直接填实例地址,按平台能力自适应(如 GitLab CE/EE 审批降级)。 +- **本地优先,开箱即用** —— 仓库副本、PR 元数据、评论草稿都存本机工作目录,企业内网友好;安装包内嵌 pr-agent,零外部依赖。 +- **网络代理** —— LLM 调用、代码平台、git 拉取统一经 HTTP 代理,本地地址自动直连。 + +#### 📥 PR 发现与浏览 + +- **自动发现** —— 轮询拉取待评审 PR,按「待我评审 / 我创建」等分类与仓库分组,支持状态过滤与搜索。 +- **未读与点名标记** —— 新分配 / 新提交 / 被 @ / 被回复标未读,其中被点名的条数单独计数。 +- **历史与按需打开** —— 浏览已合并 / 已关闭的 PR,或按 URL 直接打开任意 PR(含补充评论、补跑评审)。 + +#### 🔍 本地 Diff 阅读 + +- **并排 / 内联 diff** —— 编辑器级代码阅读体验:文件树(合并冲突标注)、按变更范围 / 单 commit 查看、滚动条总览标尺、blame、跨文件代码搜索。 +- **行内评论** —— 新增行与删除行均可评论;选中代码可作为上下文引用进提问。 + +#### 🤖 AI / Agentic 评审 + +- **指令驱动 pr-agent** —— `/describe`、`/review`、`/improve`、`/ask` 对话式驱动,结果结构化成可操作的评审发现。 +- **复评闭环** —— 对评审建议发起 `/ask` 复评,按裁决(取代 / 保留 / 撤销)自动取代或关闭原评论。 +- **Agentic 自主编排** —— 自然语言驱动的规划 + 多工具编排 + 长期 Memory,过程可观测(think → tool → think 时间线),可中途追加输入、随时停止,让评审走向可累积上下文的协作。 +- **AutoPilot 预评审** —— 对待我评审·待处理的新 PR 自动预跑评审,进应用即见待确认草稿;写操作经逐项授权 + 红线校验把关(默认仅开放只读工具)。 + +#### ✍️ 评审闭环与协作 + +- **确认 → 发布** —— 评审发现转草稿、行内编辑、单条 / 批量发布到远端;远端可合并状态可视、满足条件一键合并(亦可对话 `/merge`)。 +- **评论互动** —— 自己的评论可回复 / 编辑 / 删除;支持 emoji 反应、@ 提及补全、图片附件(粘贴 / 选取上传)、`:shortcode:` 表情渲染(随平台能力提供)。 +- **活动时间线** —— 评论 / 提交更新 / 评审决断归并为一条时间线(GitHub / Bitbucket)。 +- **消息通知** —— 新 PR、评论回复、被 @ 分类弹系统通知,仅对待处理 PR 提醒、不打扰已决断项;点击直达对应 PR 或代码行,macOS dock 角标显示待你回应的评论数。 + +#### ⚙️ 模型与规则 + +- **多 LLM Provider** —— OpenAI / openai-compatible / DeepSeek / Anthropic / 通义千问 / 火山方舟等(本地 Ollama 经 openai-compatible 的 `/v1` 接入);也可通过本机已授权的本地 CLI 工具(如 claude / codex)调用第三方模型。 +- **个性化规则** —— 每位 Reviewer 维护自己的规则目录(markdown + frontmatter,支持子目录递归组织),按项目 / 仓库 / 目标分支命中;命中的多条规则按 Ruleset 分段一并注入评审,`priority` 控制排序。 +- **运行参数可调** —— 评审任务并发、输入上下文长度、Agent 策略(自动追问开关、追问 / 代码建议数量)均可在设置页调整。 + +#### 🔌 外部集成与 CLI + +- **可供外部 Agent 集成** —— PR 评审能力经本机 HTTP 接口 + 跨平台 CLI 对外开放,让本机 agentic 工具(如 claude / codex)、脚本、CI 把 PR 发现 / 浏览 / 评审 Agent 操作纳入自动化流程。 +- **本地 API 服务** —— 可选开启一个本机 API,将 PR 发现 / 浏览 / diff / 评审 Agent 操作 / 评审写动作以语言无关的 HTTP 契约开放出来;默认仅本机可达、强制访问令牌鉴权,不开放合并与变更类工具。 +- **跨平台命令行工具 `meebox`** —— 随发布提供 Windows / macOS / Linux 客户端,经本地 API 浏览 PR、驱动评审 Agent 并执行评审写动作(approve / needswork / comment);`meebox login` 一次存好凭据即可免传参,**压缩包即 agent skill 目录、可直接投放到 agent 的 skills 目录**。用法见 **[CLI 命令行工具](docs/guide/06-cli.md)**。 + +#### 🎨 界面与体验 + +- **主题与外观** —— 深色 / 浅色 / 跟随系统,多款编辑器配色主题,自定义等宽字体与字号。 +- **命令面板** —— `Ctrl/Cmd+Shift+P` 唤起,快速执行常用操作并归口分散功能。 +- **多语言界面** —— 简体中文 / English / 日本語 / Deutsch,AI 回复语言随界面语言。 +- **无边框窗口** —— 自绘标题栏(VS Code 风),展示品牌名与当前 PR 标题。 + +
+ +Code Meeseeks 界面预览 + +
+ +--- + +## 安装 + +到 [Releases](../../releases) 下载对应平台安装包: + +| 平台 | 产物 | 状态 | +| ----------- | ---------------------------------------------------- | ------- | +| Windows x64 | `code-meeseeks--win-x64.exe`(NSIS 安装包) | ✅ 可用 | +| macOS arm64 | `code-meeseeks--mac-arm64.dmg` | ✅ 可用 | + +安装包已内嵌 pr-agent,安装后即可使用,无需额外环境。 + +> **macOS 首次打开**:安装包为 ad-hoc 签名、未做 Apple 公证(notarization),Gatekeeper 会拦下未知开发者的 App。首次使用请右键点击 App 选「打开」,或到「系统设置 → 隐私与安全性」点「仍要打开」,确认一次后即可正常启动。 +> +> 之所以未公证:本项目是**免费开源软件**,未购置 Apple Developer 付费账号(公证依赖该账号)。源码完全公开、可自行审计与构建,ad-hoc 签名不影响功能与安全。 + +--- + +## 快速上手 + +1. **配置连接** —— 设置页填入代码平台地址 + 鉴权信息。 +2. **配置 LLM** —— 选择 Provider,填 API Key / base_url / 模型名。 +3. **发现 PR** —— 应用自动轮询拉取评审者待评审的 PR,左侧列表按仓库分组。 +4. **阅读 + 评审** —— 选中 PR 看 diff,点击自动评审按钮让 AI 生成评审发现;也可在对话框输入固定指令(如 `/describe`)或自然语言请求。 +5. **确认 + 发布** —— 把评审发现转成草稿、编辑措辞,单条或批量发布到远端。 + +配置存放在 `~/.code-meeseeks/config.yaml`;仓库镜像默认在 `~/.code-meeseeks/repos/`,可在设置页改到其他目录。 + +> **网络代理**(可选,内网用户):设置页「网络代理」填 HTTP 代理地址 / 端口 / Basic Auth,开启后 LLM 调用、代码平台、git 拉取统一经代理,本地地址自动直连(含「测试连通」按钮)。 +> +> **SSH 方式的 git 拉取**不走此配置,请在 `~/.ssh/config` 为对应 host 自配 `ProxyCommand`。 + +各步的详细说明(安装与首次使用、PAT 权限与 Clone 协议、LLM 模型选择、网络代理)见 **[使用说明](docs/guide/README.md)**。 + +--- + +## 平台支持 + +| 平台 | 状态 | +| ------------------------------ | --------------------------------------------------------------- | +| GitHub | ✅ 已验证(github.com + GitHub Enterprise Server,REST API v3) | +| Bitbucket Server / Data Center | ✅ 已支持(REST API v1,>= 7.0) | +| GitLab | ✅ 已支持(gitlab.com + Self-Managed,CE / EE,REST API v4,>= 13.8,推荐 15.6+) | + +--- + +## 模型支持 + +评审能力经 pr-agent(底层 litellm)接入,**理论上兼容任意 OpenAI 兼容 / litellm 支持的模型供应商**(在设置页选模型供应商,填 API Key、base_url、模型名即可)。下表为设置页内置的厂商选项及实测状态: + +| 模型供应商(厂商) | 说明 | 状态 | +| ------------------- | ------------------------------------------- | ------------------- | +| `openai` | OpenAI(GPT 系) | ✅ 已验证 | +| `anthropic` | Anthropic(Claude 系) | ✅ 已验证 | +| `deepseek` | DeepSeek | ✅ 已验证 | +| `dashscope` | 阿里百炼(DashScope,通义千问) | ✅ 已验证 | +| `volcengine-ark` | 火山方舟(Volcengine Ark,豆包) | ✅ 已验证 | +| `openai-compatible` | OpenAI 协议兼容(vLLM / 中转 / 自建 / 本地 Ollama 的 `/v1`) | ✅ 已验证 | +| `cli` | 通过本地 CLI 工具调用第三方模型 | ✅ 已验证 | + +> **本地 CLI 模式说明**:该模式不直连模型 API,而是把评审请求转交给使用者**自行安装并授权**的本地命令行工具,由其代为调用背后的第三方模型。需先在本机完成对应 CLI 工具的安装与登录授权,应用本身不负责其凭据管理与计费。 + +> 💸 **成本提示**:Agentic 评审与 AutoPilot 预评审会对每个 PR 串联多次模型调用(描述、评审、必要时追问、汇总),token 消耗显著高于单次手动评审。无论使用按量计费的 API、还是有额度上限的订阅 / 本地 CLI 账户,都请留意用量节奏,自行评估成本投入;每步的 token 用量已在评审时间线上分步展示,便于观察消耗。 + +--- + +## 技术栈 + +- **桌面壳**:Electron + Vite(electron-vite) +- **渲染层**:React + TypeScript(strict) +- **编辑器**:Monaco(并排 / 内联 diff) +- **工程**:npm workspaces + Nx 单仓多包 +- **pr-agent 集成**:内嵌 Python 运行时子进程(缺失时回退系统 pr-agent CLI) + +> 📚 **延伸阅读** +> +> - 已交付能力、规划与未决项见 **[Roadmap](docs/ROADMAP.md)** +> - 详细架构与各模块设计见 **[模块文档](docs/arch/README.md)** + +--- + +## 开发 + +环境准备、启动调试、构建打包步骤见 **[开发指南](docs/development/README.md)**。 + +--- + +## 隐私与数据 + +- **本地优先**:除调用 LLM API 与访问所配置的 Git 平台外,不向任何第三方上报数据。 +- **工作目录**:应用数据固定在 `~/.code-meeseeks/`,仓库镜像目录可配置。 +- pr-agent 评审时仅把 PR diff + 评审者的规则发给评审者自行配置的 LLM;接入本地模型(如本地 Ollama)即可全程不出本机。 + +--- + +## 致谢 + +构建于 [PR-Agent](https://github.com/The-PR-Agent/pr-agent) 之上 —— Qodo 贡献给社区的开源版本(官网 [docs.pr-agent.ai](https://docs.pr-agent.ai/))。作为第三方依赖打包,按其自身许可证分发,**不在本项目重命名 / 改动范围内**。 + +## 许可证 + +本项目采用 [Apache License 2.0](LICENSE)。 + +打包分发的安装包内含第三方组件(PR-Agent、Electron 等),各按其自身许可证分发,归集见 [NOTICE](NOTICE);完整第三方许可(THIRD-PARTY-NOTICES)出包时自动生成并随安装包内置(位于 App 资源目录)。 + +## 商标与免责声明 + +本项目为非官方、独立的开源工具,**与 _Rick and Morty_ 及其权利方无任何关联,亦未获其授权或认可**。「Rick and Morty」「Mr. Meeseeks」等名称、角色及相关元素的版权与商标归其各自权利人所有(Adult Swim / Warner Bros. Discovery 等)。本项目名称与图标仅出于致敬目的进行借用,不主张任何相关权利;如权利方有异议,将配合调整。 + +--- + +
+ +Made on 🌏 with ♥️. + +
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 31e28935..01b1d01c 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,6 +1,6 @@ # Code Meeseeks Roadmap -> 最后更新:2026-06-30 +> 最后更新:2026-07-03 本文件只保留**高层视角**:已交付能力全景、持续演进、风险与下一步。面向用户的**特性详述**见 **[README](../README.md)**;各模块的**设计与实现细节**见 **[模块设计文档 docs/arch/](arch/README.md)**。 @@ -56,6 +56,11 @@ - [x] 个性化规则目录(markdown + frontmatter,子目录递归;命中多条按 Ruleset 分段注入、`priority` 排序) - [x] 运行参数可调:评审任务并发、输入上下文长度、Agent 策略(自动追问开关、代码建议数量) +#### 🔌 外部集成与 CLI + +- [x] 本机本地 API(仅本机可达 + 令牌鉴权)开放 PR 发现 / 浏览 / diff / 评审 Agent / 评审写动作,供外部 agent · 脚本 · CI 集成 +- [x] 跨平台 CLI `meebox`(Windows / macOS / Linux):浏览 PR + 驱动评审 Agent + 评审写动作(approve / needswork / comment);压缩包即 agent skill 目录 + #### 🎨 界面与体验 - [x] 主题与外观:深色 / 浅色 / 跟随系统 + 多款编辑器配色 + 自定义等宽字体字号 @@ -78,8 +83,30 @@ ### 进行中 / 待办 ⏭️ - [ ] **可观测性扩展**:规则命中率、模型对比(token 用量已做)。 -- [ ] **外部集成扩展与 CLI**:下个版本(0.9.0)方向——主进程内置本地 API + 独立 CLI,使外部 agent / 工具 - 可集成应用能力(设计见 [服务监听与本地 API](arch/04-integration/01-service-api.md) · [CLI 工具](arch/04-integration/02-cli.md))。 + +### 0.10.0:项目国际化与品牌官网 🌐 + +本轮聚焦「项目自身」的对外呈现(区别于**应用界面** i18n,后者已四语交付),分**品牌官网**与**文档国际化**两条线。 + +**A. 品牌官网**(技术栈 **VitePress**;英文默认 + 中文;源码置主仓 `website/`) + +- [ ] 落地页:定位一句话 + 截图 / 演示 + 核心特性(镜像 README 领域划分,营销化改写)+ 下载 CTA(跳 Releases)+ FAQ +- [ ] 托管使用文档:官网从仓库 `docs/guide/` 构建渲染(**不另起一份**),i18n 走 VitePress `locales`(EN 根 + `/zh/`) +- [ ] 部署:GitHub Pages(source 选 GitHub Actions),新增独立 `pages.yml`(路径过滤 `website/**` + `docs/**`,push `master` 触发),**与 `release.yml` 的 `v*` 发版流水线解耦** +- [ ] 自定义域名(可选,后续 `CNAME`) + +**B. 文档国际化**(英文默认 + 中文;`arch/` 与 `ROADMAP` 维持中文、不纳入本轮) + +- [ ] **阶段 1(本轮)**:README 拆分 —— `README.md`(英文,默认)+ `README.zh-CN.md`(中文),两份顶部各置语言切换行;现有中文 README 迁至 `README.zh-CN.md` +- [ ] **阶段 2(后续)**:`docs/guide/` 用户向文档 EN + ZH,目录结构镜像应用 locales + +**内容同步规范**(防 README / docs / 官网三处漂移,每类内容单一真相源): + +| 内容 | 真相源 (SoT) | 其余处理 | +| --- | --- | --- | +| 定位 / 核心特性 | README | 官网落地页在营销高度改写,细节链回 README/docs,不逐字复制 | +| 使用文档 | 仓库 `docs/guide/` | 官网从其构建渲染,不另存一份 | +| arch 设计文档 | 仓库 `docs/arch/`(中文) | 不进官网、不翻译(与「设计文档中文、异常/日志英语」约定一致) | --- From cfd99117a4834a9433ae25b67a700aaf10193830 Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 10:34:52 +0800 Subject: [PATCH 04/80] =?UTF-8?q?feat(website):=20VitePress=20=E5=AE=98?= =?UTF-8?q?=E7=BD=91=20scaffold=20+=20=E5=8F=8C=E8=AF=AD=E8=90=BD=E5=9C=B0?= =?UTF-8?q?=E9=A1=B5=20+=20Pages=20=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 独立子工程 website/(不入 workspace/Nx,类比 cli/),VitePress + i18n(EN 根 / zh) - 双语 Hero 落地页,特性卡镜像 README 领域、营销化改写 - pages.yml:PR 构建检查 + push master 部署,路径过滤 website/ + docs/,与发版流水线解耦 - base 默认 /code-meeseeks/,可经 SITE_BASE 切自定义域名 Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/pages.yml | 64 + website/.gitignore | 3 + website/.vitepress/config.ts | 70 + website/README.md | 41 + website/index.md | 35 + website/package-lock.json | 2514 ++++++++++++++++++++++++++++++++++ website/package.json | 16 + website/zh/index.md | 35 + 8 files changed, 2778 insertions(+) create mode 100644 .github/workflows/pages.yml create mode 100644 website/.gitignore create mode 100644 website/.vitepress/config.ts create mode 100644 website/README.md create mode 100644 website/index.md create mode 100644 website/package-lock.json create mode 100644 website/package.json create mode 100644 website/zh/index.md diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 00000000..9c5e3d9c --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,64 @@ +name: Deploy Website (GitHub Pages) + +# Brand website (website/, VitePress). Decoupled from the v* release pipeline: +# build on every PR touching the site/docs (as a check), deploy on push to master. +on: + push: + branches: [master] + paths: + - 'website/**' + - 'docs/**' + - '.github/workflows/pages.yml' + pull_request: + paths: + - 'website/**' + - 'docs/**' + - '.github/workflows/pages.yml' + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment; do not cancel an in-progress production deploy. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + defaults: + run: + working-directory: website + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Install + run: npm install + + - name: Build + run: npm run build + + - name: Upload Pages artifact + if: github.ref == 'refs/heads/master' + uses: actions/upload-pages-artifact@v3 + with: + path: website/.vitepress/dist + + deploy: + if: github.ref == 'refs/heads/master' + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 00000000..2c1fa99c --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +.vitepress/dist/ +.vitepress/cache/ diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts new file mode 100644 index 00000000..4d776a15 --- /dev/null +++ b/website/.vitepress/config.ts @@ -0,0 +1,70 @@ +import { defineConfig } from 'vitepress' + +const REPO = 'https://github.com/huhamhire/code-meeseeks' +const description = + 'A local, semi-automated AI code-review desktop client for the individual reviewer, built on pr-agent.' + +// GitHub Pages project site serves under // by default. +// Set SITE_BASE=/ when a custom domain (CNAME) is configured. +const base = process.env.SITE_BASE ?? '/code-meeseeks/' + +export default defineConfig({ + base, + title: 'Code Meeseeks', + description, + lang: 'en-US', + cleanUrls: true, + lastUpdated: true, + metaChunk: true, + + // README.md is the dev-facing readme (repo-relative links), not a site page. + srcExclude: ['README.md'], + + themeConfig: { + socialLinks: [{ icon: 'github', link: REPO }], + search: { provider: 'local' }, + }, + + locales: { + root: { + label: 'English', + lang: 'en-US', + themeConfig: { + nav: [ + { text: 'Guide', link: `${REPO}/tree/master/docs/guide` }, + { text: 'Roadmap', link: `${REPO}/blob/master/docs/ROADMAP.md` }, + { text: 'Download', link: `${REPO}/releases` }, + ], + footer: { + message: 'Released under the Apache License 2.0.', + copyright: `An unofficial, independent open-source tool. Not affiliated with Rick and Morty.`, + }, + }, + }, + zh: { + label: '简体中文', + lang: 'zh-CN', + description: '面向 Reviewer 个人的本地化、半自动 AI 代码评审桌面客户端,基于 pr-agent 构建。', + themeConfig: { + nav: [ + { text: '使用说明', link: `${REPO}/tree/master/docs/guide` }, + { text: '路线图', link: `${REPO}/blob/master/docs/ROADMAP.md` }, + { text: '下载', link: `${REPO}/releases` }, + ], + footer: { + message: '基于 Apache License 2.0 发布。', + copyright: '非官方、独立的开源工具,与 Rick and Morty 无任何关联。', + }, + docFooter: { prev: '上一页', next: '下一页' }, + outline: { label: '本页目录' }, + lastUpdated: { text: '最后更新于' }, + langMenuLabel: '切换语言', + returnToTopLabel: '回到顶部', + sidebarMenuLabel: '菜单', + darkModeSwitchLabel: '主题', + lightModeSwitchTitle: '切换到浅色模式', + darkModeSwitchTitle: '切换到深色模式', + }, + }, + }, +}) diff --git a/website/README.md b/website/README.md new file mode 100644 index 00000000..8f905e8f --- /dev/null +++ b/website/README.md @@ -0,0 +1,41 @@ +# Code Meeseeks Website + +Brand website for Code Meeseeks, built with [VitePress](https://vitepress.dev/). English is the default locale; Simplified Chinese lives under `/zh/`. + +This is a **standalone sub-project** — it is not part of the npm workspace or Nx (the `workspaces` globs only cover `apps/*` and `packages/*`), so it keeps its own `package.json` / lockfile and is built and deployed on its own, like `cli/`. + +## Local development + +```bash +cd website +npm install +npm run dev # local dev server with hot reload +npm run build # production build → .vitepress/dist +npm run preview # preview the production build +``` + +Node >= 20 (22 recommended), same as the rest of the repo. + +## Structure + +``` +website/ +├── .vitepress/config.ts # site config + i18n (en root, /zh/) +├── index.md # English landing (home layout) +├── zh/index.md # Chinese landing +└── public/ # static assets (favicon, images) +``` + +## Deployment + +Deployed to GitHub Pages via [`.github/workflows/pages.yml`](../.github/workflows/pages.yml): +build runs on every PR touching `website/**` or `docs/**` (as a check), and deploy runs on push to `master`. The workflow is decoupled from the `v*` release pipeline. + +The site serves under `/code-meeseeks/` by default (GitHub Pages project site). When a custom domain is configured, set `SITE_BASE=/` for the build. + +## Content sync + +Per the [Roadmap](../docs/ROADMAP.md) content-sync convention, each kind of content has a single source of truth: + +- **Positioning / features** — source of truth is the repo README; the landing page paraphrases at marketing altitude, it does not copy verbatim. +- **User guide** — source of truth is `docs/guide/`; when the site hosts docs it builds from there rather than keeping a second copy. diff --git a/website/index.md b/website/index.md new file mode 100644 index 00000000..ad2bcbaf --- /dev/null +++ b/website/index.md @@ -0,0 +1,35 @@ +--- +layout: home + +hero: + name: Code Meeseeks + text: AI code review, on your terms + tagline: A local, semi-automated AI code-review desktop client for the individual reviewer — built on pr-agent. The human decides, rules stay local, data stays local. + actions: + - theme: brand + text: Download + link: https://github.com/huhamhire/code-meeseeks/releases + - theme: alt + text: View on GitHub + link: https://github.com/huhamhire/code-meeseeks + +features: + - icon: 🧑‍⚖️ + title: The human decides + details: Every comment is confirmed or edited by you before it reaches the remote. The AI only drafts — you keep the final call. + - icon: 🔒 + title: Data stays local + details: Repository mirrors, PR metadata, and comment drafts all live on your machine. Wire up a local model and nothing ever leaves it. + - icon: 🌍 + title: GitHub · Bitbucket · GitLab + details: Unified access across platforms, including self-hosted GitHub Enterprise and GitLab Self-Managed, adapting to each platform's capabilities. + - icon: 🤖 + title: Agentic review + details: Command-driven pr-agent plus autonomous orchestration, AutoPilot pre-review, and a re-review loop — with an observable, interruptible process. + - icon: ⚙️ + title: Your models, your rules + details: Multiple LLM providers (OpenAI, Anthropic, DeepSeek, and any OpenAI-compatible endpoint) and a personalized rules directory you fully control. + - icon: 🔌 + title: CLI & integration + details: A local API and the cross-platform meebox CLI let external agents, scripts, and CI fold PR review into automated workflows. +--- diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 00000000..de8cbe7b --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,2514 @@ +{ + "name": "code-meeseeks-website", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "code-meeseeks-website", + "version": "0.0.0", + "license": "Apache-2.0", + "devDependencies": { + "vitepress": "^1.6.4" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.21.1.tgz", + "integrity": "sha512-Wia5/mNTfiU0PIUN25UMfAGGdASkkwuCS9nBAdmhqrNPY/ff7U/6MgBVdwFDPsa3sA1msutPtO50gvOzx6MOXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "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.1", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.55.1.tgz", + "integrity": "sha512-miW8RzAtBgNiEJ9fGEhsOPgWUpekAe64YcVufqXrlykj0Jjmo5nj0a5f/HAzRVX5ZuU1GAVd7BkzFDx7q50P3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.55.1.tgz", + "integrity": "sha512-eR3J3kB9JX6DdCvDRi3I4KPfwO6fR9HWYRXhVke2TXIoOQafMKCRAneg33JRmIrb+DnnJ/eWApJLF1O1CLPERg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.55.1.tgz", + "integrity": "sha512-P5ak7EurwYqgAiDyb95mgA3WRR/Zu8CPMv36lWTISvL2AmlPyqQPy2nX/KEJRTcwaeTWwrk6wJV4/M93GfjOWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.55.1.tgz", + "integrity": "sha512-OVtj9uA//+pjvKQI5INnzbyLrf3ClNv3XRbWswwJ2kHIStQNHtBfHo+LofNB/WhM9xjuXlW5ANn2aMj65UGx7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.55.1.tgz", + "integrity": "sha512-oKlVFlp+qbIEe4p7E54zSiP2gEV/vDu972Ykv8VDMFwEvreS7m0YKA3a8hGGHwc7yiBUGGiR3LlwzMLfnJmy6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.55.1.tgz", + "integrity": "sha512-BOVrld6vdtsFmotVDMTVQfYXwrVplJ+DUvy60JFi+tkWV698q2J9NNPKEO3dr5qxtSLKQP4vHF8n+3U5PDWhOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.55.1.tgz", + "integrity": "sha512-GAqHl9zERhC3bbBfubwUu07G3UXO06gORvOcsiTBZB3et0s3auNUbHlYdYNp4VKa3sUZqH5AcD3OKzU/KDGXjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.55.1.tgz", + "integrity": "sha512-BXZw+C+gsWL7pZvbnhJUnCXASiDLGcQxVV7h55Pyh2DmSzwdZIVccE5xc9RVD2trtrhIqk5smuODTxtaZqd0IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.55.1.tgz", + "integrity": "sha512-9g/ceZrZTqA62FA3588Xj0onRPjDNfu0pVQqefK0rrHp9H6Wblph/YmzGjZ2g8uqbTh0ZGIvAGCzErU8f7MHpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.55.1.tgz", + "integrity": "sha512-cZTIrGyAP+W4A6jDVwvWM/JOaoJKQkD/2a5eLUEeNdKAD45jN7BCpsMDONyhZlosLa4UwL8uiINQzj4iFy9nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.55.1.tgz", + "integrity": "sha512-N6I3leW0UO8Y9Zv90yo2UHgYGuxZO0mjbvzNxDIJDjO0qECEF7Z9XMvSNeUWXQh/iNDA9lr8MfEy3rmZGIcclw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.55.1.tgz", + "integrity": "sha512-ukU5zeeFs44rQkzv+TRdYard+d+3lmPGs8lPZhHtWE8rfz+LlBSF6s9kP3VQ7LeOYL8Dz0u6tZfnyTrqrumbHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.55.1.tgz", + "integrity": "sha512-lCwXyijwPm3vbYHpBXPRomMcD6mgiptmps27gnMCf4HK+u/AOeFPBnIFh4V3l4A5SnP9VRiKBZqwGBpUH0vaTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1" + }, + "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.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.88", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.88.tgz", + "integrity": "sha512-+cvi1qCuvReL29ehi6t62L4fb7GDXe+UlGHFcsJcV7I2l9wtqn9XE2IBKcDr3CI5iGUGS5ISnXv699pSGpyx1Q==", + "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", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "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/@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.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "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/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/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/@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", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "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-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-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.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.55.1.tgz", + "integrity": "sha512-FyaFnnsbVPtevQwqSj/SdxE3jAsSsY0BEH8IVLf9rXxEBdAhAmT6VKCVSMWoaPIHVN1Eufh/1w8q6k8URpIkWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.21.1", + "@algolia/client-abtesting": "5.55.1", + "@algolia/client-analytics": "5.55.1", + "@algolia/client-common": "5.55.1", + "@algolia/client-insights": "5.55.1", + "@algolia/client-personalization": "5.55.1", + "@algolia/client-query-suggestions": "5.55.1", + "@algolia/client-search": "5.55.1", + "@algolia/ingestion": "1.55.1", + "@algolia/monitoring": "1.55.1", + "@algolia/recommend": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "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/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/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/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/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/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/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/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/esbuild": { + "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", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@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": { + "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/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", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "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/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/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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/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", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.29.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.3.tgz", + "integrity": "sha512-D9NL1GAnJZhc3RndVs4gDdxEeU9TcHgywMrhhOsnpdlvFjdbx0gAsLUnH6JEhlJH5giL7Tx5biWPUSEXE/HPzw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "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/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", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "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/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/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "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/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/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/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/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/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": "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.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "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/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/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/website/package.json b/website/package.json new file mode 100644 index 00000000..4172c1f2 --- /dev/null +++ b/website/package.json @@ -0,0 +1,16 @@ +{ + "name": "code-meeseeks-website", + "version": "0.0.0", + "private": true, + "description": "Code Meeseeks brand website (VitePress). Standalone sub-project, not part of the npm workspace / Nx.", + "license": "Apache-2.0", + "type": "module", + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.6.4" + } +} diff --git a/website/zh/index.md b/website/zh/index.md new file mode 100644 index 00000000..a53993f7 --- /dev/null +++ b/website/zh/index.md @@ -0,0 +1,35 @@ +--- +layout: home + +hero: + name: Code Meeseeks + text: AI 代码评审,决策权在你 + tagline: 面向 Reviewer 个人的本地化、半自动 AI 代码评审桌面客户端,基于 pr-agent 构建。决策权在人、规则在本地、数据在本地。 + actions: + - theme: brand + text: 下载 + link: https://github.com/huhamhire/code-meeseeks/releases + - theme: alt + text: 在 GitHub 查看 + link: https://github.com/huhamhire/code-meeseeks + +features: + - icon: 🧑‍⚖️ + title: 决策权在人 + details: 所有评论都需你二次确认 / 编辑后才会发到远端,AI 只做草稿,最终决定权始终在你手里。 + - icon: 🔒 + title: 数据在本地 + details: 仓库副本、PR 元数据、评论草稿都存在本机;接入本地模型即可全程不出本机,企业内网友好。 + - icon: 🌍 + title: GitHub · Bitbucket · GitLab + details: 统一接入多平台,含自建 GitHub Enterprise 与 GitLab Self-Managed,按平台能力自适应降级。 + - icon: 🤖 + title: Agentic 评审 + details: 指令驱动 pr-agent,叠加自主编排、AutoPilot 预评审与复评闭环;过程可观测,可中途追加、随时停止。 + - icon: ⚙️ + title: 你的模型,你的规则 + details: 多 LLM Provider(OpenAI / Anthropic / DeepSeek 及任意 OpenAI 兼容端点)+ 完全自控的个性化规则目录。 + - icon: 🔌 + title: CLI 与外部集成 + details: 本地 API + 跨平台 meebox CLI,让外部 agent、脚本、CI 把 PR 评审纳入自动化流程。 +--- From e4688117490e34ed32febbcd78b810196f65badf Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 10:41:02 +0800 Subject: [PATCH 05/80] =?UTF-8?q?feat(website):=20=E4=BB=8E=20docs/guide?= =?UTF-8?q?=20=E6=9E=84=E5=BB=BA=E6=9C=9F=E5=90=8C=E6=AD=A5=E6=89=98?= =?UTF-8?q?=E7=AE=A1=E4=B8=AD=E6=96=87=E4=BD=BF=E7=94=A8=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sync-docs.mjs:构建/开发前把 docs/guide 拷入 zh/guide(gitignored 派生物,SoT 仍在 docs/guide) - 越界链接(../arch 等站外内容)改写为 GitHub 绝对地址,站内互链保留,README→index - zh 侧 nav/sidebar 接入使用说明八篇 - ignoreDeadLinks 限定 /zh/guide/ 子树与锚点,容忍同步内容的 slug 漂移、不放过落地页/导航真实死链 Co-Authored-By: Claude Opus 4.8 (1M context) --- website/.gitignore | 3 ++ website/.vitepress/config.ts | 25 ++++++++++++++- website/package.json | 5 +-- website/scripts/sync-docs.mjs | 57 +++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 website/scripts/sync-docs.mjs diff --git a/website/.gitignore b/website/.gitignore index 2c1fa99c..a2f73cac 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -1,3 +1,6 @@ node_modules/ .vitepress/dist/ .vitepress/cache/ + +# Generated by scripts/sync-docs.mjs from docs/guide/ (single source of truth) +zh/guide/ diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index 4d776a15..18abf958 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -20,6 +20,12 @@ export default defineConfig({ // README.md is the dev-facing readme (repo-relative links), not a site page. srcExclude: ['README.md'], + // The guide under /zh/guide/ is generated from docs/guide/ (single source of + // truth, not maintained here). Its cross-links may carry anchor slugs that + // don't match VitePress's, so scope dead-link tolerance to that subtree and to + // anchor fragments — landing/nav links are still checked. + ignoreDeadLinks: [/^\/zh\/guide\//, /#/], + themeConfig: { socialLinks: [{ icon: 'github', link: REPO }], search: { provider: 'local' }, @@ -47,10 +53,27 @@ export default defineConfig({ description: '面向 Reviewer 个人的本地化、半自动 AI 代码评审桌面客户端,基于 pr-agent 构建。', themeConfig: { nav: [ - { text: '使用说明', link: `${REPO}/tree/master/docs/guide` }, + { text: '使用说明', link: '/zh/guide/' }, { text: '路线图', link: `${REPO}/blob/master/docs/ROADMAP.md` }, { text: '下载', link: `${REPO}/releases` }, ], + sidebar: { + '/zh/guide/': [ + { + text: '使用说明', + items: [ + { text: '概览', link: '/zh/guide/' }, + { text: '安装与首次使用', link: '/zh/guide/00-getting-started' }, + { text: '代码平台配置', link: '/zh/guide/01-code-platform' }, + { text: 'LLM 配置', link: '/zh/guide/02-llm' }, + { text: '网络代理配置', link: '/zh/guide/03-proxy' }, + { text: '配置文件参考', link: '/zh/guide/04-config-reference' }, + { text: '自定义评审规则', link: '/zh/guide/05-rules' }, + { text: 'CLI 命令行工具', link: '/zh/guide/06-cli' }, + ], + }, + ], + }, footer: { message: '基于 Apache License 2.0 发布。', copyright: '非官方、独立的开源工具,与 Rick and Morty 无任何关联。', diff --git a/website/package.json b/website/package.json index 4172c1f2..ea65ff2e 100644 --- a/website/package.json +++ b/website/package.json @@ -6,8 +6,9 @@ "license": "Apache-2.0", "type": "module", "scripts": { - "dev": "vitepress dev", - "build": "vitepress build", + "sync": "node scripts/sync-docs.mjs", + "dev": "npm run sync && vitepress dev", + "build": "npm run sync && vitepress build", "preview": "vitepress preview" }, "devDependencies": { diff --git a/website/scripts/sync-docs.mjs b/website/scripts/sync-docs.mjs new file mode 100644 index 00000000..bf27e2ef --- /dev/null +++ b/website/scripts/sync-docs.mjs @@ -0,0 +1,57 @@ +// Sync the user guide from docs/guide/ into the VitePress site (zh locale). +// +// The repo `docs/guide/` is the single source of truth; this copies it into +// `zh/guide/` at dev/build time (that dir is gitignored — never edit it by hand). +// Links that escape the guide (e.g. ../arch/, ../../README) point at pages the +// site does not host, so they are rewritten to absolute GitHub URLs; intra-guide +// links stay relative for VitePress to resolve. + +import { readdir, readFile, writeFile, rm, mkdir } from 'node:fs/promises' +import path from 'node:path' + +const CWD = process.cwd() // website/ +const SRC = path.resolve(CWD, '../docs/guide') +const DEST = path.resolve(CWD, 'zh/guide') +const REPO_BLOB = 'https://github.com/huhamhire/code-meeseeks/blob/master' + +// Rewrite a single markdown link target. +function rewriteTarget(target) { + if (/^(https?:)?\/\//.test(target) || target.startsWith('#') || target.startsWith('/')) { + return target + } + const [rel, hash] = target.split('#') + if (!rel) return target // pure anchor + // Resolve relative to docs/guide/ within the repo. + const resolved = path.posix.normalize(path.posix.join('docs/guide', rel)) + if (resolved.startsWith('docs/guide/')) { + return target // stays inside the guide → keep relative + } + // Escapes the guide → link to the file on GitHub. + return `${REPO_BLOB}/${resolved}${hash ? '#' + hash : ''}` +} + +function rewriteLinks(md) { + return md.replace(/\]\(([^)]+)\)/g, (_m, target) => `](${rewriteTarget(target)})`) +} + +async function main() { + await rm(DEST, { recursive: true, force: true }) + await mkdir(DEST, { recursive: true }) + + const entries = await readdir(SRC, { withFileTypes: true }) + let count = 0 + for (const entry of entries) { + if (!entry.isFile() || !entry.name.endsWith('.md')) continue + const md = rewriteLinks(await readFile(path.join(SRC, entry.name), 'utf8')) + // README.md is the guide index → index.md + const outName = entry.name === 'README.md' ? 'index.md' : entry.name + await writeFile(path.join(DEST, outName), md, 'utf8') + count++ + } + console.log(`[sync-docs] copied ${count} guide file(s) → zh/guide/`) +} + +main().catch((err) => { + console.error('[sync-docs] failed:', err) + process.exit(1) +}) From 9a098d33e909b2c0ff03393fcdfce7e8928cbc59 Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 10:54:36 +0800 Subject: [PATCH 06/80] =?UTF-8?q?feat(website):=20=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E5=93=81=E7=89=8C=E8=A7=86=E8=A7=89=20=E2=80=94=E2=80=94=20log?= =?UTF-8?q?o/favicon/=E4=B8=BB=E8=89=B2=20+=20=E6=88=AA=E5=9B=BE=E5=8D=A0?= =?UTF-8?q?=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - logo 用真实品牌图标 icon.png(Meeseeks 蓝),favicon 复用 icon.ico(多尺寸),经 public/ 提供 - 品牌主色取 VS Code 蓝(与应用默认主题一致):亮 #005fb8/#0e639c、暗 #6cb6ff,含 hero 渐变 - head favicon 走 base 前缀,兼容 Pages 子路径;pages.yml checkout 加 lfs:true 拉取真图 - 截图先放 SVG 占位(VS Code 风窗口线框,免 LFS),真图后续替换 Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/pages.yml | 2 + website/.vitepress/config.ts | 8 +++ website/.vitepress/theme/custom.css | 42 ++++++++++++++ website/.vitepress/theme/index.ts | 4 ++ website/index.md | 8 +++ website/public/favicon.ico | 3 + website/public/logo.png | 3 + website/public/screenshot-placeholder.svg | 70 +++++++++++++++++++++++ website/zh/index.md | 8 +++ 9 files changed, 148 insertions(+) create mode 100644 website/.vitepress/theme/custom.css create mode 100644 website/.vitepress/theme/index.ts create mode 100644 website/public/favicon.ico create mode 100644 website/public/logo.png create mode 100644 website/public/screenshot-placeholder.svg diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 9c5e3d9c..cb102a34 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -34,6 +34,8 @@ jobs: working-directory: website steps: - uses: actions/checkout@v4 + with: + lfs: true # brand icon/favicon are Git LFS assets — fetch real bytes, not pointers - uses: actions/setup-node@v4 with: diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index 18abf958..7b7eb45e 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -26,7 +26,15 @@ export default defineConfig({ // anchor fragments — landing/nav links are still checked. ignoreDeadLinks: [/^\/zh\/guide\//, /#/], + // base-aware so favicons resolve on the GitHub Pages project sub-path too. + head: [ + ['link', { rel: 'icon', href: `${base}favicon.ico`, sizes: '48x48' }], + ['link', { rel: 'icon', type: 'image/png', href: `${base}logo.png` }], + ['link', { rel: 'apple-touch-icon', href: `${base}logo.png` }], + ], + themeConfig: { + logo: '/logo.png', socialLinks: [{ icon: 'github', link: REPO }], search: { provider: 'local' }, }, diff --git a/website/.vitepress/theme/custom.css b/website/.vitepress/theme/custom.css new file mode 100644 index 00000000..ca913211 --- /dev/null +++ b/website/.vitepress/theme/custom.css @@ -0,0 +1,42 @@ +/** + * Brand palette — VS Code blue, matching the desktop app's default theme + * (see apps/desktop/src/renderer/src/styles/_palette.scss $vscode-blue-*). + */ +:root { + --vp-c-brand-1: #0e639c; /* links / accent text (readable on light) */ + --vp-c-brand-2: #1177bb; /* hover */ + --vp-c-brand-3: #005fb8; /* solid buttons / badges */ + --vp-c-brand-soft: rgba(17, 119, 187, 0.14); + + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: linear-gradient(120deg, #005fb8 20%, #6cb6ff); + + --vp-home-hero-image-background-image: linear-gradient(120deg, rgba(14, 99, 156, 0.28), rgba(108, 182, 255, 0.28)); + --vp-home-hero-image-filter: blur(48px); +} + +.dark { + --vp-c-brand-1: #6cb6ff; /* links / accent text (readable on dark) */ + --vp-c-brand-2: #8cc6ff; /* hover */ + --vp-c-brand-3: #0e639c; /* solid buttons / badges */ + --vp-c-brand-soft: rgba(108, 182, 255, 0.16); +} + +/* Product screenshot / placeholder framing under the hero. */ +.screenshot-frame { + max-width: 1152px; + margin: 8px auto 0; + padding: 0 24px; +} +.screenshot-frame img { + width: 100%; + height: auto; + border-radius: 12px; + box-shadow: 0 18px 56px -12px rgba(0, 0, 0, 0.35); +} +.screenshot-frame figcaption { + margin-top: 12px; + text-align: center; + font-size: 13px; + color: var(--vp-c-text-3); +} diff --git a/website/.vitepress/theme/index.ts b/website/.vitepress/theme/index.ts new file mode 100644 index 00000000..42fe9a93 --- /dev/null +++ b/website/.vitepress/theme/index.ts @@ -0,0 +1,4 @@ +import DefaultTheme from 'vitepress/theme' +import './custom.css' + +export default DefaultTheme diff --git a/website/index.md b/website/index.md index ad2bcbaf..2e00f263 100644 --- a/website/index.md +++ b/website/index.md @@ -5,6 +5,9 @@ hero: name: Code Meeseeks text: AI code review, on your terms tagline: A local, semi-automated AI code-review desktop client for the individual reviewer — built on pr-agent. The human decides, rules stay local, data stays local. + image: + src: /logo.png + alt: Code Meeseeks actions: - theme: brand text: Download @@ -33,3 +36,8 @@ features: title: CLI & integration details: A local API and the cross-platform meebox CLI let external agents, scripts, and CI fold PR review into automated workflows. --- + +
+ Code Meeseeks UI preview +
Interface preview — a polished screenshot is on the way.
+
diff --git a/website/public/favicon.ico b/website/public/favicon.ico new file mode 100644 index 00000000..e8499ad4 --- /dev/null +++ b/website/public/favicon.ico @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fce064da083d33e581528e868b2800ebcc4ba5b1807fb64de8d81594997036e5 +size 285478 diff --git a/website/public/logo.png b/website/public/logo.png new file mode 100644 index 00000000..7d6bc805 --- /dev/null +++ b/website/public/logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72cb1904c11a1cb51bcded880a1ec088164f9300f6b322cbf6224ed55af1af63 +size 266542 diff --git a/website/public/screenshot-placeholder.svg b/website/public/screenshot-placeholder.svg new file mode 100644 index 00000000..91e800a5 --- /dev/null +++ b/website/public/screenshot-placeholder.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + Code Meeseeks — feat/awesome-change · #1024 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M + + + + + + + + + + diff --git a/website/zh/index.md b/website/zh/index.md index a53993f7..4243a0ed 100644 --- a/website/zh/index.md +++ b/website/zh/index.md @@ -5,6 +5,9 @@ hero: name: Code Meeseeks text: AI 代码评审,决策权在你 tagline: 面向 Reviewer 个人的本地化、半自动 AI 代码评审桌面客户端,基于 pr-agent 构建。决策权在人、规则在本地、数据在本地。 + image: + src: /logo.png + alt: Code Meeseeks actions: - theme: brand text: 下载 @@ -33,3 +36,8 @@ features: title: CLI 与外部集成 details: 本地 API + 跨平台 meebox CLI,让外部 agent、脚本、CI 把 PR 评审纳入自动化流程。 --- + +
+ Code Meeseeks 界面预览 +
界面预览 —— 正式截图即将上线。
+
From 143647e82fcfcae83a00074f9d7d3223c8adfb72 Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 10:56:59 +0800 Subject: [PATCH 07/80] =?UTF-8?q?feat(website):=20=E8=90=BD=E5=9C=B0?= =?UTF-8?q?=E9=A1=B5=E8=A1=A5=E4=B8=8B=E8=BD=BD=E4=B8=8E=20FAQ=20=E5=8C=BA?= =?UTF-8?q?=E5=9D=97=EF=BC=88=E5=8F=8C=E8=AF=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 下载:分平台安装包表(Windows x64 / macOS arm64)+ macOS 首次打开提示,镜像 README 安装段 - FAQ:6 条常见问题折叠面板(数据外发 / 免装 Python·Docker / 平台与模型 / 非 CI bot / token 成本 / 开源许可) Co-Authored-By: Claude Opus 4.8 (1M context) --- website/index.md | 39 +++++++++++++++++++++++++++++++++++++++ website/zh/index.md | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/website/index.md b/website/index.md index 2e00f263..8806e59e 100644 --- a/website/index.md +++ b/website/index.md @@ -41,3 +41,42 @@ features: Code Meeseeks UI preview
Interface preview — a polished screenshot is on the way.
+ +## Download + +Grab the installer for your platform from the [Releases page](https://github.com/huhamhire/code-meeseeks/releases). pr-agent is embedded — there is no extra runtime to install. + +| Platform | Installer | Status | +| ----------- | --------------------------------------------- | ----------- | +| Windows x64 | `code-meeseeks--win-x64.exe` (NSIS) | ✅ Available | +| macOS arm64 | `code-meeseeks--mac-arm64.dmg` | ✅ Available | + +::: tip macOS first launch +The installer is ad-hoc signed and not Apple-notarized (this is free, open-source software without a paid Apple Developer account). On first open, right-click the app → **Open**, or go to **System Settings → Privacy & Security → Open Anyway**. Confirm once and it launches normally. +::: + +## FAQ + +::: details Does my code leave my machine? +Only what you configure: the PR diff and your rules go to the LLM provider you set up, and Code Meeseeks talks to the Git platform you connect. Nothing else is reported. Wire up a local model (e.g. local Ollama) and nothing ever leaves your machine. +::: + +::: details Do I need to install Python or Docker? +No. pr-agent and its Python runtime are embedded in the installer — it works right after installation. +::: + +::: details Which platforms and models are supported? +Platforms: GitHub (incl. Enterprise Server), Bitbucket Server / Data Center, and GitLab (incl. Self-Managed). Models: any OpenAI-compatible / litellm-supported provider — OpenAI, Anthropic, DeepSeek, and more — or a local model. +::: + +::: details Is this a CI review bot? +No. Code Meeseeks is a desktop tool for the individual reviewer — every comment is confirmed or edited by you before it is published. Automated in-CI review is what pr-agent itself is for. +::: + +::: details What about token cost? +Agentic review and AutoPilot chain several model calls per PR, so token use is higher than a single manual review. Per-step usage is shown on the review timeline so you can watch it, whether you use a pay-as-you-go API or a local CLI / subscription account. +::: + +::: details Is it free and open source? +Yes — licensed under Apache-2.0. The source is public, auditable, and buildable yourself. +::: diff --git a/website/zh/index.md b/website/zh/index.md index 4243a0ed..1efe9778 100644 --- a/website/zh/index.md +++ b/website/zh/index.md @@ -41,3 +41,42 @@ features: Code Meeseeks 界面预览
界面预览 —— 正式截图即将上线。
+ +## 下载 + +到 [Releases 页面](https://github.com/huhamhire/code-meeseeks/releases) 下载对应平台安装包。安装包已内嵌 pr-agent,无需额外运行时。 + +| 平台 | 安装包 | 状态 | +| ----------- | --------------------------------------------- | ------- | +| Windows x64 | `code-meeseeks--win-x64.exe`(NSIS) | ✅ 可用 | +| macOS arm64 | `code-meeseeks--mac-arm64.dmg` | ✅ 可用 | + +::: tip macOS 首次打开 +安装包为 ad-hoc 签名、未做 Apple 公证(本项目是免费开源软件,未购置 Apple Developer 付费账号)。首次打开请右键点击 App → **打开**,或到 **系统设置 → 隐私与安全性 → 仍要打开**,确认一次后即可正常启动。 +::: + +## 常见问题 + +::: details 我的代码会离开本机吗? +只有你配置的内容会外发:PR diff 与你的规则发给你自行配置的 LLM 服务商,Code Meeseeks 只与你接入的 Git 平台通信,此外不上报任何数据。接入本地模型(如本地 Ollama)即可全程不出本机。 +::: + +::: details 需要额外装 Python 或 Docker 吗? +不需要。pr-agent 及其 Python 运行时已内嵌进安装包,装完即用。 +::: + +::: details 支持哪些平台与模型? +平台:GitHub(含 Enterprise Server)、Bitbucket Server / Data Center、GitLab(含 Self-Managed)。模型:任意 OpenAI 兼容 / litellm 支持的服务商——OpenAI、Anthropic、DeepSeek 等,或本地模型。 +::: + +::: details 这是 CI 里的评审 bot 吗? +不是。Code Meeseeks 是面向 Reviewer 个人的桌面工具——每条评论都需你二次确认 / 编辑后才会发布。CI 中自动评审是 pr-agent 本身的定位。 +::: + +::: details token 成本如何? +Agentic 评审与 AutoPilot 会对每个 PR 串联多次模型调用,token 消耗高于单次手动评审。每步用量都在评审时间线上分步展示,便于观察——无论用按量计费 API 还是本地 CLI / 订阅账户。 +::: + +::: details 是免费开源的吗? +是,采用 Apache-2.0 许可。源码完全公开、可自行审计与构建。 +::: From f3f14ee8911a68f236555c780300717ce12b9315 Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 11:14:35 +0800 Subject: [PATCH 08/80] =?UTF-8?q?feat(website):=20=E7=8B=AC=E7=AB=8B=20Dow?= =?UTF-8?q?nload=20=E9=A1=B5=20+=20=E8=BF=90=E8=A1=8C=E6=97=B6=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=89=88=E4=B8=8B=E8=BD=BD=EF=BC=88OS=20=E8=AF=86?= =?UTF-8?q?=E5=88=AB=20+=20CLI=20=E4=B8=93=E6=A0=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Download/FAQ 从落地页迁至独立 /download(内容不多,二者共用一页),hero/nav 指向它 - DownloadPanel 组件运行时打 GitHub releases/latest 取真实资产:OS 识别给推荐项 + 列全部候选 - 桌面端(Windows .exe / macOS .dmg)+ 独立 meebox CLI 栏(win/mac/linux×2 压缩包),各含大小与安装提示 - 失败回退 Releases 页;双语随页面语言切换;资产归类经真实 v0.9.0 release 数据验证 Co-Authored-By: Claude Opus 4.8 (1M context) --- website/.vitepress/config.ts | 4 +- .../theme/components/DownloadPanel.vue | 323 ++++++++++++++++++ website/.vitepress/theme/index.ts | 8 +- website/download.md | 34 ++ website/index.md | 41 +-- website/zh/download.md | 34 ++ website/zh/index.md | 41 +-- 7 files changed, 402 insertions(+), 83 deletions(-) create mode 100644 website/.vitepress/theme/components/DownloadPanel.vue create mode 100644 website/download.md create mode 100644 website/zh/download.md diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index 7b7eb45e..6fdbc88a 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -47,7 +47,7 @@ export default defineConfig({ nav: [ { text: 'Guide', link: `${REPO}/tree/master/docs/guide` }, { text: 'Roadmap', link: `${REPO}/blob/master/docs/ROADMAP.md` }, - { text: 'Download', link: `${REPO}/releases` }, + { text: 'Download', link: '/download' }, ], footer: { message: 'Released under the Apache License 2.0.', @@ -63,7 +63,7 @@ export default defineConfig({ nav: [ { text: '使用说明', link: '/zh/guide/' }, { text: '路线图', link: `${REPO}/blob/master/docs/ROADMAP.md` }, - { text: '下载', link: `${REPO}/releases` }, + { text: '下载', link: '/zh/download' }, ], sidebar: { '/zh/guide/': [ diff --git a/website/.vitepress/theme/components/DownloadPanel.vue b/website/.vitepress/theme/components/DownloadPanel.vue new file mode 100644 index 00000000..84b9b141 --- /dev/null +++ b/website/.vitepress/theme/components/DownloadPanel.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/website/.vitepress/theme/index.ts b/website/.vitepress/theme/index.ts index 42fe9a93..07ae6d9f 100644 --- a/website/.vitepress/theme/index.ts +++ b/website/.vitepress/theme/index.ts @@ -1,4 +1,10 @@ import DefaultTheme from 'vitepress/theme' +import DownloadPanel from './components/DownloadPanel.vue' import './custom.css' -export default DefaultTheme +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + app.component('DownloadPanel', DownloadPanel) + }, +} diff --git a/website/download.md b/website/download.md new file mode 100644 index 00000000..7c03f302 --- /dev/null +++ b/website/download.md @@ -0,0 +1,34 @@ +--- +title: Download +outline: [2, 2] +--- + +# Download + + + +## FAQ + +::: details Does my code leave my machine? +Only what you configure: the PR diff and your rules go to the LLM provider you set up, and Code Meeseeks talks to the Git platform you connect. Nothing else is reported. Wire up a local model (e.g. local Ollama) and nothing ever leaves your machine. +::: + +::: details Do I need to install Python or Docker? +No. pr-agent and its Python runtime are embedded in the installer — it works right after installation. +::: + +::: details Which platforms and models are supported? +Platforms: GitHub (incl. Enterprise Server), Bitbucket Server / Data Center, and GitLab (incl. Self-Managed). Models: any OpenAI-compatible / litellm-supported provider — OpenAI, Anthropic, DeepSeek, and more — or a local model. +::: + +::: details Is this a CI review bot? +No. Code Meeseeks is a desktop tool for the individual reviewer — every comment is confirmed or edited by you before it is published. Automated in-CI review is what pr-agent itself is for. +::: + +::: details What about token cost? +Agentic review and AutoPilot chain several model calls per PR, so token use is higher than a single manual review. Per-step usage is shown on the review timeline so you can watch it, whether you use a pay-as-you-go API or a local CLI / subscription account. +::: + +::: details Is it free and open source? +Yes — licensed under Apache-2.0. The source is public, auditable, and buildable yourself. +::: diff --git a/website/index.md b/website/index.md index 8806e59e..814fbf2f 100644 --- a/website/index.md +++ b/website/index.md @@ -11,7 +11,7 @@ hero: actions: - theme: brand text: Download - link: https://github.com/huhamhire/code-meeseeks/releases + link: /download - theme: alt text: View on GitHub link: https://github.com/huhamhire/code-meeseeks @@ -41,42 +41,3 @@ features: Code Meeseeks UI preview
Interface preview — a polished screenshot is on the way.
- -## Download - -Grab the installer for your platform from the [Releases page](https://github.com/huhamhire/code-meeseeks/releases). pr-agent is embedded — there is no extra runtime to install. - -| Platform | Installer | Status | -| ----------- | --------------------------------------------- | ----------- | -| Windows x64 | `code-meeseeks--win-x64.exe` (NSIS) | ✅ Available | -| macOS arm64 | `code-meeseeks--mac-arm64.dmg` | ✅ Available | - -::: tip macOS first launch -The installer is ad-hoc signed and not Apple-notarized (this is free, open-source software without a paid Apple Developer account). On first open, right-click the app → **Open**, or go to **System Settings → Privacy & Security → Open Anyway**. Confirm once and it launches normally. -::: - -## FAQ - -::: details Does my code leave my machine? -Only what you configure: the PR diff and your rules go to the LLM provider you set up, and Code Meeseeks talks to the Git platform you connect. Nothing else is reported. Wire up a local model (e.g. local Ollama) and nothing ever leaves your machine. -::: - -::: details Do I need to install Python or Docker? -No. pr-agent and its Python runtime are embedded in the installer — it works right after installation. -::: - -::: details Which platforms and models are supported? -Platforms: GitHub (incl. Enterprise Server), Bitbucket Server / Data Center, and GitLab (incl. Self-Managed). Models: any OpenAI-compatible / litellm-supported provider — OpenAI, Anthropic, DeepSeek, and more — or a local model. -::: - -::: details Is this a CI review bot? -No. Code Meeseeks is a desktop tool for the individual reviewer — every comment is confirmed or edited by you before it is published. Automated in-CI review is what pr-agent itself is for. -::: - -::: details What about token cost? -Agentic review and AutoPilot chain several model calls per PR, so token use is higher than a single manual review. Per-step usage is shown on the review timeline so you can watch it, whether you use a pay-as-you-go API or a local CLI / subscription account. -::: - -::: details Is it free and open source? -Yes — licensed under Apache-2.0. The source is public, auditable, and buildable yourself. -::: diff --git a/website/zh/download.md b/website/zh/download.md new file mode 100644 index 00000000..93c8c936 --- /dev/null +++ b/website/zh/download.md @@ -0,0 +1,34 @@ +--- +title: 下载 +outline: [2, 2] +--- + +# 下载 + + + +## 常见问题 + +::: details 我的代码会离开本机吗? +只有你配置的内容会外发:PR diff 与你的规则发给你自行配置的 LLM 服务商,Code Meeseeks 只与你接入的 Git 平台通信,此外不上报任何数据。接入本地模型(如本地 Ollama)即可全程不出本机。 +::: + +::: details 需要额外装 Python 或 Docker 吗? +不需要。pr-agent 及其 Python 运行时已内嵌进安装包,装完即用。 +::: + +::: details 支持哪些平台与模型? +平台:GitHub(含 Enterprise Server)、Bitbucket Server / Data Center、GitLab(含 Self-Managed)。模型:任意 OpenAI 兼容 / litellm 支持的服务商——OpenAI、Anthropic、DeepSeek 等,或本地模型。 +::: + +::: details 这是 CI 里的评审 bot 吗? +不是。Code Meeseeks 是面向 Reviewer 个人的桌面工具——每条评论都需你二次确认 / 编辑后才会发布。CI 中自动评审是 pr-agent 本身的定位。 +::: + +::: details token 成本如何? +Agentic 评审与 AutoPilot 会对每个 PR 串联多次模型调用,token 消耗高于单次手动评审。每步用量都在评审时间线上分步展示,便于观察——无论用按量计费 API 还是本地 CLI / 订阅账户。 +::: + +::: details 是免费开源的吗? +是,采用 Apache-2.0 许可。源码完全公开、可自行审计与构建。 +::: diff --git a/website/zh/index.md b/website/zh/index.md index 1efe9778..eba60865 100644 --- a/website/zh/index.md +++ b/website/zh/index.md @@ -11,7 +11,7 @@ hero: actions: - theme: brand text: 下载 - link: https://github.com/huhamhire/code-meeseeks/releases + link: /zh/download - theme: alt text: 在 GitHub 查看 link: https://github.com/huhamhire/code-meeseeks @@ -41,42 +41,3 @@ features: Code Meeseeks 界面预览
界面预览 —— 正式截图即将上线。
- -## 下载 - -到 [Releases 页面](https://github.com/huhamhire/code-meeseeks/releases) 下载对应平台安装包。安装包已内嵌 pr-agent,无需额外运行时。 - -| 平台 | 安装包 | 状态 | -| ----------- | --------------------------------------------- | ------- | -| Windows x64 | `code-meeseeks--win-x64.exe`(NSIS) | ✅ 可用 | -| macOS arm64 | `code-meeseeks--mac-arm64.dmg` | ✅ 可用 | - -::: tip macOS 首次打开 -安装包为 ad-hoc 签名、未做 Apple 公证(本项目是免费开源软件,未购置 Apple Developer 付费账号)。首次打开请右键点击 App → **打开**,或到 **系统设置 → 隐私与安全性 → 仍要打开**,确认一次后即可正常启动。 -::: - -## 常见问题 - -::: details 我的代码会离开本机吗? -只有你配置的内容会外发:PR diff 与你的规则发给你自行配置的 LLM 服务商,Code Meeseeks 只与你接入的 Git 平台通信,此外不上报任何数据。接入本地模型(如本地 Ollama)即可全程不出本机。 -::: - -::: details 需要额外装 Python 或 Docker 吗? -不需要。pr-agent 及其 Python 运行时已内嵌进安装包,装完即用。 -::: - -::: details 支持哪些平台与模型? -平台:GitHub(含 Enterprise Server)、Bitbucket Server / Data Center、GitLab(含 Self-Managed)。模型:任意 OpenAI 兼容 / litellm 支持的服务商——OpenAI、Anthropic、DeepSeek 等,或本地模型。 -::: - -::: details 这是 CI 里的评审 bot 吗? -不是。Code Meeseeks 是面向 Reviewer 个人的桌面工具——每条评论都需你二次确认 / 编辑后才会发布。CI 中自动评审是 pr-agent 本身的定位。 -::: - -::: details token 成本如何? -Agentic 评审与 AutoPilot 会对每个 PR 串联多次模型调用,token 消耗高于单次手动评审。每步用量都在评审时间线上分步展示,便于观察——无论用按量计费 API 还是本地 CLI / 订阅账户。 -::: - -::: details 是免费开源的吗? -是,采用 Apache-2.0 许可。源码完全公开、可自行审计与构建。 -::: From 9100a9220caccd0fbd6e15610e422faf6c99bd22 Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 11:33:08 +0800 Subject: [PATCH 09/80] =?UTF-8?q?refactor(website):=20CSS=20=E6=8A=BD?= =?UTF-8?q?=E5=8F=96=E4=B8=BA=20SCSS=20=E5=88=86=E5=B1=82=20+=20=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0/FAQ=20=E5=9B=BE=E6=A0=87=20+=20=E5=BC=B1=E5=8C=96=20R?= =?UTF-8?q?oadmap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 样式统一抽到 .vitepress/theme/styles/(tokens/vars/components 分层),移除组件 scoped 与 custom.css;引入 sass - 品牌色单点 token 化(VS Code 蓝,映射 VitePress --vp-c-brand-*,亮暗两套)便于复用 - Download:桌面端/CLI 各项加平台单色图标(Windows 四窗格 + Apple/Tux 取自 simple-icons),推荐卡显示识别到的系统名与图标 + Linux 补 CLI 提示;移除「pr-agent embedded」文案 - FAQ:每题前加 emoji 图标(双语) - 导航移除 Roadmap(弱化);Vite 用 Sass modern-compiler API Co-Authored-By: Claude Opus 4.8 (1M context) --- website/.vitepress/config.ts | 7 +- .../theme/components/DownloadPanel.vue | 169 ++----- website/.vitepress/theme/custom.css | 42 -- website/.vitepress/theme/index.ts | 2 +- website/.vitepress/theme/styles/_tokens.scss | 14 + .../.vitepress/theme/styles/components.scss | 167 +++++++ website/.vitepress/theme/styles/index.scss | 3 + website/.vitepress/theme/styles/vars.scss | 27 ++ website/download.md | 12 +- website/package-lock.json | 427 ++++++++++++++++++ website/package.json | 1 + website/zh/download.md | 12 +- 12 files changed, 702 insertions(+), 181 deletions(-) delete mode 100644 website/.vitepress/theme/custom.css create mode 100644 website/.vitepress/theme/styles/_tokens.scss create mode 100644 website/.vitepress/theme/styles/components.scss create mode 100644 website/.vitepress/theme/styles/index.scss create mode 100644 website/.vitepress/theme/styles/vars.scss diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index 6fdbc88a..1801d4c5 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -33,6 +33,11 @@ export default defineConfig({ ['link', { rel: 'apple-touch-icon', href: `${base}logo.png` }], ], + // Use Dart Sass's modern API (silences the legacy-js-api deprecation warning). + vite: { + css: { preprocessorOptions: { scss: { api: 'modern-compiler' } } }, + }, + themeConfig: { logo: '/logo.png', socialLinks: [{ icon: 'github', link: REPO }], @@ -46,7 +51,6 @@ export default defineConfig({ themeConfig: { nav: [ { text: 'Guide', link: `${REPO}/tree/master/docs/guide` }, - { text: 'Roadmap', link: `${REPO}/blob/master/docs/ROADMAP.md` }, { text: 'Download', link: '/download' }, ], footer: { @@ -62,7 +66,6 @@ export default defineConfig({ themeConfig: { nav: [ { text: '使用说明', link: '/zh/guide/' }, - { text: '路线图', link: `${REPO}/blob/master/docs/ROADMAP.md` }, { text: '下载', link: '/zh/download' }, ], sidebar: { diff --git a/website/.vitepress/theme/components/DownloadPanel.vue b/website/.vitepress/theme/components/DownloadPanel.vue index 84b9b141..3a18f4a8 100644 --- a/website/.vitepress/theme/components/DownloadPanel.vue +++ b/website/.vitepress/theme/components/DownloadPanel.vue @@ -4,11 +4,28 @@ import { useData } from 'vitepress' const REPO = 'huhamhire/code-meeseeks' const RELEASES_URL = `https://github.com/${REPO}/releases` +const CLI_GUIDE_URL = `https://github.com/${REPO}/tree/master/cli` const API = `https://api.github.com/repos/${REPO}/releases/latest` +// Platform glyphs (24×24, currentColor). Apple / Linux from simple-icons (CC0); +// Windows is the four-pane mark. +const ICON = { + windows: + 'M0 3.449 9.75 2.1v9.451H0m10.949-9.602L24 0v11.4H10.949M0 12.6h9.75v9.451L0 20.699M10.949 12.6H24V24l-12.9-1.801', + apple: + 'M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701', + linux: + 'M12.504 0c-.155 0-.315.008-.48.021-4.226.333-3.105 4.807-3.17 6.298-.076 1.092-.3 1.953-1.05 3.02-.885 1.051-2.127 2.75-2.716 4.521-.278.832-.41 1.684-.287 2.489a.424.424 0 00-.11.135c-.26.268-.45.6-.663.839-.199.199-.485.267-.797.4-.313.136-.658.269-.864.68-.09.189-.136.394-.132.602 0 .199.027.4.055.536.058.399.116.728.04.97-.249.68-.28 1.145-.106 1.484.174.334.535.47.94.601.81.2 1.91.135 2.774.6.926.466 1.866.67 2.616.47.526-.116.97-.464 1.208-.946.587-.003 1.23-.269 2.26-.334.699-.058 1.574.267 2.577.2.025.134.063.198.114.333l.003.003c.391.778 1.113 1.132 1.884 1.071.771-.06 1.592-.536 2.257-1.306.631-.765 1.683-1.084 2.378-1.503.348-.199.629-.469.649-.853.023-.4-.2-.811-.714-1.376v-.097l-.003-.003c-.17-.2-.25-.535-.338-.926-.085-.401-.182-.786-.492-1.046h-.003c-.059-.054-.123-.067-.188-.135a.357.357 0 00-.19-.064c.431-1.278.264-2.55-.173-3.694-.533-1.41-1.465-2.638-2.175-3.483-.796-1.005-1.576-1.957-1.56-3.368.026-2.152.236-6.133-3.544-6.139zm.529 3.405h.013c.213 0 .396.062.584.198.19.135.33.332.438.533.105.259.158.459.166.724 0-.02.006-.04.006-.06v.105a.086.086 0 01-.004-.021l-.004-.024a1.807 1.807 0 01-.15.706.953.953 0 01-.213.335.71.71 0 00-.088-.042c-.104-.045-.198-.064-.284-.133a1.312 1.312 0 00-.22-.066c.05-.06.146-.133.183-.198.053-.128.082-.264.088-.402v-.02a1.21 1.21 0 00-.061-.4c-.045-.134-.101-.2-.183-.333-.084-.066-.167-.132-.267-.132h-.016c-.093 0-.176.03-.262.132a.8.8 0 00-.205.334 1.18 1.18 0 00-.09.4v.019c.002.089.008.179.02.267-.193-.067-.438-.135-.607-.202a1.635 1.635 0 01-.018-.2v-.02a1.772 1.772 0 01.15-.768c.082-.22.232-.406.43-.533a.985.985 0 01.594-.2zm-2.962.059h.036c.142 0 .27.048.399.135.146.129.264.288.344.465.09.199.14.4.153.667v.004c.007.134.006.2-.002.266v.08c-.03.007-.056.018-.083.024-.152.055-.274.135-.393.2.012-.09.013-.18.003-.267v-.015c-.012-.133-.04-.2-.082-.333a.613.613 0 00-.166-.267.248.248 0 00-.183-.064h-.021c-.071.006-.13.04-.186.132a.552.552 0 00-.12.27.944.944 0 00-.023.33v.015c.012.135.037.2.08.334.046.134.098.2.166.268.01.009.02.018.034.024-.07.057-.117.07-.176.136a.304.304 0 01-.131.068 2.62 2.62 0 01-.275-.402 1.772 1.772 0 01-.155-.667 1.759 1.759 0 01.08-.668 1.43 1.43 0 01.283-.535c.128-.133.26-.2.418-.2zm1.37 1.706c.332 0 .733.065 1.216.399.293.2.523.269 1.052.468h.003c.255.136.405.266.478.399v-.131a.571.571 0 01.016.47c-.123.31-.516.643-1.063.842v.002c-.268.135-.501.333-.775.465-.276.135-.588.292-1.012.267a1.139 1.139 0 01-.448-.067 3.566 3.566 0 01-.322-.198c-.195-.135-.363-.332-.612-.465v-.005h-.005c-.4-.246-.616-.512-.686-.71-.07-.268-.005-.47.193-.6.224-.135.38-.271.483-.336.104-.074.143-.102.176-.131h.002v-.003c.169-.202.436-.47.839-.601.139-.036.294-.065.466-.065zm2.8 2.142c.358 1.417 1.196 3.475 1.735 4.473.286.534.855 1.659 1.102 3.024.156-.005.33.018.513.064.646-1.671-.546-3.467-1.089-3.966-.22-.2-.232-.335-.123-.335.59.534 1.365 1.572 1.646 2.757.13.535.16 1.104.021 1.67.067.028.135.06.205.067 1.032.534 1.413.938 1.23 1.537v-.043c-.06-.003-.12 0-.18 0h-.016c.151-.467-.182-.825-1.065-1.224-.915-.4-1.646-.336-1.77.465-.008.043-.013.066-.018.135-.068.023-.139.053-.209.064-.43.268-.662.669-.793 1.187-.13.533-.17 1.156-.205 1.869v.003c-.02.334-.17.838-.319 1.35-1.5 1.072-3.58 1.538-5.348.334a2.645 2.645 0 00-.402-.533 1.45 1.45 0 00-.275-.333c.182 0 .338-.03.465-.067a.615.615 0 00.314-.334c.108-.267 0-.697-.345-1.163-.345-.467-.931-.995-1.788-1.521-.63-.4-.986-.87-1.15-1.396-.165-.534-.143-1.085-.015-1.645.245-1.07.873-2.11 1.274-2.763.107-.065.037.135-.408.974-.396.751-1.14 2.497-.122 3.854a8.123 8.123 0 01.647-2.876c.564-1.278 1.743-3.504 1.836-5.268.048.036.217.135.289.202.218.133.38.333.59.465.21.201.477.335.876.335.039.003.075.006.11.006.412 0 .73-.134.997-.268.29-.134.52-.334.74-.4h.005c.467-.135.835-.402 1.044-.7zm2.185 8.958c.037.6.343 1.245.882 1.377.588.134 1.434-.333 1.791-.765l.211-.01c.315-.007.577.01.847.268l.003.003c.208.199.305.53.391.876.085.4.154.78.409 1.066.486.527.645.906.636 1.14l.003-.007v.018l-.003-.012c-.015.262-.185.396-.498.595-.63.401-1.746.712-2.457 1.57-.618.737-1.37 1.14-2.036 1.191-.664.053-1.237-.2-1.574-.898l-.005-.003c-.21-.4-.12-1.025.056-1.69.176-.668.428-1.344.463-1.897.037-.714.076-1.335.195-1.814.12-.465.308-.797.641-.984l.045-.022zm-10.814.049h.01c.053 0 .105.005.157.014.376.055.706.333 1.023.752l.91 1.664.003.003c.243.533.754 1.064 1.189 1.637.434.598.77 1.131.729 1.57v.006c-.057.744-.48 1.148-1.125 1.294-.645.135-1.52.002-2.395-.464-.968-.536-2.118-.469-2.857-.602-.369-.066-.61-.2-.723-.4-.11-.2-.113-.602.123-1.23v-.004l.002-.003c.117-.334.03-.752-.027-1.118-.055-.401-.083-.71.043-.94.16-.334.396-.4.69-.533.294-.135.64-.202.915-.47h.002v-.002c.256-.268.445-.601.668-.838.19-.201.38-.336.663-.336zm7.159-9.074c-.435.201-.945.535-1.488.535-.542 0-.97-.267-1.28-.466-.154-.134-.28-.268-.373-.335-.164-.134-.144-.333-.074-.333.109.016.129.134.199.2.096.066.215.2.36.333.292.2.68.467 1.167.467.485 0 1.053-.267 1.398-.466.195-.135.445-.334.648-.467.156-.136.149-.267.279-.267.128.016.034.134-.147.332a8.097 8.097 0 01-.69.468zm-1.082-1.583V5.64c-.006-.02.013-.042.029-.05.074-.043.18-.027.26.004.063 0 .16.067.15.135-.006.049-.085.066-.135.066-.055 0-.092-.043-.141-.068-.052-.018-.146-.008-.163-.065zm-.551 0c-.02.058-.113.049-.166.066-.047.025-.086.068-.14.068-.05 0-.13-.02-.136-.068-.01-.066.088-.133.15-.133.08-.031.184-.047.259-.005.019.009.036.03.03.05v.02h.003z', +} +function iconFor(goos) { + if (goos === 'darwin' || goos === 'macos') return ICON.apple + if (goos === 'windows') return ICON.windows + if (goos === 'linux') return ICON.linux + return '' +} + const { lang } = useData() const zh = computed(() => String(lang.value).toLowerCase().startsWith('zh')) - const t = computed(() => (zh.value ? STR.zh : STR.en)) const state = ref('loading') // loading | ok | error @@ -48,6 +65,10 @@ const recommendedCli = computed(() => { return null }) +const osName = computed( + () => ({ windows: 'Windows', macos: 'macOS', linux: 'Linux', ios: 'iOS', android: 'Android' })[os.value] ?? '', +) + function detectOS() { if (typeof navigator === 'undefined') return 'unknown' const ua = navigator.userAgent || '' @@ -105,7 +126,6 @@ const STR = { winHint: 'Run the .exe installer (NSIS).', macHint: 'Open the .dmg → drag to Applications. First launch: right-click → Open (ad-hoc signed, not notarized).', cliHint: 'Unzip and put meebox on your PATH, or drop the folder into your agent’s skills directory.', - embedded: 'pr-agent is embedded — no extra runtime to install.', }, zh: { loading: '正在获取最新版本…', @@ -126,7 +146,6 @@ const STR = { winHint: '运行 .exe 安装程序(NSIS)。', macHint: '打开 .dmg 拖入「应用程序」。首次打开:右键 → 打开(ad-hoc 签名、未公证)。', cliHint: '解压后把 meebox 加入 PATH,或将整个目录投放到 agent 的 skills 目录。', - embedded: '安装包已内嵌 pr-agent,无需额外运行时。', }, } @@ -147,9 +166,13 @@ const STR = { {{ t.notes }} → - +
-
{{ t.recommended }}
+
+ {{ t.recommended }} +

{{ t.unknown }}

@@ -172,17 +196,22 @@ const STR = {

{{ t.desktop }}

-

{{ t.embedded }}

- diff --git a/website/.vitepress/theme/custom.css b/website/.vitepress/theme/custom.css deleted file mode 100644 index ca913211..00000000 --- a/website/.vitepress/theme/custom.css +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Brand palette — VS Code blue, matching the desktop app's default theme - * (see apps/desktop/src/renderer/src/styles/_palette.scss $vscode-blue-*). - */ -:root { - --vp-c-brand-1: #0e639c; /* links / accent text (readable on light) */ - --vp-c-brand-2: #1177bb; /* hover */ - --vp-c-brand-3: #005fb8; /* solid buttons / badges */ - --vp-c-brand-soft: rgba(17, 119, 187, 0.14); - - --vp-home-hero-name-color: transparent; - --vp-home-hero-name-background: linear-gradient(120deg, #005fb8 20%, #6cb6ff); - - --vp-home-hero-image-background-image: linear-gradient(120deg, rgba(14, 99, 156, 0.28), rgba(108, 182, 255, 0.28)); - --vp-home-hero-image-filter: blur(48px); -} - -.dark { - --vp-c-brand-1: #6cb6ff; /* links / accent text (readable on dark) */ - --vp-c-brand-2: #8cc6ff; /* hover */ - --vp-c-brand-3: #0e639c; /* solid buttons / badges */ - --vp-c-brand-soft: rgba(108, 182, 255, 0.16); -} - -/* Product screenshot / placeholder framing under the hero. */ -.screenshot-frame { - max-width: 1152px; - margin: 8px auto 0; - padding: 0 24px; -} -.screenshot-frame img { - width: 100%; - height: auto; - border-radius: 12px; - box-shadow: 0 18px 56px -12px rgba(0, 0, 0, 0.35); -} -.screenshot-frame figcaption { - margin-top: 12px; - text-align: center; - font-size: 13px; - color: var(--vp-c-text-3); -} diff --git a/website/.vitepress/theme/index.ts b/website/.vitepress/theme/index.ts index 07ae6d9f..bb174f1c 100644 --- a/website/.vitepress/theme/index.ts +++ b/website/.vitepress/theme/index.ts @@ -1,6 +1,6 @@ import DefaultTheme from 'vitepress/theme' import DownloadPanel from './components/DownloadPanel.vue' -import './custom.css' +import './styles/index.scss' export default { extends: DefaultTheme, diff --git a/website/.vitepress/theme/styles/_tokens.scss b/website/.vitepress/theme/styles/_tokens.scss new file mode 100644 index 00000000..e156f020 --- /dev/null +++ b/website/.vitepress/theme/styles/_tokens.scss @@ -0,0 +1,14 @@ +// Brand color tokens — the single source of truth for the site's palette. +// VS Code blue, matching the desktop app's default theme +// (apps/desktop/src/renderer/src/styles/_palette.scss, $vscode-blue-*). +// Everything else (VitePress CSS vars, component styles) derives from these. + +// Light +$brand-primary-light: #005fb8; // vscode-blue-800 — solid buttons / badges +$brand-accent-light: #0e639c; // vscode-blue-700 — accent text / links +$brand-hover-light: #1177bb; // vscode-blue-600 — hover + +// Dark +$brand-primary-dark: #6cb6ff; // vscode-blue-300 — accent text / links on dark +$brand-accent-dark: #0e639c; // vscode-blue-700 — solid buttons on dark +$brand-hover-dark: #8cc6ff; // hover on dark diff --git a/website/.vitepress/theme/styles/components.scss b/website/.vitepress/theme/styles/components.scss new file mode 100644 index 00000000..85e51e1d --- /dev/null +++ b/website/.vitepress/theme/styles/components.scss @@ -0,0 +1,167 @@ +// Page / component styles, extracted here for unified maintenance +// (moved out of DownloadPanel.vue's scoped block and the old custom.css). +// Class names are uniquely prefixed, so global scope is safe. + +// ── Screenshot frame (landing hero) ───────────────────────────── +.screenshot-frame { + max-width: 1152px; + margin: 8px auto 0; + padding: 0 24px; + + img { + width: 100%; + height: auto; + border-radius: 12px; + box-shadow: 0 18px 56px -12px rgba(0, 0, 0, 0.35); + } + + figcaption { + margin-top: 12px; + text-align: center; + font-size: 13px; + color: var(--vp-c-text-3); + } +} + +// ── Download panel ────────────────────────────────────────────── +.dl { + margin: 8px 0 4px; + + &-muted { + color: var(--vp-c-text-2); + } + + &-hint { + font-size: 13px; + margin-top: 8px; + } + + &-ico { + width: 1.05em; + height: 1.05em; + fill: currentColor; + flex: none; + vertical-align: -0.15em; + } + + &-head { + display: flex; + align-items: baseline; + gap: 16px; + flex-wrap: wrap; + margin-bottom: 12px; + } + + &-tag { + font-weight: 600; + padding: 2px 10px; + border-radius: 12px; + background: var(--vp-c-brand-soft); + color: var(--vp-c-brand-1); + } + + &-link { + color: var(--vp-c-brand-1); + font-weight: 500; + } + + &-card { + border: 1px solid var(--vp-c-divider); + border-radius: 12px; + padding: 20px; + background: var(--vp-c-bg-soft); + } + + &-reco { + border-color: var(--vp-c-brand-3); + + &-label { + display: flex; + align-items: center; + gap: 6px; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--vp-c-brand-1); + font-weight: 700; + margin-bottom: 12px; + } + } + + &-error { + border-color: var(--vp-c-warning-1, var(--vp-c-divider)); + } + + &-list { + list-style: none; + padding: 0; + margin: 12px 0 0; + display: flex; + flex-direction: column; + gap: 8px; + + li { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; + padding: 12px 16px; + border: 1px solid var(--vp-c-divider); + border-radius: 10px; + background: var(--vp-c-bg-soft); + } + } + + &-plat { + display: inline-flex; + align-items: center; + gap: 8px; + font-weight: 600; + min-width: 180px; + } + + &-file { + flex: 1 1 200px; + font-family: var(--vp-font-family-mono); + font-size: 12px; + color: var(--vp-c-text-3); + word-break: break-all; + } + + &-btn { + display: inline-flex; + align-items: center; + gap: 8px; + white-space: nowrap; + padding: 8px 16px; + border-radius: 8px; + border: 1px solid var(--vp-c-brand-2); + color: var(--vp-c-brand-1); + font-weight: 600; + font-size: 14px; + transition: all 0.2s; + + &:hover { + border-color: var(--vp-c-brand-1); + background: var(--vp-c-brand-soft); + } + + &-brand { + background: var(--vp-c-brand-3); + border-color: var(--vp-c-brand-3); + color: #fff; + + &:hover { + background: var(--vp-c-brand-2); + border-color: var(--vp-c-brand-2); + color: #fff; + } + } + } + + &-size { + font-weight: 400; + font-size: 12px; + opacity: 0.8; + } +} diff --git a/website/.vitepress/theme/styles/index.scss b/website/.vitepress/theme/styles/index.scss new file mode 100644 index 00000000..c88a3cb6 --- /dev/null +++ b/website/.vitepress/theme/styles/index.scss @@ -0,0 +1,3 @@ +// Theme style entry — brand vars first, then component styles. +@use 'vars'; +@use 'components'; diff --git a/website/.vitepress/theme/styles/vars.scss b/website/.vitepress/theme/styles/vars.scss new file mode 100644 index 00000000..c33d31e6 --- /dev/null +++ b/website/.vitepress/theme/styles/vars.scss @@ -0,0 +1,27 @@ +// Map brand tokens → VitePress theme CSS variables (light + dark). +// Keep the token → --vp-c-brand-* mapping here; never write raw brand hex elsewhere. +@use 'sass:color'; +@use 'tokens' as *; + +:root { + --vp-c-brand-1: #{$brand-accent-light}; + --vp-c-brand-2: #{$brand-hover-light}; + --vp-c-brand-3: #{$brand-primary-light}; + --vp-c-brand-soft: #{color.change($brand-hover-light, $alpha: 0.14)}; + + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: linear-gradient(120deg, #{$brand-primary-light} 20%, #{$brand-primary-dark}); + --vp-home-hero-image-background-image: linear-gradient( + 120deg, + #{color.change($brand-accent-light, $alpha: 0.28)}, + #{color.change($brand-primary-dark, $alpha: 0.28)} + ); + --vp-home-hero-image-filter: blur(48px); +} + +.dark { + --vp-c-brand-1: #{$brand-primary-dark}; + --vp-c-brand-2: #{$brand-hover-dark}; + --vp-c-brand-3: #{$brand-accent-dark}; + --vp-c-brand-soft: #{color.change($brand-primary-dark, $alpha: 0.16)}; +} diff --git a/website/download.md b/website/download.md index 7c03f302..31c38dc8 100644 --- a/website/download.md +++ b/website/download.md @@ -9,26 +9,26 @@ outline: [2, 2] ## FAQ -::: details Does my code leave my machine? +::: details 🔒 Does my code leave my machine? Only what you configure: the PR diff and your rules go to the LLM provider you set up, and Code Meeseeks talks to the Git platform you connect. Nothing else is reported. Wire up a local model (e.g. local Ollama) and nothing ever leaves your machine. ::: -::: details Do I need to install Python or Docker? +::: details 📦 Do I need to install Python or Docker? No. pr-agent and its Python runtime are embedded in the installer — it works right after installation. ::: -::: details Which platforms and models are supported? +::: details 🧩 Which platforms and models are supported? Platforms: GitHub (incl. Enterprise Server), Bitbucket Server / Data Center, and GitLab (incl. Self-Managed). Models: any OpenAI-compatible / litellm-supported provider — OpenAI, Anthropic, DeepSeek, and more — or a local model. ::: -::: details Is this a CI review bot? +::: details 🤖 Is this a CI review bot? No. Code Meeseeks is a desktop tool for the individual reviewer — every comment is confirmed or edited by you before it is published. Automated in-CI review is what pr-agent itself is for. ::: -::: details What about token cost? +::: details 💸 What about token cost? Agentic review and AutoPilot chain several model calls per PR, so token use is higher than a single manual review. Per-step usage is shown on the review timeline so you can watch it, whether you use a pay-as-you-go API or a local CLI / subscription account. ::: -::: details Is it free and open source? +::: details ⚖️ Is it free and open source? Yes — licensed under Apache-2.0. The source is public, auditable, and buildable yourself. ::: diff --git a/website/package-lock.json b/website/package-lock.json index de8cbe7b..dc567401 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "license": "Apache-2.0", "devDependencies": { + "sass": "^1.83.4", "vitepress": "^1.6.4" } }, @@ -786,6 +787,316 @@ "dev": true, "license": "MIT" }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.62.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", @@ -1630,6 +1941,22 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -1674,6 +2001,17 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -1835,6 +2173,38 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-what": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", @@ -2014,6 +2384,14 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/oniguruma-to-es": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", @@ -2040,6 +2418,20 @@ "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/postcss": { "version": "8.5.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", @@ -2091,6 +2483,20 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", @@ -2170,6 +2576,27 @@ "fsevents": "~2.3.2" } }, + "node_modules/sass": { + "version": "1.101.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.0.tgz", + "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, "node_modules/search-insights": { "version": "2.17.3", "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", diff --git a/website/package.json b/website/package.json index ea65ff2e..33c24f07 100644 --- a/website/package.json +++ b/website/package.json @@ -12,6 +12,7 @@ "preview": "vitepress preview" }, "devDependencies": { + "sass": "^1.83.4", "vitepress": "^1.6.4" } } diff --git a/website/zh/download.md b/website/zh/download.md index 93c8c936..3ccc7988 100644 --- a/website/zh/download.md +++ b/website/zh/download.md @@ -9,26 +9,26 @@ outline: [2, 2] ## 常见问题 -::: details 我的代码会离开本机吗? +::: details 🔒 我的代码会离开本机吗? 只有你配置的内容会外发:PR diff 与你的规则发给你自行配置的 LLM 服务商,Code Meeseeks 只与你接入的 Git 平台通信,此外不上报任何数据。接入本地模型(如本地 Ollama)即可全程不出本机。 ::: -::: details 需要额外装 Python 或 Docker 吗? +::: details 📦 需要额外装 Python 或 Docker 吗? 不需要。pr-agent 及其 Python 运行时已内嵌进安装包,装完即用。 ::: -::: details 支持哪些平台与模型? +::: details 🧩 支持哪些平台与模型? 平台:GitHub(含 Enterprise Server)、Bitbucket Server / Data Center、GitLab(含 Self-Managed)。模型:任意 OpenAI 兼容 / litellm 支持的服务商——OpenAI、Anthropic、DeepSeek 等,或本地模型。 ::: -::: details 这是 CI 里的评审 bot 吗? +::: details 🤖 这是 CI 里的评审 bot 吗? 不是。Code Meeseeks 是面向 Reviewer 个人的桌面工具——每条评论都需你二次确认 / 编辑后才会发布。CI 中自动评审是 pr-agent 本身的定位。 ::: -::: details token 成本如何? +::: details 💸 token 成本如何? Agentic 评审与 AutoPilot 会对每个 PR 串联多次模型调用,token 消耗高于单次手动评审。每步用量都在评审时间线上分步展示,便于观察——无论用按量计费 API 还是本地 CLI / 订阅账户。 ::: -::: details 是免费开源的吗? +::: details ⚖️ 是免费开源的吗? 是,采用 Apache-2.0 许可。源码完全公开、可自行审计与构建。 ::: From 4866f61910266c1237f615c94d4099622192f77e Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 11:35:42 +0800 Subject: [PATCH 10/80] =?UTF-8?q?docs(website):=20Download=20=E9=A1=B5?= =?UTF-8?q?=E8=A1=A5=E9=A6=96=E6=AC=A1=E5=90=AF=E5=8A=A8=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E5=BA=94=E5=AF=B9=EF=BC=88Windows=20SmartScr?= =?UTF-8?q?een=20+=20macOS=20Gatekeeper=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增「首次启动」区,分平台 tip:Windows SmartScreen「更多信息 → 仍要运行」、macOS Gatekeeper 右键打开 / 隐私与安全性放行 - 说明未付费签名的缘由(免费开源、源码可审计) - 组件推荐卡短提示同步点到 SmartScreen/Gatekeeper 并指向该区(双语) Co-Authored-By: Claude Opus 4.8 (1M context) --- .../theme/components/DownloadPanel.vue | 8 ++++---- website/download.md | 17 +++++++++++++++++ website/zh/download.md | 17 +++++++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/website/.vitepress/theme/components/DownloadPanel.vue b/website/.vitepress/theme/components/DownloadPanel.vue index 3a18f4a8..1ad4db93 100644 --- a/website/.vitepress/theme/components/DownloadPanel.vue +++ b/website/.vitepress/theme/components/DownloadPanel.vue @@ -123,8 +123,8 @@ const STR = { download: 'Download', linuxNoDesktop: 'No desktop build for Linux yet — use the meebox CLI below.', unknown: 'Pick your platform below.', - winHint: 'Run the .exe installer (NSIS).', - macHint: 'Open the .dmg → drag to Applications. First launch: right-click → Open (ad-hoc signed, not notarized).', + winHint: 'Run the .exe (NSIS). If SmartScreen warns, click “More info → Run anyway” — see First launch below.', + macHint: 'Open the .dmg → drag to Applications. First launch: right-click → Open (Gatekeeper) — see First launch below.', cliHint: 'Unzip and put meebox on your PATH, or drop the folder into your agent’s skills directory.', }, zh: { @@ -143,8 +143,8 @@ const STR = { download: '下载', linuxNoDesktop: '暂未提供 Linux 桌面版——请使用下方 meebox CLI。', unknown: '请在下方选择你的平台。', - winHint: '运行 .exe 安装程序(NSIS)。', - macHint: '打开 .dmg 拖入「应用程序」。首次打开:右键 → 打开(ad-hoc 签名、未公证)。', + winHint: '运行 .exe(NSIS)。若 SmartScreen 拦截,点「更多信息 → 仍要运行」——详见下方「首次启动」。', + macHint: '打开 .dmg 拖入「应用程序」。首次打开:右键 → 打开(Gatekeeper)——详见下方「首次启动」。', cliHint: '解压后把 meebox 加入 PATH,或将整个目录投放到 agent 的 skills 目录。', }, } diff --git a/website/download.md b/website/download.md index 31c38dc8..f2e64081 100644 --- a/website/download.md +++ b/website/download.md @@ -7,6 +7,23 @@ outline: [2, 2] +## First launch + +The installers are not signed with a paid code-signing certificate (this is free, open-source software), so the OS shows a one-time security prompt on first launch. This is expected — the source is public and auditable. + +::: tip 🪟 Windows — SmartScreen +Running the `.exe` may trigger **“Windows protected your PC”** (Microsoft Defender SmartScreen) for an unrecognized publisher. Click **More info**, then **Run anyway**. You only need to do this once. +::: + +::: tip 🍎 macOS — Gatekeeper +The app is ad-hoc signed and not Apple-notarized (no paid Apple Developer account), so Gatekeeper blocks the first launch. Fix it once, either way: + +- **Right-click** the app in Applications → **Open** → **Open** in the dialog; or +- **System Settings → Privacy & Security** → scroll to the blocked-app notice → **Open Anyway**. + +After confirming once, it launches normally from then on. +::: + ## FAQ ::: details 🔒 Does my code leave my machine? diff --git a/website/zh/download.md b/website/zh/download.md index 3ccc7988..6e4f4d2b 100644 --- a/website/zh/download.md +++ b/website/zh/download.md @@ -7,6 +7,23 @@ outline: [2, 2] +## 首次启动 + +安装包未使用付费代码签名证书(本项目为免费开源软件),故首次启动时系统会弹一次性安全拦截提示。这是预期内的——源码完全公开、可自行审计。 + +::: tip 🪟 Windows —— SmartScreen +运行 `.exe` 时可能弹出 **「Windows 已保护你的电脑」**(Microsoft Defender SmartScreen),提示发布者无法识别。点 **更多信息**,再点 **仍要运行** 即可,只需一次。 +::: + +::: tip 🍎 macOS —— Gatekeeper +应用为 ad-hoc 签名、未做 Apple 公证(未购置 Apple Developer 付费账号),Gatekeeper 会拦下首次启动。任选一种方式处理一次: + +- 在「应用程序」中 **右键点击** 应用 → **打开** → 弹窗里再点 **打开**;或 +- **系统设置 → 隐私与安全性** → 找到被拦应用的提示 → **仍要打开**。 + +确认一次后,之后即可正常启动。 +::: + ## 常见问题 ::: details 🔒 我的代码会离开本机吗? From 6a96ab9da1aa45ecd287590984a5b8d58345f47c Mon Sep 17 00:00:00 2001 From: Hamhire Hu Date: Fri, 3 Jul 2026 11:51:15 +0800 Subject: [PATCH 11/80] =?UTF-8?q?feat(website):=20Download=20=E5=88=86=20G?= =?UTF-8?q?UI/CLI=20=E6=A0=87=E7=AD=BE=20+=20CLI=20=E4=B8=80=E9=94=AE?= =?UTF-8?q?=E5=AE=89=E8=A3=85=EF=BC=8CFAQ=20=E7=8B=AC=E7=AB=8B=E6=88=90?= =?UTF-8?q?=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 下载区按 GUI(桌面)/ CLI 两大类切换标签;OS 识别决定默认标签 - CLI 标签补一键安装命令(curl | bash,macOS/Linux)+ 带图标复制按钮;Windows 指向压缩包 - 首次启动指引收进推荐卡 info 框(ℹ️ 标题 + 要点逐行,仅当前 OS),移除独立 First launch 段(去重) - FAQ 拆到独立 /faq 页,改常显 Q&A(问题 h3 + 分段答案 + 留白),nav 增 FAQ - 平台/OS 检测抽 os.js 共用;按钮去下划线;Release notes 右对齐 Co-Authored-By: Claude Opus 4.8 (1M context) --- website/.vitepress/config.ts | 2 + .../theme/components/DownloadPanel.vue | 180 ++++++++++++------ website/.vitepress/theme/os.js | 13 ++ .../.vitepress/theme/styles/components.scss | 120 ++++++++++++ website/download.md | 43 ----- website/faq.md | 42 ++++ website/zh/download.md | 43 ----- website/zh/faq.md | 42 ++++ 8 files changed, 341 insertions(+), 144 deletions(-) create mode 100644 website/.vitepress/theme/os.js create mode 100644 website/faq.md create mode 100644 website/zh/faq.md diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index 1801d4c5..4ca3cbd0 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -52,6 +52,7 @@ export default defineConfig({ nav: [ { text: 'Guide', link: `${REPO}/tree/master/docs/guide` }, { text: 'Download', link: '/download' }, + { text: 'FAQ', link: '/faq' }, ], footer: { message: 'Released under the Apache License 2.0.', @@ -67,6 +68,7 @@ export default defineConfig({ nav: [ { text: '使用说明', link: '/zh/guide/' }, { text: '下载', link: '/zh/download' }, + { text: '常见问题', link: '/zh/faq' }, ], sidebar: { '/zh/guide/': [ diff --git a/website/.vitepress/theme/components/DownloadPanel.vue b/website/.vitepress/theme/components/DownloadPanel.vue index 1ad4db93..a1997ecb 100644 --- a/website/.vitepress/theme/components/DownloadPanel.vue +++ b/website/.vitepress/theme/components/DownloadPanel.vue @@ -1,11 +1,18 @@ + + diff --git a/website/.vitepress/theme/index.ts b/website/.vitepress/theme/index.ts index bb174f1c..116e5b8f 100644 --- a/website/.vitepress/theme/index.ts +++ b/website/.vitepress/theme/index.ts @@ -1,10 +1,12 @@ import DefaultTheme from 'vitepress/theme' import DownloadPanel from './components/DownloadPanel.vue' +import HomeFeatures from './components/HomeFeatures.vue' import './styles/index.scss' export default { extends: DefaultTheme, enhanceApp({ app }) { app.component('DownloadPanel', DownloadPanel) + app.component('HomeFeatures', HomeFeatures) }, } diff --git a/website/.vitepress/theme/styles/features.scss b/website/.vitepress/theme/styles/features.scss index c9da398d..416f1956 100644 --- a/website/.vitepress/theme/styles/features.scss +++ b/website/.vitepress/theme/styles/features.scss @@ -1,41 +1,66 @@ -// Landing feature cards: icon on the left, title to its right, and the -// description as a scannable bullet list underneath (VitePress renders -// `details` via v-html, so the markdown can carry a real