@aurelienbn/符合核心条件
对任何类型Script repo进行6个回放检查. 普通函数或一个 Vitest 文件 .
// conformance.test.ts
import { coreConformance } from "@aurelienbbn/conformance-core/vitest";
coreConformance({ root: process.cwd(), tsconfigStrictness: {} });
vitest 是一个可选的对等点( e)>=4.1.11 <6.0.0; 节点 ^22.19.0 || ^24.11.0。 。 。 .
报告从不把"不违规"和"没有证据"混为一谈
skipped excluded by skipChecks · CSS probe or tsconfig gate unconfigured
unsupported tool absent (jscpd, knip) · no tsconfig found
failed timeout · bad report · throw · bad options (tools cap at 120 s, Vitest tests at 125 s)
evaluated ran to completion, can still hold violations
report.status failed any error finding or failed check
incomplete any check not evaluated
passed otherwise (configured static checks, not whole-project compliance)
| 评价 | 测试 |
|---|---|
| 不支持的警告 | qq 跳过, 警告已打印 |
不支持的错误( n)requireTool, (中文(简体) ), requireKnipConfig,明确 tsconfig files(中文(简体) ) | 失败 |
| 失败 | 失败,即使警告严重 |
| 已评估 : 错误 : 仅警告 | - 通过 |
三个入境点
import { runCoreConformance, runCoreConformanceReport } from "@aurelienbbn/conformance-core";
const findings = await runCoreConformance({
root: process.cwd(),
skipChecks: ["duplication-budget"],
}); // legacy, same severities
const report = await runCoreConformanceReport({ root: process.cwd() }); // { status, checks[], findings[] }
coreConformance (单位:千美元)/vitest)每检查一次测试. 查找 : check, (中文(简体) ), severity, (中文(简体) ), message, (中文(简体) ), path?, (中文(简体) ), docs URL( URL) , (英语), evaluation 当证据不见了.
完整实例、样本报告、其他出口
coreConformance({
root: process.cwd(),
duplication: { maxClones: 0 },
deadExports: { requireKnipConfig: true },
closedDesignSystem: {
stylesheet: "theme.css",
requiredSelectors: [".token"],
forbiddenSelectors: [".raw"],
buildCommand: [
process.execPath,
"-e",
"require('node:fs').writeFileSync(process.argv[1], '.token {}')",
"{output}",
],
},
tsconfigStrictness: {
waivers: {
exactOptionalPropertyTypes: "Vendor SDK typings assign undefined to optional fields.",
},
},
});
runCoreConformanceReport({ root, tsconfigStrictness: {}, skipChecks: ["duplication-budget"] }) 在工作空间,修剪:
{
"status": "failed",
"checks": [
{ "check": "dependency-overlap", "status": "evaluated", "findings": [] },
{
"check": "duplication-budget",
"status": "skipped",
"reason": "Excluded by skipChecks.",
"findings": []
},
{
"check": "closed-design-system-probe",
"status": "skipped",
"reason": "No CSS build/selector probe configured.",
"findings": []
},
{
"check": "tsconfig-strictness",
"status": "evaluated",
"findings": [
{
"check": "tsconfig-strictness",
"severity": "error",
"message": "packages/agentlint-plugin-core/tsconfig.json: `noUncheckedIndexedAccess` is unset; set it to true in compilerOptions.",
"path": "packages/agentlint-plugin-core/tsconfig.json",
"docs": "https://github.com/aurelienbobenrieth/harness/tree/main/packages/conformance-core#tsconfig-strictness"
}
]
}
]
}
也导出 : coreChecks, (中文(简体) ), activeChecks,每个检查对象(dependencyOverlap, (中文(简体) ), duplicationBudget, (中文(简体) ), deadExports, (中文(简体) ), closedDesignSystemProbe, (中文(简体) ), tsconfigStrictness, (中文(简体) ), instructionBlocks) (中文(简体) ).
检查
依赖重叠
内建家庭警告(工具可以互补) dependencyOverlapGroups 替换它们和错误; [] 禁用 . 每个根和工作空间 package.json 独自判断.
30个家庭,工作空间发现
读取 dependencies + 键 devDependencies。工作空间: pnpm-workspace.yaml packages: 文字路径和单级 dir/* 惟有弃绝和深厚的污名.
dayjs date-fns moment luxon
axios got ky node-fetch superagent
uuid nanoid cuid cuid2 @paralleldrive/cuid2 ulid
zod yup joi ajv superstruct valibot arktype
lodash lodash-es ramda remeda es-toolkit
chalk picocolors kleur colorette ansis
dotenv dotenv-flow
jest vitest
winston pino bunyan loglevel consola
glob fast-glob globby tinyglobby
commander yargs cac citty meow
inquirer @inquirer/prompts prompts @clack/prompts enquirer
p-limit p-queue p-map promise-pool @supercharge/promise-pool
yaml js-yaml
papaparse csv-parse fast-csv
prisma drizzle-orm kysely knex typeorm sequelize
ws socket.io
immer mutative
zustand jotai valtio @xstate/store
fs-extra graceful-fs
semver compare-versions
marked markdown-it remark micromark
cheerio parse5 linkedom node-html-parser
execa zx tinyexec
rimraf del
cross-env env-cmd
nodemon tsx-watch watchexec
mime mime-types
deepmerge defu ts-deepmerge
query-string qs
重复预算
页:1,忽略 node_modules, (中文(简体) ), dist, (中文(简体) ), coverage, (中文(简体) ), .git。超预算: 与前3名克隆人. 在任何预算下不正确的克隆行会失败 .
废导出
树脂 --reporter json:未使用的文件,导出,类型,命名空间,enum,和类成员(已列出10个). 先检查报告形状 。 默认: 没有 knip 配置仍然运行; 没有 knip 警告; 超时或输出失败 .
闭路设计系统探测器
有限选择器探测器 并非彻底关闭的证据. 在您解析的构建输出中需要/ 禁止选择 . 没有默认构建器, 没有默认安装;构建者必须包含探测器输入. 超时, 非零出站, 无输出, 无效 CSS → 失败 .
[尖叫声] Windows:通过本地可执行文件或
node加上工具的JS切入点. 果壳香( Sell shims (英语).cmd, (中文(简体) ),.bat, (中文(简体) ),npx, (中文(简体) ),npm, (中文(简体) ),pnpm, (中文(简体) ),yarn)被拒绝.
道具:关闭 Tailwind v4 主题并证明
- 打开
--*: initial在顶层@theme(单位:千美元)尾风主题文件因此,只有你的代币 产生公用事业, 然后迁移受影响的用途。 静态公用事业和任意的价值观仍然有效:这关闭了符号集,而不是类列表. - 探测样式表: 一个孤立的文件, 导入真实的文件, 并请求允许和禁止的类
@source inline(...)(单位:千美元)语法) (中文(简体) ). 没有它,一个缺失的选取者可能仅指"从未发现". - 以被绑定的本地 CLI 构建为可执行文件加参数数组;从未下载过浮动 CLI .
buildCommand因为核心兼容性没有框架默认. - 电线像 实例。 。 。 .
对于完整的类允许列表,还要检查类构建和源中的任意值. 一个失败的构建或缺失的工具意味着未经评价,从不"禁止缺席". 调查候选者 远离生产来源.
tsconfig 限制
松散的tsconfig悄悄地降解出有意识的类型(no-unnecessary-condition, (中文(简体) ), strict-boolean-expressions, (中文(简体) ), no-unsafe-*而AST规则没有看到JSON. 检查有效选项 extends; 消息名称为设置每个值的文件.
要求数 strict: true 写下来,没有继承· ; noUncheckedIndexedAccess, (中文(简体) ), exactOptionalPropertyTypes, (中文(简体) ), verbatimModuleSyntax, (中文(简体) ), erasableSyntaxOnly 真实; 不关闭严格的家族旗帜; 不 ignoreDeprecations无论它的价值如何.
严格的家庭,默认文件,放弃,失败模式, extends 决议
- 严格的家庭 :
strictNullChecks, (中文(简体) ),noImplicitAny, (中文(简体) ),strictFunctionTypes, (中文(简体) ),strictBindCallApply, (中文(简体) ),strictPropertyInitialization, (中文(简体) ),strictBuiltinIteratorReturn, (中文(简体) ),noImplicitThis, (中文(简体) ),useUnknownInCatchVariables, (中文(简体) ),alwaysStrict。 。 。 . erasableSyntaxOnly以编译器保证取代一个由enum/namespace/parameter-property lint规则组成的家族.- 默认
files数字 :tsconfig.json+ 键tsconfig.*.json在根和每个 pnpm 工作空间包中,减去溶解文件("files": [],没有include)和只作为另一个被检查的配置的配置extends基础. additionalRequiredFlags: 必须增加旗帜true,比如说.noImplicitOverride。 。 。 .
| 投入 | 结果 |
|---|---|
| 放弃(国旗-理由-3个字) | 警告在每份报告中重复原因 |
| 放弃支票不拥有的旗帜或理由 < 3个字 | 抛出( 报告评价失败) |
| 放弃不匹配 | 暂停警告 |
缺少或循环 extends,不可读或格式错误的文件 | qq 评估失败,从未通过 |
| 缺少列表文件 | qq 失败 |
| 未发现 tsconfig | qq 不支持( qq 出错 ) files 明确) |
extends 解析度: 有无的相对路径 .json; 数组, 以后的条目获胜; 包指定符来自 node_modules 通过字符串 exports 目标或清单 tsconfig 字段; JSONC 注释, 后面的逗号, 一个 BOM。 仅读 JSON : 不 tsc 运行,不需要安装类型脚本.
指令块
代理必须遵循的一条规则 每一个答复都属于它总是加载的文件, 但应该写一次. 每个已配置的块 AGENTS.md (或 file)必须将其源文件的确切文本保存在 <!-- harness:<name>:start --> 财务报告和审定财务报表 <!-- harness:<name>:end -->。行尾和周围的空白行被忽略;其他的都是漂移.
instructionBlocks: {
blocks: {
communication: ".agents/skills/communication/core.md";
}
}
| 投入 | 结果 |
|---|---|
| 区块文本与来源不同 | {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}漂来漂去 复制来源 |
| 没有标记, 未关闭, 在开始前结束, 重复标记 | 命名要添加的标记 |
| 缺少指令文件 | ❌ |
缺少源, 为空 blocks,非kebab 块名 | 抛出( 评估失败) |
| 未配置的块的标记 | 忽略 |
选项
| 选项 | 默认 | 页:1 |
|---|---|---|
skipChecks | [] | 未知的ID 丢弃 |
dependencyOverlapGroups | 30个家庭 | 换掉他们 |
duplication.maxClones • 妇女 .minLines • 妇女 .minTokens | 0 • 妇女 8 • 妇女 60 | 安全整数; maxClones ,其他 > 0 |
duplication.ignorePatterns | [] | 生成/复仇花纹 |
duplication.requireTool | false | 没有jscpd或坏运行 === |
deadExports.requireKnipConfig | false | 无配置( n)knip.json(c), (中文(简体) ), .knip.json(c), (中文(简体) ), knip(.config).ts/js, (中文(简体) ), package.json#knip页:1 |
closedDesignSystem | 未设置( 已滑动) | stylesheet, (中文(简体) ), buildCommand 参数 {stylesheet} {output}, (中文(简体) ), requiredSelectors, (中文(简体) ), forbiddenSelectors |
tsconfigStrictness | 未设置( 已滑动) | {} = 违约; files, (中文(简体) ), additionalRequiredFlags, (中文(简体) ), waivers |
instructionBlocks | 未设置( 已滑动) | blocks (名称-根-相对来源), file (默认) AGENTS.md(中文(简体) ) |
移徙
- 未知
skipChecksID投出而不是默默地失去例外:修正打错. - 缺少可选工具会被跳过测试; 输出不良或运行失败失败 。 两者都可以通过之前仅作为警告性的测试.
- 重复限制必须是有限度的安全整数;即使预算很宽大,jscpd行也失败了.
登记的合同库存
从软件包导出 pnpm catalog. 规则特定选项和限制在上文和源测试中都有描述.
| 规则/检查 | 触发或审查范围 |
|---|---|
closed-design-system-probe | 已建 CSS 包含每个自有的符号工具并排除已配置的被禁选择器 . |
dead-exports | 密码库( knip) 中没有未使用的文件或导出 . |
dependency-overlap | 每个已知的重复依赖家庭只能安装一个包. |
duplication-budget | 复制版块保留在已配置的克隆预算(jscpd)内. |
instruction-blocks | 在代理指令文件中被标记的块与他们的源文件完全匹配. |
tsconfig-strictness | 已解析的 tsconfig 文件保留了严格的编译器基线,没有关闭严格的家族旗. |
信用概念
- 由Sandro Maglione(启发、独立重新执行)自动操作
- 代码由 Asyrafhussin (MIT,概念被重新执行)
- 由 Peter O'Malley 拆解(仅概念,没有代码再使用)