# @webority/repo-checks 中文文档

规范地址：https://npmcn.com/package/%40webority/repo-checks/

版本：0\.119\.0
npm 元数据更新时间：2026-11-02T21:02:18.049Z
中文译文更新时间：2026-11-02T22:17:19.202Z
软件包许可：SEE LICENSE IN LICENSE

本文由上游 README 机器翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40webority/repo-checks
原文对照：https://npmcn.com/package/%40webority/repo-checks/?lang=original

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：225 kB，5 个文件
- 模块格式：ES Module
- TypeScript 类型：未声明
- Node.js 要求：\>=24\.15 \<25
- 运行依赖：0 个
- 首次发布：2026-10-10T06:04:56.092Z
- 最新版本发布：2026-11-02T21:02:17.890Z
- 已发布版本数：140（近 12 个月 140 个）

## 中文简介

对webbority React门户网站、React Native应用程序和Razor站点的存储库检查：禁止的和必需的依赖项，仅限pnpm，确切的pin，共享的Biome预设，以及样式、标记和组件代码中的令牌使用。在推之前跑；现有的结果

## 安装

```sh
npm install @webority/repo-checks
```

也可以使用：`pnpm add @webority/repo-checks`、`yarn add @webority/repo-checks`、`bun add @webority/repo-checks`

## README

# @webority / repo-checks

仓库检查webbority React web门户和React Native应用。一个命令读取每 应用程序 `package.json` 在git存储库和报告中，内部规则说它不能有， 必须有，以及它必须如何固定和安装。

它还计算原始尺寸，原始颜色，根字体大小和调色板读取的每一个跟踪风格， 存储库的标记和脚本文件(bootstrap-ui。md→令牌)。

## 使用

```bash
pnpm add -D --save-exact @webority/repo-checks
pnpm exec webority-repo-checks              # every app in the repository
pnpm exec webority-repo-checks apps/portal  # one app folder
```

应用程序是一个 `package.json` 谁的 `dependencies` 持有 `react-native` (移动)或 `react-dom` (网络)。一个 `react-dom` 文件夹中也有 `react-native-web` 是一个react-native-web演示：它获得了pnpm和Biome检查，而不是门户规则。生物群落和 `@webority/biome-config` 都是从 `package.json` 旁边的 `biome.json` 的嵌套配置 `"root": false` 参照上面的方法)，因此根配置约束的子文件夹不会重复它们。一个 `workspace:`， `file:` 或者 `link:` 引用是本地的，永远不会被视为同步版本。 一个装有 `agentation` 在其 `dependencies` 是一个构建工具，而不是一个应用程序。它和其他任何东西（工具根，库）只得到lockfile检查。

每个应用程序也得到Node检查： `engines.node` (从应用程序的 `package.json`，否则它旁边的那个 `pnpm-lock.yaml`)一定是 `>=24.15 <25`和最近的 `.nvmrc` 必须持有 `24`。一个手机应用程序 `android/` 文件夹获得Android检查，以及web应用程序的 `src/` 导入检查。 这个 `missing-export:<file>` check运行安装在应用旁边或应用上方文件夹中的Biome，所以它需要 `@biomejs/biome` 安装;没有一个，它什么也不报告，而且 `required:@biomejs/biome` 查找失败的应用程序。

