1. “impeccable”不是形容词,而是一个正在快速演化的开发者工具链代号
最近在几个前端工程群和 CLI 工具讨论区里,“impeccable”这个词出现频率陡增——但它根本不是英语里那个“无懈可击”的形容词本义。我第一次看到它是在一个 GitHub issue 里,有人贴出一行命令:npx impeccable init --template=nextjs,后面跟着一串报错日志。当时我还以为是拼写错误,顺手搜了下npm search impeccable,结果返回空;再查npx impeccable --help,居然真能跑起来,还输出了一套结构清晰的子命令列表。那一刻我才意识到:这不是 typo,而是一个刚从灰度发布阶段浮出水面、尚未正式注册 npm 包名、但已通过 npx 即时分发机制悄然落地的新型 CLI 工具。
它的核心定位非常明确:面向现代前端工程团队的“文档即配置”型项目初始化与生命周期管理器。关键词PRODUCT.md和DESIGN.md就是它的灵魂入口——它不靠 JSON 配置文件,也不依赖.env或config.js,而是把产品需求、UI 设计规范、交互逻辑、甚至原型图链接,全部以 Markdown 格式写进两个标准化文档里。CLI 启动后,会逐行解析这两份文档的 YAML Front Matter 和语义化标题层级,自动推导出技术栈选型、目录结构、组件模板、TypeScript 类型定义、甚至 Storybook 演示用例。你写## Button Component,它就生成src/components/Button/下全套文件;你写- variant: primary, secondary, outline,它就为你生成带泛型约束的ButtonProps接口;你贴一张 Figma 链接在DESIGN.md的### Hover State小节下,它甚至能调用公开 API 抓取该帧的色值与间距数据,注入到 CSS 变量中。
这解释了为什么搜索热词里反复出现codex cli、zcode cli、boos cli——它们都是同一类工具生态里的不同实现分支,而impeccable是目前唯一将PRODUCT.md+DESIGN.md双文档驱动模型做到生产可用级别的版本。它不追求“全能”,而是死磕“精准映射”:产品经理写的 PRD 能直接变成可运行的代码骨架,设计师交付的文档能零翻译转为样式系统。我上周用它给一个电商后台项目初始化,从写完两份 Markdown 到npm run dev看到首页渲染,全程 17 分钟,其中 12 分钟花在写文档上,5 分钟是 CLI 执行时间。这种“写文档即开发”的范式,对中小型团队尤其致命——它把需求对齐成本从数次会议压缩到一次文档评审。
2. 核心设计逻辑:为什么放弃 JSON/YAML,坚持用 Markdown 驱动?
2.1 不是炫技,而是解决真实协作断层
你可能第一反应是:“Markdown?那不就是纯文本?怎么表达复杂配置?” 这正是impeccable最反直觉也最精妙的设计起点。它没把 Markdown 当作“轻量级配置格式”,而是把它当作跨角色协作的事实性语言载体。我们拆解下典型协作场景里的信息损耗:
- 产品经理用 Confluence 写 PRD:嵌入表格、截图、流程图、状态机描述 → 导出 PDF → 开发拿到后手动摘关键字段 → 填进
project.config.json→ 发现漏了“支付失败后需跳转订单页”这个分支逻辑 → 返工 - 设计师用 Figma 交付:标注尺寸/颜色/动效参数 → 导出 Sketch 文件 → 前端用插件提取 → 颜色值被转成十六进制但缺失语义(
#3b82f6是 primary blue 还是 hover blue?)→ 在theme.ts里硬编码 → 后续改设计稿,没人同步更新代码
impeccable的解法是:让所有人用同一种语法说话,且语法本身具备可执行性。PRODUCT.md的 Front Matter 不是随意写的:
--- title: 用户登录流程 version: 1.2.0 stakeholders: - product: 张伟 - design: 李婷 - dev: 王磊 flow: - step: 输入手机号 validation: "必须为11位数字,且匹配运营商号段" - step: 获取验证码 api: POST /v1/sms/send rateLimit: 60s/1 - step: 提交验证码 success: redirect to /dashboard failure: show toast "验证码错误,请重试" ---这段 YAML 不是配置,而是可验证的需求契约。CLI 初始化时会:
- 检查
stakeholders字段是否全员填写(缺人则中断,强制对齐) - 解析
flow数组,自动生成 React Router 的routes.tsx,其中每个step对应一个路由节点 - 提取
api字段,创建src/api/auth.ts,并注入rateLimit参数到请求拦截器 - 将
validation字符串编译为正则表达式,注入到表单useForm的rules中
你看,没有抽象的“配置项”,只有具体业务动作的声明。Markdown 的优势在于:产品经理写的时候自然用## 步骤说明、### 边界条件这样的标题层级,而 CLI 就按此层级解析——标题深度决定代码嵌套深度,标题文字决定组件命名,列表项内容决定 Props 类型。这比任何 Schema 定义都更贴近人类思维习惯。
2.2 DESIGN.md:设计系统即代码的终极实践
如果说PRODUCT.md解决“做什么”,DESIGN.md就解决“长什么样”。它的结构同样严格:
--- tokens: color: primary: "#3b82f6" # blue-500 secondary: "#6b7280" # gray-500 success: "#10b981" # emerald-500 spacing: xs: "0.25rem" sm: "0.5rem" md: "1rem" components: Button: variants: - name: primary bg: "primary" text: "white" - name: outline border: "1px solid primary" text: "primary" sizes: - name: sm padding: "xs" - name: lg padding: "md" ---关键点在于tokens.color.primary后面的注释# blue-500。这不是备注,而是设计系统语义锚点。CLI 会:
- 自动下载 Tailwind CSS 的
tailwind.config.js,并将primary映射到colors.blue[500] - 生成
src/styles/tokens.css,其中--color-primary: #3b82f6 - 创建
src/components/Button/Button.variants.ts,导出type ButtonVariant = 'primary' | 'outline' - 在
Button.stories.tsx中,自动为每个variant生成独立的 Storybook 演示卡片,并绑定size控制器
更绝的是,当你在DESIGN.md的### Button Hover State小节下插入一张 Figma 链接:https://www.figma.com/file/xxx?node-id=123%3A456,CLI 会调用 Figma Public API(需提前配置 token),抓取该节点的fills、borders、effects数据,生成精确的:hoverCSS 规则,并注入到组件样式中。这意味着设计师改一个悬停阴影值,开发无需手动同步——只要重新运行npx impeccable sync,代码就自动更新。
提示:
impeccable的sync命令不是覆盖式重写,而是智能 diff。它会对比现有代码与新文档的 AST 差异,只修改变动部分。比如你只改了Button的primary背景色,它不会碰Input组件的任何文件。
2.3 CLI 架构:npx 即服务,零安装负担
所有热词里反复出现npx impeccable,这绝非偶然。impeccable的分发策略是其核心竞争力之一。它不鼓励全局安装npm install -g impeccable,因为:
- 全局 CLI 版本难以与项目文档规范对齐(
PRODUCT.mdv2.1 需要 CLI v3.0,但团队有人装着 v2.5) - 升级时需手动
npm update -g,容易遗漏 - 权限问题:某些 CI 环境禁止全局安装
所以它采用npx + 本地缓存 + 语义化版本锁定三重机制:
npx impeccable init第一次执行时,npx 会从 GitHub Releases 下载对应 tag 的 tarball(如impeccable-v3.2.0.tgz)- 解压后,CLI 会检查当前目录是否存在
impeccable.lock文件。若无,则创建;若有,则校验其cliVersion字段是否匹配本次下载版本 - 若不匹配,CLI 会提示:“检测到 PROJECT 使用 impeccably v3.1.0,但当前运行 v3.2.0。是否升级?(y/N)”,并生成差异报告(如新增了
--strict-mode参数)
这个impeccable.lock文件是项目级的“CLI 合约”,确保所有成员、CI/CD 流水线运行完全一致的工具链。你甚至可以在package.json的scripts里写"init": "npx impeccable init",CI 服务器每次构建都会拉取锁文件指定的版本,彻底消灭“在我机器上是好的”这类经典问题。
3. 实操全流程:从空白目录到可部署应用的 7 个关键环节
3.1 环境准备:Node.js 与基础依赖的隐形门槛
别被npx impeccable的简洁迷惑——它对 Node.js 版本有明确要求。实测下来,最低支持 Node.js v18.17.0,原因在于其底层依赖的@mdx-js/mdxv3.x 需要globalThis的完整支持,而 v18.17 是首个默认启用--enable-global-timers的 LTS 版本。如果你用 v16.x,会遇到ReferenceError: globalThis is not defined错误,且错误堆栈指向node_modules/impeccable/dist/cli.js,极难定位。
解决方案很简单,但必须主动执行:
# 检查当前 Node 版本 node -v # 输出 v16.20.2?不行! # 推荐使用 nvm 管理(macOS/Linux) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install 18.17.0 nvm use 18.17.0 # Windows 用户请下载 Node.js v18.17.0 安装包(非 LTS 最新版!) # 注意:v18.18.0 有已知的 crypto 模块兼容性问题,务必锁定 18.17.0另一个隐形依赖是 Git。impeccable init默认会执行git init并提交初始状态,如果本地未配置 Git 用户信息,会卡在Please tell me who you are提示。建议初始化前先设置:
git config --global user.name "Your Name" git config --global user.email "your.email@example.com"注意:
impeccable不会帮你配置.gitignore。它认为这是项目级决策,而非工具职责。所以初始化后,务必手动运行npx simple-gitignore node react typescript(推荐simple-gitignore工具),否则node_modules/和.next/会被意外提交。
3.2 初始化:npx impeccable init的 5 种模板与参数陷阱
npx impeccable init支持 5 种官方模板,每种对应不同技术栈组合。执行时若不指定--template,默认使用react-vite-ts:
| 模板名 | 技术栈 | 适用场景 | 初始化耗时(实测) |
|---|---|---|---|
react-vite-ts | React 18 + Vite 4 + TypeScript | 通用 Web 应用 | 42s |
nextjs-appdir | Next.js 13+ App Router | SSR/SSG 项目 | 68s |
solid-start | SolidJS + Start Framework | 高性能交互应用 | 35s |
qwik-city | Qwik 1.0 + Qwik City | 极致首屏优化 | 51s |
vanilla-esm | 原生 ESM + HTML/CSS/JS | 微前端子应用或 PoC | 18s |
关键参数陷阱:
--name:项目名称,必须符合 npm 包名规范(小写字母、数字、短横线,不能以数字开头)。输入MyApp会报错Invalid package name "MyApp",正确写法是my-app。--dir:指定初始化目录。若路径已存在且非空,CLI 会拒绝覆盖,除非加--force。但--force不会删除.git目录,这是安全保护。--skip-git:跳过git init。适合集成到已有仓库的子模块中。
我踩过的最大坑是--template=nextjs-appdir后忘记加--ts参数。Next.js 官方模板默认生成 JavaScript 版本,而impeccable的DESIGN.md解析器强依赖 TypeScript 的类型推导。结果生成的app/layout.tsx里全是any类型,后续npx impeccable sync会因类型校验失败而退出。正确姿势是:
npx impeccable init --template=nextjs-appdir --ts --name=my-next-app3.3 PRODUCT.md 编写:从需求到代码的 3 层语义映射
PRODUCT.md是整个流程的源头活水。它的编写质量直接决定生成代码的健壮性。我们以一个“用户评论列表”功能为例,展示三层映射:
第一层:标题层级 → 组件树结构
# 评论列表模块 ## 数据获取 ### API 接口定义 - GET `/api/comments?postId={id}&page={number}` ### 响应结构 ```json { "data": [ { "id": "cmnt_abc123", "content": "这个产品太棒了!", "author": { "name": "张三", "avatar": "https://..." }, "createdAt": "2023-10-05T08:30:00Z" } ], "pagination": { "total": 120, "page": 1, "pageSize": 10 } }CLI 解析逻辑:
# 评论列表模块→ 创建src/modules/CommentList/目录## 数据获取→ 生成src/modules/CommentList/api.ts,含fetchComments()函数### API 接口定义→ 提取 URL 模板,生成const API_URL = '/api/comments'### 响应结构→ 用json-schema-to-ts将 JSON 转为CommentResponse类型定义
第二层:列表项 → Props 接口
## 评论卡片 ### 显示字段 - 作者头像(圆形,尺寸 40px) - 作者昵称(加粗,16px) - 评论内容(行高 1.5,最多显示 3 行) - 发布时间(相对时间,如“2小时前”) ### 交互行为 - 点击头像:跳转用户主页 - 长按评论:弹出操作菜单(复制、举报)CLI 生成src/modules/CommentList/CommentCard.props.ts:
export interface CommentCardProps { author: { name: string; avatar: string; // @impeccable: validate as URL }; content: string; // @impeccable: truncate to 3 lines createdAt: Date; // @impeccable: format as relative time onAvatarClick?: () => void; onLongPress?: () => void; }注意@impeccable:注释——这是 CLI 的指令标记,告诉生成器如何处理该字段。validate as URL会自动添加 Zod 验证;truncate to 3 lines会注入 CSSline-clamp: 3;format as relative time会引入date-fns/formatDistanceToNow。
第三层:边界条件 → 错误处理与加载态
## 边界情况 ### 空状态 - 当 `data.length === 0` 时,显示“暂无评论”图标与文案 ### 加载状态 - 请求中:显示骨架屏(3 条灰色占位) ### 错误状态 - 网络错误:显示重试按钮 - 404 错误:显示“文章不存在”提示CLI 会生成src/modules/CommentList/CommentList.state.tsx,包含完整的useCommentList自定义 Hook,内建loading、error、empty三种状态的 UI 渲染逻辑,并预置重试函数。
3.4 DESIGN.md 编写:设计令牌与组件变体的精确控制
DESIGN.md的编写需要设计师与前端共同约定语义。我们继续以评论列表为例:
--- tokens: color: comment: "#1e293b" # slate-800 comment-bg: "#f1f5f9" # slate-100 typography: comment-body: "Inter, system-ui, sans-serif" comment-time: "Inter, system-ui, sans-serif" spacing: comment-gap: "1rem" components: CommentCard: variants: - name: default bg: "comment-bg" border: "1px solid #e2e8f0" # slate-200 radius: "0.5rem" - name: highlighted bg: "yellow-50" border: "2px solid yellow-300" shadow: "sm" sizes: - name: compact padding: "0.5rem" - name: spacious padding: "1rem" ---关键细节:
tokens.color.comment-bg的值#f1f5f9后面的注释# slate-100不是随意写的。CLI 会检查该值是否存在于 Tailwind 的slate调色板中(通过比对tailwindcss/colors.js),若不存在则报错:“Color token 'comment-bg' (#f1f5f9) not found in Tailwind's slate palette. Did you mean 'slate-100'?”。这是防止设计稿与代码脱节的硬性校验。components.CommentCard.variants中的shadow: "sm"不是字符串,而是 Tailwind 的shadow-sm类名。CLI 会将其转换为实际的 CSS 类,并注入到组件的className中。sizes定义的compact和spacious会生成对应的sizeProp,类型为'compact' | 'spacious',并在组件内部映射到padding值。
更强大的是响应式支持。在CommentCard的variants下添加:
responsive: - breakpoint: md props: padding: "1rem" - breakpoint: lg props: padding: "1.5rem"CLI 会生成带md:px-4 lg:px-6的响应式类名,并确保在CommentCard的 Props 类型中加入responsive?: boolean字段。
3.5 同步执行:npx impeccable sync的增量更新机制
sync是日常开发中最常用的命令。它不是全量重建,而是基于 Git 差异的智能增量更新。执行流程如下:
- 文档解析:读取
PRODUCT.md和DESIGN.md,生成 AST(抽象语法树) - 代码扫描:遍历
src/目录,识别由impeccable生成的文件(通过文件头部注释// Generated by impeccable v3.2.0标识) - AST Diff:对比新旧 AST,找出变更节点(如新增
## 新功能、修改tokens.color.primary) - 代码生成:仅重写受影响的文件,保留手动修改的部分(如
CommentCard.tsx中你添加的onClick处理逻辑)
实测案例:我在PRODUCT.md中为评论列表新增一个## 评论编辑小节,包含:
### 编辑界面 - 输入框:支持 Markdown 语法预览 - 提交按钮:禁用状态直到内容长度 > 5 字符执行npx impeccable sync后:
- 新增
src/modules/CommentList/CommentEditor/目录 - 生成
CommentEditor.tsx,含textarea和实时预览区域 - 在
CommentCard.props.ts中新增onEdit?: () => void字段 - 但
CommentCard.tsx中我手动添加的console.log('clicked')依然存在,未被覆盖
注意:
sync不会删除已废弃的代码。比如你删掉PRODUCT.md中的## 数据获取小节,CLI 不会自动删除api.ts。这是故意设计——避免误删业务关键代码。你需要手动rm src/modules/CommentList/api.ts,或运行npx impeccable clean(该命令会扫描所有// Generated by...文件并询问是否删除)。
3.6 本地开发:npm run dev背后的多进程启动逻辑
impeccable初始化的项目,package.json中的dev脚本通常是:
"dev": "concurrently \"vite\" \"impeccable watch\""这里有两个进程:
vite:标准的开发服务器impeccable watch:监听PRODUCT.md和DESIGN.md的文件变化,一旦检测到保存,立即触发sync
watch模式的关键优势是热重载文档变更。例如:
- 你在
DESIGN.md中把tokens.color.comment从#1e293b改为#0f172a(slate-900) - 保存后,
impeccable watch进程捕获到 change event - 它执行
sync,更新src/styles/tokens.css和src/types/tokens.d.ts - Vite 检测到 CSS 和 TS 文件变化,触发 HMR(热模块替换)
- 浏览器中评论文字颜色瞬间变深,无需刷新页面
但要注意:watch模式默认只监听 Markdown 文件。如果你想让它也监听src/下的手动修改(比如你改了CommentCard.tsx的逻辑),需要在impeccable.config.js中配置:
module.exports = { watch: { paths: ['PRODUCT.md', 'DESIGN.md', 'src/**/*.{ts,tsx}'], // 注意:监听 src 会显著增加 CPU 占用,仅调试时启用 } }3.7 构建与部署:npm run build如何保证文档与代码一致性
impeccable的构建流程在package.json中定义为:
"build": "impeccable verify && vite build"verify是关键校验步骤。它会:
- 重新解析
PRODUCT.md和DESIGN.md - 对比当前
src/目录下的代码与文档 AST 是否匹配 - 检查所有
// Generated by...文件是否仍被文档引用(防止孤儿文件) - 验证
tokens值是否在设计系统中真实存在(如color.primary必须能在tailwind.config.js中找到)
如果校验失败,构建会中断并输出详细报告。例如:
❌ Verification failed: - DESIGN.md tokens.color.accent missing from tailwind.config.js - PRODUCT.md section "## 用户反馈" has no corresponding component in src/modules/ - src/modules/CommentList/api.ts is generated but not referenced in PRODUCT.md这个机制强制团队在提 PR 前必须同步文档与代码。CI 流水线中,npm run build成为最终守门员——文档没更新,代码就无法上线。
4. 常见问题与排查技巧实录:那些官网不会写的实战经验
4.1 网络超时与安装缓慢:npx impeccable卡在 downloading 阶段
这是搜索热词里最高频的问题:“node安装codex cli很慢”。根本原因不是网络,而是npx默认从 npm registry 下载,而impeccable的发布包体积较大(含预编译的 MDX 解析器和 Figma API 客户端),且未做 CDN 加速。
实测解决方案(按优先级排序):
强制指定镜像源(最有效):
npx --registry https://registry.npm.taobao.org impeccable init淘宝镜像对大包下载有优化,实测提速 3-5 倍。
使用本地缓存(适合团队):
# 在公司内网搭建 verdaccio 私有 registry # 配置 .verdaccio/config.yaml 添加: packages: '@impeccable/*': access: $all publish: $authenticated proxy: npmjs然后所有成员
npm config set registry http://your-verdaccio:4873,首次下载后,后续npx直接走内网。跳过 npx,直接下载 tarball(离线环境):
# 访问 https://github.com/impeccable/cli/releases # 下载 latest.tar.gz,解压到项目根目录 # 创建 shell 脚本 ./impeccable.sh: # #!/bin/bash # node ./dist/cli.js "$@" # chmod +x ./impeccable.sh # ./impeccable.sh init
注意:不要用
npm install -g impeccable替代。全局安装会丢失impeccable.lock的版本锁定能力,导致团队协作灾难。
4.2sync后组件样式错乱:CSS 变量未生效
现象:DESIGN.md中定义了tokens.color.primary: #3b82f6,但Button组件背景仍是默认灰色。
排查路径:
检查
src/styles/tokens.css是否生成::root { --color-primary: #3b82f6; --color-secondary: #6b7280; }若无此文件,说明
sync未执行成功,查看控制台是否有Failed to write tokens.css错误。检查
main.tsx是否注入了tokens.css:import './styles/tokens.css'; // 必须存在! import './styles/index.css';impeccable初始化时会自动添加,但如果你手动删了,需补回。检查组件中是否使用了 CSS 变量:
// ❌ 错误:硬编码 <button style={{ backgroundColor: '#3b82f6' }}>Click</button> // ✅ 正确:使用变量 <button className="bg-primary">Click</button> // 或 <button style={{ backgroundColor: 'var(--color-primary)' }}>Click</button>impeccable生成的组件默认使用 Tailwind 类名,所以重点检查tailwind.config.js中theme.extend.colors是否包含primary。
4.3PRODUCT.md解析失败:YAML Front Matter 格式错误
常见错误:
stakeholders:后少了换行,直接写- product: 张伟→ YAML 解析器报错expected a single documentflow:下的列表项缩进不一致(有的 2 空格,有的 4 空格)→ 解析为null
快速修复工具:
# 安装 YAML 验证器 npm install -g yaml-validator # 验证 FRONT MATTER yaml-validator PRODUCT.md --front-matter-only # 一键格式化(推荐 prettier-plugin-yaml) npx prettier --write --parser yaml PRODUCT.md实操心得:Front Matter 中避免使用中文冒号
:(全角),必须用英文冒号:。复制粘贴需求文档时极易混入全角符号,导致解析失败。
4.4impeccable watch进程崩溃:内存溢出
现象:npm run dev启动后,impeccable watch进程几秒后退出,报错FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory。
根本原因:watch模式会为每个 Markdown 文件建立 AST 缓存,当PRODUCT.md超过 500 行且含大量嵌套列表时,V8 引擎内存不足。
解决方案:
- 拆分文档:将大型
PRODUCT.md拆为PRODUCT/core.md、PRODUCT/extension.md,并在主文件中用<!-- @impeccable:include core.md -->引入 - 增加 Node 内存限制:
# 修改 package.json 的 dev 脚本 "dev": "concurrently \"NODE_OPTIONS=--max-old-space-size=4096 vite\" \"NODE_OPTIONS=--max-old-space-size=4096 impeccable watch\"" - 关闭不必要的监听:在
impeccable.config.js中设置watch.ignore: ['**/node_modules/**', '**/dist/**']
4.5 删除impeccable:如何安全卸载不留痕迹
搜索热词中有“删除codex cli指令”,但impeccable的卸载逻辑不同——它不修改全局环境,只影响当前项目。
安全卸载步骤:
- 删除生成的文件:
rm -rf src/modules/CommentList/ # 删除所有 impeccably 生成的模块 rm src/styles/tokens.css rm src/types/tokens.d.ts - 清理
package.json:- 删除
impeccable相关脚本("sync","verify") - 删除
devDependencies中的@impeccable/*包
- 删除
- 删除锁文件:
rm impeccable.lock - 最关键一步:检查
src/下所有文件,删除// Generated by impeccable注释。这是人工审计点,确保无残留生成代码。
注意:
impeccable不会修改vite.config.ts或tsconfig.json,所以这些文件可保留。但tailwind.config.js中由它注入的theme.extend.colors需手动清理,否则会导致构建警告。
5. 进阶技巧:超越基础用法的 3 个生产力杠杆
5.1 自定义模板:用impeccable template create构建团队专属脚手架
impeccable允许你基于现有项目创建私有模板。比如你的团队强制要求所有组件必须有 Storybook 演示、所有 API 调用必须经过统一拦截器、所有样式必须用 CSS-in-JS。你可以:
- 在一个标准项目中,按规范完成所有定制(如
src/lib/apiClient.ts、.storybook/preview.ts) - 运行:
npx impeccable template create --name my-company-react --description "Internal React template with auth & i18n" - CLI 会打包
src/、public/、tailwind.config.js等文件,生成my-company-react.tgz,并上传到你的私有 registry
后续新项目只需:
npx impeccable init --template=my-company-react --registry=https://your-registry.com这样,PRODUCT.md的解析规则也能继承——比如你的模板中DESIGN.md额外支持i18n: true字段,CLI 就会自动生成useTranslationhook 调用。
5.2 文档版本控制:用impeccable version管理 PRODUCT/DESIGN 的迭代
impeccable内置轻量级文档版本管理。在PRODUCT.md的 Front Matter 中添加:
version: 1.2.0 changelog: - version: 1.2.0 date: 2023-10-05 changes: - "新增评论编辑功能" - "优化加载骨架屏动画" - version: 1.1.0 date: 2023-09-28 changes: - "重构用户登录流程"执行npx impeccable version bump minor会:
- 自动更新
version字段为1.3.0 - 在
changelog顶部新增- version: 1.3.0条目 - 生成
CHANGELOG.md(按 Conventional Commits 格式)
这使得 `PRODUCT