# @app-studio/qa-core 中文文档

规范地址：https://npmcn.com/package/%40app-studio/qa-core/

版本：0\.11\.6
npm 元数据更新时间：2026-11-05T23:15:19.934Z
中文译文更新时间：2026-11-06T20:58:57.102Z
软件包许可：UNLICENSED

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

原始 npm 页面：https://www.npmjs.com/package/%40app-studio/qa-core
原文对照：https://npmcn.com/package/%40app-studio/qa-core/?lang=original

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

- 包体积（解压后）：327 kB，51 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=20
- 运行依赖：2 个
- 首次发布：2026-08-09T15:45:31.823Z
- 最新版本发布：2026-11-05T23:15:19.748Z
- 近 30 天下载量：2350（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：34（近 12 个月 34 个）

## 中文简介

绑定合同的每个其它@app- studio/ qa 套件写道: schema, 加载器,跨进程锁,命令跑取器和默认的层叠.

## 安装

```sh
npm install @app-studio/qa-core
```

也可以使用：`pnpm add @app-studio/qa-core`、`yarn add @app-studio/qa-core`、`bun add @app-studio/qa-core`

## README

# @app-studio/qa-core (英语)

合同其他的 `@app-studio/qa` 包读取.

主机存储器一次声明其QA事实, 在 `qa.bindings.json` 其根源: 哪些命令存在,哪些是测试套件的分层,哪些是测试 种子被活化 种子被活化 种子被活化 这个 执行时 钩子和医生都读了那个文件 没什么 复制到主机中,然后左去 stale.

这条规则不具有标准性。 从一个仓库复制到另一个仓库的质量保证系统 而不重写它的约束 产生一个守卫,它的图案 匹配没有文件 - 它一无所有,却一无所获 有关. `@app-studio/qa-doctor` 存在使状态不可能实现 包是它所检查的合同.

## 这是什么

| 导出 | 目的 |
| --- | --- |
| `bindingsSchema`, (中文(简体) ), `QaBindings` | 佐德计划及其类型. `strict()` 全部:一个未知的密钥是一个错误,因为一个沉默无所事事的字典就是束缚如何变成谎言. |
| `loadBindings`, (中文(简体) ), `findBindingsFile` | 从任意目录到寄存器根并验证 。 以数据返回失败, 这样医生可以报告它而不是崩溃 . |
| `acquireLock`, (中文(简体) ), `withLock` | 通过取出键的跨进程锁 。 原子的创造;一个被报告为僵硬的锁,从不自动删除. |
| `runCommand`, (中文(简体) ), `startBackground` | 以信号转发和SIGTERM SIGKILL 关闭命令执行 . |
| `waitForUrl`, (中文(简体) ), `ensurePortFree`, (中文(简体) ), `isPortFree` | 用于管弦服务器的准备和港口卫生. |
| `DEFAULT_LAYERS`, (中文(简体) ), `selectLayers`, (中文(简体) ), `runLayers`, (中文(简体) ), `describeLayers` | 分层行走:自下而上,在第一课间休息时停止,说什么不是跑和为什么跑. |
| `Rule`, (中文(简体) ), `Finding`, (中文(简体) ), `DoctorContext` | 医生的插件合同,在这里,包可以贡献规则而不取决于医生. |
| `appStudioFeatureSpecSchema`, (中文(简体) ), `appStudioFormSpecSchema` | App Studio最初的功能/形式合同及其交叉引用验证. |
| `compileAppStudioFeatureSpec` | 编译 `feature.userExperience` 输入没有重复的情景文件的活化名义和有条件浏览器路径. |

## 绑定文件