| 发现 | 这意味着什么？ |
| --- | --- |
| `banned:<name>` | 一个依赖规则退役或禁止（ESLint, Prettier, lint-stage, react-toastify， moment等；移动列表是退役库表） |
| `required:<name>` | 每个应用都带有依赖关系（Biome和共享预设，核心和UI包，web上的Bootstrap和react-bootstrap，手机上的Crashlytics）。 |
| `not-exact:<name>` | 一、 `^` 或者 `~` 范围内。网络销 `@webority/*` 和 `bootstrap` 准确;React Native应用会精确地固定每个依赖项 |
| `bootstrap-version` | 5.3.3以外的引导 |
| `lockstep:<set>` | 在一个版本上一起发布的包被固定在不同的版本上 |
| `pnpm:*` | 一个承诺 `package-lock.json` 或者 `yarn.lock`,没有 `pnpm-lock.yaml`,没有 `devEngines.packageManager` 的 `{ "name": "pnpm", "version": "<x.y.z>", "onFail": "error" }` (一个普通 `npm install` 失败了，PNPM拒绝任何其他版本)，这是一个遗留问题 `packageManager` 字段（pnpm会忽略devEngines旁边的字段），或者 `pnpm-workspace.yaml` 没有 `engineStrict: true` 和 `strictPeerDependencies: true` |
| `biome:*` | 没有Biome配置，一个不扩展的配置 `@webority/biome-config/biome.jsonc`,一个 `formatter.lineEnding` 或者根 `linter.rules`，或（手机）号码 `__DEV__` 全局的，可以是顶级的，也可以是覆盖中的 `includes` 覆盖应用程序文件夹 |
| `catalogue-copy:<file>` | 下面的web文件 `src/components/` 名字像a `@webority/ui-react` 出口 |
| `engines-node-floor:package.json` | `engines.node` 是不是失踪了 `>=24.15 <25` |
| `engines-node-floor:.nvmrc` | 否 `.nvmrc` 在应用程序的上方或下方，否则无法保持 `24` |
| `android-release-signing` | `android/app/build.gradle` 没有一个卫兵会扔球吗 `GradleException` 当请求的任务名称包含 `release` 签名设置或上传密钥丢失 |
| `android-edge-to-edge` | `android/gradle.properties` 集合 `edgeToEdgeEnabled=false` |
| `rn-mainactivity-oncreate-bundle:<file>` | 一、 `MainActivity.kt` 或者 `.java` 将一个bundle传递给 `super.onCreate`;通过 `null` |
| `metro-bridge:<file>` | React Native应用程序的入口文件(`package.json` `main`、默认 `index.js`),根 `App.js` 或者 `src/App.js` 也不是应用程序的任何其他源文件（外部） `node_modules`， `ios`， `android` 以及构建输出)导入 `createMetroBridge` 从 `@webority/mobile-core/metro` 和分配 `globalThis.__METRO_BRIDGE__` 从一个 `createMetroBridge(...)` 电话里面 `if (__DEV__)` 在同一档案中；react-native-procedures。md→调试：开发桥梁 |
| `mobile-production-stamps:<file>` | 移动应用的Android或iOS清单 `Expo.plist` 将无线更新指向Staging或Development提要，或者 `android/gradle.properties` 带有 `.staging` 或者 `.development` App id，由 `mobile-tools prebuild`。运行 `mobile-tools prebuild --env Production` 之前 |
| `spa-host-immutable-assets:<file>` | web应用程序 `web.config`， `staticwebapp.config.json`， `_headers` 或者 `spa-host*.json` 设置缓存控制 `immutable` |
| `stale-theme-name:<file>` | web样式或源文件将0.89.0之前的主题名称作为整个令牌读取(`var(--radius)`， `--color-primary-ink`）. 这些船没有别名。运行 `webority upgrade 0.89.0 --path <folder>` 有一次,然后 `webority brand`. `--color-primary-text` 没有标记。从未在基线中记录 |
| `lint:<file>` | Biome在app文件夹中检查，警告为错误：任何错误或警告。从未在基线中记录；修复发现 |
| `web-import-axios:<file>` | 一个web源文件下 `src/` 导入 `axios`； HTTP通过 `@webority/web-core` |
| `web-import-router:<file>` | 导入web源文件 `BrowserRouter` 或者 `Routes` 从 `react-router` 或者 `react-router-dom`； 路由是 `createBrowserRouter` |
| `web-import-env-branch:<file>` | web源文件如下 `import.meta.env.DEV` 或者 `import.meta.env.PROD`； 分支 `AppSettings.ENVIRONMENT` |
| `missing-export:<file>` | 一个文件导入了一个它的模块没有导出的名称；Biome的React错误警报和未解决的别名没有报告 |
| `raw-measure:<file>` | 一个px， rem或em文字，或一个粗细或行距的数字，在填充，边距，间隙，插入，角，字体大小，字体粗细或行高。每个文件计数。 |
| `raw-colour:<file>` | 一个六角，一个 `rgb()` 或者 `hsl()` 使用数字，或者在颜色属性或样式键中使用名为color的CSS，其中颜色含义所属。每个文件计数。 |
| `root-font-size:<file>` | 一、 `font-size` 或者 `font` 上声明 `html` 或者 `:root`。类型大小采用浏览器的根大小。每个文件计数。 |
| `palette-read:<file>` | 对原始调色板步骤的读取(`var(--wui-<step>)`，或者手机 `palette.` 阅读)或Bootstrap主题颜色(`var(--bs-primary)`， `var(--bs-primary-rgb)` 或萨斯 `$primary`（为八种主题颜色），其中颜色的含义所属。消息命名了要读取的含义。每个文件计数。 |
| `missing-canvas-key:<file>` | 列表中的第一个JSX标记 `.map(` Callback)，没有 `data-canvas` 网页或 `testID` 就一个电话，没有传播。每个文件计数。 |
| `repeated-canvas-key:<file>` | 一个引用 `data-canvas` 或者 `testID` 相同模块中第二个标签重复的值。每个文件计数。 |
| `raw-bootstrap:<file>` | 一、 `.jsx`， `.tsx` 或者 `.cshtml` 文件写入一个原始的引导组件类(`btn`， `card`， `modal`， `table`， `badge`， `alert`， `form-control`， `form-select`， `form-check-input`， `pagination`， `nav-tabs`， `dropdown-menu`， `offcanvas`， `breadcrumb`， `progress`， `spinner-border`， `accordion`）; 消息命名库组件。修饰语，如 `btn-primary` 单独不算。每个文件计数。 |
| `library-class-restyle:<file>` | 一个产品 `.scss` 或者 `.css` 选择器为库主题定义的类命名(a `wui-*` 组件类或 `app-*` Shell、导航或TAB类)，包括作为祖先(`.my-page .wui-card-body`， `.app-shell.collapsed .app-sidebar .brand-logo`）; 使用库道具或令牌，或产品类。只设置自定义属性的令牌文件不命名类，也不计数。每个文件计数。 |
| `shadowed-library-name:<file>` | 一、 `.jsx` 或者 `.tsx` 导入目录组件 `@webority/ui-react` 在另一个名称下，并以目录名称(`import { AppButton as LibraryAppButton }` 与 `function AppButton`)，因此它的调用站点被读取为库组件。使用库组件和它的props，或者给产品组件起一个自己的名字。每个文件计数。 |
| `rename-wrapper:<file>` | 再出口 `@webority/ui-react`，其主体只返回一个目录组件的组件，或 `_Name.cshtml` 偏导是1 `<app-*>` 元素：导入库名。每个文件计数。 |
| `single-use-component:<file>` | 下面的文件 `src/components/<feature>/` (不 `layout/`)，或共享的部分下 `Pages/Shared/` 或者一个 `*.Web.Common` 项目，即少于两个文件使用；将其移动到使用它的页面旁边。跳过布局：A `_…Layout.cshtml` 文件，或者一个 `_ViewStart.cshtml` 的项目名称 `Layout = "<name>"`在美国，因为很多地区都叫它这个名字。Razor文件的第一行是 `@* layering-allow single-use-component: <reason> *@` 也被跳过了；一个没有理由的标记是一个发现。每个文件计数。 |
| `error-summary-title:<file>` | 一、 `.cshtml` `<app-error-summary>` 设置一个 `title` 使用旧的通用措辞（“Please fix the following”，“There were errors”）；放下它，库将写入标准标题。计算的标题或命名失败操作的标题不计算在内。每个文件计数。 |
| `route-internal-id:<file>` | 路由绑定了一条记录的内部编号：A `.cshtml` `@page` 或者c# `[Route]`， `[Http*]` 或者 `Map*` 模板的 `id` 或者 `...Id` 参数受限 `int` 或者 `long`，或 `asp-route-*` 传递记录的链接 `.Id`。通过公共id (`{publicId:guid}`)。一个无类型 `{id}` 不计算在内。每个文件计数。 |
| `oversize:<file>` | 一、 `.jsx`， `.tsx` 或者 `.cshtml` 文件超过600行（超过800行表示按照关注点拆分）。只是一个警告：它永远不会失败，即使在基线之外。每个文件计数。 |
| `hook:drift` | 根 `.husky/pre-commit` 缺少或不同于此包提供的共享钩子（CRLF被忽略） |
| `tracked-case:<path>` | 一个被跟踪的文件或文件夹，它在磁盘上的名字只有字母大小写不同，在Mac上手工重命名，git从未见过；Linux签出无法找到导入。运行 `git mv` 信息给出。一个文件夹只报告一次。总是失败。 |

注释行(`//`， `/*`， `*`), `.test.` 或者 `.spec.` 导入检查不读取文件。

## 令牌规则：按文件计数

这四条规则解读了每一条轨迹 `.scss`， `.css`， `.cshtml`， `.jsx` 和 `.tsx` 文件，每个 `.js` 或者 `.ts` 导入的文件 `react-native`。它们跳过带有a的路径 `node_modules`， `dist`， `generated`， `vendor`， `__tests__` 或者 `__mocks__` 段，一个电子邮件模板项目文件夹(`<Product>.Email` 或者 `<Product>.Emails`电子邮件客户端读取没有CSS变量，所以需要内联像素和颜色； 一个普通 `Email` 文件夹的管理屏幕保持选中)，路径包含 `wwwroot/lib/`,一个 `.generated.` 名字， 一个 `.min.css` 名称、 `.test.` 或者 `.spec.` 脚本，以及repo列表下的任何路径 `generated[].paths` 在 `.webority/map.json` (落后于 `/` 命名一个文件夹； `*` 同一段内的匹配)。列出已编译的 样式表：它捆绑了共享主题，所以它的库规则不是产品的代码 规则仍然读取构建它的SCSS。

`raw-measure` 计数一个非零的px， rem或em字面量，或一个纯数字的权重或前导，in 填充、边距、间隙、插入、角、字体大小、字体粗细或行高：每个发现一个 声明或样式键。一个零，一个关键字`auto`， `bold`， `normal`)，一个令牌 （`var(--wui-space-md)`)，百分比或其他单位，以及自定义属性或Sass变量 声明不计算在内。

`raw-colour` 算一个十六进制，然后 `rgb()`， `rgba()`， `hsl()` 或者 `hsla()` 带有数字参数或CSS 命名为color，在颜色属性或样式键中（包括内部的回退） `var(--color-x, #fff)`）。 `transparent`， `currentColor`，含义读取，自定义属性或Sass变量声明，以及 中的文本 `url()` 或者带引号的字符串不计算在内。

`root-font-size` 计算每一个 `font-size` 或者 `font` 选择器为的规则中的声明 `html` 或者 `:root` （带或不带属性、类或伪类），无论其值是多少。

`palette-read` 计算每个 `var(--wui-<step>)` 每个电话 `palette.` 阅读，加上每个 `var(--bs-<colour>)`， `var(--bs-<colour>-rgb)` 和萨斯 `$<colour>` Bootstrap的八个主题 颜色：每次读取一个发现，声明不是读取。

`missing-canvas-key` 和 `repeated-canvas-key` 阅读导入的每个脚本模块 `react-native`， `@webority/mobile-ui` 或者 `@webority/ui-react`。属性为 `testID` 的模块中 `react-native` 或者 `@webority/mobile-ui`, `data-canvas` 在任何其他地方。该项目的价差计为 键入，重复在第一个标记之后为每个标记添加一个查找结果。

```text
src/assets/styles/_home.scss:12: color: var(--wui-primary);
  (read the meaning: var(--color-primary))
```

## 新规定以警告开始

`lint`， `rn-mainactivity-oncreate-bundle`， `spa-host-immutable-assets` 和 `oversize` 以警告形式打印，直到 `REPO_CHECKS_ENFORCE` 名称: `REPO_CHECKS_ENFORCE=lint,rn-mainactivity-oncreate-bundle`，或者 `all`。一个版本 当没有存储库有命中时，从警告列表中删除规则。 `--json` 带有下面的警告 `warnings`.

## 现有的发现是：一个只会缩小的基线

采用检查的存储库记录它今天的内容，一次：

```bash
pnpm exec webority-repo-checks --baseline-init
```

写 `.webority/baselines/repo-checks-baseline.json`，创建文件夹：依赖项发现为 `"<app folder> | <id>"`，每个文件计算代码规则：

```json
{
    "version": 2,
    "findings": ["apps/portal | banned:@webority/ui-elements", "samples/react-sandbox | required:@webority/web-core"],
    "counts": { "palette-read:packages/theme/scss/wui/_buttons.scss": 3, "raw-measure:src/assets/styles/_home.scss": 14 }
}
```

从那时起，基线中的发现被作为已知的报告，并且不会失败；还有其他发现吗？ 失败（退出1）。计数可能只会下降：超过其记录计数的文件失败并打印其行， 从基线缺失的文件从0开始，因此新的或重命名的文件从0开始。修旧后 发现或降低计数， `--baseline-shrink` 丢弃固定的结果并将每个计数降低到 它的当前值，删除一个达到0的；它从不加1或加1。

`--baseline-accept <folder> --reason <text>` 记录所有者接受的债务：添加该文件夹下的每个当前发现和计数，并将计数提高到其当前值，而不会降低。只用于债权人接受的债务，并说明理由；原因被保留了下来 `accepted` 在基线文件中，和 `--baseline-shrink` 保留这个条目。

`--baseline-adopt <rule,...>` 记录今天的发现，并计算基线从未记录的规则，例如新版本添加的规则。它拒绝基线已经记录的规则，因此它永远不会提出一个现有条目，并命名每个规则采用了多少个发现和计数。

`--baseline-init` 运行一次：它拒绝现有的文件和文件夹参数。当文件为 早期形状（否） `version`)，删除并运行 `--baseline-init` 从git根目录查看一次，然后查看 提交之前的困难。

