Module Structure
交付链以 packages/cli/package.json 为 npm 权威版本,先把 Node CLI 与 Vite Web 构建到一个发布目录,再由版本 tag 触发 OIDC npm 发布;文档站从 Git 可见双语源和部署时生成的 changelog 组成。
Directory Layout
package.json— 私有 monorepo 工作区和 CLI/VS Code 聚合命令packages/cli/package.json—blade-code发布版本、bin、files、依赖和 prepackpackages/cli/scripts/build.ts、packages/cli/web/vite.config.ts— 后端 ESM 与 Web 静态资源构建packages/vscode/package.json— 独立 VS Code 扩展构建,不进入blade-codenpm 文件清单packages/cli/scripts/release.js、packages/cli/release.config.js— 本地版本、changelog、tag 与 push 编排scripts/release.sh、scripts/setup-auto-release.sh、scripts/get-npm-token.sh— 仓库遗留发布辅助脚本.github/workflows/ci.yml、.github/workflows/publish.yml、.github/workflows/docs.yml— CI、npm/GitHub Release 与 PagesCHANGELOG.md、CHANGELOG.zh.md、docs/— 英文权威 changelog、中文同步记录和双语 Docsify 源vendor/ripgrep/、packages/cli/vendor/ripgrep/— 可选二进制的忽略目录与 Git 可见说明
Key Entry Points
packages/cli/scripts/build.ts— 清空dist、externalize 运行时依赖、构建 CLI 并调用 Vitepackages/cli/scripts/release.js— 本地版本递增、changelog、构建、提交、tag 和 pushpackages/cli/release.config.js— 决定本地发布脚本实际跳过或执行哪些步骤.github/workflows/publish.yml— tag 或手动 dispatch 的幂等 npm/GitHub Release.github/workflows/docs.yml— changelog 复制和 GitHub Pages 部署AGENTS.md— 当前仓库要求的独立 patch、双语 changelog 和发布前验证契约
Branching Table
| 维度 | 分支 A | 分支 B |
|---|---|---|
| 根构建目标 | build:cli 构建可发布 CLI 与嵌入 Web |
build:vscode 独立输出 VS Code extension |
| CLI 构建内容 | Bun 将 src/blade.tsx 打成 Node ESM chunks,依赖保持 external |
Vite 将 Web 打到 packages/cli/dist/web 并按 React/xterm/radix/session-events 分块 |
| 开发与发布 | 开发从源码 watch 启动 | npm 只暴露 dist/blade.js,并依赖 prepack 重新构建 |
| 本地发布与远端发布 | release.js 递增版本、生成英文 changelog、提交并推 tag |
publish.yml 校验 tag=包版本后构建并通过 OIDC 发布 |
| workflow 入口 | tag push 检出触发 tag | 手动 dispatch 检出调用者指定的既有 tag |
| npm 状态 | 版本不存在时执行 npm publish --access public |
版本已存在时跳过 publish,继续确保 GitHub Release |
| 文档 changelog | 根 CHANGELOG.zh.md/CHANGELOG.md 是维护源 |
部署时复制到被忽略的 docs/changelog.md/docs/en/changelog.md |
| 浏览器与搜索资产 | Playwright 包和可选 @vscode/ripgrep 随 npm 依赖解析 |
Chromium 与 vendored ripgrep 二进制都不是普通源码 checkout 自动具备的资产 |
Affected Scope
packages/cli/src/blade.tsx— Bun 后端 bundle 的唯一入口packages/cli/web/src/— Vite 构建并嵌入 CLIdist/web的前端packages/vscode/src/— 根构建的第二目标,使用独立 esbuild 配置packages/cli/scripts/build.ts、packages/cli/web/vite.config.ts— npm bin 与 Web 静态资源制品的生成入口packages/cli/package.json— npm 版本、files 白名单、bin 和运行时依赖packages/cli/release.config.js、packages/cli/scripts/release.js— 本地 release 行为与远端 tag 发布的交接点.github/workflows/— CI、tag 发布与 Pages 的远端执行边界CHANGELOG.md、CHANGELOG.zh.md— 发布记录和文档站生成源docs/、docs/en/— 中文默认与英文镜像的用户/参考/测试文档vendor/ripgrep/、packages/cli/vendor/ripgrep/— 可选平台搜索二进制的准备位置
Gotchas
- npm 发布版本只来自
packages/cli/package.json;根package.json的0.1.x是私有 monorepo 版本,不能用来创建blade-codetag (package.json,packages/cli/package.json,.github/workflows/publish.yml) release.config.js当前关闭runTests、checkCodeQuality和checkSecurity,所以release:patch即使成功也没有证明候选通过本地或生产资格 (packages/cli/release.config.js,packages/cli/scripts/release.js)- 本地 release 脚本只按配置生成根
CHANGELOG.md,不会同步CHANGELOG.zh.md;仓库规则要求两份 changelog 在版本提交前人工保持同 heading 和语义 (packages/cli/release.config.js,packages/cli/scripts/release.js,AGENTS.md) publish.yml只校验 tag/包版本、构建和发布,不运行测试;必须先在精确候选 SHA 上完成资格,再创建 tag (.github/workflows/publish.yml,docs/testing/qualification.md)docs/changelog.md与docs/en/changelog.md被 Git 忽略并在 Pages workflow 中重建,直接编辑会丢失且不会成为权威源 (.gitignore,.github/workflows/docs.yml,AGENTS.md)- 两个 ripgrep vendor 目录只跟踪
.gitignore和 README,二进制被忽略;packages/cli/package.json的 vendor files 白名单不保证 fresh checkout 已含平台二进制 (packages/cli/package.json,packages/cli/vendor/ripgrep/.gitignore,vendor/ripgrep/.gitignore) download-ripgrep.js的两个 macOS 条目名称与x86_64/aarch64、darwin-x64/darwin-arm64映射相反,重新生成 vendor 资产前必须先核对平台映射 (packages/cli/scripts/download-ripgrep.js)scripts/setup-auto-release.sh与scripts/get-npm-token.sh仍描述NPM_TOKEN/Release Please,且后者会显示并复制本地 token;当前权威发布已迁移到 OIDC,不应运行这些遗留助手 (scripts/setup-auto-release.sh,scripts/get-npm-token.sh,.github/workflows/publish.yml,git:45fe4348)VersionChecker从 npm CDN 请求包根CHANGELOG.md,但 CLIfiles白名单没有显式列出或复制该文件;改包清单或 release layout 时必须用npm pack核验更新说明确实可取 (packages/cli/src/services/VersionChecker.ts,packages/cli/package.json)
Architecture
- 后端 build 将 dependencies、optionalDependencies 与 peerDependencies 全部 externalize,运行时完整性取决于 npm 正确安装依赖;Web 则由 Vite bundle 到同一个
dist树 (packages/cli/scripts/build.ts,packages/cli/web/vite.config.ts) - 根
bun run build先构建 CLI(其中包含 Web)再构建 VS Code extension;blade-codenpmfiles不包含 VS Code 产物 (package.json,packages/cli/package.json,packages/vscode/package.json) - tag workflow 使用
contents: write与id-token: write,升级 npm 后走 Trusted Publishing,并对已存在 npm 版本和 GitHub Release执行幂等检查 (.github/workflows/publish.yml) - Docs workflow 只在 main 的 docs/changelog 变更或手动触发时部署,先将中文 changelog 放到默认根、英文 changelog 放到
/en/(.github/workflows/docs.yml)
Decisions
- npm 长期 token 已被 OIDC Trusted Publishing 取代,以减少 secret 失效面并产生 registry provenance;旧 token 辅助脚本不再是发布架构的一部分 (
.github/workflows/publish.yml,git:45fe4348) - Playwright 是固定版本运行时依赖,但 Chromium 采用显式安装而非 npm install 自动下载,保持普通 CLI 安装轻量且让浏览器可用性在 preflight 中可诊断 (
packages/cli/package.json,docs/getting-started/installation.md) - 文档采用中文默认根与英文
/en/镜像,未翻译内容允许英文站回退中文;行为契约变更仍应优先同步两种语言的对应页面 (docs/README.md,docs/en/README.md,docs/_sidebar.md,docs/en/_sidebar.md)
Patterns
- 近期 release commit 固定同改 CLI package 版本和中英文 changelog;功能实现、资格修复与 release metadata 通常分开提交,便于证明候选 SHA 到 tag HEAD 的差异 (
packages/cli/package.json,CHANGELOG.md,CHANGELOG.zh.md,git:1ce74b03) - 用户可见功能先更新
docs//docs/en/源,再由 Pages workflow 生成 changelog 页面;不要把部署产物反向当作编辑源 (.github/workflows/docs.yml,AGENTS.md) - 每个独立 feature/fix 使用单独 patch 版本,避免多个未经独立资格的行为共享一个 npm 发布边界 (
AGENTS.md)
Dependencies
- CI 与发布统一 Bun
1.3.11、Node22.x,npm Trusted Publishing 还在 workflow 内升级到支持 OIDC 的新 npm;更换版本时要同时检查 root metadata、CI 和 publish workflow (package.json,.github/workflows/ci.yml,.github/workflows/publish.yml)
Branching Behavior
packages/cli/scripts/build.ts找到 Web Vite 配置时构建 Web,找不到时只打印跳过并仍完成后端构建;发布检查若要求 Web,不能只依赖 build 的零退出 (packages/cli/scripts/build.ts)- 本地
release.js在 npm 发布关闭时仍会 commit、tag 并 push branch/tags,真正 npm 发布随后由 tag workflow 接管 (packages/cli/release.config.js,packages/cli/scripts/release.js,.github/workflows/publish.yml) - tag workflow 在 npm 版本已存在时跳过重复 publish,在 GitHub Release 已存在时保留原对象,因此支持同一 tag 的手动幂等恢复 (
.github/workflows/publish.yml) - Pages workflow 的中英文映射是
CHANGELOG.zh.md -> docs/changelog.md、CHANGELOG.md -> docs/en/changelog.md;反向复制会让站点语言错位 (.github/workflows/docs.yml) - npm 包安装只提供 Playwright JavaScript 运行库,
blade browser install才下载 Chromium;普通 CLI、WebFetch 与 WebSearch 路径不应因浏览器缺失而失败 (packages/cli/package.json,docs/getting-started/installation.md)