@aurelienbn/ agentlint-plugin-core (英语)
25 Agentlint对任何TypeScript repo的检讨:一个决定性的触发器发现地点,一个代理或一个人类解决.
[尖叫声] 需要引擎
@aurelienbbn/agentlint>=0.3.0 <0.9.0作为同伴. 证据。 。 。 .
strictPreset █████████████ 13 settled rules
starterPreset ██ 2 boundary-resilience, bounded-work
opt-in ████████████ 12 exported, in no preset: calibrate first
从2条开始,不是25条
agentlint init --preset "@aurelienbbn/agentlint-plugin-core#starterPreset"
agentlint rules test
agentlint rules scan --review
agentlint next --format json
init 保存已有的配置并打印安装命令;从未安装. 要求前校正绑定 agentlint check --all。 。 。 .
import { defineConfig } from "@aurelienbbn/agentlint";
import { defineFallbackMasksFailure, fakeParity, strictPreset } from "@aurelienbbn/agentlint-plugin-core";
export default defineConfig({
extends: [strictPreset],
rules: [fakeParity, defineFallbackMasksFailure({ minFallbacksPerScope: 3 })],
});
规则
| 规则 | 预设 | 权力 | 生命周期 | 选项( 默认) |
|---|---|---|---|---|
abstraction-earns-keep | 严格 | 人类 | 状态 | minForwardingMembers (3), forwardingRatio (0.8个), interfacePattern, (中文(简体) ), implementationFiles |
boundary-resilience | 严格 ・ 启动器 | 代理人 | 状态 | networkCallPattern |
bounded-data-access | 严格 | 代理人 | 状态 | |
bounded-work | 严格 ・ 启动器 | 代理人 | 状态 | |
comment-signal | 严格 | 代理人 | 状态 | narrationPattern, (中文(简体) ), minWordOverlapLength 4 个 |
correlated-optional-state | 严格 | 代理人 | 状态 | discriminantNames, (中文(简体) ), minOptionalSiblings (2), skipNamePattern |
expected-value-recomputed | 严格 | 代理人 | 状态 | matcherPattern, (中文(简体) ), derivationCallees, (中文(简体) ), maxFindingsPerFile (三) |
integration-test-owns-its-boundary | 严格 | 代理人 | 状态 | integrationPattern, (中文(简体) ), doublePattern |
operations-stay-with-owner | 严格 | 代理人 | 状态 | minOperations (4), (中文(简体) ), entryPattern (单位:千美元)api.* 文档 , packages |
temporal-coupling | 严格 | 代理人 | 状态 | guardMessagePattern, (中文(简体) ), initMethodPattern |
test-behavior-coverage | 严格 | 代理人 | 状态 | mockPattern, (中文(简体) ), outcomePattern, (中文(简体) ), minInteractionShare (0.5个), maxInlineSnapshotLines (12个) |
test-exercises-project-code | 严格 | 代理人 | 状态 | projectImportPattern, (中文(简体) ), workspacePackages, (中文(简体) ), blackBoxModules |
test-expectation-drift | 严格 | 人类 | 变动 | authority, (中文(简体) ), testFilePattern, (中文(简体) ), assertionPattern, (中文(简体) ), maxEvidenceLines |
change-scatter-review | 🧪 | 人类 | 变动 | minFiles (3), maxFindings (3), tokenPattern |
fake-parity | 🧪 | 代理人 | 状态 | fakeNamePattern, (中文(简体) ), portTypePattern |
fallback-masks-failure | 🧪 | 代理人 | 状态 | minFallbacksPerScope (2), sensitiveNames |
flag-forked-function | 🧪 | 人类 | 状态 | minFlags (2), minSitesForSingleFlag (3), includeJsx (谎言) |
hotspot-change-review | 🧪 | 人类 | 变动 | hotspots (空:无声 |
isomorphic-mapping | 🧪 | 人类 | 状态 | minProperties (5), (中文), identityRatio (0.9个) |
pinned-suspect-output | 🧪 | 代理人 | 状态 | suspectPattern |
precision-boundary-review | 🧪 | 人类 | 状态 | conversionCalleePattern |
property-test-opportunity | 🧪 | 代理人 | 状态 | pairPatterns, (中文(简体) ), idempotentPattern, (中文(简体) ), propertyApiPattern |
protected-invariant-change | 🧪 | 人类 | 变动 | invariants (空:无声 |
single-use-extraction-review | 🧪 | 人类 | 状态 | minParameters (2), minStatements (三) |
validation-discards-proof | 🧪 | 代理人 | 状态 | namePattern |
* * 选择进入:导出,亲自登记 * * 只有人类才能接受发现。 预设忽略 **/*.d.ts。 。 。 .
只有在大多数选择规则 agentlint rules scan --review 调查结果导致变化. 每道都规定了昂贵或体积不明的固定装置.
fetch(url); // ❌ boundary-resilience: no signal/timeout
fetch(url, { signal: AbortSignal.timeout(2_000) }); // ✅
try { await fetch(url, { signal }); } catch (error) { logger.warn('failed', error); } // ❌ failure discarded (logging still discards)
expect(applyDiscount(price, pct)).toBe(price - (price * pct) / 100); // ❌ expected-value-recomputed
expect(applyDiscount(200, 15)).toBe(170); // ✅ states it
const email = form.get("email") || ""; // ❌ fallback-masks-failure
<span title={user.email ?? ""}>{user.id ?? ""}</span> // ✅ JSX display default
一个网络 try/catch 返回空字元由两者报告 fallback-masks-failure 财务报告和审定财务报表 boundary-resilience。 。 。 .
边界 : boundary-resilience, (中文(简体) ), bounded-work, (中文(简体) ), bounded-data-access
| 规则 | 着火了 | 保持安静 |
|---|---|---|
boundary-resilience | fetch( 编号 : axios 编号 : got 编号 : ky 给谁打电话 参数列表 没有 signal, (中文(简体) ), timeout, (中文(简体) ), timeoutMs, (中文(简体) ), deadline 或者说 AbortSignal | 链条 fetch(url).then(...) 一次报告,在调用时拥有参数;字符串和注释被空白(fetch("/api/signal?timeout=1") 火灾) |
catch 页:1 try 环绕外出呼叫,或 .catch(cb) 将失败丢弃(只交给 console.* 编号 : logger.* 废品) | 重新扔出, 在错误上分枝, 传递到另一个函数, a REASON: 3个字的评论;在其它地方捕捉 | |
bounded-work | * 相继3次 await与一/O,循环一/O, Promise.all(...map(...)) 风扇出, timeoutMs编号 :durationMs编号 :cpuMs > 60 000 | 纯 items.map(item => item.id) |
bounded-data-access | findMany编号 :findAll编号 :getMany编号 :list编号 :search编号 :query编号 :select 收回/储存/代办/客户/模型/收集 | 非零 first编号 :take编号 :limit编号 :pageSize编号 :perPage编号 :maxResults 或者说 .limit(n)编号 :.take(n) |
限制 : bounded-work 分隔包含操作;光标本身不是基本约束;取消不是一个最后期限.
测试:行为覆盖范围、重新计算的期望、一体化界限、项目进口
| 规则 | 着火了 | 保持安静 |
|---|---|---|
test-behavior-coverage | 3个触发器, 不同的键 (下方) | 值、出错、属性、快照匹配者计为结果 |
expected-value-recomputed | expect(subject(...)).toBe…(expected) 地点 expected 由主体输入计算 | 60 * 60 * 1000,来自无关常数的URL, expect.*, (中文(简体) ), fc.property 编号 : it.prop 机构 |
integration-test-owns-its-boundary | a 一个 integration 编号 : e2e 构造双倍的测试 | print.test.ts合同套房int, (中文(简体) ), contract 不是标记) |
test-exercises-project-code | 带有 it编号 :test 没有从项目中进口任何东西 | 黑盒驱动器; *.test-d.ts |
test-behavior-coverage triggers
file-density ≥ 3 mock constructions, no assertion pins returned state or output
interaction-only ≥ 2 tests, or ≥ minInteractionShare of a file's tests, assert interactions only
(skipped when file-density already fires; lists the doubles per test)
snapshot-only ≥ 2 tests whose only oracle is a whole-value snapshot,
or an inline snapshot > maxInlineSnapshotLines
toHaveBeenCalled*, (中文(简体) ), toHaveBeenNthCalledWith, (中文(简体) ), toHaveReturned* 编辑 toBeCalled* 别名从不计为结果,即使通过习惯 outcomePattern. 法官每双问被嘲笑的合作者是否是一个不受管理的流程边界. 选择双重和预言 留在 testing 技术。 限制:衡量每个文件的模拟/反馈密度,而不是每个测试的覆盖率.
预期值计算. 仅测试文件 。 匹配者 : toBe, (中文(简体) ), toEqual, (中文(简体) ), toStrictEqual, (中文(简体) ), toBeCloseTo, (中文(简体) ), toContain, (中文(简体) ), toMatchObject。 。 。 . expected (或当地 const 它的名称,在同一测试回调内),当它用非立体操作算术时,即计算出一个非立体操作,a map编号 :filter编号 :reduce编号 :join编号 :replace编号 :toLowerCase编号 :toFixed编号 :round...呼叫,或者2个替代的模板。 只有在预期表达式与主题调用参数共享标识符时,或调用从主题自身模块中导入的东西时,才会报告.
集成测试 - 拥有 - 其边界. 路径有 integration 或者说 e2e 部件或名称部分( e)orders.integration.test.ts, (中文(简体) ), tests/integration/..., (中文(简体) ), e2e/...),或第一个 describe 标题包含“整合”。 双倍数 : vi.fn(, (中文(简体) ), createMock(, (中文(简体) ), mockX(, (中文(简体) ), fakeX(,或一个 InMemoryX编号 :FakeX编号 :StubX 名称。 弦和评论被忽略;双取是证据. 每个文件一个发现。 一个合同套房 合法地运行假 旁边的真实的东西.
测试-实验-项目代码. 项目影响说明:相对, @/, (中文(简体) ), ~/, (中文(简体) ), #...,或名称在 workspacePackages,通过 import, (中文(简体) ), export ... from, (中文(简体) ), import(), (中文(简体) ), require() 或者说 vi.importActual()。黑盒驱动程序,使其保持安静: node:child_process, (中文(简体) ), execa, (中文(简体) ), node:fs, (中文(简体) ), node:fs/promises, (中文(简体) ), @playwright/test, (中文(简体) ), supertest, (中文(简体) ), undici,或者一个赤裸的 fetch( 电话 一个用包名导入的单列波将这些名称列表于 workspacePackages。 。 。 .
所有权:业务与其模块保持一致
operations-stay-with-owner 报告调用的文件 minOperations (4) 另一模块通过其公开进入进行更多操作. 一个模块的条目是相对导入解析到 api.ts (单位:千美元)entryPattern),或列出在 packages (单位:千美元)@acme/* 范围。 操作是小写开始的值名; PascalCase 和每个 type 导入是词汇,从不计数。 每个文件和每个所有者都计算在内,所以一个读取的模型调用三个模块中每个模块的两个操作都保持沉默.
// src/qa/story.ts: ❌ replays takedown's own state moves, so the seed belongs to takedown
import { requestComposed, requestSent, requestBounced, requestReplied } from "../takedown/api.ts";
// src/ops/act.ts: ✅ one outcome the owner offers, plus its vocabulary
import { merchantsStart, type TakedownSource } from "../takedown/api.ts";
固定是所有权,而不是一个更广泛的条目:将代码移入所有者,或者让所有者通过一份声明来贡献所收集的成分(种子,处理者,迁移). 排除构成根( Q)registry/, (中文(简体) ), workers/当它合法地组装每个模块时。 在一个模块化的单体(515个文件)上校正: 1 发现,重放另一个特性的动作的种子.
QQ 测试漂移:作者不接受
test-expectation-drift 权威默认为 "human":改变作者是想接受这一结论的政党. defineTestExpectationDrift({ authority: "agent" }) 恢复通常的默认值。 别小了 include 以测试文件:引擎在检测前通过绑定过滤更改,有两种取决于源编辑.
6个漂移类型(每次试验一次发现或 *.snap 文件)
| 仁爱 | 当火 |
|---|---|
assertion-removed | 所删除的主张行比所添加的要多; 变化中任意位置重复出现的一行是动作, 先离开两边 |
test-removed | 更多 it(编号 :test( 线条被删除而不是被添加, 或者测试文件被删除, 而没有同样干线的源文件被删除或重新命名 |
matcher-downgraded | 不变 expect(subject) 向下移动 toStrictEqual › toEqual编号 :toBe › toMatchObject › toHaveProperty编号 :toContain编号 :toBeDefined编号 :toBeTruthy, (中文(简体) ), toBe › toBeCloseTo或收益 expect.any编号 :expect.anything编号 :expect.objectContaining编号 :expect.arrayContaining |
expectation-revalued | 同一个主题,同一个匹配者, 不同的论点, 财务报告和审定财务报表 未测试源文件已更改 |
disabled | .skip, (中文(简体) ), .todo, (中文(简体) ), .fails 或者说 xit编号 :xtest编号 :xdescribe 已添加 |
snapshot-rewritten | 删除的行 .snap 文件或多行文件 toMatchInlineSnapshot 源代码更改时的正文 |
沉默:添加了测试文件,只添加了hunks,更强的匹配者,一个测试被删除并带有其来源. 已解决的组合中唯一的改变寿命周期规则.
设计 : abstraction-earns-keep, (中文(简体) ), correlated-optional-state, (中文(简体) ), temporal-coupling, (中文(简体) ), comment-signal
| 规则 | 着火了 | 保持安静 |
|---|---|---|
abstraction-earns-keep | 只行为界面/类型等于其唯一公认的执行者(类, satisfies,注解对象); Impl编号 :Default编号 :Base编号 :Concrete编号 :Standard编号 :Real 安装一个相对导入的接口; 一个类逐字转发给一个合作者; 一个模块, 其输出全部向前( 取代每次输出的结论); 导出参数不变地传递给一个呼叫 | 基于名称的匹配,除非 interfacePattern 设置; 当文件显示\\ 2 执行者时, 名称匹配 |
correlated-optional-state | 非测试接口/对象类型 status编号 :state编号 :kind编号 :type编号 :phase编号 :step编号 :mode编号 :variant 字符串- 升联 + → 2 可选或 | null编号 :| undefined 字段 | *Props, (中文(简体) ), *Options, (中文(简体) ), *Config, (中文(简体) ), *Params, (中文(简体) ), *Args, (中文(简体) ), *Input, (中文(简体) ), *Query, (中文(简体) ), *Filter, (中文(简体) ), *Patch, (中文(简体) ), *Update; 工会或交叉点的成员 |
temporal-coupling | 设置前可使用的非测试类,每类一次(下面的符号) | 已装饰的框架字段( e)@property() name!: string, (中文(简体) ), ! 字段“未找到用户” |
comment-signal | (单位:千美元) // 注释从创建/get/ set/ return/初始化/loop/check/ call/update/send/add/remove开始,与下行共享一个单词; docblocks重排签名 | 单位、不变量、有用的公共界面文件,甚至短; 仅JS类型 JSDoc标签 |
temporal-coupling signals
guard-throw throw message says "not initialized/connected/started/configured/ready/loaded/opened",
"call x() first/before" or "must call/be initialized"
definite-assignment undecorated `name!: T` assigned in a method, never in the constructor
nullable-init `| null`/`| undefined` field set by exactly one init/initialize/setup/connect/open/
start/load/configure/bootstrap method, null-checked in ≥ 2 other methods
工厂的关闭还没有检查。 袋 生命周期布尔属于 no-impossible-state-bag 在类型证据的牛林插件中.
抽象 - 保留 计数执行者而不是读取名称。 建议 interfacePattern数字 : /^I[A-Z][a-z]|Interface$/,保留 IPAddress 默然无声. 工厂返回新鲜对象文字(直接或通过本地康斯特),接口继承和直接/接口类型别名算作执行证据。 利用现有实例、对象分布、抽象类别和环境宣言并不能证明另一个具体实施.
对于交叉文件证据,通过精确的寄存器相对源路径 defineAbstractionEarnsKeep({ implementationFiles: ["src/clock.ts", "src/manual-clock.ts"] })。引擎捕捉这些已申报的依赖性;探测器对照这些快照解决相对名称/命名空间的导入和再出口。 同名无关的接口和评论不能提供执行证据。 此模式扫描寄存器和依赖更改无效决定 。 它没有执行文件系统读取,包别名解析或完全TypeScript类型推论;未抓取的执行仍然需要人审查.
对出口进行结构检查,包括表达式箭头和自动/等待。 调用被改变、重新排序或默认的参数,模块所属私人合作者的接入者保持沉默。 工厂提供了额外执行的证据;它们自己的返回界面不会成为新的标题候选人。 一个抽象的,使今天的变革更容易通过,即使有一个执行者.
注释符号道克块栏,来自上游观察到的公约 effect-ts/effect 来源(Array.ts, (中文(简体) ), Option.ts, (中文(简体) ), Duration.ts:
| 保留 | 丢弃 |
|---|---|
@since, (中文(简体) ), @category, (中文(简体) ), @example, (中文(简体) ), @see | @param 编号 : @returns: 类型存在于签名中, 从未重现 |
| 有结构的道词:"何时使用","细节" | 每个条目(审查候选人)3个字重报的参数清单 |
边缘大小写: NaN 处理为 0, 夹到 [0, length] | |
| 单位和精度: 四舍五入到最接近的纳秒 | |
| 变量: 包含范围、 单吨实例; 计数 |
JavaScript 类型唯一的 JSDoc 标记仍然有效:它们携带编译时间类型信息.
fallback-masks-failure :触发和"需要的数据"
执行前用代码测量体积 。 每个函数最多一个发现;默认绑定排除了测试文件.
| 着火了 | 细节 |
|---|---|
?? 编号 : || 右侧为空文 | "", (中文(简体) ), ``, (中文(简体) ), 0, (中文(简体) ), [], (中文(简体) ), {}, (中文(简体) ), "unknown", (中文(简体) ), "N/A",当左侧名称需要数据时 |
≥ minFallbacksPerScope (2) 在一个函数中倒置普通名称 | |
| 参数或以空字符解结构默认值 | 仅需要外观名称 |
catch 编号 : .catch(cb) 他们的归宿是空的, null 或者说 undefined 丢弃错误 | 定义与 boundary-resilience, (中文(简体) ), REASON: 包括越狱 |
"需要的数据"=后导属性,字符串键(form.get("email"), (中文(简体) ), headers["x-api-token"])或被调用者,被拆分为段并配对 sensitiveNames (默认: id, key, sorder, secret, 价格, 金额, 总额, 成本, 费用, 税收, 余额, 数量, 数量, 货币, url, 电子邮件, sku,...). width 不匹配 id后退 类型检查器被证明是无用的 typescript/no-unnecessary-condition。 。 。 .
其他选入规则:目录行不言而喻
| 规则 | 额外 |
|---|---|
validation-discards-proof | 补充 fallback-masks-failure: 一个报告缺勤的默认纸张, 这个本应出具证明的纸 |
precision-boundary-review | 命名的转换呼叫保持安静 |
single-use-extraction-review | 询问帮助者是否命名一个概念或分割一个操作 |
change-scatter-review | 找到一个变化无常的拥有者,或说明独立边界翻译的理由 |
hotspot-change-review | 由具体更正、倒转、事件或共同变化历史所支持的路径; 通用复杂性分数不是热点 |
被宣布为无变化者和热点
protected-invariant-change 财务报告和审定财务报表 hotspot-change-review 船空而寂: 他们只用你所宣称的开火.
| 工厂 | 每个条目 |
|---|---|
defineProtectedInvariantChange | invariants[]数字 : id, (中文(简体) ), statement (可防变), protectedPaths: RegExp[], (中文(简体) ), evidencePaths?: RegExp[] |
defineHotspotChangeReview | hotspots[]数字 : id, (中文(简体) ), pathPattern: RegExp (以真实历史为后盾), evidence (具体原因) |
移徙:重新审查先前的接受情况
审查提示,不是正确证明.
| 规则 | 订正 | 探测器 | 变动 |
|---|---|---|---|
boundary-resilience ⚠️ | 2个 | 2个 | 将处理器丢弃到外出呼叫中; 参数列表外的恢复力单词不再计数 |
test-behavior-coverage ⚠️ | 3个 | 3个 | 仅报告交互- 匹配文件、 仅报告交互测试、 仅报告快照测试 |
abstraction-earns-keep ⚠️ | 2个 | 2个 | 计数执行者和转发成员; IName 编号 : ...Interface 名称仅使用 interfacePattern |
abstraction-earns-keep, (中文(简体) ), flag-forked-function, (中文(简体) ), isomorphic-mapping | 建筑上的取舍:现在的人类权威 | ||
flag-forked-function | 跳过 JSX 文件, 除非 includeJsx |
现有接受情况需要重新审查.
Agentlint规则合同
| 事实 | 细节 |
|---|---|
| 规则形状 | lifecycle, (中文(简体) ), standard (订正), detector (版本), binding (id, 权威, 范围, 实质性选项) |
| 编译 | defineConfig({ extends: [preset] }) 或者说 defineConfig({ rules: [configuredRule] }); 重复使用需要不同的绑定标识 |
| 权力 | 储存库所有者选择范围和权威;机械证明的规则可能允许代理人接受;建筑、变化和不可逆转的取舍需要人 |
| 接受结论 | 需要匹配当前证据 财务报告和审定财务报表 匹配权威 |
| 固定装置 | @aurelienbbn/agentlint/testing 使用真实解析器运行嵌入式活性/静态固定装置 |
登记的合同库存
从软件包导出 pnpm catalog. 规则特定选项和限制在上文和源测试中都有描述.
| 规则/检查 | 触发或审查范围 |
|---|---|
abstraction-earns-keep | 旗舰接口可以反映他们唯一的执行者,类和模块可以逐字转发给一个合作者,并输出只授权给一个呼叫. |
boundary-resilience | Flags出局的网络呼叫没有显示超时或中止Signal,周围的处理者则丢弃失败. |
bounded-data-access | 旗舰寄存器类似列表/搜索/清空调用,没有明显的界限标记. |
bounded-work | 旗下执行路径无限制 I/O , 扇出,或运行时间预算. |
change-scatter-review | 标出在多个制作文件中添加的决定符号,因此读者可以检查修改是否合法是交叉的还是重复的所有权. |
comment-signal | 标记注释会描述下一行或Docblocks重述签名. |
correlated-optional-state | 旗帜对象类型将字形-联盟状态字段与两个或两个以上的可选字段相配,其中受歧视的联盟会使非法的组合无法代表. |
expected-value-recomputed | 标出其预期价值与试验中的呼号相同而不是被标出. |
fake-parity | 旗子手写一个港口的假象 所以共享的行为套件 或合同测试 证明它们的行为仍然像真正的执行. |
fallback-masks-failure | 旗下空-升-回倒在需要的外观值上,倒倒倒-调值函数,和返回空-升-回倒的错误处理器. |
flag-forked-function | 其布尔或字形-联盟参数仅用于选择代码路径的旗帜函数,以检查它们是否是两个共享名称的函数. |
hotspot-change-review | 标记更改路径到寄存器已经从真实的纠正历史中识别出来,而不是将通用的复杂性分数视为缺陷. |
integration-test-owns-its-boundary | 旗子测试文件被命名或命名为整合测试,这些测试也构造测试双,因此所主张的边界被检查为真实的. |
isomorphic-mapping | 将对象字段逐字复制成同形对象的旗帜功能,以检查真边界将两种类型分开. |
operations-stay-with-owner | 标记一个通过它公开的条目调用另一个模块的多个操作的文件,因此审查者决定该代码是属于主人还是主人的条目暴露其内部. |
pinned-suspect-output | 包含 : undefined, (中文(简体) ), NaN, (中文(简体) ), [object Object], (中文(简体) ), Invalid Date 或嵌入式 null,它通常证明测试记录的bug. |
precision-boundary-review | 横跨不同单位的标识符的旗帜原始算术,因此阅读器检查单位,容受度,四舍五入和独立测试证据. |
property-test-opportunity | 旗帜测试文件,覆盖一个编码/解码风格的倒对或一个只有示例的同位素常态器,其中一个属性将覆盖打开的输入域. |
protected-invariant-change | 旗帜更改为寄存器申报的无变相表面及其佐证,因此建筑保证不能无声地改变. |
single-use-extraction-review | 标记一个调用符和几个转发值的文件本地助手,这样,一个阅读器就可以决定提取词是将一个真实的概念命名还是将一个操作碎片化. |
temporal-coupling | 无法使用状态下存在的旗帜类:"未初始化"的卫士,在构造器外设置的确定任务字段,以及用init方法填充的可失效字段. |
test-behavior-coverage | Flags模拟高分测试文件没有结果断言,测试只坚持模拟交互,测试其唯一先知是整个值的快照. |
test-exercises-project-code | Flags测试文件从项目中不导入任何内容,所以它们锻炼的代码是副本或第三方库. |
test-expectation-drift | 旗子测试文件,其现有期望被删除,松动,跳出或在同一变化中重新估值,因此行为变化被宣布而不是被吸收. |
validation-discards-proof | 旗帜验证/检查/确定函数返回无效或布尔时没有类型上移,所以它们所证明的会输给类型系统. |
信用概念
- 迈克尔·费瑟斯所著"特征测试"(概念)
- Scott Wlaschin所著"选择属性进行基于地产的测试"(概念:反向和一能家族)
- 马丁·福勒所著"合同试验"(概念)
- 由Mark Seemann(概念)出品的"设计气息:临时交配"
- 由斯科特·瓦斯钦(英语:Scott Wlaschin (cept))所著"按类型来设计:使非法状态无法代表"
- "不要把逻辑放入测试"(Google测试博客)(概念)
- "Feature Envy"出自马丁·福勒的"重构"(概念,从班级升为单元)
- "FlagArgument"由马丁·福勒所著 (概念)
- J. B. Rainsberger所著"从合同测试开始"(概念)
- 由马丁·福勒所著"集成测试"(概念:狭义的集成测试是远程的两倍,不是适配器)
- 由Mark Seemann所著"Interfaces不是抽象"(概念:标题界面,再用抽象原理)
- 亚历克西斯·金的"帕斯,不要验证"(概念)
- Alexis King所著"Parse, don't experience" (概念:缺席被拒绝一次,在边界上)
- 桑迪·梅兹所著"错误的抽象"(概念)
- 由Vladimir Khorikov所著"When to Moc"(概念:交互断言属于未管理的流程边界)
- 不可能的奔驰 (arXiv 2510.20270)(概念:通过编辑预告)
- 由 Asyrafhussin(麻省理工学院) + Cursor(麻省理工学院) 所发码,概念被重新执行
- 代码由 Asyrafhussin (MIT,概念被重新执行)
- 由Asyrafhussin(麻省理工学院,概念重新实施;真实防卫清单)
- https://alexn.org/blog/2026/09/22/ai-has-no-wisdom-and-neither-will-you/ 互联网档案馆的存檔,存档日期2014-12-21 (激励;独立执行)
- https://alexn.org/blog/2026/09/22/ai-has-no-wisdom-and-neither-will-you/#isso-thread (英语) (激励;独立执行)
按细则计算的贷项
只有概念;每个规则都得到独立执行.
| 规则 | 概念 |
|---|---|
fallback-masks-failure | "帕斯,不要验证",阿列克西斯·金:缺席一次被拒绝,在边界上 |
validation-discards-proof | "帕斯,别验证",亚历克西斯·金 |
test-behavior-coverage | "When to Mock", Vladimir Khorikov:互动断言属于无管理的流程外依赖性 |
test-expectation-drift | 不可能 Bench (arXiv 2510.20270):通过编辑甲骨文而通过;"变相测试",Michael Feathers |
expected-value-recomputed | "不要把逻辑放入测试",Google测试博客 |
integration-test-owns-its-boundary | "集成测试","马丁·福勒":狭义的集成测试将远程的两倍,而不是适配器 |
correlated-optional-state | "根据类型来设计:使非法状态无法代表", Scott Wlaschin |
abstraction-earns-keep | “界面不是抽象的”, Mark Seemann: 与一个执行器相接头 |
operations-stay-with-owner | "Feature Evy"和"Move 函数",马丁·福勒 (Reforming),从班级升入模块 |
temporal-coupling | "设计气味:时空碰撞",Mark Seemann |
flag-forked-function | "错误的抽象",桑迪·梅兹;"FlagArgument",马丁·福勒 |
property-test-opportunity | "选择属性进行基于地产的测试", Scott Wlaschin:反向和专有家庭 |
fake-parity | "合同试验",马丁·福勒;"从合同试验开始",J. B. Rainsberger |
single-use-extraction-review, (中文(简体) ), change-scatter-review, (中文(简体) ), precision-boundary-review, (中文(简体) ), protected-invariant-change, (中文(简体) ), hotspot-change-review | "AI没有智慧,也不会有你",亚历山德鲁·内德尔库:延迟可维护性反馈,零散的单用途助手,明确的设计变化性 |
comment-signal docblock 栏 | 在上游遵守的公约 effect-ts/effect 来源 |
starterPreset 入职 | 由Peter O'Malley拆分: 逐渐上船; 没有复制代码或指南 |