`--json` 打印 `{ root, new, known, stale }` 的工具;记录上面的计数出现在 `new` 用它的线条。

## 共享的预提交钩子

每个存储库都运行这个包附带的预提交钩子。从git根目录中采用一次：

```bash
pnpm exec webority-repo-checks --sync-hook
```

写 `.husky/pre-commit`,创造 `.husky` 当缺少时，用LF行结尾。一个 多应用程序存储库只在根目录下安装一次。赫斯基一直是安装者，通过 `prepare` 脚本。移除绒毛分级(`pnpm remove lint-staged`，并删除其配置键)： 共享钩子运行Biome本身。加入仅支持回购的步骤 `.husky/pre-commit.local`； 共享钩子 在Biome之后运行该文件，然后 `--sync-hook` 永远不要碰它。

`hook:drift` 保持根副本等于附带的副本。

## 版本控制

发表于 `webority-ui` Monorepo和另一个人步调一致 `@webority/*` 包。销 精确版本；当你撞到它时，新的规则就会出现。

## 常见问题

### @webority/repo-checks 是什么？

对webbority React门户网站、React Native应用程序和Razor站点的存储库检查：禁止的和必需的依赖项，仅限pnpm，确切的pin，共享的Biome预设，以及样式、标记和组件代码中的令牌使用。在推之前跑；现有的结果

### 如何安装 @webority/repo-checks？

在项目目录运行 npm install @webority/repo-checks，或使用 pnpm add / yarn add / bun add。它还提供命令行工具 webority-repo-checks，可以用 npx webority-repo-checks 直接运行。

### @webority/repo-checks 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/webority\_\_repo-checks 是否存在。

### @webority/repo-checks 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @webority/repo-checks 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=24\.15 \<25。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @webority/repo-checks 可以商用吗？

@webority/repo-checks 使用 SEE LICENSE IN LICENSE 许可。许可条款写在包内的独立文件中，请阅读该文件确认可否商用。以上为概括，不构成法律意见，请以许可原文为准。

### @webority/repo-checks 还在维护吗？

最新版本 0\.119\.0 发布于 2026/11/03（今天）；至今共发布 140 个版本，其中过去 12 个月发布了 140 个；首次发布于 2026/10/10。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

