- 本仓库将 GitLab 的 Pajamas Design System / GitLab UI 从 Vue 移植到 React,并使用 pnpm workspace 组织为 monorepo。
- 当前上游源码与设计规范位于 https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com 和 https://design.gitlab.com/ 。旧的 https://gitlab.com/gitlab-org/gitlab-ui 已归档;不要把旧仓库当作当前来源。
- 根依赖
@gitlab/ui是可供对照的 Vue 实现快照,其包内repository.directory指向上游packages/gitlab-ui。需要确认最新行为时,以当前上游源码、组件文档、stories 和测试为准。 - 移植目标是保持可观察行为、视觉语义和可访问性,同时提供符合 React 习惯的实现;不要引入 Vue 运行时或在 React 中模拟 Vue 内部机制。
packages/ui:React 组件库,包名为gitlab-ui-react。组件源码位于src/base/<component>/,每个目录通过自己的index.ts形成gitlab-ui-react/<component>公共入口;Vite 负责 JS 多入口构建,TypeScript 单独生成声明文件。packages/tokens:设计 token 的源 JSON、Style Dictionary 构建脚本及生成产物,包名为@gitlab-ui-react/tokens。packages/styles:基础样式、组件样式、Tailwind 集成和最终 CSS,包名为@gitlab-ui-react/styles,通过workspace:^依赖 tokens。跨组件共享的表单样式(Bootstrap 兼容层、GitLab shared override、feedback)集中在src/forms/,由src/components.css在任何组件私有 CSS 之前导入。apps:workspace 已预留的应用目录;不存在具体应用时不要假设其运行方式。- 各包的
package.json、根pnpm-workspace.yaml和pnpm-lock.yaml是依赖、版本与脚本的事实来源。
- 只使用 pnpm;不要生成 npm 或 Yarn lockfile。新增或调整依赖后运行
pnpm install并提交对应的pnpm-lock.yaml变化。 - 内部包依赖使用
workspace:^。运行时依赖、peer dependency 与开发依赖要放入实际消费它们的包,不要仅为了方便全部提升到根目录。 - 保持改动聚焦。仓库可能已有未提交工作,不要覆盖、回退或顺手重排无关文件。
- 遵循所在包的现有格式和命名,不要进行与任务无关的全仓格式化。代码采用 ESM;React 源码使用严格 TypeScript 与现代 JSX runtime。
packages/tokens/dist和packages/styles/dist是由脚本生成且被版本控制的产物。修改其源文件或构建脚本后要重新生成并检查 diff;不要直接手改生成文件。- 不要手动执行 tokens 构建(
pnpm build、pnpm --filter @gitlab-ui-react/tokens build等会触发 tokens 构建的命令):tokens 产物由上游同步工作流统一重建。验证组件或样式改动时跳过 tokens 构建,若不慎重建了packages/tokens/dist,将其还原后再交付。 - 从上游复制或实质性改编代码时,保留适用的版权与许可证头,并在有助于后续同步时记录上游文件路径。
- 移植或实质同步
packages/ui组件时,使用项目 Skill:.agents/skills/port-gitlab-ui-component/SKILL.md;详细的上游核对、API 转换、样式、测试和交付流程以该文件为准。 - 保留上游可观察行为、视觉语义和可访问性,并转换为符合 React 习惯的类型化 API;使用 Base UI 作为基底(icon 除外),使用 cva 管理变体和类名。
- 公共组件和类型从所属目录的
packages/ui/src/base/<component>/index.ts导出,不提供gitlab-ui-react根入口。组件 CSS 与源码同目录,并由packages/styles/src/components.css导入;优先复用现有 tokens、styles 和 icons。 - 覆盖语义、键盘、焦点、ARIA 及上游支持的状态;有意偏离或延后的行为必须在代码或文档中明确说明。
从仓库根目录运行与改动范围相符的最小验证集:
pnpm lint:全仓静态检查。pnpm test:运行根 Vitest 配置发现的全部测试。pnpm build:构建 tokens 及 styles;该命令不会构建 React UI 包。不要手动运行(见“工作约定”),styles 改动用下面的单包命令。pnpm --filter gitlab-ui-react build:构建 React UI 的 ESM/CJS 输出和类型声明。pnpm --filter @gitlab-ui-react/styles test:仅运行 styles 包测试。pnpm --filter @gitlab-ui-react/styles build:样式改动时单独重建 styles 包。
组件改动至少运行 lint、相关测试和 UI 包构建;token/style 改动至少运行相关构建、测试并检查已跟踪的 dist 差异。若现有失败与本次改动无关,在交付说明中明确列出命令和失败原因。
.github/workflows/upstream-sync.yml每天北京时间 07:00 运行,包含两个独立 job,跟踪清单由.github/upstream-sync.json声明。syncjob:遍历 manifest 的sync列表(目录 +include通配符,当前为上游packages/gitlab-ui/src/tokens的*.tokens.json↔ 本地packages/tokens/src),镜像语义直接覆盖本地文件、重建 tokens/styles 产物并创建带upstream-synclabel 的同步 PR。trackjob:遍历 manifest 的track列表(单文件或目录),仅当该路径在观察窗口内有新上游 commit 时,把上游 diff、变更文件内容、本地对应内容和 open 的upstream-trackingissue 列表交给 DeepSeek(deepseek-v4-flash)单轮分析,由模型判断本仓库是否需要更改并去重,返回结构化 JSON 后创建 issue;workflow_dispatch可通过since_hours调整观察窗口(默认 24 小时)。- 该工作流使用内置
GITHUB_TOKEN创建同步 PR,因此 PR 作者显示为github-actions[bot],且由该 PR 产生的 CI 需要手动批准运行;upstream-sync环境仅需提供DEEPSEEK_API_KEYsecret。