[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"doc-\u002Fzh-Hans\u002Fcmtx\u002Fdev-guide\u002FDEV-001-development_guide\u002F":3},"\u003Ch1 id=\"dev-001%3A-%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#dev-001%3A-%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97\">#\u003C\u002Fa> DEV-001: 开发指南\u003C\u002Fh1>\n\u003Cp>本文档包含 CMTX 项目的开发环境设置、常用命令和开发 workflow。\u003C\u002Fp>\n\u003Ch2 id=\"1.-%E7%8E%AF%E5%A2%83%E8%A6%81%E6%B1%82\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#1.-%E7%8E%AF%E5%A2%83%E8%A6%81%E6%B1%82\">#\u003C\u002Fa> 1. 环境要求\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Node.js 22+（所有包在 \u003Ccode>package.json\u003C\u002Fcode> 中声明 \u003Ccode>&gt;=22.0.0\u003C\u002Fcode>）\u003C\u002Fli>\n\u003Cli>pnpm 10+（已在 packageManager 字段声明）\u003C\u002Fli>\n\u003Cli>ESM \u002F TypeScript NodeNext\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"2.-%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#2.-%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96\">#\u003C\u002Fa> 2. 安装依赖\u003C\u002Fh2>\n\u003Cpre data-lang=\"bash\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> install\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"3.-%E5%BC%80%E5%8F%91%E5%91%BD%E4%BB%A4\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#3.-%E5%BC%80%E5%8F%91%E5%91%BD%E4%BB%A4\">#\u003C\u002Fa> 3. 开发命令\u003C\u002Fh2>\n\u003Cpre data-lang=\"bash\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 构建所有包（构建产物自动验证：package.json 中声明的 dist 文件必须真实存在）\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> build\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 运行测试\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> test\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 代码检查并自动修复\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> lint\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 生成 API 文档\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> run\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> docs\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"3.1.-%E5%8C%85%E7%AE%A1%E7%90%86\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#3.1.-%E5%8C%85%E7%AE%A1%E7%90%86\">#\u003C\u002Fa> 3.1. 包管理\u003C\u002Fh3>\n\u003Cpre data-lang=\"bash\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 构建指定包\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#005CC5\"> -F\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> @cmtx\u002Fcore\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> build\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 测试指定包\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#005CC5\"> -F\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> @cmtx\u002Fcore\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> test\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"4.-pnpm-monorepo-%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#4.-pnpm-monorepo-%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86\">#\u003C\u002Fa> 4. pnpm Monorepo 依赖管理\u003C\u002Fh2>\n\u003Ch3 id=\"4.1.-%E4%B8%A5%E6%A0%BC%E4%BE%9D%E8%B5%96%E8%A7%A3%E6%9E%90\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#4.1.-%E4%B8%A5%E6%A0%BC%E4%BE%9D%E8%B5%96%E8%A7%A3%E6%9E%90\">#\u003C\u002Fa> 4.1. 严格依赖解析\u003C\u002Fh3>\n\u003Cp>pnpm 默认启用\u003Cstrong>严格依赖解析\u003C\u002Fstrong>：你只能 import 你\u003Cstrong>直接声明\u003C\u002Fstrong>的依赖。间接依赖（通过其他包传递的）不会出现在你的 \u003Ccode>node_modules\u003C\u002Fcode> 中。\u003C\u002Fp>\n\u003Cp>这意味着在 monorepo 中跨包使用导出时，必须在 \u003Ccode>package.json\u003C\u002Fcode> 中显式声明依赖，即使该包已通过其他 workspace 包间接可用。\u003C\u002Fp>\n\u003Ch3 id=\"4.2.-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%EF%BC%9A%E8%B7%A8%E5%8C%85%E5%AF%BC%E5%87%BA%E7%B1%BB%E5%9E%8B%E8%A7%A3%E6%9E%90%E5%A4%B1%E8%B4%A5\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#4.2.-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%EF%BC%9A%E8%B7%A8%E5%8C%85%E5%AF%BC%E5%87%BA%E7%B1%BB%E5%9E%8B%E8%A7%A3%E6%9E%90%E5%A4%B1%E8%B4%A5\">#\u003C\u002Fa> 4.2. 常见问题：跨包导出类型解析失败\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>现象\u003C\u002Fstrong>：在包 A 中新增了导出，包 B 直接 import 该导出，但 \u003Ccode>pnpm typecheck\u003C\u002Fcode> 报 \u003Ccode>Module '...' has no exported member '...'\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>根因\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Col>\n\u003Cli>包 B 的 \u003Ccode>package.json\u003C\u002Fcode> 未声明对包 A 的直接依赖\u003C\u002Fli>\n\u003Cli>pnpm 未为包 B 创建包 A 的 symlink（因为依赖图未变化）\u003C\u002Fli>\n\u003Cli>TypeScript 解析到的是 \u003Ccode>.pnpm\u003C\u002Fcode> store 中的旧缓存版本\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>\u003Cstrong>解决方案\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>在包 B 的 \u003Ccode>package.json\u003C\u002Fcode> 中添加直接依赖：\u003C\u002Fp>\n\u003Cpre data-lang=\"json\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#032F62\">\"dependencies\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">: {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5\">    \"@cmtx\u002F包A\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">\"workspace:*\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n\u003Cli>\n\u003Cp>清理 pnpm store 缓存并重新安装：\u003C\u002Fp>\n\u003Cpre data-lang=\"bash\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">rm\u003C\u002Fspan>\u003Cspan style=\"color:#005CC5\"> -rf\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> node_modules\u002F.pnpm\u002F@cmtx+包A\u003C\u002Fspan>\u003Cspan style=\"color:#005CC5\">*\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> install\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n\u003Cli>\n\u003Cp>验证类型解析：\u003C\u002Fp>\n\u003Cpre data-lang=\"bash\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#005CC5\"> --filter\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> @cmtx\u002F包B\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> typecheck\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"4.3.-%E9%A2%84%E9%98%B2%E5%BB%BA%E8%AE%AE\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#4.3.-%E9%A2%84%E9%98%B2%E5%BB%BA%E8%AE%AE\">#\u003C\u002Fa> 4.3. 预防建议\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>始终显式声明依赖\u003C\u002Fstrong>：你用了什么包，就声明什么包\u003C\u002Fli>\n\u003Cli>\u003Cstrong>新增跨包导出后\u003C\u002Fstrong>：检查所有直接使用该导出的包是否已声明依赖\u003C\u002Fli>\n\u003Cli>\u003Cstrong>CI 检查\u003C\u002Fstrong>：可运行 \u003Ccode>pnpm ls --recursive\u003C\u002Fcode> 检查是否有未声明的依赖\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"5.-%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#5.-%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84\">#\u003C\u002Fa> 5. 项目结构\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>cmtx-project\u002F\n├── packages\u002F                    # 各功能包\n│   ├── core\u002F                   # 核心文档处理（图片+元数据）\n│   ├── storage\u002F                # 对象存储适配器\n│   ├── asset\u002F                  # 资产管理（上传、转移、下载、删除）\n│   ├── template\u002F               # 模板渲染引擎\n│   ├── rule-engine\u002F            # 规则引擎、内容变换、跨平台适配\n│   ├── ai\u002F                     # AI 能力：Slug 生成、内容校验\n│   ├── fpe-wasm\u002F               # FF1 格式保留加密（WASM）\n│   ├── autocorrect-wasm\u002F       # 文本自动纠正（WASM）\n│   ├── cli\u002F                    # 命令行工具\n│   ├── mcp-server\u002F             # MCP 服务器\n│   ├── vscode-extension\u002F       # VS Code 扩展\n│   ├── markdown-it-presigned-url\u002F           # Markdown-it 预签名 URL 插件\n│   └── markdown-it-presigned-url-adapter-nodejs\u002F  # Node.js 签名适配器\n├── docs\u002F                       # 项目文档\n│   └── i18n\u002Fzh-Hans\u002F           # 简体中文文档集\n├── scripts\u002F                    # 构建和发布脚本\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"6.-%E5%BC%80%E5%8F%91-workflow\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#6.-%E5%BC%80%E5%8F%91-workflow\">#\u003C\u002Fa> 6. 开发 Workflow\u003C\u002Fh2>\n\u003Col>\n\u003Cli>在 \u003Ccode>develop\u003C\u002Fcode> 分支开发，PR 合并到 \u003Ccode>main\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>开发：保持 ESM、严格类型，遵循现有代码风格\u003C\u002Fli>\n\u003Cli>校验：至少运行 \u003Ccode>pnpm lint\u003C\u002Fcode> 与 \u003Ccode>pnpm test\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>提交信息：建议使用简洁动词开头，明确范围（如 feat(core), fix(upload), docs(cli)）\u003C\u002Fli>\n\u003Cli>创建 changeset：记录变更意图（包 + bump 类型 + 描述）\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"7.-%E4%BB%A3%E7%A0%81%E9%A3%8E%E6%A0%BC\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#7.-%E4%BB%A3%E7%A0%81%E9%A3%8E%E6%A0%BC\">#\u003C\u002Fa> 7. 代码风格\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>TypeScript strict 模式，NodeNext 模块解析\u003C\u002Fli>\n\u003Cli>导入路径在源码中使用 .js 后缀（满足 NodeNext 构建）\u003C\u002Fli>\n\u003Cli>Markdown 表格使用空格分隔管道，标题与列表上下保持空行\u003C\u002Fli>\n\u003Cli>命名规范详见 \u003Ca href=\"\u002Fzh-Hans\u002Fcmtx\u002Fdev-guide\u002FDEV-013-api-conventions\u002F\">DEV-013 §1\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"8.-%E5%BA%94%E7%94%A8%E5%B1%82%E6%93%8D%E4%BD%9C%E6%A8%A1%E5%BC%8F\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#8.-%E5%BA%94%E7%94%A8%E5%B1%82%E6%93%8D%E4%BD%9C%E6%A8%A1%E5%BC%8F\">#\u003C\u002Fa> 8. 应用层操作模式\u003C\u002Fh2>\n\u003Cp>应用层（CLI \u002F VS Code \u002F MCP Server）在操作 Markdown 图片时有两种模式。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>核心区别不是&quot;是否传入文件路径&quot;，而是传入的路径指向什么以及工具对路径做什么。\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch3 id=\"8.1.-text-%E6%A8%A1%E5%BC%8F\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#8.1.-text-%E6%A8%A1%E5%BC%8F\">#\u003C\u002Fa> 8.1. Text 模式\u003C\u002Fh3>\n\u003Cp>CLI 和 VS Code 使用 Text 模式。传入的路径指向 \u003Cstrong>Markdown 文件\u003C\u002Fstrong>，工具读取其文本内容，解析 \u003Ccode>![alt](path)\u003C\u002Fcode> 提取图片路径，完成操作后写回。工作流是&quot;内容转换&quot;：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Markdown 文本 → 提取图片路径 → 上传\u002F下载\u002F删除 → 替换文本中的引用 → 写回\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cul>\n\u003Cli>工具需要从文本中\u003Cstrong>发现\u003C\u002Fstrong>图片引用\u003C\u002Fli>\n\u003Cli>上传后\u003Cstrong>替换\u003C\u002Fstrong>为远程 URL\u003C\u002Fli>\n\u003Cli>写回文件\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>具体表现\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>工具\u003C\u002Fth>\n\u003Cth>传入路径指向\u003C\u002Fth>\n\u003Cth>操作范围\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>CLI \u003Ccode>upload &lt;filePath&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.md\u003C\u002Fcode> 文件\u003C\u002Ftd>\n\u003Ctd>读取整个文件内容\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>CLI \u003Ccode>download &lt;file&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.md\u003C\u002Fcode> 文件\u003C\u002Ftd>\n\u003Ctd>读取整个文件内容\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>VS Code \u003Ccode>uploadSelected\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>编辑器选区\u003C\u002Ftd>\n\u003Ctd>读取选区文本\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>VS Code \u003Ccode>rule.upload-images\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>编辑器文件\u003C\u002Ftd>\n\u003Ctd>读取整个文件内容\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>VS Code \u003Ccode>delete\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>编辑器光标行\u003C\u002Ftd>\n\u003Ctd>读取光标所在行\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>VS Code 读编辑器文本（含未保存更改）是合理的实现选择\u003C\u002Fstrong>，但不是主要原因。即使文件已保存，仍然需要 Text 模式来完成&quot;发现 → 上传 → 替换&quot;的完整流程。\u003C\u002Fp>\n\u003Ch3 id=\"8.2.-file-path-%E6%A8%A1%E5%BC%8F\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#8.2.-file-path-%E6%A8%A1%E5%BC%8F\">#\u003C\u002Fa> 8.2. File Path 模式\u003C\u002Fh3>\n\u003Cp>MCP Server 的部分工具使用 File Path 模式。传入的路径直接指向 \u003Cstrong>图片文件本身\u003C\u002Fstrong>，工具直接操作该图片，无需从 Markdown 文本中发现。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>具体表现\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>工具\u003C\u002Fth>\n\u003Cth>传入路径指向\u003C\u002Fth>\n\u003Cth>说明\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>delete.safe\u003C\u002Fcode> \u002F \u003Ccode>delete.force\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>图片文件\u003C\u002Ftd>\n\u003Ctd>直接传入 \u003Ccode>imagePath\u003C\u002Fcode> 参数\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>find.filesReferencingImage\u003C\u002Fcode> \u002F \u003Ccode>find.referenceDetails\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>图片文件\u003C\u002Ftd>\n\u003Ctd>直接传入 \u003Ccode>imagePath\u003C\u002Fcode> 参数\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>原因\u003C\u002Fstrong>：AI Agent 已经知道要操作哪个图片，直接传路径即可。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>注意\u003C\u002Fstrong>：MCP Server 的上传\u002F转移工具仍用 Text 模式，因为传入的路径指向 \u003Ccode>.md\u003C\u002Fcode> 文件：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>工具\u003C\u002Fth>\n\u003Cth>传入路径指向\u003C\u002Fth>\n\u003Cth>模式\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>upload.run\u003C\u002Fcode> \u002F \u003Ccode>upload.preview\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>目录（扫描 \u003Ccode>.md\u003C\u002Fcode> 文件）\u003C\u002Ftd>\n\u003Ctd>Text 模式\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>transfer.execute\u003C\u002Fcode> \u002F \u003Ccode>transfer.analyze\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>.md\u003C\u002Fcode> 文件\u003C\u002Ftd>\n\u003Ctd>Text 模式\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"9.-wasm-%E6%89%93%E5%8C%85%E8%AF%B4%E6%98%8E\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#9.-wasm-%E6%89%93%E5%8C%85%E8%AF%B4%E6%98%8E\">#\u003C\u002Fa> 9. WASM 打包说明\u003C\u002Fh2>\n\u003Ch3 id=\"9.1.-%40cmtx%2Ffpe-wasm-%E5%8C%85\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#9.1.-%40cmtx%2Ffpe-wasm-%E5%8C%85\">#\u003C\u002Fa> 9.1. @cmtx\u002Ffpe-wasm 包\u003C\u002Fh3>\n\u003Cp>该包使用 Rust 实现 NIST SP 800-38G FF1 格式保留加密算法，通过 WASM 在 Node.js 和浏览器环境中运行。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>构建流程：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>WASM 构建\u003C\u002Fstrong>（需要 Rust 工具链）\u003C\u002Fp>\n\u003Cpre data-lang=\"bash\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 进入 fpe-wasm 包目录\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#005CC5\">cd\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> packages\u002Ffpe-wasm\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 构建 WASM（生成 pkg\u002F 目录）\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> run\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> build:wasm\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>TypeScript 打包\u003C\u002Fstrong>（使用 tsdown）\u003C\u002Fp>\n\u003Cpre data-lang=\"bash\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 构建 TypeScript（复制 WASM 到 dist\u002F）\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">pnpm\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> run\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> build\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>\u003Cstrong>输出结构：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode>packages\u002Ffpe-wasm\u002F\n├── pkg\u002F                          # wasm-pack 输出（源文件）\n│   ├── cmtx_fpe_wasm.js\n│   ├── cmtx_fpe_wasm_bg.wasm\n│   └── cmtx_fpe_wasm.d.ts\n├── dist\u002F                         # tsdown 输出（发布到 npm）\n│   ├── index.mjs                 # ESM 入口\n│   ├── index.cjs                 # CJS 入口\n│   ├── index.d.ts                # 类型定义\n│   └── pkg\u002F                      # 复制的 WASM 文件\n│       └── cmtx_fpe_wasm_bg.wasm\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>VS Code 扩展中的 WASM 处理：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>VS Code 扩展使用 \u003Ccode>rolldown-plugin-wasm\u003C\u002Fcode> 自动处理 WASM 文件：\u003C\u002Fp>\n\u003Cpre data-lang=\"typescript\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">\u002F\u002F vscode-extension\u002Ftsdown.config.ts\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49\">import\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\"> { wasm } \u003C\u002Fspan>\u003Cspan style=\"color:#D73A49\">from\u003C\u002Fspan>\u003Cspan style=\"color:#032F62\"> \"rolldown-plugin-wasm\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#D73A49\">export\u003C\u002Fspan>\u003Cspan style=\"color:#D73A49\"> default\u003C\u002Fspan>\u003Cspan style=\"color:#6F42C1\"> defineConfig\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">    plugins: [\u003C\u002Fspan>\u003Cspan style=\"color:#6F42C1\">wasm\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">({ targetEnv: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">\"node\"\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\"> })],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    \u002F\u002F ...\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">});\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>打包后 WASM 文件位于：\u003Ccode>dist\u002Fnode_modules\u002F@cmtx\u002Ffpe-wasm\u002Fcmtx_fpe_wasm_bg.wasm\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>开发注意事项：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>修改 Rust 源码后需要重新运行 \u003Ccode>pnpm --filter @cmtx\u002Ffpe-wasm build\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>开发模式（F5）直接使用 \u003Ccode>packages\u002Ffpe-wasm\u002Fpkg\u002F\u003C\u002Fcode> 中的 WASM\u003C\u002Fli>\n\u003Cli>生产模式（vsce package）使用打包后的 WASM\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"10.-%E7%89%88%E6%9C%AC%E4%B8%8E%E5%8F%91%E5%B8%83\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#10.-%E7%89%88%E6%9C%AC%E4%B8%8E%E5%8F%91%E5%B8%83\">#\u003C\u002Fa> 10. 版本与发布\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>正式发布后各包将独立版本号和更新周期\u003C\u002Fli>\n\u003Cli>发布范围：@cmtx\u002F*（默认 public 发布）\u003C\u002Fli>\n\u003Cli>Changelog 维护：各包内 \u003Ca href=\"http:\u002F\u002FCHANGELOG.md\">CHANGELOG.md\u003C\u002Fa>，遵循 Keep a Changelog 格式\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"11.-%E6%96%87%E6%A1%A3%E8%A6%81%E6%B1%82\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#11.-%E6%96%87%E6%A1%A3%E8%A6%81%E6%B1%82\">#\u003C\u002Fa> 11. 文档要求\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>各包应包含 \u003Ca href=\"http:\u002F\u002FREADME.md\">README.md\u003C\u002Fa>，描述功能、使用方式、API 接口\u003C\u002Fli>\n\u003Cli>大功能特性应在 \u003Ca href=\"http:\u002F\u002FCHANGELOG.md\">CHANGELOG.md\u003C\u002Fa> 中记录\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"12.-%E9%97%AE%E9%A2%98%E5%8F%8D%E9%A6%88\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#12.-%E9%97%AE%E9%A2%98%E5%8F%8D%E9%A6%88\">#\u003C\u002Fa> 12. 问题反馈\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Issue 列表：\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcc01cc\u002Fcmtx-project\u002Fissues\">https:\u002F\u002Fgithub.com\u002Fcc01cc\u002Fcmtx-project\u002Fissues\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>欢迎提供复现步骤、日志或最小复现示例\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"13.-%E7%9B%B8%E5%85%B3%E6%96%87%E6%A1%A3\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#13.-%E7%9B%B8%E5%85%B3%E6%96%87%E6%A1%A3\">#\u003C\u002Fa> 13. 相关文档\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"\u002Fzh-Hans\u002Fcmtx\u002Fdev-guide\u002FDEV-005-publish-validation\u002F\">发布前校验与质量门禁指南\u003C\u002Fa> - 包发布校验标准\u003C\u002Fli>\n\u003C\u002Ful>\n",1786290224233]