diff --git a/README.md b/README.md index 72eb2e1..1bbbd3b 100644 --- a/README.md +++ b/README.md @@ -33,17 +33,17 @@ jobs: #### Secrets -| Secret | Required | Description | -| ------------------- | -------- | ----------------------- | -| `ANTHROPIC_API_KEY` | Yes | API key for Anthropic | +| Secret | Required | Description | +| ------------------- | -------- | --------------------- | +| `ANTHROPIC_API_KEY` | Yes | API key for Anthropic | Set this as an **org-level secret** so all repos inherit it, or per-repo if needed. #### Variables -| Variable | Required | Description | -| --------------------- | -------- | ----------------------------------------------- | -| `ANTHROPIC_BASE_URL` | No | Custom API base URL (e.g. for proxy or gateway) | +| Variable | Required | Description | +| -------------------- | -------- | ----------------------------------------------- | +| `ANTHROPIC_BASE_URL` | No | Custom API base URL (e.g. for proxy or gateway) | Set this as an **org-level variable** (not a secret) if you need to route requests through a proxy. diff --git a/docs/rfcs/0001-code-review-customization.md b/docs/rfcs/0001-code-review-customization.md index 994996c..afb1747 100644 --- a/docs/rfcs/0001-code-review-customization.md +++ b/docs/rfcs/0001-code-review-customization.md @@ -32,13 +32,13 @@ PR #14 合入后已经解决了「重复评论」和「max-turns 30 太少」这 把「特化项」按**变化频率**和**抽象层级**分类,分别用最匹配的载体: -| 类别 | 例子 | 载体 | 谁维护 | -|---|---|---|---| -| 数值/枚举 | `max_turns`, `model`, `confidence_min` | workflow `inputs:` | 基础设施 | -| 路径过滤 | `paths_focus`, `paths_skip` | workflow `inputs:` | 项目 + 基础设施 | -| 工具扩展 | `Bash(pytest:*)` | workflow `inputs:`(白名单内) | 项目(受限) | -| Prompt 内容 | 项目栈、gotchas、业务规则、误报黑名单 | `.github/REVIEW.md` | 项目 | -| Review 目标 | 安全 only / 文档 only | 独立 workflow | 基础设施 | +| 类别 | 例子 | 载体 | 谁维护 | +| ----------- | -------------------------------------- | ------------------------------ | --------------- | +| 数值/枚举 | `max_turns`, `model`, `confidence_min` | workflow `inputs:` | 基础设施 | +| 路径过滤 | `paths_focus`, `paths_skip` | workflow `inputs:` | 项目 + 基础设施 | +| 工具扩展 | `Bash(pytest:*)` | workflow `inputs:`(白名单内) | 项目(受限) | +| Prompt 内容 | 项目栈、gotchas、业务规则、误报黑名单 | `.github/REVIEW.md` | 项目 | +| Review 目标 | 安全 only / 文档 only | 独立 workflow | 基础设施 | **核心选择**:**结构性的当 input,自由文本的当文件。** 数值/枚举走 yaml input(IDE 补全、可校验、显式);自由文本(项目知识、误报名单)走 `.github/REVIEW.md`(跟项目演进,diff 自然,无转义地狱)。 @@ -49,8 +49,8 @@ PR #14 合入后已经解决了「重复评论」和「max-turns 30 太少」这 ```yaml inputs: # —— 现有 —— - pr_number: { required: true, type: number } - is_draft: { required: false, type: boolean, default: false } + pr_number: { required: true, type: number } + is_draft: { required: false, type: boolean, default: false } head_repo_full_name: { required: false, type: string } # —— 资源 / 模型 —— @@ -119,21 +119,25 @@ inputs: # Review Guidelines ## Project Context + - 栈:TypeScript + React 19 + Vite + Effect-TS - 部署:Vercel + Cloudflare Workers - 关键依赖版本约束:见 package.json ## Review Focus (项目特化) + - Effect 的 unhandled / non-tracked effect - React 19 useTransition / useOptimistic 的 stale closure - Drizzle migration 文件改动需要二次审视 ## False-Positive Filter (额外的不要报告项) + - `*.gen.ts`:codegen 产物 - `packages/legacy/**`:待删除模块,新增问题不计 - `apps/*/e2e/**`:测试 fixture,不算业务逻辑 ## Domain Knowledge + - "Maker" 指 maker.taptap.cn 项目 - 用户角色:creator / player / admin - 业务规则 X:详见 docs/business-rules/X.md @@ -144,6 +148,7 @@ inputs: > **设计取舍**:也可以把文件放在仓库根目录的 `REVIEW.md`,这样 prompt 字面不需要改。但 `.github/REVIEW.md` 语义更清晰("这是给 CI 看的,不是给开发者读的项目文档"),且不污染根目录。一行 prompt 改动换更好的归位,划算。 **与 workflow inputs 的关系**: + - `paths_skip` input 是**结构化的强 prompt 指令**(org workflow 在 prompt 里告诉 Claude "skip these globs")。它声明意图明确、模型遵守率高,但**不是硬过滤**——LLM 不提供 100% 的指令遵守保证,理论上 Claude 仍可能去读 skip 路径。 - REVIEW.md 的 "False-Positive Filter" 是**软指引**(告诉 Claude "这些路径下的问题置信度自动 -20" 之类) - 两者强度不同但**都不应当作安全边界使用**:不要依赖 `paths_skip` 来防止 Claude 看到敏感文件(如 credentials)。敏感文件本来就不该在 diff 里,应当靠 `.gitignore` / `git-secrets` / pre-commit hook 在更上游拦掉。如果将来真有"必须物理剔除路径再喂给 Claude"的场景,参考 §10 的备选方案 D(pre-process diff,未在本 RFC 范围内实现)。 @@ -299,6 +304,7 @@ Bash(tsc:*) ### 6.3 隐含的全局禁止 即使将来扩白名单,下列绝不允许: + - 任何带 `curl / wget / nc / ssh / scp / rsync` 的 pattern(外联) - 任何带 `rm / mv / cp / chmod / chown` 的 pattern(写文件系统) - 任何 `gh api ... -X POST/PUT/PATCH/DELETE` 形式的 mutation(除已经在 base allowedTools 里、专门授给 dedup/resolve 用的两条) @@ -326,14 +332,14 @@ org workflow 在 reusable workflow 入口加一个 `validate-extra-tools` step **默认值与现行 workflow 的对照**: -| Input | 默认值 | 与 PR #14 合入后的 workflow | -|---|---|---| -| `model` | `opus` | 一致(现行就是 `--model opus`) | -| `max_turns` | `256` | 一致(PR #14 已经设到 256) | -| `max_budget_usd` | `10` | **新增**(现行没有 budget 上限) | -| `confidence_min` | `75` | **形式上新增**——现行 workflow 在 prompt 里写死了 "Only report findings with confidence ≥ 75",本 RFC 把它从 prompt 字面提到 input 参数化 | -| `max_findings` | `10` | **形式上新增**——同上,现行 prompt 里写死 "at most 10 new findings" | -| `paths_focus / paths_skip / extra_allowed_tools` | 空 | **新增**,空时不影响行为 | +| Input | 默认值 | 与 PR #14 合入后的 workflow | +| ------------------------------------------------ | ------ | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `model` | `opus` | 一致(现行就是 `--model opus`) | +| `max_turns` | `256` | 一致(PR #14 已经设到 256) | +| `max_budget_usd` | `10` | **新增**(现行没有 budget 上限) | +| `confidence_min` | `75` | **形式上新增**——现行 workflow 在 prompt 里写死了 "Only report findings with confidence ≥ 75",本 RFC 把它从 prompt 字面提到 input 参数化 | +| `max_findings` | `10` | **形式上新增**——同上,现行 prompt 里写死 "at most 10 new findings" | +| `paths_focus / paths_skip / extra_allowed_tools` | 空 | **新增**,空时不影响行为 | 唯一行为变化是引入 `max_budget_usd: 10` 上限——超出会中止 review。`10 USD/run` 应当远高于实际开销(参考 maker#439 一次 ~4min × opus 远低于 $1),属于安全网而非常态约束。如担心切换震动,可在 Phase 1 默认 `0`(无上限)后续再调高。 diff --git a/package.json b/package.json index a528742..5124658 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,11 @@ "devDependencies": { "@eslint/js": "^10.0.1", "autocorrect-node": "^2.14.0", - "eslint": "^10.1.0", - "globals": "^17.4.0", + "eslint": "^10.3.0", + "globals": "^17.6.0", "husky": "^9.1.7", "lint-staged": "^16.4.0", - "prettier": "^3.8.1", - "typescript-eslint": "^8.57.2" + "prettier": "^3.8.3", + "typescript-eslint": "^8.59.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e1eba6..c1de335 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,16 +9,16 @@ importers: devDependencies: "@eslint/js": specifier: ^10.0.1 - version: 10.0.1(eslint@10.1.0) + version: 10.0.1(eslint@10.3.0) autocorrect-node: specifier: ^2.14.0 version: 2.14.0 eslint: - specifier: ^10.1.0 - version: 10.1.0 + specifier: ^10.3.0 + version: 10.3.0 globals: - specifier: ^17.4.0 - version: 17.4.0 + specifier: ^17.6.0 + version: 17.6.0 husky: specifier: ^9.1.7 version: 9.1.7 @@ -26,11 +26,11 @@ importers: specifier: ^16.4.0 version: 16.4.0 prettier: - specifier: ^3.8.1 - version: 3.8.1 + specifier: ^3.8.3 + version: 3.8.3 typescript-eslint: - specifier: ^8.57.2 - version: 8.57.2(eslint@10.1.0)(typescript@5.9.3) + specifier: ^8.59.3 + version: 8.59.3(eslint@10.3.0)(typescript@5.9.3) packages: "@eslint-community/eslint-utils@4.9.1": @@ -49,24 +49,24 @@ packages: } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - "@eslint/config-array@0.23.3": + "@eslint/config-array@0.23.5": resolution: { - integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==, + integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==, } engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - "@eslint/config-helpers@0.5.3": + "@eslint/config-helpers@0.5.5": resolution: { - integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==, + integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==, } engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - "@eslint/core@1.1.1": + "@eslint/core@1.2.1": resolution: { - integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==, + integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==, } engines: { node: ^20.19.0 || ^22.13.0 || >=24 } @@ -82,31 +82,38 @@ packages: eslint: optional: true - "@eslint/object-schema@3.0.3": + "@eslint/object-schema@3.0.5": resolution: { - integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==, + integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==, } engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - "@eslint/plugin-kit@0.6.1": + "@eslint/plugin-kit@0.7.1": resolution: { - integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==, + integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==, } engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - "@humanfs/core@0.19.1": + "@humanfs/core@0.19.2": resolution: { - integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, + integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==, } engines: { node: ">=18.18.0" } - "@humanfs/node@0.16.7": + "@humanfs/node@0.16.8": resolution: { - integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==, + integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==, + } + engines: { node: ">=18.18.0" } + + "@humanfs/types@0.15.0": + resolution: + { + integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==, } engines: { node: ">=18.18.0" } @@ -130,10 +137,10 @@ packages: integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==, } - "@types/estree@1.0.8": + "@types/estree@1.0.9": resolution: { - integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==, } "@types/json-schema@7.0.15": @@ -142,92 +149,92 @@ packages: integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, } - "@typescript-eslint/eslint-plugin@8.57.2": + "@typescript-eslint/eslint-plugin@8.59.3": resolution: { - integrity: sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==, + integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - "@typescript-eslint/parser": ^8.57.2 + "@typescript-eslint/parser": ^8.59.3 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" + typescript: ">=4.8.4 <6.1.0" - "@typescript-eslint/parser@8.57.2": + "@typescript-eslint/parser@8.59.3": resolution: { - integrity: sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==, + integrity: sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" + typescript: ">=4.8.4 <6.1.0" - "@typescript-eslint/project-service@8.57.2": + "@typescript-eslint/project-service@8.59.3": resolution: { - integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==, + integrity: sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: ">=4.8.4 <6.0.0" + typescript: ">=4.8.4 <6.1.0" - "@typescript-eslint/scope-manager@8.57.2": + "@typescript-eslint/scope-manager@8.59.3": resolution: { - integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==, + integrity: sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@typescript-eslint/tsconfig-utils@8.57.2": + "@typescript-eslint/tsconfig-utils@8.59.3": resolution: { - integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==, + integrity: sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: ">=4.8.4 <6.0.0" + typescript: ">=4.8.4 <6.1.0" - "@typescript-eslint/type-utils@8.57.2": + "@typescript-eslint/type-utils@8.59.3": resolution: { - integrity: sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==, + integrity: sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" + typescript: ">=4.8.4 <6.1.0" - "@typescript-eslint/types@8.57.2": + "@typescript-eslint/types@8.59.3": resolution: { - integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==, + integrity: sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - "@typescript-eslint/typescript-estree@8.57.2": + "@typescript-eslint/typescript-estree@8.59.3": resolution: { - integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==, + integrity: sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: ">=4.8.4 <6.0.0" + typescript: ">=4.8.4 <6.1.0" - "@typescript-eslint/utils@8.57.2": + "@typescript-eslint/utils@8.59.3": resolution: { - integrity: sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==, + integrity: sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" + typescript: ">=4.8.4 <6.1.0" - "@typescript-eslint/visitor-keys@8.57.2": + "@typescript-eslint/visitor-keys@8.59.3": resolution: { - integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==, + integrity: sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -247,10 +254,10 @@ packages: engines: { node: ">=0.4.0" } hasBin: true - ajv@6.14.0: + ajv@6.15.0: resolution: { - integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==, + integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==, } ansi-escapes@7.3.0: @@ -336,10 +343,10 @@ packages: } engines: { node: 18 || 20 || >=22 } - brace-expansion@5.0.5: + brace-expansion@5.0.6: resolution: { - integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==, + integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==, } engines: { node: 18 || 20 || >=22 } @@ -436,10 +443,10 @@ packages: } engines: { node: ^20.19.0 || ^22.13.0 || >=24 } - eslint@10.1.0: + eslint@10.3.0: resolution: { - integrity: sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==, + integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==, } engines: { node: ^20.19.0 || ^22.13.0 || >=24 } hasBin: true @@ -561,10 +568,10 @@ packages: } engines: { node: ">=10.13.0" } - globals@17.4.0: + globals@17.6.0: resolution: { - integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==, + integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==, } engines: { node: ">=18" } @@ -691,10 +698,10 @@ packages: } engines: { node: ">=18" } - minimatch@10.2.4: + minimatch@10.2.5: resolution: { - integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==, + integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==, } engines: { node: 18 || 20 || >=22 } @@ -766,10 +773,10 @@ packages: } engines: { node: ">= 0.8.0" } - prettier@3.8.1: + prettier@3.8.3: resolution: { - integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==, + integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==, } engines: { node: ">=14" } hasBin: true @@ -794,10 +801,10 @@ packages: integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, } - semver@7.7.4: + semver@7.8.0: resolution: { - integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==, + integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==, } engines: { node: ">=10" } hasBin: true @@ -872,10 +879,10 @@ packages: } engines: { node: ">=18" } - tinyglobby@0.2.15: + tinyglobby@0.2.16: resolution: { - integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, + integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==, } engines: { node: ">=12.0.0" } @@ -895,15 +902,15 @@ packages: } engines: { node: ">= 0.8.0" } - typescript-eslint@8.57.2: + typescript-eslint@8.59.3: resolution: { - integrity: sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A==, + integrity: sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" + typescript: ">=4.8.4 <6.1.0" typescript@5.9.3: resolution: @@ -957,66 +964,71 @@ packages: engines: { node: ">=10" } snapshots: - "@eslint-community/eslint-utils@4.9.1(eslint@10.1.0)": + "@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)": dependencies: - eslint: 10.1.0 + eslint: 10.3.0 eslint-visitor-keys: 3.4.3 "@eslint-community/regexpp@4.12.2": {} - "@eslint/config-array@0.23.3": + "@eslint/config-array@0.23.5": dependencies: - "@eslint/object-schema": 3.0.3 + "@eslint/object-schema": 3.0.5 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - "@eslint/config-helpers@0.5.3": + "@eslint/config-helpers@0.5.5": dependencies: - "@eslint/core": 1.1.1 + "@eslint/core": 1.2.1 - "@eslint/core@1.1.1": + "@eslint/core@1.2.1": dependencies: "@types/json-schema": 7.0.15 - "@eslint/js@10.0.1(eslint@10.1.0)": + "@eslint/js@10.0.1(eslint@10.3.0)": optionalDependencies: - eslint: 10.1.0 + eslint: 10.3.0 - "@eslint/object-schema@3.0.3": {} + "@eslint/object-schema@3.0.5": {} - "@eslint/plugin-kit@0.6.1": + "@eslint/plugin-kit@0.7.1": dependencies: - "@eslint/core": 1.1.1 + "@eslint/core": 1.2.1 levn: 0.4.1 - "@humanfs/core@0.19.1": {} + "@humanfs/core@0.19.2": + dependencies: + "@humanfs/types": 0.15.0 - "@humanfs/node@0.16.7": + "@humanfs/node@0.16.8": dependencies: - "@humanfs/core": 0.19.1 + "@humanfs/core": 0.19.2 + "@humanfs/types": 0.15.0 "@humanwhocodes/retry": 0.4.3 + "@humanfs/types@0.15.0": {} + "@humanwhocodes/module-importer@1.0.1": {} "@humanwhocodes/retry@0.4.3": {} "@types/esrecurse@4.3.1": {} - "@types/estree@1.0.8": {} + "@types/estree@1.0.9": {} "@types/json-schema@7.0.15": {} - "@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0)(typescript@5.9.3))(eslint@10.1.0)(typescript@5.9.3)": + "@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@5.9.3))(eslint@10.3.0)(typescript@5.9.3)": dependencies: "@eslint-community/regexpp": 4.12.2 - "@typescript-eslint/parser": 8.57.2(eslint@10.1.0)(typescript@5.9.3) - "@typescript-eslint/scope-manager": 8.57.2 - "@typescript-eslint/type-utils": 8.57.2(eslint@10.1.0)(typescript@5.9.3) - "@typescript-eslint/utils": 8.57.2(eslint@10.1.0)(typescript@5.9.3) - "@typescript-eslint/visitor-keys": 8.57.2 - eslint: 10.1.0 + "@typescript-eslint/parser": 8.59.3(eslint@10.3.0)(typescript@5.9.3) + "@typescript-eslint/scope-manager": 8.59.3 + "@typescript-eslint/type-utils": 8.59.3(eslint@10.3.0)(typescript@5.9.3) + "@typescript-eslint/utils": 8.59.3(eslint@10.3.0)(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.59.3 + eslint: 10.3.0 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -1024,79 +1036,79 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/parser@8.57.2(eslint@10.1.0)(typescript@5.9.3)": + "@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@5.9.3)": dependencies: - "@typescript-eslint/scope-manager": 8.57.2 - "@typescript-eslint/types": 8.57.2 - "@typescript-eslint/typescript-estree": 8.57.2(typescript@5.9.3) - "@typescript-eslint/visitor-keys": 8.57.2 + "@typescript-eslint/scope-manager": 8.59.3 + "@typescript-eslint/types": 8.59.3 + "@typescript-eslint/typescript-estree": 8.59.3(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.59.3 debug: 4.4.3 - eslint: 10.1.0 + eslint: 10.3.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/project-service@8.57.2(typescript@5.9.3)": + "@typescript-eslint/project-service@8.59.3(typescript@5.9.3)": dependencies: - "@typescript-eslint/tsconfig-utils": 8.57.2(typescript@5.9.3) - "@typescript-eslint/types": 8.57.2 + "@typescript-eslint/tsconfig-utils": 8.59.3(typescript@5.9.3) + "@typescript-eslint/types": 8.59.3 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/scope-manager@8.57.2": + "@typescript-eslint/scope-manager@8.59.3": dependencies: - "@typescript-eslint/types": 8.57.2 - "@typescript-eslint/visitor-keys": 8.57.2 + "@typescript-eslint/types": 8.59.3 + "@typescript-eslint/visitor-keys": 8.59.3 - "@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.9.3)": + "@typescript-eslint/tsconfig-utils@8.59.3(typescript@5.9.3)": dependencies: typescript: 5.9.3 - "@typescript-eslint/type-utils@8.57.2(eslint@10.1.0)(typescript@5.9.3)": + "@typescript-eslint/type-utils@8.59.3(eslint@10.3.0)(typescript@5.9.3)": dependencies: - "@typescript-eslint/types": 8.57.2 - "@typescript-eslint/typescript-estree": 8.57.2(typescript@5.9.3) - "@typescript-eslint/utils": 8.57.2(eslint@10.1.0)(typescript@5.9.3) + "@typescript-eslint/types": 8.59.3 + "@typescript-eslint/typescript-estree": 8.59.3(typescript@5.9.3) + "@typescript-eslint/utils": 8.59.3(eslint@10.3.0)(typescript@5.9.3) debug: 4.4.3 - eslint: 10.1.0 + eslint: 10.3.0 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/types@8.57.2": {} + "@typescript-eslint/types@8.59.3": {} - "@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3)": + "@typescript-eslint/typescript-estree@8.59.3(typescript@5.9.3)": dependencies: - "@typescript-eslint/project-service": 8.57.2(typescript@5.9.3) - "@typescript-eslint/tsconfig-utils": 8.57.2(typescript@5.9.3) - "@typescript-eslint/types": 8.57.2 - "@typescript-eslint/visitor-keys": 8.57.2 + "@typescript-eslint/project-service": 8.59.3(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.59.3(typescript@5.9.3) + "@typescript-eslint/types": 8.59.3 + "@typescript-eslint/visitor-keys": 8.59.3 debug: 4.4.3 - minimatch: 10.2.4 - semver: 7.7.4 - tinyglobby: 0.2.15 + minimatch: 10.2.5 + semver: 7.8.0 + tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/utils@8.57.2(eslint@10.1.0)(typescript@5.9.3)": + "@typescript-eslint/utils@8.59.3(eslint@10.3.0)(typescript@5.9.3)": dependencies: - "@eslint-community/eslint-utils": 4.9.1(eslint@10.1.0) - "@typescript-eslint/scope-manager": 8.57.2 - "@typescript-eslint/types": 8.57.2 - "@typescript-eslint/typescript-estree": 8.57.2(typescript@5.9.3) - eslint: 10.1.0 + "@eslint-community/eslint-utils": 4.9.1(eslint@10.3.0) + "@typescript-eslint/scope-manager": 8.59.3 + "@typescript-eslint/types": 8.59.3 + "@typescript-eslint/typescript-estree": 8.59.3(typescript@5.9.3) + eslint: 10.3.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/visitor-keys@8.57.2": + "@typescript-eslint/visitor-keys@8.59.3": dependencies: - "@typescript-eslint/types": 8.57.2 + "@typescript-eslint/types": 8.59.3 eslint-visitor-keys: 5.0.1 acorn-jsx@5.3.2(acorn@8.16.0): @@ -1105,7 +1117,7 @@ snapshots: acorn@8.16.0: {} - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -1145,7 +1157,7 @@ snapshots: balanced-match@4.0.4: {} - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -1183,7 +1195,7 @@ snapshots: eslint-scope@9.1.2: dependencies: "@types/esrecurse": 4.3.1 - "@types/estree": 1.0.8 + "@types/estree": 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -1191,19 +1203,19 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.1.0: + eslint@10.3.0: dependencies: - "@eslint-community/eslint-utils": 4.9.1(eslint@10.1.0) + "@eslint-community/eslint-utils": 4.9.1(eslint@10.3.0) "@eslint-community/regexpp": 4.12.2 - "@eslint/config-array": 0.23.3 - "@eslint/config-helpers": 0.5.3 - "@eslint/core": 1.1.1 - "@eslint/plugin-kit": 0.6.1 - "@humanfs/node": 0.16.7 + "@eslint/config-array": 0.23.5 + "@eslint/config-helpers": 0.5.5 + "@eslint/core": 1.2.1 + "@eslint/plugin-kit": 0.7.1 + "@humanfs/node": 0.16.8 "@humanwhocodes/module-importer": 1.0.1 "@humanwhocodes/retry": 0.4.3 - "@types/estree": 1.0.8 - ajv: 6.14.0 + "@types/estree": 1.0.9 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 @@ -1220,7 +1232,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.4 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: @@ -1278,7 +1290,7 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@17.4.0: {} + globals@17.6.0: {} husky@9.1.7: {} @@ -1347,9 +1359,9 @@ snapshots: mimic-function@5.0.1: {} - minimatch@10.2.4: + minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 ms@2.1.3: {} @@ -1384,7 +1396,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.8.1: {} + prettier@3.8.3: {} punycode@2.3.1: {} @@ -1395,7 +1407,7 @@ snapshots: rfdc@1.4.1: {} - semver@7.7.4: {} + semver@7.8.0: {} shebang-command@2.0.0: dependencies: @@ -1434,7 +1446,7 @@ snapshots: tinyexec@1.0.4: {} - tinyglobby@0.2.15: + tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 @@ -1447,13 +1459,13 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.57.2(eslint@10.1.0)(typescript@5.9.3): + typescript-eslint@8.59.3(eslint@10.3.0)(typescript@5.9.3): dependencies: - "@typescript-eslint/eslint-plugin": 8.57.2(@typescript-eslint/parser@8.57.2(eslint@10.1.0)(typescript@5.9.3))(eslint@10.1.0)(typescript@5.9.3) - "@typescript-eslint/parser": 8.57.2(eslint@10.1.0)(typescript@5.9.3) - "@typescript-eslint/typescript-estree": 8.57.2(typescript@5.9.3) - "@typescript-eslint/utils": 8.57.2(eslint@10.1.0)(typescript@5.9.3) - eslint: 10.1.0 + "@typescript-eslint/eslint-plugin": 8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0)(typescript@5.9.3))(eslint@10.3.0)(typescript@5.9.3) + "@typescript-eslint/parser": 8.59.3(eslint@10.3.0)(typescript@5.9.3) + "@typescript-eslint/typescript-estree": 8.59.3(typescript@5.9.3) + "@typescript-eslint/utils": 8.59.3(eslint@10.3.0)(typescript@5.9.3) + eslint: 10.3.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color