@aurelienbbn/agentlint-plugin-xstate

中文文档
0.2.0发布于 2026/10/14MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 2587

自定义代理林特为X国机器和演员规定.

中文使用文档
文档目录5 节
  1. 快开始
  2. 规则
  3. 登记的合同库存
  4. 信用概念
  5. 贷项

@aurelienbn/ agentlint-plugin-xstate (英语)

npm downloads CI license node

XState v5和v6 alpha的7个代理林特评论(与 @xstate/effect:每个演员都有主人公,每个失败的路径,每个坚持的快照一个版本.

v6 支持被选中 [email protected] 财务报告和审定财务报表 @xstate/[email protected];α APIs可以在发行间移动.

[尖叫声] 需要引擎 @aurelienbbn/agentlint >=0.3.0 <0.9.0 作为同伴. 证据。 。 。 .

oxlint-plugin-xstate      mechanical, setup-aware checks
agentlint-plugin-xstate   review questions a linter can't decide   ◀── you are here
eslint-plugin-xstate      doesn't analyse setup().createMachine() machines

快开始

agentlint init --preset "@aurelienbbn/agentlint-plugin-xstate#starterPreset"
agentlint rules test
agentlint rules scan --review
agentlint next --format json

init 保存已有的配置并打印安装命令;从未安装. 要求前校正绑定 agentlint check --all。 。 。 .

import { defineConfig } from "@aurelienbbn/agentlint";
import { xstatePreset } from "@aurelienbbn/agentlint-plugin-xstate";

export default defineConfig({ extends: [xstatePreset] });

规则

规则xstatePresetstarterPreset权力标准折返探测器跳过测试
actor-cleanup✅✅代理人3个2个✅
machine-failure-coverage✅✅代理人3个3个
derived-boolean-context✅代理人3个3个
spawned-actor-release✅代理人2 国 家2个✅
persisted-snapshot-compat✅代理人2 国 家1个✅
spawn-id-collision✅代理人1个1个
effect-actor-observed✅代理人1个1个

预设忽略 **/*.d.ts。跳过测试=排除 **/*.{test,spec}.*; 重新组合 exclude 以审查测试. QQ 提出的修订修改了指南,并可能报告更多网站(v6拼写):早期的接受需要重新审查.

createMachine({ invoke: { src: load } }); // ❌ machine-failure-coverage: no onError
const actor = createActor(machine); // ❌ actor-cleanup: who stops it?
setup({}).createMachine({ entry: spawnChild("sync", { id: "sync" }) }); // ❌ spawned-actor-release: paired stopChild?
save(actor.getPersistedSnapshot()); // ❌ persisted-snapshot-compat
setup({}).createMachine({ context: { isLoading: false } }); // ❌ derived-boolean-context

// v6 alpha / @xstate/effect
createMachine({
  on: {
    ADD: (_, enq) => {
      enq.spawn("todo", { id: "todo" });
    },
  },
}); // ❌ spawn-id-collision, spawned-actor-release
const actor = yield * createEffectActor(machine); // ❌ effect-actor-observed: nothing joins or waits on it

每个规则都输出一个 defineX(options) 工厂在它的默认实例之外. setup().createMachine() 生成一个发现,而不是两个: createMachine 呼叫( 赤裸, 有链条) setup(...),或存储的设置结果).

machine-failure-coverage:每个援引,每个产卵
createMachine({ invoke: { src: "load", onError: {} } }); // ❌ fires: empty onError
createMachine({ invoke: { src: "load", onError: "failed" }, entry: spawnChild("sync", { id: "sync" }) }); // ❌ fires: spawn, no xstate.error
createMachine({ invoke: { src: load, onError: "error" } }); // ✅ silent