```jsonc
{
  "$schema": "./node_modules/@app-studio/qa-core/schema/qa.bindings.schema.json",
  "version": "2",
  "repo": { "name": "my-app" },

  // The canonical registry. Layers, gates and docs reference the KEYS, never
  // the shell strings, so "what this repository runs" is written down once.
  "commands": {
    "typecheck": "pnpm typecheck",
    "test.unit": "pnpm vitest run --project unit",
    "test.integration": "pnpm vitest run --project integration",
    "test.e2e": "pnpm playwright test",
    "seed.apply": "pnpm seed",
    "seed.check": "pnpm seed:check"
  },

  // Bottom-up. `qa run` stops at the first break.
  "layers": [
    {
      "key": "logic",
      "title": "Pure logic",
      "restsOn": "nothing — no database, no application",
      "means": "a sanitiser or a validator is wrong. Nothing above can be trusted.",
      "commands": ["test.unit"]
    }
  ],

  "paths": { "seeds": "src/features/*/seed/index.ts", "tests.e2e": "tests/e2e" },
  "ports": { "api": { "port": 3000, "boundBy": "playwright.config.ts" } },
  "seedAccounts": [
    { "role": "ADMIN", "email": "admin@example.com", "password": { "kind": "seeded-constant", "value": "password123456" } }
  ]
}
```

`restsOn` 财务报告和审定财务报表 `means` 不是装饰. `qa run --list` 打印它们,一个 已断层打印 `means` 在它没有运行的地层列表旁边—— 所以红色跑车说哪层破了 为什么上面的地板是 跳过,而不是五百个失败 是一个虫子穿不同的 名称.

## 锁,三个决定

1.  **以退出键入**,将寄存器根散开到锁文件名中,所以 同一项目种子的两棵工作树和两颗炮弹同时进入 同样的退票.
2.  **原子创造** (单位:千美元)`open(path, 'wx')`) (中文(简体) ). 检查时创建会留下窗口 他们都相信自己赢了.
3.  **旧锁被报告,从未自动取出.** 两个服务生可以 既观察已死亡的持有者, 也同时删除文件 —— 第二个删除 驱逐了第一扇锁 刚刚合法取走。 错误名称 持有并打印 `rm` 命令; 人类的决定.

## 明确限定的取景口的设计接受度

普通类 `design-acceptance` 记录至少需要两个不同的视图 标签。 签了合同,授权一个景点 由可选 `scope` 字段 :

```jsonc
{
  "scope": {
    "kind": "single-viewport",
    "viewport": { "name": "desktop", "width": 1440, "height": 900 },
    "contract": {
      "file": "knowledge/design/feature-ui.md",
      "sha256": "<SHA-256 of the signed contract>"
    },
    "reason": "The signed contract limits this review to the desktop viewport."
  }
}
```

这是一个范围碎片,而不是接受判决。 现有记录仍然 需要其审查者、时间、状态、来源摘要和证据 检查. `checks.responsive.viewports` 必须准确包含瞄准镜的标签; 宽度和高度是正整数,描述授权的取景口. 合同档案也必须出现在 `sources` 与相同的文摘. CLI对磁盘上的文件进行汇总检查,就像对每个来源一样. 记录刷新源码, 但不会默默更新范围 合同散列:变更后的合同需要明确的范围审查.

计划不解释合同的道词或检查截图. 设计师核实范围和尺寸与所签合同相符 和观察的证据。 限制响应范围并不放弃 无障碍性、设计-系统、判断、固定识别或源头-新鲜度检查. 普通记录和范围记录都拒绝重复标签.

## 所需资源

节点.js20或更新.

## 常见问题

### @app-studio/qa-core 是什么？

绑定合同的每个其它@app- studio/ qa 套件写道: schema, 加载器,跨进程锁,命令跑取器和默认的层叠\.

### 如何安装 @app-studio/qa-core？

在项目目录运行 npm install @app-studio/qa-core，或使用 pnpm add / yarn add / bun add。

### @app-studio/qa-core 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @app-studio/qa-core 支持 ESM 还是 CommonJS？

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

### @app-studio/qa-core 需要什么版本的 Node\.js？

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

### @app-studio/qa-core 可以商用吗？

@app-studio/qa-core 使用 UNLICENSED 许可。作者声明为 UNLICENSED，即不授予公开使用许可（与公共领域的 Unlicense 不同）。使用前需获得作者授权。以上为概括，不构成法律意见，请以许可原文为准。

### @app-studio/qa-core 的下载量有多少？

根据 npm 官方下载统计，@app-studio/qa-core 在 2026/10/07 – 2026/11/05 这 30 天内被下载 2,350 次，日均约 78 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @app-studio/qa-core 还在维护吗？

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

