{"owner":"doocs","repo":"md","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"# Agent Instructions\n\n本文件为 AI Agent（Claude Code、OpenCode、Cursor、Copilot 等）在本仓库中工作时提供统一入口。\n\n## 项目概览\n\n**doocs/md** — 一款微信 Markdown 编辑器，将 Markdown 渲染为微信公众号文章格式。支持自定义主题样式、多图床、AI 助手、浏览器扩展、**简体中文 / English 界面**等特性。\n\n- **在线地址:** https://md.doocs.org\n- **Node 版本:** >= 22.22.2（`.nvmrc`: v22.22.2）\n- **包管理器:** pnpm（monorepo）\n- **npm 镜像:** https://registry.npmmirror.com（`.npmrc`）\n\n## Monorepo 结构\n\n| 工作区           | 路径                  | 说明                                                                 |\n| ---------------- | --------------------- | -------------------------------------------------------------------- |\n| `@md/web`        | `apps/web`            | 主应用，Vue 3 + 浏览器扩展（WXT: Chrome/Firefox）                    |\n| `doocs-md`       | `apps/vscode`         | VS Code 扩展（webpack 构建，marketplace ID: `doocs.doocs-md`）       |\n| `@md/utools`     | `apps/utools`         | uTools 插件打包                                                      |\n| `@md/core`       | `packages/core`       | 核心 Markdown 渲染引擎（marked + 自定义扩展）                        |\n| `@md/shared`     | `packages/shared`     | 共享工具函数、配置、类型、编辑器配置                                 |\n| `@md/config`     | `packages/config`     | TypeScript 配置基础文件                                              |\n| `@doocs/md-cli`  | `packages/md-cli`     | CLI 工具（Express 服务托管构建产物）                                 |\n| `@md/mcp-server` | `packages/mcp-server` | MCP 服务，为 AI Agent 暴露接口                                       |\n| `@md/api`        | `apps/api`            | 后端 API：账户登录 + 云同步 + 计费（Cloudflare Workers + Hono + D1） |\n\n独立示例（不在 workspace 内）：`docs/examples/wechat-openapi-worker/` — 微信公众号 OpenAPI 代理 Worker。\n\n## 常用命令\n\n### 根目录\n\n```bash\npnpm install          # 安装所有依赖\npnpm start            # 等同于 `pnpm web dev`\npnpm run lint         # ESLint --fix 全项目检查\npnpm run type-check   # vue-tsc 类型检查\npnpm run build:cli    # 构建 web + 复制到 md-cli + npm pack\npnpm run release:cli  # 通过 scripts/release.js 发布 CLI\npnpm utools:package   # 打包 uTools 插件\npnpm run inspector    # node-modules-inspector 查看依赖树\npnpm link-claude-skills  # 链接 .claude/skills → .agents/skills\n```\n\n### Web 应用 (`@md/web`)\n\n```bash\npnpm web dev          # 启动 Vite 开发服务器\npnpm web build        # 生产构建 + 类型检查\npnpm web build:h5-netlify   # 构建用于 Netlify 根目录部署\npnpm web build:analyze      # 构建并生成 rollup-plugin-visualizer 分析\npnpm web ext:dev      # WXT Chrome 扩展开发模式\npnpm web ext:zip      # 打包 Chrome 扩展\npnpm web firefox:dev  # WXT Firefox 扩展开发模式\npnpm web firefox:zip  # 打包 Firefox 扩展\npnpm web wrangler:dev    # Cloudflare Workers 开发\npnpm web wrangler:deploy   # Cloudflare Workers 部署\n```\n\n### VSCode 扩展\n\n```bash\npnpm vscode compile   # webpack 编译\npnpm vscode watch     # webpack 监听\npnpm vscode build     # 生产 webpack 构建\npnpm vscode package   # vsce 打包\n```\n\n### CLI & MCP\n\n```bash\npnpm cli <cmd>        # 在 @doocs/md-cli 中执行命令\npnpm mcp <cmd>        # 在 @md/mcp-server 中执行命令（render_markdown 等 MCP 工具）\npnpm mcp dev          # MCP Server 监听模式\n```\n\n`@md/mcp-server` 通过 stdio 暴露 `render_markdown`、`list_themes`、`list_colors` 等工具，配置见 [packages/mcp-server/README.md](./packages/mcp-server/README.md)、[`.vscode/mcp.json`](./.vscode/mcp.json) 与 [`.cursor/mcp.json`](./.cursor/mcp.json)。\n\n## 架构\n\n### 渲染管线\n\n1. `@md/core` 封装 `marked`，实现自定义扩展（Mermaid、PlantUML、Ruby、KaTeX、TOC、alert 块、infographic、slider、markup、脚注）\n2. `juice` 内联 CSS 以兼容微信\n3. `isomorphic-dompurify` 净化输出\n4. 主题系统（`@md/core/src/theme/`）注入 CSS 变量\n\n### 构建系统\n\n- **`@md/core` 和 `@md/shared` 直接导出 TypeScript 源码**（不预构建）。由消费方的构建工具（Vite/webpack）编译。\n- Web 应用使用 Vite 8，VSCode 扩展使用 webpack，浏览器扩展使用 WXT\n\n### 样式与主题\n\n- Web 应用使用 Tailwind CSS 4 + PostCSS\n- 主题 CSS 文件位于 `packages/shared/src/configs/theme-css/`（default.css、grace.css、simple.css）\n- 部分主题文件使用 Less\n\n### 状态管理\n\n- Pinia store 位于 `apps/web/src/stores/`（按领域划分：`useEditorStore`、`useThemeStore`、`useUiStore`、`useLocaleStore` 等）\n- UI 组件遵循 Shadcn-Vue 模式，位于 `apps/web/src/components/ui`\n- 跨 feature 通用组件位于 `apps/web/src/components/shared`\n- 架构详情见 [docs/architecture.md](./docs/architecture.md)\n\n### 国际化（i18n，`@md/web`）\n\nWeb 主应用与部分浏览器扩展 UI 支持 **zh-CN**、**zh-TW**、**en-US**、**ja-JP**；VS Code 扩展、uTools、CLI、MCP **未**国际化。\n\n- **库**：`vue-i18n`（composition API，`legacy: false`），在 `apps/web/vite.config.ts` 中通过 `unplugin-auto-import` 自动导入 `useI18n`\n- **文案**：`apps/web/src/i18n/messages/{zh-CN,zh-TW,en-US,ja-JP}/`（`common`、`editor`、`dialog`、`store`、`ai`、`upload`、`chrome`）\n- **组件内**：`useI18n()` + `t('key')`；**Store / 工具函数**：`@/i18n/translate` 的 `t()` / `getLocale()` / `formatLocalDateTime()`\n- **语言状态**：`useLocaleStore`（持久化 key：`locale`）；用户可在 **偏好设置**（`Ctrl+,`）→ General 切换\n- **启动**：`await initStorage()` → `setupI18n(detectInitialLocale())` → Pinia → `useLocaleStore()`（见 `apps/web/src/bootstrap.ts`）；`index.html` 启动屏从 `localStorage` 读取 locale\n- **云同步**：`locale` 在 `SYNC_SETTING_KEYS` 中，远端应用后由 `hydrateSyncedSettings` 热更新\n- **约定**：新增用户可见文案须同时维护 zh-CN、zh-TW、en-US 与 ja-JP；在 computed 中调用 `t()` 且需随语言切换更新时，应依赖 `locale`（例如 `void locale.value`）\n\n## Lint 与格式化\n\n- **ESLint:** `@antfu/eslint-config` + Vue + TypeScript + formatter\n- **Prettier:** 固定版本 `2.8.8`（通过 `pnpm-workspace.yaml` 的 `overrides` 强制）\n- **Pre-commit 钩子:** `lint-staged` 对所有文件执行 `eslint --fix`\n- 规则：不使用分号，关闭 `no-unused-vars`、`no-console`、`no-debugger`\n- **代码注释：** 统一英文。保留非显而易见的 why / 约束 / 兼容性说明；删除复述下一行代码的噪音注释。勿改动 `i18n/messages` 等用户可见文案。\n\n## 依赖管理\n\n这是一个 pnpm monorepo，`pnpm-workspace.yaml` 中包含大量安全覆盖（overrides）。\n\n### 升级依赖\n\n1. **共享版本用 catalog** — 跨包共用的工具链版本集中在 `pnpm-workspace.yaml` 的 `catalog`（`typescript`、`vitest`、`wrangler`、`@types/node`、`marked`、`@codemirror/state|view` 等）；workspace 内各 `package.json` 用 `\"catalog:\"` 引用。**仓库根 `package.json` 因 `private: false` 可被 npm 消费，须写普通 semver，勿用 `catalog:`。**包专属依赖可继续写版本号（`pnpm/json-enforce-catalog` 已关闭）\n2. **Prettier 必须固定在 `2.8.8`** — 通过 catalog + `overrides.prettier` 强制（根 package 直接写 `2.8.8`）\n3. **Patch 文件：** 如果打了 patch 的依赖升级了，必须同步更新 `patches/` 中对应的 patch 文件：\n   - `@codemirror/view` → `patches/@codemirror__view@6.43.6.patch`（导出 `MeasureRequest` 接口，修复 macOS 上 Alt+Shift 快捷键处理）\n   - `front-matter` → `patches/front-matter@4.0.2.patch`\n   - `juice` → `patches/juice@12.1.1.patch`（为 `parseCSS` 返回值增加空值检查）\n4. 更新 `pnpm-workspace.yaml` 中的 `patchedDependencies` 以匹配新版本\n5. 运行 `pnpm install` 重新生成 `pnpm-lock.yaml`；可用 `pnpm dedupe` 收敛可合并的间接依赖\n\n### 安全覆盖\n\n`pnpm-workspace.yaml` 的 `overrides` 部分强制了存在漏洞的间接依赖的最低版本（ajv、dompurify、undici、minimatch 等）。除非上游已修复漏洞，否则不要移除这些覆盖。\n\n### allowBuilds\n\n`pnpm-workspace.yaml` 包含 `allowBuilds` 列表，用于需要原生构建脚本的依赖（`esbuild`、`sharp`、`keytar`、`workerd` 等）。新增需要原生构建的依赖可能需要添加到此列表。\n\n## Git 规范\n\n- **提交信息:** 遵循 Conventional Commits（`feat`、`fix`、`docs`、`style`、`refactor`、`perf`、`test`、`build`、`chore`），**一律使用英文**\n- **分支命名:** `feat/description`、`fix/description`\n\n## Skills\n\nReusable workflows live in [`.agents/skills/`](./.agents/skills/) (canonical). Claude Code reads the same files via `.claude/skills` → `.agents/skills`.\n\nAfter clone, create the link once:\n\n```bash\n# macOS / Linux / Git Bash\n./scripts/link-claude-skills.sh\n\n# Windows PowerShell\n./scripts/link-claude-skills.ps1\n```\n\n| Skill        | When to use                                                                           |\n| ------------ | ------------------------------------------------------------------------------------- |\n| `git-commit` | Commit changes with Conventional Commits (`/git-commit` or \"commit my changes\")       |\n| `create-pr`  | Create a GitHub pull request (`/create-pr` or \"open a PR\")                            |\n| `wechat-svg` | WeChat SVG whitelist, bubbling-group interaction, paste compatibility (`/wechat-svg`) |\n\nInvoke manually: `/skill-name` in Cursor or Claude Code; OpenCode uses the `skill` tool.\n"},"files":{"AGENTS.md":"# Agent Instructions\n\n本文件为 AI Agent（Claude Code、OpenCode、Cursor、Copilot 等）在本仓库中工作时提供统一入口。\n\n## 项目概览\n\n**doocs/md** — 一款微信 Markdown 编辑器，将 Markdown 渲染为微信公众号文章格式。支持自定义主题样式、多图床、AI 助手、浏览器扩展、**简体中文 / English 界面**等特性。\n\n- **在线地址:** https://md.doocs.org\n- **Node 版本:** >= 22.22.2（`.nvmrc`: v22.22.2）\n- **包管理器:** pnpm（monorepo）\n- **npm 镜像:** https://registry.npmmirror.com（`.npmrc`）\n\n## Monorepo 结构\n\n| 工作区           | 路径                  | 说明                                                                 |\n| ---------------- | --------------------- | -------------------------------------------------------------------- |\n| `@md/web`        | `apps/web`            | 主应用，Vue 3 + 浏览器扩展（WXT: Chrome/Firefox）                    |\n| `doocs-md`       | `apps/vscode`         | VS Code 扩展（webpack 构建，marketplace ID: `doocs.doocs-md`）       |\n| `@md/utools`     | `apps/utools`         | uTools 插件打包                                                      |\n| `@md/core`       | `packages/core`       | 核心 Markdown 渲染引擎（marked + 自定义扩展）                        |\n| `@md/shared`     | `packages/shared`     | 共享工具函数、配置、类型、编辑器配置                                 |\n| `@md/config`     | `packages/config`     | TypeScript 配置基础文件                                              |\n| `@doocs/md-cli`  | `packages/md-cli`     | CLI 工具（Express 服务托管构建产物）                                 |\n| `@md/mcp-server` | `packages/mcp-server` | MCP 服务，为 AI Agent 暴露接口                                       |\n| `@md/api`        | `apps/api`            | 后端 API：账户登录 + 云同步 + 计费（Cloudflare Workers + Hono + D1） |\n\n独立示例（不在 workspace 内）：`docs/examples/wechat-openapi-worker/` — 微信公众号 OpenAPI 代理 Worker。\n\n## 常用命令\n\n### 根目录\n\n```bash\npnpm install          # 安装所有依赖\npnpm start            # 等同于 `pnpm web dev`\npnpm run lint         # ESLint --fix 全项目检查\npnpm run type-check   # vue-tsc 类型检查\npnpm run build:cli    # 构建 web + 复制到 md-cli + npm pack\npnpm run release:cli  # 通过 scripts/release.js 发布 CLI\npnpm utools:package   # 打包 uTools 插件\npnpm run inspector    # node-modules-inspector 查看依赖树\npnpm link-claude-skills  # 链接 .claude/skills → .agents/skills\n```\n\n### Web 应用 (`@md/web`)\n\n```bash\npnpm web dev          # 启动 Vite 开发服务器\npnpm web build        # 生产构建 + 类型检查\npnpm web build:h5-netlify   # 构建用于 Netlify 根目录部署\npnpm web build:analyze      # 构建并生成 rollup-plugin-visualizer 分析\npnpm web ext:dev      # WXT Chrome 扩展开发模式\npnpm web ext:zip      # 打包 Chrome 扩展\npnpm web firefox:dev  # WXT Firefox 扩展开发模式\npnpm web firefox:zip  # 打包 Firefox 扩展\npnpm web wrangler:dev    # Cloudflare Workers 开发\npnpm web wrangler:deploy   # Cloudflare Workers 部署\n```\n\n### VSCode 扩展\n\n```bash\npnpm vscode compile   # webpack 编译\npnpm vscode watch     # webpack 监听\npnpm vscode build     # 生产 webpack 构建\npnpm vscode package   # vsce 打包\n```\n\n### CLI & MCP\n\n```bash\npnpm cli <cmd>        # 在 @doocs/md-cli 中执行命令\npnpm mcp <cmd>        # 在 @md/mcp-server 中执行命令（render_markdown 等 MCP 工具）\npnpm mcp dev          # MCP Server 监听模式\n```\n\n`@md/mcp-server` 通过 stdio 暴露 `render_markdown`、`list_themes`、`list_colors` 等工具，配置见 [packages/mcp-server/README.md](./packages/mcp-server/README.md)、[`.vscode/mcp.json`](./.vscode/mcp.json) 与 [`.cursor/mcp.json`](./.cursor/mcp.json)。\n\n## 架构\n\n### 渲染管线\n\n1. `@md/core` 封装 `marked`，实现自定义扩展（Mermaid、PlantUML、Ruby、KaTeX、TOC、alert 块、infographic、slider、markup、脚注）\n2. `juice` 内联 CSS 以兼容微信\n3. `isomorphic-dompurify` 净化输出\n4. 主题系统（`@md/core/src/theme/`）注入 CSS 变量\n\n### 构建系统\n\n- **`@md/core` 和 `@md/shared` 直接导出 TypeScript 源码**（不预构建）。由消费方的构建工具（Vite/webpack）编译。\n- Web 应用使用 Vite 8，VSCode 扩展使用 webpack，浏览器扩展使用 WXT\n\n### 样式与主题\n\n- Web 应用使用 Tailwind CSS 4 + PostCSS\n- 主题 CSS 文件位于 `packages/shared/src/configs/theme-css/`（default.css、grace.css、simple.css）\n- 部分主题文件使用 Less\n\n### 状态管理\n\n- Pinia store 位于 `apps/web/src/stores/`（按领域划分：`useEditorStore`、`useThemeStore`、`useUiStore`、`useLocaleStore` 等）\n- UI 组件遵循 Shadcn-Vue 模式，位于 `apps/web/src/components/ui`\n- 跨 feature 通用组件位于 `apps/web/src/components/shared`\n- 架构详情见 [docs/architecture.md](./docs/architecture.md)\n\n### 国际化（i18n，`@md/web`）\n\nWeb 主应用与部分浏览器扩展 UI 支持 **zh-CN**、**zh-TW**、**en-US**、**ja-JP**；VS Code 扩展、uTools、CLI、MCP **未**国际化。\n\n- **库**：`vue-i18n`（composition API，`legacy: false`），在 `apps/web/vite.config.ts` 中通过 `unplugin-auto-import` 自动导入 `useI18n`\n- **文案**：`apps/web/src/i18n/messages/{zh-CN,zh-TW,en-US,ja-JP}/`（`common`、`editor`、`dialog`、`store`、`ai`、`upload`、`chrome`）\n- **组件内**：`useI18n()` + `t('key')`；**Store / 工具函数**：`@/i18n/translate` 的 `t()` / `getLocale()` / `formatLocalDateTime()`\n- **语言状态**：`useLocaleStore`（持久化 key：`locale`）；用户可在 **偏好设置**（`Ctrl+,`）→ General 切换\n- **启动**：`await initStorage()` → `setupI18n(detectInitialLocale())` → Pinia → `useLocaleStore()`（见 `apps/web/src/bootstrap.ts`）；`index.html` 启动屏从 `localStorage` 读取 locale\n- **云同步**：`locale` 在 `SYNC_SETTING_KEYS` 中，远端应用后由 `hydrateSyncedSettings` 热更新\n- **约定**：新增用户可见文案须同时维护 zh-CN、zh-TW、en-US 与 ja-JP；在 computed 中调用 `t()` 且需随语言切换更新时，应依赖 `locale`（例如 `void locale.value`）\n\n## Lint 与格式化\n\n- **ESLint:** `@antfu/eslint-config` + Vue + TypeScript + formatter\n- **Prettier:** 固定版本 `2.8.8`（通过 `pnpm-workspace.yaml` 的 `overrides` 强制）\n- **Pre-commit 钩子:** `lint-staged` 对所有文件执行 `eslint --fix`\n- 规则：不使用分号，关闭 `no-unused-vars`、`no-console`、`no-debugger`\n- **代码注释：** 统一英文。保留非显而易见的 why / 约束 / 兼容性说明；删除复述下一行代码的噪音注释。勿改动 `i18n/messages` 等用户可见文案。\n\n## 依赖管理\n\n这是一个 pnpm monorepo，`pnpm-workspace.yaml` 中包含大量安全覆盖（overrides）。\n\n### 升级依赖\n\n1. **共享版本用 catalog** — 跨包共用的工具链版本集中在 `pnpm-workspace.yaml` 的 `catalog`（`typescript`、`vitest`、`wrangler`、`@types/node`、`marked`、`@codemirror/state|view` 等）；workspace 内各 `package.json` 用 `\"catalog:\"` 引用。**仓库根 `package.json` 因 `private: false` 可被 npm 消费，须写普通 semver，勿用 `catalog:`。**包专属依赖可继续写版本号（`pnpm/json-enforce-catalog` 已关闭）\n2. **Prettier 必须固定在 `2.8.8`** — 通过 catalog + `overrides.prettier` 强制（根 package 直接写 `2.8.8`）\n3. **Patch 文件：** 如果打了 patch 的依赖升级了，必须同步更新 `patches/` 中对应的 patch 文件：\n   - `@codemirror/view` → `patches/@codemirror__view@6.43.6.patch`（导出 `MeasureRequest` 接口，修复 macOS 上 Alt+Shift 快捷键处理）\n   - `front-matter` → `patches/front-matter@4.0.2.patch`\n   - `juice` → `patches/juice@12.1.1.patch`（为 `parseCSS` 返回值增加空值检查）\n4. 更新 `pnpm-workspace.yaml` 中的 `patchedDependencies` 以匹配新版本\n5. 运行 `pnpm install` 重新生成 `pnpm-lock.yaml`；可用 `pnpm dedupe` 收敛可合并的间接依赖\n\n### 安全覆盖\n\n`pnpm-workspace.yaml` 的 `overrides` 部分强制了存在漏洞的间接依赖的最低版本（ajv、dompurify、undici、minimatch 等）。除非上游已修复漏洞，否则不要移除这些覆盖。\n\n### allowBuilds\n\n`pnpm-workspace.yaml` 包含 `allowBuilds` 列表，用于需要原生构建脚本的依赖（`esbuild`、`sharp`、`keytar`、`workerd` 等）。新增需要原生构建的依赖可能需要添加到此列表。\n\n## Git 规范\n\n- **提交信息:** 遵循 Conventional Commits（`feat`、`fix`、`docs`、`style`、`refactor`、`perf`、`test`、`build`、`chore`），**一律使用英文**\n- **分支命名:** `feat/description`、`fix/description`\n\n## Skills\n\nReusable workflows live in [`.agents/skills/`](./.agents/skills/) (canonical). Claude Code reads the same files via `.claude/skills` → `.agents/skills`.\n\nAfter clone, create the link once:\n\n```bash\n# macOS / Linux / Git Bash\n./scripts/link-claude-skills.sh\n\n# Windows PowerShell\n./scripts/link-claude-skills.ps1\n```\n\n| Skill        | When to use                                                                           |\n| ------------ | ------------------------------------------------------------------------------------- |\n| `git-commit` | Commit changes with Conventional Commits (`/git-commit` or \"commit my changes\")       |\n| `create-pr`  | Create a GitHub pull request (`/create-pr` or \"open a PR\")                            |\n| `wechat-svg` | WeChat SVG whitelist, bubbling-group interaction, paste compatibility (`/wechat-svg`) |\n\nInvoke manually: `/skill-name` in Cursor or Claude Code; OpenCode uses the `skill` tool.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# Agent Instructions\n\n本文件为 AI Agent（Claude Code、OpenCode、Cursor、Copilot 等）在本仓库中工作时提供统一入口。\n\n## 项目概览\n\n**doocs/md** — 一款微信 Markdown 编辑器，将 Markdown 渲染为微信公众号文章格式。支持自定义主题样式、多图床、AI 助手、浏览器扩展、**简体中文 / English 界面**等特性。\n\n- **在线地址:** https://md.doocs.org\n- **Node 版本:** >= 22.22.2（`.nvmrc`: v22.22.2）\n- **包管理器:** pnpm（monorepo）\n- **npm 镜像:** https://registry.npmmirror.com（`.npmrc`）\n\n## Monorepo 结构\n\n| 工作区           | 路径                  | 说明                                                                 |\n| ---------------- | --------------------- | -------------------------------------------------------------------- |\n| `@md/web`        | `apps/web`            | 主应用，Vue 3 + 浏览器扩展（WXT: Chrome/Firefox）                    |\n| `doocs-md`       | `apps/vscode`         | VS Code 扩展（webpack 构建，marketplace ID: `doocs.doocs-md`）       |\n| `@md/utools`     | `apps/utools`         | uTools 插件打包                                                      |\n| `@md/core`       | `packages/core`       | 核心 Markdown 渲染引擎（marked + 自定义扩展）                        |\n| `@md/shared`     | `packages/shared`     | 共享工具函数、配置、类型、编辑器配置                                 |\n| `@md/config`     | `packages/config`     | TypeScript 配置基础文件                                              |\n| `@doocs/md-cli`  | `packages/md-cli`     | CLI 工具（Express 服务托管构建产物）                                 |\n| `@md/mcp-server` | `packages/mcp-server` | MCP 服务，为 AI Agent 暴露接口                                       |\n| `@md/api`        | `apps/api`            | 后端 API：账户登录 + 云同步 + 计费（Cloudflare Workers + Hono + D1） |\n\n独立示例（不在 workspace 内）：`docs/examples/wechat-openapi-worker/` — 微信公众号 OpenAPI 代理 Worker。\n\n## 常用命令\n\n### 根目录\n\n```bash\npnpm install          # 安装所有依赖\npnpm start            # 等同于 `pnpm web dev`\npnpm run lint         # ESLint --fix 全项目检查\npnpm run type-check   # vue-tsc 类型检查\npnpm run build:cli    # 构建 web + 复制到 md-cli + npm pack\npnpm run release:cli  # 通过 scripts/release.js 发布 CLI\npnpm utools:package   # 打包 uTools 插件\npnpm run inspector    # node-modules-inspector 查看依赖树\npnpm link-claude-skills  # 链接 .claude/skills → .agents/skills\n```\n\n### Web 应用 (`@md/web`)\n\n```bash\npnpm web dev          # 启动 Vite 开发服务器\npnpm web build        # 生产构建 + 类型检查\npnpm web build:h5-netlify   # 构建用于 Netlify 根目录部署\npnpm web build:analyze      # 构建并生成 rollup-plugin-visualizer 分析\npnpm web ext:dev      # WXT Chrome 扩展开发模式\npnpm web ext:zip      # 打包 Chrome 扩展\npnpm web firefox:dev  # WXT Firefox 扩展开发模式\npnpm web firefox:zip  # 打包 Firefox 扩展\npnpm web wrangler:dev    # Cloudflare Workers 开发\npnpm web wrangler:deploy   # Cloudflare Workers 部署\n```\n\n### VSCode 扩展\n\n```bash\npnpm vscode compile   # webpack 编译\npnpm vscode watch     # webpack 监听\npnpm vscode build     # 生产 webpack 构建\npnpm vscode package   # vsce 打包\n```\n\n### CLI & MCP\n\n```bash\npnpm cli <cmd>        # 在 @doocs/md-cli 中执行命令\npnpm mcp <cmd>        # 在 @md/mcp-server 中执行命令（render_markdown 等 MCP 工具）\npnpm mcp dev          # MCP Server 监听模式\n```\n\n`@md/mcp-server` 通过 stdio 暴露 `render_markdown`、`list_themes`、`list_colors` 等工具，配置见 [packages/mcp-server/README.md](./packages/mcp-server/README.md)、[`.vscode/mcp.json`](./.vscode/mcp.json) 与 [`.cursor/mcp.json`](./.cursor/mcp.json)。\n\n## 架构\n\n### 渲染管线\n\n1. `@md/core` 封装 `marked`，实现自定义扩展（Mermaid、PlantUML、Ruby、KaTeX、TOC、alert 块、infographic、slider、markup、脚注）\n2. `juice` 内联 CSS 以兼容微信\n3. `isomorphic-dompurify` 净化输出\n4. 主题系统（`@md/core/src/theme/`）注入 CSS 变量\n\n### 构建系统\n\n- **`@md/core` 和 `@md/shared` 直接导出 TypeScript 源码**（不预构建）。由消费方的构建工具（Vite/webpack）编译。\n- Web 应用使用 Vite 8，VSCode 扩展使用 webpack，浏览器扩展使用 WXT\n\n### 样式与主题\n\n- Web 应用使用 Tailwind CSS 4 + PostCSS\n- 主题 CSS 文件位于 `packages/shared/src/configs/theme-css/`（default.css、grace.css、simple.css）\n- 部分主题文件使用 Less\n\n### 状态管理\n\n- Pinia store 位于 `apps/web/src/stores/`（按领域划分：`useEditorStore`、`useThemeStore`、`useUiStore`、`useLocaleStore` 等）\n- UI 组件遵循 Shadcn-Vue 模式，位于 `apps/web/src/components/ui`\n- 跨 feature 通用组件位于 `apps/web/src/components/shared`\n- 架构详情见 [docs/architecture.md](./docs/architecture.md)\n\n### 国际化（i18n，`@md/web`）\n\nWeb 主应用与部分浏览器扩展 UI 支持 **zh-CN**、**zh-TW**、**en-US**、**ja-JP**；VS Code 扩展、uTools、CLI、MCP **未**国际化。\n\n- **库**：`vue-i18n`（composition API，`legacy: false`），在 `apps/web/vite.config.ts` 中通过 `unplugin-auto-import` 自动导入 `useI18n`\n- **文案**：`apps/web/src/i18n/messages/{zh-CN,zh-TW,en-US,ja-JP}/`（`common`、`editor`、`dialog`、`store`、`ai`、`upload`、`chrome`）\n- **组件内**：`useI18n()` + `t('key')`；**Store / 工具函数**：`@/i18n/translate` 的 `t()` / `getLocale()` / `formatLocalDateTime()`\n- **语言状态**：`useLocaleStore`（持久化 key：`locale`）；用户可在 **偏好设置**（`Ctrl+,`）→ General 切换\n- **启动**：`await initStorage()` → `setupI18n(detectInitialLocale())` → Pinia → `useLocaleStore()`（见 `apps/web/src/bootstrap.ts`）；`index.html` 启动屏从 `localStorage` 读取 locale\n- **云同步**：`locale` 在 `SYNC_SETTING_KEYS` 中，远端应用后由 `hydrateSyncedSettings` 热更新\n- **约定**：新增用户可见文案须同时维护 zh-CN、zh-TW、en-US 与 ja-JP；在 computed 中调用 `t()` 且需随语言切换更新时，应依赖 `locale`（例如 `void locale.value`）\n\n## Lint 与格式化\n\n- **ESLint:** `@antfu/eslint-config` + Vue + TypeScript + formatter\n- **Prettier:** 固定版本 `2.8.8`（通过 `pnpm-workspace.yaml` 的 `overrides` 强制）\n- **Pre-commit 钩子:** `lint-staged` 对所有文件执行 `eslint --fix`\n- 规则：不使用分号，关闭 `no-unused-vars`、`no-console`、`no-debugger`\n- **代码注释：** 统一英文。保留非显而易见的 why / 约束 / 兼容性说明；删除复述下一行代码的噪音注释。勿改动 `i18n/messages` 等用户可见文案。\n\n## 依赖管理\n\n这是一个 pnpm monorepo，`pnpm-workspace.yaml` 中包含大量安全覆盖（overrides）。\n\n### 升级依赖\n\n1. **共享版本用 catalog** — 跨包共用的工具链版本集中在 `pnpm-workspace.yaml` 的 `catalog`（`typescript`、`vitest`、`wrangler`、`@types/node`、`marked`、`@codemirror/state|view` 等）；workspace 内各 `package.json` 用 `\"catalog:\"` 引用。**仓库根 `package.json` 因 `private: false` 可被 npm 消费，须写普通 semver，勿用 `catalog:`。**包专属依赖可继续写版本号（`pnpm/json-enforce-catalog` 已关闭）\n2. **Prettier 必须固定在 `2.8.8`** — 通过 catalog + `overrides.prettier` 强制（根 package 直接写 `2.8.8`）\n3. **Patch 文件：** 如果打了 patch 的依赖升级了，必须同步更新 `patches/` 中对应的 patch 文件：\n   - `@codemirror/view` → `patches/@codemirror__view@6.43.6.patch`（导出 `MeasureRequest` 接口，修复 macOS 上 Alt+Shift 快捷键处理）\n   - `front-matter` → `patches/front-matter@4.0.2.patch`\n   - `juice` → `patches/juice@12.1.1.patch`（为 `parseCSS` 返回值增加空值检查）\n4. 更新 `pnpm-workspace.yaml` 中的 `patchedDependencies` 以匹配新版本\n5. 运行 `pnpm install` 重新生成 `pnpm-lock.yaml`；可用 `pnpm dedupe` 收敛可合并的间接依赖\n\n### 安全覆盖\n\n`pnpm-workspace.yaml` 的 `overrides` 部分强制了存在漏洞的间接依赖的最低版本（ajv、dompurify、undici、minimatch 等）。除非上游已修复漏洞，否则不要移除这些覆盖。\n\n### allowBuilds\n\n`pnpm-workspace.yaml` 包含 `allowBuilds` 列表，用于需要原生构建脚本的依赖（`esbuild`、`sharp`、`keytar`、`workerd` 等）。新增需要原生构建的依赖可能需要添加到此列表。\n\n## Git 规范\n\n- **提交信息:** 遵循 Conventional Commits（`feat`、`fix`、`docs`、`style`、`refactor`、`perf`、`test`、`build`、`chore`），**一律使用英文**\n- **分支命名:** `feat/description`、`fix/description`\n\n## Skills\n\nReusable workflows live in [`.agents/skills/`](./.agents/skills/) (canonical). Claude Code reads the same files via `.claude/skills` → `.agents/skills`.\n\nAfter clone, create the link once:\n\n```bash\n# macOS / Linux / Git Bash\n./scripts/link-claude-skills.sh\n\n# Windows PowerShell\n./scripts/link-claude-skills.ps1\n```\n\n| Skill        | When to use                                                                           |\n| ------------ | ------------------------------------------------------------------------------------- |\n| `git-commit` | Commit changes with Conventional Commits (`/git-commit` or \"commit my changes\")       |\n| `create-pr`  | Create a GitHub pull request (`/create-pr` or \"open a PR\")                            |\n| `wechat-svg` | WeChat SVG whitelist, bubbling-group interaction, paste compatibility (`/wechat-svg`) |\n\nInvoke manually: `/skill-name` in Cursor or Claude Code; OpenCode uses the `skill` tool.\n","category":"root","tokens":1899}]}