每起火灾 invoke 没有真实的 onError (按援引情况审查;v6) createInvoke({...}) 和附件状态的 onError 覆盖) spawnChild(...) 编号 : enq.spawn(...) 编号 : spawn(...) 没有演员- 错误处理: 根 onError (v6),一个 xstate.error.actor 过渡,或 subscribeTo(ref, { error }). v6 逻辑创建者(createAsyncLogic, (中文(简体) ), createCallbackLogic,(......)和 fromEffect* 计为失败源 。 每个版本的指导不同: v6 onError 恢复动作和产子出错,v5没有. 全机倒置仍为承诺/召回逻辑,两者均无. onSnapshot 不是一个失败路径; 纯机器不需要一个捏造的错误状态.

选项 : machineDefinitionPattern, (中文(简体) ), invokeMarkerPattern, (中文(简体) ), errorHandlingMarkerPattern, (中文(简体) ), spawnCallPattern, (中文(简体) ), spawnErrorMarkerPattern。 。 。 .

actor-cleanup:谁创造了一个演员就阻止它

着火了 createActor(...) 财务报告和审定财务报表 system.createActor(...)· ; createEffectActor(...) (按效力范围拥有)和 createActorAtoms(...) (由原子登记处拥有) 得到他们自己的信息。 注射或父母拥有的行为者不必停下来.

  • 退出动作不会运行在外部 stop() (v5和v6); 清扫生活于 fromCallback 编号 : createCallbackLogic 或自动终止信号
  • 反应所有权通过 useActorRef 编号 : useMachine 编号 : createActorContext
  • 未订阅: 放松一次 stop() 已被证明

选项 : actorStartPattern。 。 。 .

spawned-actor-release: 每个机器定义一次
createMachine({ on: { ADD: { actions: assign({ ref: ({ spawn }) => spawn(todoMachine) }) } } }); // ❌ fires
setup({}).createMachine({ entry: spawnChild("sync", { id: "sync" }) }); // ❌ fires, once
const child = spawn("git", ["status"]);
assign({ ref: child }); // ✅ silent: not a machine

每个机器定义一次起火(createMachine, (中文(简体) ), setup(...) 编号 : setupEffect(...) 编号 : system.setup(...) .createMachine一个存储的设置, createStateConfig包含 spawnChild(...) 编号 : enqueue.spawnChild(...)时,v6 enq.spawn(...),或已调整结构 spawn(...) (五级) assign,v5/v6上下文厂). 法官把每个产卵配上可伸展的 stopChild 编号 : enq.stop(ref) 并拒绝从上下文删除(v6:返回上下文补丁),或处理自我补全、列表删除的过渡。 受约束的父母 - 生活演员通过 与约束声明。 仅审查快取: 跨过渡对接不合成.

选项 : machineCalleePattern, (中文(简体) ), spawnChildCallPattern。 。 。 .

persisted-snapshot-compat: 存储状态超过其写入器
createActor(machine, { snapshot: JSON.parse(raw) }); // ❌ fires
useMachine(machine, { snapshot }); // ❌ fires
createActor(machine, { input: { id } }); // ✅ silent
render(view, { snapshot: actor.getSnapshot() }); // ✅ silent: not an actor call

着火了 getPersistedSnapshot() 继续 createActor 编号 : useActor 编号 : useMachine 编号 : useActorRef 带有 snapshot 键。 只审查快取:存储代码和上下文类型横跨文件. 法官检查:

  • 已版本存储( v6: 机器) version + 键 machineVersions() 迁移; v5快照在 v6 不恢复)
  • 恢复回到新角色:不相容的快照输出状态 'error'它不会扔,所以 try/catch 单枪匹马一无所获
  • 持续 getPersistedSnapshot()永远 getSnapshot()· ; @xstate/effect 演员还不能恢复
  • 上下文为 JSON 序列
  • 不依赖重播的输入动作
  • 演员 src 名称

选项 : persistCalleePattern, (中文(简体) ), restoreCalleePattern (两者都根据被调用文本进行测试).

derived-boolean-context: 旗帜和状态镜像
createMachine({});
assign({ canSubmit: true }); // ❌ fires
setup({ types: { context: {} as { status: "idle" | "loading" } } }).createMachine({}); // ❌ fires
createMachine({});
assign({ count: 1 }); // ✅ silent
createMachine({ context: { status: initialStatus, items: [] } }); // ✅ silent: not a literal

着火了 assign(...), (中文(简体) ), enqueue.assign(...)设置 <x>.assign(...), v6 上下文补丁(a) context 由处理器返回或设置在静态过渡对象上,初始 context 页:1 createMachine 配置,以及 types.context /v6 数据 schemas.context (一旦双方宣布同一字段) can|is|has* 旗帜和 status|state|step|phase|mode 字段中含有字符串字符或字符串结合。 复议迅速,不是判决:仅点名不能确定可衍生性.

选项 : contextFlagPattern, (中文(简体) ), stateMirrorPattern, (中文(简体) ), machineFilePattern (对照文件来源进行测试;将规则打开机器文件).

spawn-id-collision: 可重复的事件, 固定的 id
createMachine({
  on: {
    ADD: (_, enq) => {
      enq.spawn("todo", { id: "todo" });
    },
  },
}); // ❌ fires
createMachine({
  on: {
    ADD: ({ event }, enq) => {
      enq.spawn("todo", { id: `todo-${event.id}` });
    },
  },
}); // ✅ silent

