@aurelienbn/ agentlint-plugin-alchemy (英语)
6 Agentlint 为Alchemy v2 sacks进行评论:无静置替换,无静置数据删除,无静置收购.
[尖叫声] 需要引擎
@aurelienbbn/agentlint>=0.3.0 <0.9.0作为同伴. 证据。 。 。 .
[注] 已核对
[email protected]. 释放候选人:还没有消费者校正这些规则。 炼金术在β;替换触发和默认可以在β之间移动.
快开始
agentlint init --preset "@aurelienbbn/agentlint-plugin-alchemy#starterPreset"
agentlint rules test
agentlint rules scan --review
agentlint next --format json
init 保存已有的配置并打印安装命令;从未安装. 更改规则需要合并基础: 与完整历史对照( C)fetch-depth: 0(原始内容存档于2017-03-21). In CI.
import { defineConfig } from "@aurelienbbn/agentlint";
import { initConfigExposure, strictPreset } from "@aurelienbbn/agentlint-plugin-alchemy";
export default defineConfig({ extends: [strictPreset], rules: [initConfigExposure] });
规则
| 规则 | 严格 | 启动 | 权力 | 生命周期 | 着火了 |
|---|---|---|---|---|---|
resource-replacement-review | ✅ | ✅ | 人类 | 变动 | 逻辑 ID 未更改 renamedFrom,声明删除,替换道具更改,堆栈重命名 |
state-store-change | ✅ | ✅ | 人类 | 变动 | state: 选项 Alchemy.Stack 已更改 |
removal-policy-change | ✅ | 人类 | 变动 | RemovalPolicy.retain(...) 删除或缩小, destroy() 添加, forceDestroy: true 设定 | |
removal-policy-review | ✅ | 代理人 | 状态 | R2, D1, KV 声明, 没有删除政策, 或 a retain 条件读取 Stage | |
adopt-review | ✅ | 人类 | 状态 | AdoptPolicy.adopt(...), (中文(简体) ), --adopt 在软件包中。json 脚本 | |
init-config-exposure | 🧪 | 代理人 | 状态 | yield* Config.*("KEY") 直接装在工人、集装箱或Lambda内 |
在预设中 \ \ 选入, 明确注册 。 预设忽略 **/*.d.ts,每个规则都是标准修订一,探测器版本一.
答案位于代码之外的人类权威:在部署阶段的数据是否可能去取,云层资源是否由他人拥有可能被接管. removal-policy-review 保持代理可接受性,因为可处理性通常可见于代码(缓存、预览、固定); 提升至 human 在你的绑定,如果它不是.
-yield* Cloudflare.R2.Bucket("Bucket");
+yield* Cloudflare.R2.Bucket("Assets"); // ❌ resource-replacement-review: new empty bucket, old one deleted
+yield* Cloudflare.R2.Bucket("Assets").pipe(Alchemy.renamedFrom("Bucket")); // ✅ state row migrates
-yield* Cloudflare.D1.Database("Orders", { primaryLocationHint: "weur" });
+yield* Cloudflare.D1.Database("Orders", { primaryLocationHint: "apac" }); // ❌ D1 plans a replace
- state: localState(),
+ state: Cloudflare.state(), // ❌ state-store-change: next deploy plans against empty state
Cloudflare.D1.Database("Orders"); // ❌ removal-policy-review: default destroy
Cloudflare.D1.Database("Orders").pipe(RemovalPolicy.retain(stack.stage === "prod")); // ✅
Cloudflare.D1.Database("Db").pipe(RemovalPolicy.retain(Effect.map(Alchemy.Stage, isProd))); // ❌ alchemy#1738
deploy(program).pipe(AdoptPolicy.adopt(true)); // ❌ adopt-review
resource-replacement-review: 替换触发器和选项
替换触发器, 从每个提供者读取 diff 内 [email protected]数字 :
| 资源 | 替换于 | 保持原地不动 |
|---|---|---|
R2.Bucket | name 设置或更改, jurisdiction, (中文(简体) ), locationHint | name 删除( 已部署名称保留), 未设置 qq jurisdiction: "default", (中文(简体) ), storageClass、域、CORS、生命周期 |
D1.Database | name 设置或更改, jurisdiction, (中文(简体) ), primaryLocationHint 设置或更改 | name 或者说 primaryLocationHint 已删除, 未设置qq jurisdiction: "default", (中文(简体) ), readReplication |
KV.Namespace | 无: title 重命名到位 | title |
逻辑ID更改与附加的同类型声明配对;已附带无条件声明的已删除声明 RemovalPolicy.retain() 保持安静。 在文件之间移动的声明保持沉默.
defineResourceReplacementReview({ resources }) 替换地图 : { "Queues.Queue": { name: "changed" } }。 。 。 . "changed" 对包括去除在内的任何区别起火; "set" 只有在后面方设定了不同的值时; { trigger, absent } 比较一个未设置道具为 absent。 。 。 .
removal-policy-change 财务报告和审定财务报表 removal-policy-review: 什么是政策
removal-policy-change 比较 RemovalPolicy.retain(...) 编号 : RemovalPolicy.destroy(...) 整个变化的呼声,所以一个被感动的呼声是静默的,留下的,随其被去除的宣告,则留给 resource-replacement-review。 。 。 . retain(), (中文(简体) ), retain(true) 财务报告和审定财务报表 destroy(false) 政策不变 destroy(), (中文(简体) ), destroy(true) 财务报告和审定财务报表 retain(false); 切换为无条件保留永不起火. forceDestroy: true 仅在变更前存在的桶上放火:没有它,R2拒绝去掉一个非空桶.
removal-policy-review 接受任何附件 .pipe(...) 提及 retain (包括援助人员,例如: retainOnDeployedStage)或(或) RemovalPolicy.destroy。当 retain 参数为 Stage: 效果表在效果工人内部失效(化学式# 1738, 打开);从 Alchemy.Stack 换句话说.
两个都拿 { resources }默认值 ["R2.Bucket", "D1.Database", "KV.Namespace"]。 。 。 .
init-config-exposure: 为何选入
炼金术将每个配置密钥 运行时间的内装值绑入部署的运行时间, secret_text 在"云花"上,有部署者的价值。 这是有文件记载的传送秘密的方式,所以大多数发现都是为了:在强制执行之前校正. 手提时间为:fetch: Effect.gen(...))和道具效果保持缄默. defineInitConfigExposure({ runtimePattern }) 替换构造器模式.
限制
- 语言学,不是语义学. 更改文本之前/之后读取的规则: 计算逻辑ID比较为表达式, 道具作为变量传递或效果不比较,
Namespace.push动作是无形的,astate选项作为标识符只通过同一个文件解决const,而堆栈文件中的正则文字可以混淆扫描仪. - 取消命名的导入 . 资源确认为
R2.Bucket(, (中文(简体) ),D1.Database(, (中文(简体) ),KV.Namespace(任何命名空间背后;import { Bucket }接下来Bucket(...)没有. - 默认情况下只有Cloudflare三家商店. 持久对象、队列、超驱动和 AWS 存储需要明确
resources地图. - YAML 没有扫描 .
--adopt在 GitHub 工作流程文件中是隐形的: Agentlint 状态规则 解析 JS, TS 和 JSON 仅. - 过渡配置读取是无形的. 图书馆读取
Config输入时也绑定( 化学式# 1842); 只有直接yield* Config.*("KEY")火灾. - 不是计划.
alchemy plan这些规则确保有人读它.
登记的合同库存
从软件包导出 pnpm catalog. 规则特定选项和限制在上文和源测试中都有描述.
| 规则/检查 | 触发或审查范围 |
|---|---|
adopt-review | 采用政策.adopt (.) 和 --adopt 在软件包中.json脚本,它让Alchemy接管了云资源,无法证明它拥有. |
init-config-exposure | 标记每个效果/ Config 密钥在一个 Alchemy runtime init中产生, Alchemy 将它上传到部署的 runtime 作为秘密绑定. |
removal-policy-change | 删除或缩小删除政策的旗帜 。 保留、添加去除政策.destroy,或将强制去除设置在已存在的R2桶上,因此人类确认的数据可能被删除. |
removal-policy-review | 在默认的去除策略上, 旗帜可状态化的Alchemy资源( R2, D1, KV), 并保留读取 Stage 通过 Effect 的条件 . |
resource-replacement-review | 使 Alchemy 替换或删除状态资源的旗帜 diffs: 逻辑ID 更改后未重新命名 From, 声明被删除, 替换- 触发道克被更改, 或者堆栈重新命名 . |
state-store-change | 标记更改 state: 选项。 堆积如此人能证实 现有状态是如何移动到新商店的. |
信用概念
- 炼金术 采用政策、炼金术/术/用药政策 https://alchemy.run/cli/取用-资源 (Apache-2.0项目;概念,独立实施)
- 炼金术取出政策、炼金术取出/铸金术取出/取出政策2.0.0-β.79;和 https://alchemy.run/基础设施-as-code/资源-生命周期 (Apache-2.0项目;概念,独立实施)
- 在炼金术/src/Cloudflare/R2/Bucket.ts和D1/Database.ts,2.0.0-β.79(Apache-2.0;替换已读出而未复制的触发器)中,Alchemy 提供者 diff 函数
- 炼金术的更名和资源寿命周期, https://alchemy.run/ 基础设施-as-code/更名 (Apache-2.0项目;概念,独立实施)
- 化学秘诀, https://alchemy.run/environments/secrets (中文(简体) ),和炼金术/src/Platform.ts 2.0.0-β.79 计划相相配置绑定(Apache-2.0项目;概念,独立实施)
- 炼金术州立商店的文献, https://alchemy.run/ state-store 互联网档案馆的存檔,存档日期2013-12-02 (Apache-2.0项目;概念,独立实施)
- 炼金术/炼金术#1738(效果-形式保留在效果-原生工人体内失败;报告的行为,而不是代码)
- 炼金术/炼金术# 1842( 通过 init 配置绑定的部署证书读取; 已报告的行为,而非代码)
贷项
来自Alchemy文档和来源(Apache-2.0)的概念,未经复制而重新执行: 重命名, (中文(简体) ), 资源使用周期和清除政策, (中文(简体) ), 采用资源, (中文(简体) ), 状态存储, (中文(简体) ), 机密和配置,并报告了炼金术/炼金术#1248,#1738和#1842中的行为. starterPreset 登机:由Peter O'Malley拆卸而来的概念灵感;没有复制代码或指南.