着火了 enq.spawn, (中文(简体) ), spawnChild 编号 : enqueue.spawnChild,或结构调整 spawn 有固定字符串 id 在一个 on.<EVENT> 处理者。 喷出 entry, (中文(简体) ), after,或者上下文厂保持沉默。 第二起事件产下第二个孩子在同一id下:v6错误父母,v5孤儿第一个孩子. 法官接受每个孩子的ID,一个相同过渡中的老人的停站,或者证明该事件在孩子活着的时候不能重复.

选项 : spawnChildCallPattern。 。 。 .

effect-actor-observed: 未读的 Effect 演员无声失败
const actor = yield * createEffectActor(machine); // ❌ fires: never joined, waited on, or returned
const actor = yield * createEffectActor(machine);
return yield * waitFor(actor, (s) => s.matches("done"), { timeout: "5 seconds" }); // ✅ silent

着火了 createEffectActor(...) 绑定在文件从未传递到的变量上 join, (中文(简体) ), waitFor,或 snapshots (也通过) pipe,从不订阅,从不返回. emitted 不计数:只是演员出错时结束. 不受限制的创建, 如 Layer.effect(...) 保持安静.

选项 : effectActorCalleePattern, (中文(简体) ), observerNames。 。 。 .

Agentlint规则合同
事实细节
规则形状lifecycle, (中文(简体) ), standard (订正), detector (版本), binding (id, 权威, 范围, 实质性选项)
编译defineConfig({ extends: [preset] }) 或者说 defineConfig({ rules: [configuredRule] }); 重复使用需要不同的绑定标识
权力默认允许代理接受;存储器所有者选择范围,并可以向 human
接受结论需要匹配当前证据 财务报告和审定财务报表 权力
固定装置@aurelienbbn/agentlint/testing 使用真实解析器运行嵌入式活性/静态固定装置

登记的合同库存

从软件包导出 pnpm catalog. 规则特定选项和限制在上文和源测试中都有描述.

规则/检查触发或审查范围
actor-cleanup旗下演员创作站点需要生命周期清理审查.
derived-boolean-contextFlags 上下文写 (v5 指定 (), v6 返回上下文补丁) 和上下文声明以缓存有限状态的可用布尔语或字符串- enum 副本 .
effect-actor-observed旗子 @ xstate/ effect actors 绑定在创建效果Actor (.) 上, 文件从不通过加入、 等待、 快照或订阅来读取其结果 .
machine-failure-coverage旗下援引演员没有真正在Error过渡,产入演员没有演员-error处理故障路径审查.
persisted-snapshot-compat坚持或恢复如此存储状态的演员快照的旗帜站点将接受审查,以进行版本化、倒置和可序列性.
spawn-id-collision旗帜在事件处理器内用固定的ID来产出,重复的事件在同一ID下产出第二个孩子.
spawned-actor-release旗子机器的定义 产出演员 所以每个产出 都经过审查 相匹配的停止和回推去除.

信用概念

  • 由Sandro Maglione(启发、独立重新执行)自动操作

贷项

starterPreset 登机:由Peter O'Malley拆卸而来的概念灵感;没有复制代码或指南.

版本与发布记录

@aurelienbbn/agentlint-plugin-xstate 共发布 6 个版本,首次发布于 2026/09/25;过去 12 个月发布了 6 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.2.0latest2026/10/1424 天前
0.1.42026/10/1325 天前
0.1.32026/09/301 个月前
0.1.22026/09/301 个月前
0.1.12026/09/251 个月前
0.1.02026/09/251 个月前

关于 @aurelienbbn/agentlint-plugin-xstate 的常见问题

@aurelienbbn/agentlint-plugin-xstate 是什么?

自定义代理林特为X国机器和演员规定.

如何安装 @aurelienbbn/agentlint-plugin-xstate?

在项目目录运行 npm install @aurelienbbn/agentlint-plugin-xstate,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@aurelienbbn/agentlint(>=0.3.0 <0.9.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@aurelienbbn/agentlint-plugin-xstate 支持 TypeScript 吗?

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

@aurelienbbn/agentlint-plugin-xstate 支持 ESM 还是 CommonJS?

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

@aurelienbbn/agentlint-plugin-xstate 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^22.19.0 || ^24.11.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@aurelienbbn/agentlint-plugin-xstate 可以商用吗?

@aurelienbbn/agentlint-plugin-xstate 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@aurelienbbn/agentlint-plugin-xstate 的下载量有多少?

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

@aurelienbbn/agentlint-plugin-xstate 还在维护吗?

最新版本 0.2.0 发布于 2026/10/14(24 天前);至今共发布 6 个版本,其中过去 12 个月发布了 6 个;首次发布于 2026/09/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。