From ed8b77b94b6535d0e21ded7979909faaecbc9b9f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 06:49:32 +0000 Subject: [PATCH 1/9] fix(deps): update all dependencies --- bun.lock | 190 +++++++++--------- package.json | 4 +- packages/api/package.json | 12 +- packages/app/package.json | 22 +- packages/docker-git-session-sync/package.json | 2 +- packages/lib/package.json | 16 +- packages/terminal/package.json | 22 +- 7 files changed, 133 insertions(+), 135 deletions(-) diff --git a/bun.lock b/bun.lock index a6bccdd7..c0823a8f 100644 --- a/bun.lock +++ b/bun.lock @@ -12,26 +12,26 @@ }, "packages/api": { "name": "@effect-template/api", - "version": "0.1.1", + "version": "0.1.2", "dependencies": { "@effect-template/lib": "workspace:*", "@effect/platform": "^0.96.1", "@effect/platform-node": "^0.107.0", "@effect/schema": "^0.75.5", - "@fedify/fedify": "^2.2.4", - "@fedify/vocab": "^2.2.4", + "@fedify/fedify": "^2.2.5", + "@fedify/vocab": "^2.2.5", "@prover-coder-ai/docker-git-terminal": "workspace:*", - "effect": "^3.21.2", + "effect": "^3.21.3", "node-pty": "^1.1.0", "ws": "^8.21.0", }, "devDependencies": { "@effect/vitest": "^0.29.0", "@eslint/js": "10.0.1", - "@types/node": "^25.9.1", + "@types/node": "^25.9.3", "@types/ws": "^8.18.1", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", "eslint": "^10.4.1", "fast-check": "4.8.0", "globals": "^17.6.0", @@ -41,7 +41,7 @@ }, "packages/app": { "name": "@prover-coder-ai/docker-git", - "version": "1.1.54", + "version": "1.1.56", "bin": { "docker-git": "dist/src/docker-git/main.js", }, @@ -61,9 +61,9 @@ "@gridland/bun": "0.4.3", "@gridland/web": "0.4.3", "@prover-coder-ai/docker-git-session-sync": "workspace:*", - "effect": "^3.21.2", - "react": "19.2.4", - "react-dom": "19.2.4", + "effect": "^3.21.3", + "react": "19.2.7", + "react-dom": "19.2.7", "react-reconciler": "^0.33.0", "ts-morph": "^28.0.0", }, @@ -80,15 +80,15 @@ "@prover-coder-ai/docker-git-terminal": "workspace:*", "@prover-coder-ai/eslint-plugin-suggest-members": "^0.0.26", "@ton-ai-core/vibecode-linter": "^1.0.11", - "@types/node": "^25.9.1", - "@types/react": "^19.2.16", + "@types/node": "^25.9.3", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", "@types/ws": "^8.18.1", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", "@vitejs/plugin-react": "^6.0.2", "@vitest/coverage-v8": "^4.1.8", - "@vitest/eslint-plugin": "^1.6.19", + "@vitest/eslint-plugin": "^1.6.20", "biome": "npm:@biomejs/biome@^2.4.16", "eslint": "^10.4.1", "eslint-import-resolver-typescript": "^4.4.5", @@ -97,12 +97,12 @@ "eslint-plugin-simple-import-sort": "^13.0.0", "eslint-plugin-sonarjs": "^4.0.3", "eslint-plugin-sort-destructure-keys": "^3.0.0", - "eslint-plugin-unicorn": "^64.0.0", + "eslint-plugin-unicorn": "^65.0.1", "fast-check": "4.8.0", "globals": "^17.6.0", - "jscpd": "^4.2.4", + "jscpd": "^5.0.8", "typescript": "^6.0.3", - "typescript-eslint": "^8.60.1", + "typescript-eslint": "^8.61.0", "vite": "^8.0.16", "vitest": "^4.1.8", "ws": "^8.21.0", @@ -110,13 +110,13 @@ }, "packages/docker-git-session-sync": { "name": "@prover-coder-ai/docker-git-session-sync", - "version": "1.0.57", + "version": "1.0.58", "bin": { "docker-git-session-sync": "dist/docker-git-session-sync.js", }, "devDependencies": { "@effect/vitest": "^0.29.0", - "@types/node": "^25.9.1", + "@types/node": "^25.9.3", "@vitejs/plugin-react": "^6.0.2", "typescript": "^6.0.3", "vite": "^8.0.16", @@ -125,7 +125,7 @@ }, "packages/lib": { "name": "@effect-template/lib", - "version": "1.1.0", + "version": "1.1.1", "dependencies": { "@effect/cli": "^0.75.2", "@effect/cluster": "^0.59.0", @@ -139,7 +139,7 @@ "@effect/sql": "^0.51.1", "@effect/typeclass": "^0.40.0", "@effect/workflow": "^0.18.2", - "effect": "^3.21.2", + "effect": "^3.21.3", "ts-morph": "^28.0.0", }, "devDependencies": { @@ -154,11 +154,11 @@ "@prover-coder-ai/docker-git-session-sync": "workspace:*", "@prover-coder-ai/eslint-plugin-suggest-members": "^0.0.26", "@ton-ai-core/vibecode-linter": "^1.0.11", - "@types/node": "^25.9.1", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@types/node": "^25.9.3", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", "@vitest/coverage-v8": "^4.1.8", - "@vitest/eslint-plugin": "^1.6.19", + "@vitest/eslint-plugin": "^1.6.20", "eslint": "^10.4.1", "eslint-import-resolver-typescript": "^4.4.5", "eslint-plugin-codegen": "0.34.1", @@ -166,12 +166,12 @@ "eslint-plugin-simple-import-sort": "^13.0.0", "eslint-plugin-sonarjs": "^4.0.3", "eslint-plugin-sort-destructure-keys": "^3.0.0", - "eslint-plugin-unicorn": "^64.0.0", + "eslint-plugin-unicorn": "^65.0.1", "fast-check": "^4.8.0", "globals": "^17.6.0", - "jscpd": "^4.2.4", + "jscpd": "^5.0.8", "typescript": "^6.0.3", - "typescript-eslint": "^8.60.1", + "typescript-eslint": "^8.61.0", "vite": "^8.0.16", "vitest": "^4.1.8", }, @@ -183,8 +183,8 @@ "@effect/platform": "^0.96.1", "@effect/platform-node": "^0.107.0", "@effect/schema": "^0.75.5", - "effect": "^3.21.2", - "react": "19.2.4", + "effect": "^3.21.3", + "react": "19.2.7", "xterm": "^5.3.0", "xterm-addon-fit": "^0.8.0", }, @@ -199,13 +199,13 @@ "@eslint/js": "10.0.1", "@prover-coder-ai/eslint-plugin-suggest-members": "^0.0.26", "@ton-ai-core/vibecode-linter": "^1.0.11", - "@types/node": "^25.9.1", - "@types/react": "^19.2.16", + "@types/node": "^25.9.3", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", "@vitest/coverage-v8": "^4.1.8", - "@vitest/eslint-plugin": "^1.6.19", + "@vitest/eslint-plugin": "^1.6.20", "eslint": "^10.4.1", "eslint-import-resolver-typescript": "^4.4.5", "eslint-plugin-codegen": "0.34.1", @@ -213,13 +213,13 @@ "eslint-plugin-simple-import-sort": "^13.0.0", "eslint-plugin-sonarjs": "^4.0.3", "eslint-plugin-sort-destructure-keys": "^3.0.0", - "eslint-plugin-unicorn": "^64.0.0", + "eslint-plugin-unicorn": "^65.0.1", "fast-check": "^4.8.0", "globals": "^17.6.0", - "jscpd": "^4.2.4", - "react-dom": "19.2.4", + "jscpd": "^5.0.8", + "react-dom": "19.2.7", "typescript": "^6.0.3", - "typescript-eslint": "^8.60.1", + "typescript-eslint": "^8.61.0", "vite": "^8.0.16", "vite-tsconfig-paths": "^6.1.1", "vitest": "^4.1.8", @@ -233,8 +233,8 @@ "@parcel/watcher", ], "overrides": { - "react": "19.2.4", - "react-dom": "19.2.4", + "react": "19.2.7", + "react-dom": "19.2.7", }, "packages": { "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "7.28.5", "js-tokens": "4.0.0", "picocolors": "1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], @@ -455,15 +455,15 @@ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], - "@fedify/fedify": ["@fedify/fedify@2.2.4", "", { "dependencies": { "@fedify/vocab": "2.2.4", "@fedify/vocab-runtime": "2.2.4", "@fedify/webfinger": "2.2.4", "@js-temporal/polyfill": "^0.5.1", "@logtape/logtape": "^2.0.5", "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^2.5.0", "@opentelemetry/sdk-trace-base": "^2.5.0", "@opentelemetry/semantic-conventions": "^1.39.0", "byte-encodings": "^1.0.11", "es-toolkit": "1.43.0", "json-canon": "^1.0.1", "jsonld": "^9.0.0", "structured-field-values": "^2.0.4", "uri-template-router": "^1.0.0", "url-template": "^3.1.1", "urlpattern-polyfill": "^10.1.0" } }, "sha512-HK9NQOyHcdHT/HCTJ58QOMp5HuLuHwSP4mmC4yX4kQflqrb1B3v083oYAXxewUucmjf0XkBANN+qPs0qkT4Anw=="], + "@fedify/fedify": ["@fedify/fedify@2.2.5", "", { "dependencies": { "@fedify/vocab": "2.2.5", "@fedify/vocab-runtime": "2.2.5", "@fedify/webfinger": "2.2.5", "@js-temporal/polyfill": "^0.5.1", "@logtape/logtape": "^2.0.5", "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^2.5.0", "@opentelemetry/sdk-trace-base": "^2.5.0", "@opentelemetry/semantic-conventions": "^1.39.0", "byte-encodings": "^1.0.11", "es-toolkit": "1.43.0", "json-canon": "^1.0.1", "jsonld": "^9.0.0", "structured-field-values": "^2.0.4", "uri-template-router": "^1.0.0", "url-template": "^3.1.1", "urlpattern-polyfill": "^10.1.0" } }, "sha512-nARV2R/lkPgUb7XBZkg+MjmZUr0vkoEWG2w/+7Rle7uf2jgk8bL3axxl95xUkvf7gWwqHrBXgw9RXWReMFIFaw=="], - "@fedify/vocab": ["@fedify/vocab@2.2.4", "", { "dependencies": { "@fedify/vocab-runtime": "2.2.4", "@fedify/vocab-tools": "2.2.4", "@fedify/webfinger": "2.2.4", "@js-temporal/polyfill": "^0.5.1", "@logtape/logtape": "^2.0.5", "@multiformats/base-x": "^4.0.1", "@opentelemetry/api": "^1.9.0", "asn1js": "^3.0.6", "es-toolkit": "1.43.0", "jsonld": "^9.0.0", "pkijs": "^3.3.3" } }, "sha512-hk3hIN3oymbXBziHZS+/W9kXl3v+Q53iU00/jWn7KujA1IHI29JnHLYmM3Ggg/bwoAv+MWLliZxHqKHw/6Oigg=="], + "@fedify/vocab": ["@fedify/vocab@2.2.5", "", { "dependencies": { "@fedify/vocab-runtime": "2.2.5", "@fedify/vocab-tools": "2.2.5", "@fedify/webfinger": "2.2.5", "@js-temporal/polyfill": "^0.5.1", "@logtape/logtape": "^2.0.5", "@multiformats/base-x": "^4.0.1", "@opentelemetry/api": "^1.9.0", "asn1js": "^3.0.6", "es-toolkit": "1.43.0", "jsonld": "^9.0.0", "pkijs": "^3.3.3" } }, "sha512-68CYYd239zgfcVppUZGA7D90y0gEcAXNzSxUOBLy04XUZG6MUO81xk5k/j4l9Twagf1KtfQI/gwPpldfpBJeQQ=="], - "@fedify/vocab-runtime": ["@fedify/vocab-runtime@2.2.4", "", { "dependencies": { "@js-temporal/polyfill": "^0.5.1", "@logtape/logtape": "^2.0.5", "@multiformats/base-x": "^4.0.1", "@opentelemetry/api": "^1.9.0", "asn1js": "^3.0.6", "byte-encodings": "^1.0.11", "jsonld": "^9.0.0", "pkijs": "^3.3.3" } }, "sha512-WOF6ei2P55gH2K0Sn1Hqwlf4zjqkYW8FrpQ63Z/BtCn0h2GtGnw6z9ocSUNsyD3Yej1HrwkpW3DfCPEFY8uK6w=="], + "@fedify/vocab-runtime": ["@fedify/vocab-runtime@2.2.5", "", { "dependencies": { "@js-temporal/polyfill": "^0.5.1", "@logtape/logtape": "^2.0.5", "@multiformats/base-x": "^4.0.1", "@opentelemetry/api": "^1.9.0", "asn1js": "^3.0.6", "byte-encodings": "^1.0.11", "jsonld": "^9.0.0", "pkijs": "^3.3.3" } }, "sha512-EiPkMwBqYsoSrllMOCFb0RTDwEO6XvppMmPa81lCux+7g9zXygKrJb9hJ9PP8Zi59+cJGqIF/Gdhug239+tZug=="], - "@fedify/vocab-tools": ["@fedify/vocab-tools@2.2.4", "", { "dependencies": { "@cfworker/json-schema": "^4.1.1", "byte-encodings": "^1.0.11", "es-toolkit": "^1.39.10", "yaml": "^2.8.1" } }, "sha512-hcbycBEGebLufCfc5uYhf0WzsksWYStkuDbFgtq0ZniZ9sYYJGIIFiQl2dZFkpAR6aAK6rnCqjyUWyL71dJ/IA=="], + "@fedify/vocab-tools": ["@fedify/vocab-tools@2.2.5", "", { "dependencies": { "@cfworker/json-schema": "^4.1.1", "byte-encodings": "^1.0.11", "es-toolkit": "^1.39.10", "yaml": "^2.8.1" } }, "sha512-D5GMXvcoSeNhI68BBPlpLHAlI7dqc0pheqj3NDCp9f5bBagXz7o+oevzzjZFxiHgxYQfRVoZ2N5lFNEy5d27gQ=="], - "@fedify/webfinger": ["@fedify/webfinger@2.2.4", "", { "dependencies": { "@fedify/vocab-runtime": "2.2.4", "@logtape/logtape": "^2.0.5", "@opentelemetry/api": "^1.9.0", "es-toolkit": "1.43.0" } }, "sha512-8zqtQB9CAwvy/qSR0QRFJvt/VbxY1r6LQpB2qGaBOXJYTsakWHOEHG/+zvprsRNS+seZXY77qpKumYDQ2jprGg=="], + "@fedify/webfinger": ["@fedify/webfinger@2.2.5", "", { "dependencies": { "@fedify/vocab-runtime": "2.2.5", "@logtape/logtape": "^2.0.5", "@opentelemetry/api": "^1.9.0", "es-toolkit": "1.43.0" } }, "sha512-NHJ0Q+YXbkE3mmQZhf5/UccSTOVUwtOCm9bQmFKGd8BbY5HCnjMceVZqLlCLT4AC6d7o5j9717KPl7+B2b7XvA=="], "@gridland/bun": ["@gridland/bun@0.4.3", "", { "dependencies": { "@gridland/utils": "0.4.3", "react": "^19.0.0", "react-reconciler": "0.33.0", "yoga-layout": "^3.2.1" }, "optionalDependencies": { "@opentui/core-darwin-arm64": "0.1.86", "@opentui/core-darwin-x64": "0.1.86", "@opentui/core-linux-arm64": "0.1.86", "@opentui/core-linux-x64": "0.1.86" } }, "sha512-pNOK9ncUJKLDiR84E61qHFRW1SG6IrmZNuSRjSmWgzS4rzXhgCPUesQOKz0dBk7dk8c1qcilyV2kEvUD9f1QnA=="], @@ -501,15 +501,15 @@ "@js-temporal/polyfill": ["@js-temporal/polyfill@0.5.1", "", { "dependencies": { "jsbi": "^4.3.0" } }, "sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ=="], - "@jscpd/badge-reporter": ["@jscpd/badge-reporter@4.2.4", "", { "dependencies": { "badgen": "^3.2.3", "colors": "^1.4.0", "fs-extra": "^11.2.0" } }, "sha512-g5vu05u0lX9rcHA0k3CptLfpOiuMzxh5+mUe2iYRAznTwH3ks6JAVAf9aPi5mBFttMCRiJh2zSt3xnSadHtMGg=="], + "@jscpd/badge-reporter": ["@jscpd/badge-reporter@4.0.4", "", { "dependencies": { "badgen": "3.2.3", "colors": "1.4.0", "fs-extra": "11.3.2" } }, "sha512-I9b4MmLXPM2vo0SxSUWnNGKcA4PjQlD3GzXvFK60z43cN/EIdLbOq3FVwCL+dg2obUqGXKIzAm7EsDFTg0D+mQ=="], - "@jscpd/core": ["@jscpd/core@4.2.4", "", { "dependencies": { "eventemitter3": "^5.0.1" } }, "sha512-9V9YzmmhYg9682kFqi+n0KGOhXNSoqxHbuIP3i/l/oSd6upBOnnSeBWDZMGOenQRQnyKEtCIbnS9YFz+3B+siQ=="], + "@jscpd/core": ["@jscpd/core@4.0.4", "", { "dependencies": { "eventemitter3": "5.0.1" } }, "sha512-QGMT3iXEX1fI6lgjPH+x8eyJwhwr2KkpSF5uBpjC0Z5Xloj0yFTFLtwJT+RhxP/Ob4WYrtx2jvpKB269oIwgMQ=="], - "@jscpd/finder": ["@jscpd/finder@4.2.4", "", { "dependencies": { "@jscpd/core": "4.2.4", "@jscpd/tokenizer": "4.2.4", "blamer": "^1.0.6", "bytes": "^3.1.2", "cli-table3": "^0.6.5", "colors": "^1.4.0", "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", "markdown-table": "^2.0.0", "pug": "^3.0.3" } }, "sha512-4LLEuAAmAraud/TAAlB5BByVdWfy7SYiPKacj5yEggpkNs0qsw2kiZ5EyU3LonB+/vntJJEDDpJMmvOeS58e0A=="], + "@jscpd/finder": ["@jscpd/finder@4.0.4", "", { "dependencies": { "@jscpd/core": "4.0.4", "@jscpd/tokenizer": "4.0.4", "blamer": "1.0.7", "bytes": "3.1.2", "cli-table3": "0.6.5", "colors": "1.4.0", "fast-glob": "3.3.3", "fs-extra": "11.3.2", "markdown-table": "2.0.0", "pug": "3.0.3" } }, "sha512-qVUWY7Nzuvfd5OIk+n7/5CM98LmFroLqblRXAI2gDABwZrc7qS+WH2SNr0qoUq0f4OqwM+piiwKvwL/VDNn/Cg=="], - "@jscpd/html-reporter": ["@jscpd/html-reporter@4.2.4", "", { "dependencies": { "colors": "1.4.0", "fs-extra": "^11.2.0", "pug": "^3.0.3" } }, "sha512-6UljCTVGf7O+o6D6fs1zNBG+vR1PTn47W2mSgb5hzSrvNw60rLrVoAMZMnr/TeIEdd/OEgAu+icbdvvVBfnvJw=="], + "@jscpd/html-reporter": ["@jscpd/html-reporter@4.0.4", "", { "dependencies": { "colors": "1.4.0", "fs-extra": "11.3.2", "pug": "3.0.3" } }, "sha512-YiepyeYkeH74Kx59PJRdUdonznct0wHPFkf6FLQN+mCBoy6leAWCcOfHtcexnp+UsBFDlItG5nRdKrDSxSH+Kg=="], - "@jscpd/tokenizer": ["@jscpd/tokenizer@4.2.4", "", { "dependencies": { "@jscpd/core": "4.2.4", "spark-md5": "^3.0.2" } }, "sha512-nM4kGyDvpcevt8t0zOsMQ82ShSc65c3LIQUHClTYwraiOGOmWgUQyen+JIiFCNF8eDCGR2Qa5iI5XBfGWYQzIg=="], + "@jscpd/tokenizer": ["@jscpd/tokenizer@4.0.4", "", { "dependencies": { "@jscpd/core": "4.0.4", "reprism": "0.0.11", "spark-md5": "3.0.2" } }, "sha512-xxYYY/qaLah/FlwogEbGIxx9CjDO+G9E6qawcy26WwrflzJb6wsnhjwdneN6Wb0RNCDsqvzY+bzG453jsin4UQ=="], "@logtape/logtape": ["@logtape/logtape@2.1.1", "", {}, "sha512-aULbCqUQGerfOsZ3CMvcKtueKzmdchluXYUd3bIHKmOIS93fx1ko0+hyRQ4flloGZ8EiyRPydZXiy8n1J/eAQA=="], @@ -687,11 +687,11 @@ "@types/minimatch": ["@types/minimatch@6.0.0", "", { "dependencies": { "minimatch": "10.2.4" } }, "sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA=="], - "@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="], + "@types/node": ["@types/node@25.9.3", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg=="], "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], - "@types/react": ["@types/react@19.2.16", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w=="], + "@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="], "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "19.2.14" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], @@ -707,25 +707,25 @@ "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.60.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.60.1", "@typescript-eslint/type-utils": "8.60.1", "@typescript-eslint/utils": "8.60.1", "@typescript-eslint/visitor-keys": "8.60.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.60.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.61.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.61.0", "@typescript-eslint/type-utils": "8.61.0", "@typescript-eslint/utils": "8.61.0", "@typescript-eslint/visitor-keys": "8.61.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.61.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.60.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.60.1", "@typescript-eslint/types": "8.60.1", "@typescript-eslint/typescript-estree": "8.60.1", "@typescript-eslint/visitor-keys": "8.60.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.61.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.61.0", "@typescript-eslint/types": "8.61.0", "@typescript-eslint/typescript-estree": "8.61.0", "@typescript-eslint/visitor-keys": "8.61.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.60.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.60.1", "@typescript-eslint/types": "^8.60.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.61.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.61.0", "@typescript-eslint/types": "^8.61.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.60.1", "", { "dependencies": { "@typescript-eslint/types": "8.60.1", "@typescript-eslint/visitor-keys": "8.60.1" } }, "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.61.0", "", { "dependencies": { "@typescript-eslint/types": "8.61.0", "@typescript-eslint/visitor-keys": "8.61.0" } }, "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.60.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.61.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.60.1", "", { "dependencies": { "@typescript-eslint/types": "8.60.1", "@typescript-eslint/typescript-estree": "8.60.1", "@typescript-eslint/utils": "8.60.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.61.0", "", { "dependencies": { "@typescript-eslint/types": "8.61.0", "@typescript-eslint/typescript-estree": "8.61.0", "@typescript-eslint/utils": "8.61.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.60.1", "", {}, "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.61.0", "", {}, "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.60.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.60.1", "@typescript-eslint/tsconfig-utils": "8.60.1", "@typescript-eslint/types": "8.60.1", "@typescript-eslint/visitor-keys": "8.60.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.61.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.61.0", "@typescript-eslint/tsconfig-utils": "8.61.0", "@typescript-eslint/types": "8.61.0", "@typescript-eslint/visitor-keys": "8.61.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.60.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.60.1", "@typescript-eslint/types": "8.60.1", "@typescript-eslint/typescript-estree": "8.60.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.61.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.61.0", "@typescript-eslint/types": "8.61.0", "@typescript-eslint/typescript-estree": "8.61.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.60.1", "", { "dependencies": { "@typescript-eslint/types": "8.60.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.61.0", "", { "dependencies": { "@typescript-eslint/types": "8.61.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ=="], "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], @@ -769,7 +769,7 @@ "@vitest/coverage-v8": ["@vitest/coverage-v8@4.1.8", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.1.8", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.2", "obug": "^2.1.1", "std-env": "^4.0.0-rc.1", "tinyrainbow": "^3.1.0" }, "peerDependencies": { "@vitest/browser": "4.1.8", "vitest": "4.1.8" }, "optionalPeers": ["@vitest/browser"] }, "sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw=="], - "@vitest/eslint-plugin": ["@vitest/eslint-plugin@1.6.19", "", { "dependencies": { "@typescript-eslint/scope-manager": "^8.58.0", "@typescript-eslint/utils": "^8.58.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "*", "eslint": ">=8.57.0", "typescript": ">=5.0.0", "vitest": "*" }, "optionalPeers": ["@typescript-eslint/eslint-plugin", "typescript", "vitest"] }, "sha512-zodmXRsVKFsuHxHJILuTFaaKsrsxm0YsiOX65clk+LpCW9JrVXaf6ERXr0caDs+NEk0S62Jyk0K7XYQ7gWXheA=="], + "@vitest/eslint-plugin": ["@vitest/eslint-plugin@1.6.20", "", { "dependencies": { "@typescript-eslint/scope-manager": "^8.58.0", "@typescript-eslint/utils": "^8.58.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "*", "eslint": ">=8.57.0", "typescript": ">=5.0.0", "vitest": "*" }, "optionalPeers": ["@typescript-eslint/eslint-plugin", "typescript", "vitest"] }, "sha512-xRwWHFG0Utp6hXtbGiWk4VdKXCGdExD8kbWrrmFEiG5dk8anOJ+vbWbeOa8EbkocKQRTsx7JAWETccZiBgFp/Q=="], "@vitest/expect": ["@vitest/expect@4.1.8", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.8", "@vitest/utils": "4.1.8", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ=="], @@ -893,8 +893,6 @@ "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], - "clean-regexp": ["clean-regexp@1.0.0", "", { "dependencies": { "escape-string-regexp": "1.0.5" } }, "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw=="], - "cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "4.2.3" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ=="], "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="], @@ -915,6 +913,18 @@ "core-js-compat": ["core-js-compat@3.49.0", "", { "dependencies": { "browserslist": "^4.28.1" } }, "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA=="], + "cpd-darwin-arm64": ["cpd-darwin-arm64@5.0.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-PkbfGYpQMqRliprPBs4U39FRNxXTAepPWKF8dj/OVBm6avE0OkJlkK6gtxxLe6mrS7S1Hen5R/UCQkyzXboPaw=="], + + "cpd-darwin-x64": ["cpd-darwin-x64@5.0.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-5vfR17HlL5LSikWxVH2R04YbH+hnLs0NAdxVtjtoVhjnr6xAHC2JRbnGUPu/PRMa5Ku6lIu5RkTm/HDA+A4ArA=="], + + "cpd-linux-arm64-gnu": ["cpd-linux-arm64-gnu@5.0.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-eOBVkjjmA54y1EGmSkjc59ZGGWVmWMdpr0NWqGgHahJKsWuYTEdYOyP2OkB+wj52KvGL3Gak2kTPbTJ51+MPTQ=="], + + "cpd-linux-x64-gnu": ["cpd-linux-x64-gnu@5.0.8", "", { "os": "linux", "cpu": "x64" }, "sha512-QKn47hJ9qBSgKPjYVDf+XSX3hFO3o1CTknS29s4yGyLo5knqEQhsI55WAMpIAruN+EQgiPo87NUQ5wZCm+kOOA=="], + + "cpd-linux-x64-musl": ["cpd-linux-x64-musl@5.0.8", "", { "os": "linux", "cpu": "x64" }, "sha512-3zHP9v7KcYjEzPftVz/quZWoMQWBFit/sLBAbku1k8kXW1u0ZRGCpXhOwJY1xuCKMa4k7dW8kmGdqioUguc3TA=="], + + "cpd-windows-x64-msvc": ["cpd-windows-x64-msvc@5.0.8", "", { "os": "win32", "cpu": "x64" }, "sha512-sxNzZ8lbMNTwWplH//s+e/79AmKTxT9GrM20ailLRdpTy6uXFAAAVxAyNJtK16YF5f6JoFEl+aIzaqlD+krwXA=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "3.1.1", "shebang-command": "2.0.0", "which": "2.0.2" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "1.0.0", "css-what": "6.2.2", "domhandler": "5.0.3", "domutils": "3.2.2", "nth-check": "2.1.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], @@ -941,7 +951,7 @@ "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "1.1.4", "has-property-descriptors": "1.0.2", "object-keys": "1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], - "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], + "detect-indent": ["detect-indent@7.0.2", "", {}, "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A=="], "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], @@ -969,7 +979,7 @@ "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - "effect": ["effect@3.21.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-rXd2FGDM8KdjSIrc+mqEELo7ScW7xTVxEf1iInmPSpIde9/nyGuFM710cjTo7/EreGXiUX2MOonPpprbz2XHCg=="], + "effect": ["effect@3.21.3", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-RqwU7WnJ6CqYhyjpOVJA5vh1Sgkn6eVECO6mnD0EjlbWcC2M3LJaPglXXr13Rdo/Y+B+wTEPzGRYFNL2xKxNeQ=="], "electron-to-chromium": ["electron-to-chromium@1.5.352", "", {}, "sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg=="], @@ -1031,7 +1041,7 @@ "eslint-plugin-sort-destructure-keys": ["eslint-plugin-sort-destructure-keys@3.0.0", "", { "dependencies": { "natural-compare-lite": "1.4.0" }, "peerDependencies": { "eslint": "10.1.0" } }, "sha512-ian2KEdGi8xZW50SVz9HIP9PDQN4XWeo3Hax3LsDk0ojL+wrwk40az8bKCnt3q2J7I3q5xF2ncZ0arj2q8Ou+A=="], - "eslint-plugin-unicorn": ["eslint-plugin-unicorn@64.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "@eslint-community/eslint-utils": "^4.9.1", "change-case": "^5.4.4", "ci-info": "^4.4.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.49.0", "find-up-simple": "^1.0.1", "globals": "^17.4.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.13.0", "semver": "^7.7.4", "strip-indent": "^4.1.1" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-rNZwalHh8i0UfPlhNwg5BTUO1CMdKNmjqe+TgzOTZnpKoi8VBgsW7u9qCHIdpxEzZ1uwrJrPF0uRb7l//K38gA=="], + "eslint-plugin-unicorn": ["eslint-plugin-unicorn@65.0.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "@eslint-community/eslint-utils": "^4.9.1", "change-case": "^5.4.4", "ci-info": "^4.4.0", "core-js-compat": "^3.49.0", "detect-indent": "^7.0.2", "find-up-simple": "^1.0.1", "globals": "^17.4.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regjsparser": "^0.13.0", "semver": "^7.7.4", "strip-indent": "^4.1.1" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-daCrQrgxOoOz2uMPWB3Y3vvv/5q+ncwICI8IjoebiwtW87CaY4tAN5EEiRXTYVnf7qi1v1BGBdHOSnZLV0rx6A=="], "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "4.3.1", "@types/estree": "1.0.8", "esrecurse": "4.3.0", "estraverse": "5.3.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], @@ -1295,7 +1305,7 @@ "jsbi": ["jsbi@4.3.2", "", {}, "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew=="], - "jscpd": ["jscpd@4.2.4", "", { "dependencies": { "@jscpd/badge-reporter": "4.2.4", "@jscpd/core": "4.2.4", "@jscpd/finder": "4.2.4", "@jscpd/html-reporter": "4.2.4", "@jscpd/tokenizer": "4.2.4", "colors": "^1.4.0", "commander": "^5.0.0", "fs-extra": "^11.2.0", "jscpd-sarif-reporter": "4.2.4" }, "bin": { "jscpd": "bin/jscpd" } }, "sha512-PSo2U0G8OxULayGyQMv7T/0ZQ+c3PPltdMOz/57v9Xnmq5xSIhh4cnZ0oYZPKqejy10aFwAbMVxqAlo24+PQ3g=="], + "jscpd": ["jscpd@5.0.8", "", { "optionalDependencies": { "cpd-darwin-arm64": "5.0.8", "cpd-darwin-x64": "5.0.8", "cpd-linux-arm64-gnu": "5.0.8", "cpd-linux-x64-gnu": "5.0.8", "cpd-linux-x64-musl": "5.0.8", "cpd-windows-x64-msvc": "5.0.8" }, "bin": { "jscpd": "run-jscpd.js", "cpd": "run-jscpd.js" } }, "sha512-dyP6fZZuHe8aks3iH3L02Ey3/CJgSPsLLgDlGCn79BmZ7Kxl5kX+NKWVpxQyBl/rNss2pcpEXgsx4MeuclRCJw=="], "jscpd-sarif-reporter": ["jscpd-sarif-reporter@4.0.5", "", { "dependencies": { "colors": "1.4.0", "fs-extra": "11.3.2", "node-sarif-builder": "3.4.0" } }, "sha512-cD1MtUdpomUPM5C0YD0vKZmdj+Gyr0KD5Bk47yGMrPCtwtgsK+7v59OzBIUjYOL8AuxNAt6hvPFo0PH+PYJh0Q=="], @@ -1567,9 +1577,9 @@ "rdf-canonize": ["rdf-canonize@5.0.0", "", { "dependencies": { "setimmediate": "^1.0.5" } }, "sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w=="], - "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + "react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="], - "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], + "react-dom": ["react-dom@19.2.7", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="], "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], @@ -1589,8 +1599,6 @@ "regexp-ast-analysis": ["regexp-ast-analysis@0.7.1", "", { "dependencies": { "@eslint-community/regexpp": "4.12.2", "refa": "0.12.1" } }, "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A=="], - "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], - "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "1.0.8", "define-properties": "1.2.1", "es-errors": "1.3.0", "get-proto": "1.0.1", "gopd": "1.2.0", "set-function-name": "2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], @@ -1759,7 +1767,7 @@ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], - "typescript-eslint": ["typescript-eslint@8.60.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.60.1", "@typescript-eslint/parser": "8.60.1", "@typescript-eslint/typescript-estree": "8.60.1", "@typescript-eslint/utils": "8.60.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA=="], + "typescript-eslint": ["typescript-eslint@8.61.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.61.0", "@typescript-eslint/parser": "8.61.0", "@typescript-eslint/typescript-estree": "8.61.0", "@typescript-eslint/utils": "8.61.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw=="], "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "1.0.4", "has-bigints": "1.1.0", "has-symbols": "1.1.0", "which-boxed-primitive": "1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], @@ -1853,6 +1861,8 @@ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@changesets/apply-release-plan/detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], + "@digitalbazaar/http-client/undici": ["undici@6.25.0", "", {}, "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg=="], "@effect/experimental/@effect/platform": ["@effect/platform@0.96.0", "", { "dependencies": { "find-my-way-ts": "0.1.6", "msgpackr": "1.11.5", "multipasta": "0.2.7" }, "peerDependencies": { "effect": "3.21.0" } }, "sha512-U7PLhkVzg7zzrgFvyWATOzD6reL87KG/fcdOxgLWBQ/J5CCU6qdPAVG+0o6o+IxcsLoqGwxs+rFxaFzrdtDV1A=="], @@ -1931,6 +1941,8 @@ "@prover-coder-ai/eslint-plugin-suggest-members/@typescript-eslint/utils": ["@typescript-eslint/utils@8.57.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.57.2", "@typescript-eslint/types": "8.57.2", "@typescript-eslint/typescript-estree": "8.57.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg=="], + "@prover-coder-ai/eslint-plugin-suggest-members/effect": ["effect@3.21.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-rXd2FGDM8KdjSIrc+mqEELo7ScW7xTVxEf1iInmPSpIde9/nyGuFM710cjTo7/EreGXiUX2MOonPpprbz2XHCg=="], + "@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], "@ton-ai-core/vibecode-linter/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "3.1.3", "fast-uri": "3.1.0", "json-schema-traverse": "1.0.0", "require-from-string": "2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -1947,7 +1959,7 @@ "@types/ws/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="], - "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "@typescript-eslint/typescript-estree/tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], "effect/fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], @@ -2005,10 +2017,6 @@ "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "jscpd/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "4.2.11", "jsonfile": "6.2.0", "universalify": "2.0.1" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], - - "jscpd/jscpd-sarif-reporter": ["jscpd-sarif-reporter@4.2.4", "", { "dependencies": { "colors": "^1.4.0", "fs-extra": "^11.2.0", "node-sarif-builder": "^3.4.0" } }, "sha512-JtX79kFSyAhqJh5TdLUcvtYJtJd1F8UW8b4Miaga+EIgUn2/nR0N2zWL9mH5cRXgbzLuQbbsw9kReUVIECApwQ=="], - "jscpd-sarif-reporter/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "4.2.11", "jsonfile": "6.2.0", "universalify": "2.0.1" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], "magicast/@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], @@ -2191,20 +2199,12 @@ "@prover-coder-ai/eslint-plugin-suggest-members/@typescript-eslint/utils/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "@prover-coder-ai/eslint-plugin-suggest-members/effect/fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], + "@ton-ai-core/vibecode-linter/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "@ton-ai-core/vibecode-linter/effect/fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], - "@ton-ai-core/vibecode-linter/jscpd/@jscpd/badge-reporter": ["@jscpd/badge-reporter@4.0.4", "", { "dependencies": { "badgen": "3.2.3", "colors": "1.4.0", "fs-extra": "11.3.2" } }, "sha512-I9b4MmLXPM2vo0SxSUWnNGKcA4PjQlD3GzXvFK60z43cN/EIdLbOq3FVwCL+dg2obUqGXKIzAm7EsDFTg0D+mQ=="], - - "@ton-ai-core/vibecode-linter/jscpd/@jscpd/core": ["@jscpd/core@4.0.4", "", { "dependencies": { "eventemitter3": "5.0.1" } }, "sha512-QGMT3iXEX1fI6lgjPH+x8eyJwhwr2KkpSF5uBpjC0Z5Xloj0yFTFLtwJT+RhxP/Ob4WYrtx2jvpKB269oIwgMQ=="], - - "@ton-ai-core/vibecode-linter/jscpd/@jscpd/finder": ["@jscpd/finder@4.0.4", "", { "dependencies": { "@jscpd/core": "4.0.4", "@jscpd/tokenizer": "4.0.4", "blamer": "1.0.7", "bytes": "3.1.2", "cli-table3": "0.6.5", "colors": "1.4.0", "fast-glob": "3.3.3", "fs-extra": "11.3.2", "markdown-table": "2.0.0", "pug": "3.0.3" } }, "sha512-qVUWY7Nzuvfd5OIk+n7/5CM98LmFroLqblRXAI2gDABwZrc7qS+WH2SNr0qoUq0f4OqwM+piiwKvwL/VDNn/Cg=="], - - "@ton-ai-core/vibecode-linter/jscpd/@jscpd/html-reporter": ["@jscpd/html-reporter@4.0.4", "", { "dependencies": { "colors": "1.4.0", "fs-extra": "11.3.2", "pug": "3.0.3" } }, "sha512-YiepyeYkeH74Kx59PJRdUdonznct0wHPFkf6FLQN+mCBoy6leAWCcOfHtcexnp+UsBFDlItG5nRdKrDSxSH+Kg=="], - - "@ton-ai-core/vibecode-linter/jscpd/@jscpd/tokenizer": ["@jscpd/tokenizer@4.0.4", "", { "dependencies": { "@jscpd/core": "4.0.4", "reprism": "0.0.11", "spark-md5": "3.0.2" } }, "sha512-xxYYY/qaLah/FlwogEbGIxx9CjDO+G9E6qawcy26WwrflzJb6wsnhjwdneN6Wb0RNCDsqvzY+bzG453jsin4UQ=="], - "@ton-ai-core/vibecode-linter/jscpd/fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "4.2.11", "jsonfile": "6.2.0", "universalify": "2.0.1" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], "@ton-ai-core/vibecode-linter/jscpd/jscpd-sarif-reporter": ["jscpd-sarif-reporter@4.0.6", "", { "dependencies": { "colors": "1.4.0", "fs-extra": "11.3.2", "node-sarif-builder": "3.4.0" } }, "sha512-b9Sm3IPZ3+m8Lwa4gZa+4/LhDhlc/ZLEsLXKSOy1DANQ6kx0ueqZT+fUHWEdQ6m0o3+RIVIa7DmvLSojQD05ng=="], @@ -2309,10 +2309,6 @@ "jscpd-sarif-reporter/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "jscpd/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "2.0.1" }, "optionalDependencies": { "graceful-fs": "4.2.11" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], - - "jscpd/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "node-sarif-builder/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "2.0.1" }, "optionalDependencies": { "graceful-fs": "4.2.11" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "node-sarif-builder/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], @@ -2383,6 +2379,8 @@ "@prover-coder-ai/eslint-plugin-suggest-members/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.57.2", "", { "dependencies": { "@typescript-eslint/types": "8.57.2", "eslint-visitor-keys": "^5.0.0" } }, "sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw=="], + "@prover-coder-ai/eslint-plugin-suggest-members/effect/fast-check/pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + "@ton-ai-core/vibecode-linter/effect/fast-check/pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], "@ton-ai-core/vibecode-linter/jscpd/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "2.0.1" }, "optionalDependencies": { "graceful-fs": "4.2.11" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], diff --git a/package.json b/package.json index e4fbdf45..91bf6175 100644 --- a/package.json +++ b/package.json @@ -62,8 +62,8 @@ "unrs-resolver" ], "overrides": { - "react": "19.2.4", - "react-dom": "19.2.4" + "react": "19.2.7", + "react-dom": "19.2.7" }, "repository": { "type": "git", diff --git a/packages/api/package.json b/packages/api/package.json index aacfc98e..a536bac8 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -24,9 +24,9 @@ "@effect/platform": "^0.96.1", "@effect/platform-node": "^0.107.0", "@effect/schema": "^0.75.5", - "@fedify/fedify": "^2.2.4", - "@fedify/vocab": "^2.2.4", - "effect": "^3.21.2", + "@fedify/fedify": "^2.2.5", + "@fedify/vocab": "^2.2.5", + "effect": "^3.21.3", "node-pty": "^1.1.0", "ws": "^8.21.0" }, @@ -42,10 +42,10 @@ "devDependencies": { "@effect/vitest": "^0.29.0", "@eslint/js": "10.0.1", - "@types/node": "^25.9.1", + "@types/node": "^25.9.3", "@types/ws": "^8.18.1", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", "eslint": "^10.4.1", "fast-check": "4.8.0", "globals": "^17.6.0", diff --git a/packages/app/package.json b/packages/app/package.json index 7a210473..40e4479c 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -79,9 +79,9 @@ "@effect/workflow": "^0.18.2", "@gridland/bun": "0.4.3", "@gridland/web": "0.4.3", - "effect": "^3.21.2", - "react": "19.2.4", - "react-dom": "19.2.4", + "effect": "^3.21.3", + "react": "19.2.7", + "react-dom": "19.2.7", "react-reconciler": "^0.33.0", "ts-morph": "^28.0.0" }, @@ -98,15 +98,15 @@ "@prover-coder-ai/docker-git-terminal": "workspace:*", "@prover-coder-ai/eslint-plugin-suggest-members": "^0.0.26", "@ton-ai-core/vibecode-linter": "^1.0.11", - "@types/node": "^25.9.1", - "@types/react": "^19.2.16", + "@types/node": "^25.9.3", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", "@types/ws": "^8.18.1", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", "@vitejs/plugin-react": "^6.0.2", "@vitest/coverage-v8": "^4.1.8", - "@vitest/eslint-plugin": "^1.6.19", + "@vitest/eslint-plugin": "^1.6.20", "biome": "npm:@biomejs/biome@^2.4.16", "eslint": "^10.4.1", "eslint-import-resolver-typescript": "^4.4.5", @@ -115,12 +115,12 @@ "eslint-plugin-simple-import-sort": "^13.0.0", "eslint-plugin-sonarjs": "^4.0.3", "eslint-plugin-sort-destructure-keys": "^3.0.0", - "eslint-plugin-unicorn": "^64.0.0", + "eslint-plugin-unicorn": "^65.0.1", "fast-check": "4.8.0", "globals": "^17.6.0", - "jscpd": "^4.2.4", + "jscpd": "^5.0.8", "typescript": "^6.0.3", - "typescript-eslint": "^8.60.1", + "typescript-eslint": "^8.61.0", "vite": "^8.0.16", "vitest": "^4.1.8", "ws": "^8.21.0" diff --git a/packages/docker-git-session-sync/package.json b/packages/docker-git-session-sync/package.json index 27b2b4a2..1c9d6fde 100644 --- a/packages/docker-git-session-sync/package.json +++ b/packages/docker-git-session-sync/package.json @@ -38,7 +38,7 @@ "packageManager": "bun@1.3.11", "devDependencies": { "@effect/vitest": "^0.29.0", - "@types/node": "^25.9.1", + "@types/node": "^25.9.3", "@vitejs/plugin-react": "^6.0.2", "typescript": "^6.0.3", "vite": "^8.0.16", diff --git a/packages/lib/package.json b/packages/lib/package.json index 55ae977b..0ea7aa74 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -46,7 +46,7 @@ "@effect/sql": "^0.51.1", "@effect/typeclass": "^0.40.0", "@effect/workflow": "^0.18.2", - "effect": "^3.21.2", + "effect": "^3.21.3", "ts-morph": "^28.0.0" }, "devDependencies": { @@ -61,10 +61,10 @@ "@eslint/js": "10.0.1", "@prover-coder-ai/eslint-plugin-suggest-members": "^0.0.26", "@ton-ai-core/vibecode-linter": "^1.0.11", - "@types/node": "^25.9.1", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", - "typescript-eslint": "^8.60.1", + "@types/node": "^25.9.3", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", + "typescript-eslint": "^8.61.0", "@vitest/coverage-v8": "^4.1.8", "eslint": "^10.4.1", "eslint-import-resolver-typescript": "^4.4.5", @@ -73,11 +73,11 @@ "eslint-plugin-simple-import-sort": "^13.0.0", "eslint-plugin-sonarjs": "^4.0.3", "eslint-plugin-sort-destructure-keys": "^3.0.0", - "eslint-plugin-unicorn": "^64.0.0", + "eslint-plugin-unicorn": "^65.0.1", "fast-check": "^4.8.0", - "@vitest/eslint-plugin": "^1.6.19", + "@vitest/eslint-plugin": "^1.6.20", "globals": "^17.6.0", - "jscpd": "^4.2.4", + "jscpd": "^5.0.8", "typescript": "^6.0.3", "vite": "^8.0.16", "vitest": "^4.1.8" diff --git a/packages/terminal/package.json b/packages/terminal/package.json index 3860b46a..0c64a18b 100644 --- a/packages/terminal/package.json +++ b/packages/terminal/package.json @@ -21,8 +21,8 @@ "@effect/platform": "^0.96.1", "@effect/platform-node": "^0.107.0", "@effect/schema": "^0.75.5", - "effect": "^3.21.2", - "react": "19.2.4", + "effect": "^3.21.3", + "react": "19.2.7", "xterm": "^5.3.0", "xterm-addon-fit": "^0.8.0" }, @@ -37,13 +37,13 @@ "@eslint/js": "10.0.1", "@prover-coder-ai/eslint-plugin-suggest-members": "^0.0.26", "@ton-ai-core/vibecode-linter": "^1.0.11", - "@types/node": "^25.9.1", - "@types/react": "^19.2.16", + "@types/node": "^25.9.3", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/eslint-plugin": "^8.61.0", + "@typescript-eslint/parser": "^8.61.0", "@vitest/coverage-v8": "^4.1.8", - "@vitest/eslint-plugin": "^1.6.19", + "@vitest/eslint-plugin": "^1.6.20", "eslint": "^10.4.1", "eslint-import-resolver-typescript": "^4.4.5", "eslint-plugin-codegen": "0.34.1", @@ -51,13 +51,13 @@ "eslint-plugin-simple-import-sort": "^13.0.0", "eslint-plugin-sonarjs": "^4.0.3", "eslint-plugin-sort-destructure-keys": "^3.0.0", - "eslint-plugin-unicorn": "^64.0.0", + "eslint-plugin-unicorn": "^65.0.1", "fast-check": "^4.8.0", "globals": "^17.6.0", - "jscpd": "^4.2.4", - "react-dom": "19.2.4", + "jscpd": "^5.0.8", + "react-dom": "19.2.7", "typescript": "^6.0.3", - "typescript-eslint": "^8.60.1", + "typescript-eslint": "^8.61.0", "vite": "^8.0.16", "vite-tsconfig-paths": "^6.1.1", "vitest": "^4.1.8" From 0121b9e652e249fbf48e7c3f93a54d5be02a07cc Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Fri, 12 Jun 2026 06:54:53 +0000 Subject: [PATCH 2/9] fix(lint): apply unicorn/prefer-includes rule from eslint-plugin-unicorn@65 eslint-plugin-unicorn v65 introduced prefer-includes-over-repeated-comparisons. Convert all flagged value===a||value===b chains to .includes() where TypeScript can infer the type, and suppress the rule on the one type-guard where .includes() breaks AgentMode narrowing. Also suppress unicorn/no-this-outside-of-class on the intentional TypeScript this-parameter stub in menu-shared.test.ts. Co-Authored-By: Claude Sonnet 4.6 --- packages/app/src/docker-git/api-container-tasks-codec.ts | 6 +----- packages/app/src/docker-git/api-project-codec.ts | 2 +- packages/app/src/docker-git/api-terminal-codec.ts | 2 +- .../src/docker-git/frontend-lib/core/auto-agent-flags.ts | 1 + packages/app/src/docker-git/menu-auth.ts | 3 +-- packages/app/src/docker-git/menu-project-auth.ts | 6 +----- packages/app/src/lib/usecases/docker-git-config-search.ts | 7 +------ packages/app/src/lib/usecases/state-repo/env.ts | 4 ++-- packages/app/src/web/actions-auth.ts | 6 +++--- packages/app/src/web/app-ready-terminal-storage.ts | 2 +- packages/app/src/web/app-ready-url.ts | 4 +--- packages/app/src/web/panel-auth.tsx | 4 ++-- packages/app/tests/docker-git/menu-shared.test.ts | 1 + 13 files changed, 17 insertions(+), 31 deletions(-) diff --git a/packages/app/src/docker-git/api-container-tasks-codec.ts b/packages/app/src/docker-git/api-container-tasks-codec.ts index 9b430a71..98ae324e 100644 --- a/packages/app/src/docker-git/api-container-tasks-codec.ts +++ b/packages/app/src/docker-git/api-container-tasks-codec.ts @@ -29,11 +29,7 @@ const readNumber = (value: JsonValue | undefined): number | null => const readBoolean = (value: JsonValue | undefined): boolean | null => typeof value === "boolean" ? value : null const isTaskKind = (value: string): value is ApiContainerTaskKind => - value === "ssh" || - value === "web-terminal" || - value === "agent" || - value === "background" || - value === "system" + ["ssh", "web-terminal", "agent", "background", "system"].includes(value) type DecodedContainerTaskFields = { readonly command: string | null diff --git a/packages/app/src/docker-git/api-project-codec.ts b/packages/app/src/docker-git/api-project-codec.ts index 990c6457..9efb34c8 100644 --- a/packages/app/src/docker-git/api-project-codec.ts +++ b/packages/app/src/docker-git/api-project-codec.ts @@ -55,7 +55,7 @@ type RawProjectDetailFields = { const isProjectStatus = ( value: string -): value is ApiProjectSummary["status"] => value === "running" || value === "stopped" || value === "unknown" +): value is ApiProjectSummary["status"] => ["running", "stopped", "unknown"].includes(value) const stringOrEmpty = (value: string | null): string => value ?? "" diff --git a/packages/app/src/docker-git/api-terminal-codec.ts b/packages/app/src/docker-git/api-terminal-codec.ts index 4e27c18e..488e6972 100644 --- a/packages/app/src/docker-git/api-terminal-codec.ts +++ b/packages/app/src/docker-git/api-terminal-codec.ts @@ -18,7 +18,7 @@ type RawTerminalSession = { const isTerminalSessionStatus = ( value: string ): value is ApiTerminalSession["status"] => - value === "ready" || value === "attached" || value === "exited" || value === "failed" + ["ready", "attached", "exited", "failed"].includes(value) const readOptionalNumber = (value: JsonValue | undefined): number | undefined => typeof value === "number" ? value : undefined diff --git a/packages/app/src/docker-git/frontend-lib/core/auto-agent-flags.ts b/packages/app/src/docker-git/frontend-lib/core/auto-agent-flags.ts index c5472b66..c754f4a6 100644 --- a/packages/app/src/docker-git/frontend-lib/core/auto-agent-flags.ts +++ b/packages/app/src/docker-git/frontend-lib/core/auto-agent-flags.ts @@ -14,6 +14,7 @@ export const resolveAutoAgentFlags = ( if (requested === "auto") { return Either.right({ agentMode: undefined, agentAuto: true }) } + // eslint-disable-next-line unicorn/prefer-includes-over-repeated-comparisons if (requested === "claude" || requested === "codex" || requested === "gemini" || requested === "grok") { return Either.right({ agentMode: requested, agentAuto: true }) } diff --git a/packages/app/src/docker-git/menu-auth.ts b/packages/app/src/docker-git/menu-auth.ts index c4444846..a8f89d05 100644 --- a/packages/app/src/docker-git/menu-auth.ts +++ b/packages/app/src/docker-git/menu-auth.ts @@ -99,8 +99,7 @@ const submitAuthPrompt = (view: AuthPromptView, context: AuthInputContext) => { const label = defaultLabel(nextValues["label"] ?? "") const effect = resolveAuthPromptEffect(view, context.state.cwd, nextValues) runAuthPromptEffect(effect, view, label, { ...context, cwd: context.state.cwd }, { - suspendTui: view.flow === "GithubOauth" || view.flow === "CodexOauth" || view.flow === "ClaudeOauth" || - view.flow === "ClaudeLogout" || view.flow === "GeminiOauth" || view.flow === "GrokOauth" + suspendTui: ["GithubOauth", "CodexOauth", "ClaudeOauth", "ClaudeLogout", "GeminiOauth", "GrokOauth"].includes(view.flow) }) } ) diff --git a/packages/app/src/docker-git/menu-project-auth.ts b/packages/app/src/docker-git/menu-project-auth.ts index a946e4a9..5bbba23e 100644 --- a/packages/app/src/docker-git/menu-project-auth.ts +++ b/packages/app/src/docker-git/menu-project-auth.ts @@ -130,11 +130,7 @@ const runProjectAuthAction = ( } if ( - action === "ProjectGithubDisconnect" || - action === "ProjectGitDisconnect" || - action === "ProjectClaudeDisconnect" || - action === "ProjectGeminiDisconnect" || - action === "ProjectGrokDisconnect" + ["ProjectGithubDisconnect", "ProjectGitDisconnect", "ProjectClaudeDisconnect", "ProjectGeminiDisconnect", "ProjectGrokDisconnect"].includes(action) ) { runProjectAuthEffect(view.project, action, {}, "default", context) return diff --git a/packages/app/src/lib/usecases/docker-git-config-search.ts b/packages/app/src/lib/usecases/docker-git-config-search.ts index 28b7847d..1fcc154b 100644 --- a/packages/app/src/lib/usecases/docker-git-config-search.ts +++ b/packages/app/src/lib/usecases/docker-git-config-search.ts @@ -12,12 +12,7 @@ type DockerGitConfigSearchState = { const isDockerGitConfig = (entry: string): boolean => entry.endsWith("docker-git.json") const shouldSkipDir = (entry: string): boolean => - entry === ".git" || - entry === ".orch" || - entry === ".docker-git" || - entry === ".cache" || - entry === "node_modules" || - entry === "tmp" + [".git", ".orch", ".docker-git", ".cache", "node_modules", "tmp"].includes(entry) const isNotFoundStatError = (error: PlatformError): boolean => error._tag === "SystemError" && error.reason === "NotFound" diff --git a/packages/app/src/lib/usecases/state-repo/env.ts b/packages/app/src/lib/usecases/state-repo/env.ts index ef5f986b..c7171087 100644 --- a/packages/app/src/lib/usecases/state-repo/env.ts +++ b/packages/app/src/lib/usecases/state-repo/env.ts @@ -1,12 +1,12 @@ /* jscpd:ignore-start */ export const isTruthyEnv = (value: string): boolean => { const normalized = value.trim().toLowerCase() - return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on" + return ["1", "true", "yes", "on"].includes(normalized) } export const isFalsyEnv = (value: string): boolean => { const normalized = value.trim().toLowerCase() - return normalized === "0" || normalized === "false" || normalized === "no" || normalized === "off" + return ["0", "false", "no", "off"].includes(normalized) } export const autoPullEnvKey = "DOCKER_GIT_STATE_AUTO_PULL" diff --git a/packages/app/src/web/actions-auth.ts b/packages/app/src/web/actions-auth.ts index eb6757b9..111c0322 100644 --- a/packages/app/src/web/actions-auth.ts +++ b/packages/app/src/web/actions-auth.ts @@ -184,13 +184,13 @@ const openProjectAuthPrompt = ( const isMenuNavigationAction = ( action: AuthMenuAction | ProjectAuthMenuAction -): action is "Back" | "Refresh" => action === "Back" || action === "Refresh" +): action is "Back" | "Refresh" => ["Back", "Refresh"].includes(action) const isCodexAuthAction = (action: BrowserAuthPrompt["action"]): action is CodexAuthAction => - action === "CodexOauth" || action === "CodexLogout" + ["CodexOauth", "CodexLogout"].includes(action) const isTerminalOnlyAuthAction = (action: BrowserAuthPrompt["action"]): action is TerminalAuthFlow => - action === "ClaudeOauth" || action === "GeminiOauth" || action === "GrokOauth" + ["ClaudeOauth", "GeminiOauth", "GrokOauth"].includes(action) const runCodexAuthAction = ( action: CodexAuthAction, diff --git a/packages/app/src/web/app-ready-terminal-storage.ts b/packages/app/src/web/app-ready-terminal-storage.ts index 9d221b4a..385b593e 100644 --- a/packages/app/src/web/app-ready-terminal-storage.ts +++ b/packages/app/src/web/app-ready-terminal-storage.ts @@ -43,7 +43,7 @@ const readJsonArray = (value: JsonValue | undefined): ReadonlyArray | const isStoredTerminalStatus = ( value: string | null ): value is ActiveTerminalSession["session"]["status"] => - value === "ready" || value === "attached" || value === "exited" || value === "failed" + ["ready", "attached", "exited", "failed"].includes(value as string) type StoredTerminalSessionFields = { readonly createdAt: string | null diff --git a/packages/app/src/web/app-ready-url.ts b/packages/app/src/web/app-ready-url.ts index 845f0621..75f230ca 100644 --- a/packages/app/src/web/app-ready-url.ts +++ b/packages/app/src/web/app-ready-url.ts @@ -117,9 +117,7 @@ const resolveProjectId = ( return null } const project = projects.find((candidate) => - candidate.id === normalizedToken || - candidate.projectKey === normalizedToken || - candidate.displayName === normalizedToken + [candidate.id, candidate.projectKey, candidate.displayName].includes(normalizedToken) ) return project?.id ?? null } diff --git a/packages/app/src/web/panel-auth.tsx b/packages/app/src/web/panel-auth.tsx index 1fdbac83..87deb5cd 100644 --- a/packages/app/src/web/panel-auth.tsx +++ b/packages/app/src/web/panel-auth.tsx @@ -7,10 +7,10 @@ import { Box, Text } from "./elements.js" import { ActionLine, ActionPromptPanel, SnapshotLine } from "./panel-auth-shared.js" const actionHint = (action: string | null): string | undefined => { - if (action === "ClaudeOauth" || action === "GeminiOauth" || action === "GrokOauth") { + if (["ClaudeOauth", "GeminiOauth", "GrokOauth"].includes(action ?? "")) { return "opens embedded terminal" } - if (action === "GithubOauth" || action === "CodexOauth") { + if (["GithubOauth", "CodexOauth"].includes(action ?? "")) { return "controller web login" } return undefined diff --git a/packages/app/tests/docker-git/menu-shared.test.ts b/packages/app/tests/docker-git/menu-shared.test.ts index ddf9a191..37fb7bbe 100644 --- a/packages/app/tests/docker-git/menu-shared.test.ts +++ b/packages/app/tests/docker-git/menu-shared.test.ts @@ -49,6 +49,7 @@ const restoreTerminalBindings = (): void => { } const createRawModeStub = (events: Array): typeof process.stdin.setRawMode => + // eslint-disable-next-line unicorn/no-this-outside-of-class function setRawModeStub(this: typeof process.stdin, enabled: boolean) { events.push(`raw:${String(enabled)}`) return this From c97670be84a606a154d4ac9d09a0649c8f379ff5 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Fri, 12 Jun 2026 06:55:54 +0000 Subject: [PATCH 3/9] fix(test): rewrite setRawMode stub as arrow function to avoid this outside class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the named function with this-parameter with an arrow function that returns process.stdin directly — no eslint-disable needed. Co-Authored-By: Claude Sonnet 4.6 --- packages/app/tests/docker-git/menu-shared.test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/app/tests/docker-git/menu-shared.test.ts b/packages/app/tests/docker-git/menu-shared.test.ts index 37fb7bbe..b5572148 100644 --- a/packages/app/tests/docker-git/menu-shared.test.ts +++ b/packages/app/tests/docker-git/menu-shared.test.ts @@ -49,10 +49,9 @@ const restoreTerminalBindings = (): void => { } const createRawModeStub = (events: Array): typeof process.stdin.setRawMode => - // eslint-disable-next-line unicorn/no-this-outside-of-class - function setRawModeStub(this: typeof process.stdin, enabled: boolean) { + (enabled: boolean) => { events.push(`raw:${String(enabled)}`) - return this + return process.stdin } const createWriteStub = ( From 679bd087e661ac3b2bafd0ef9d4fce9fe00a3b3a Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Fri, 12 Jun 2026 06:59:41 +0000 Subject: [PATCH 4/9] fix(lint): remove eslint-disable and forbidden cast from unicorn fixes - auto-agent-flags: replace ||=== chain with agentModes.find() so TypeScript narrows AgentMode without a type cast and no eslint-disable comment is needed - app-ready-terminal-storage: guard with value !== null before .includes() so the string|null parameter works without an `as string` cast Co-Authored-By: Claude Sonnet 4.6 --- .../src/docker-git/frontend-lib/core/auto-agent-flags.ts | 7 ++++--- packages/app/src/web/app-ready-terminal-storage.ts | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/app/src/docker-git/frontend-lib/core/auto-agent-flags.ts b/packages/app/src/docker-git/frontend-lib/core/auto-agent-flags.ts index c754f4a6..cec874a5 100644 --- a/packages/app/src/docker-git/frontend-lib/core/auto-agent-flags.ts +++ b/packages/app/src/docker-git/frontend-lib/core/auto-agent-flags.ts @@ -14,9 +14,10 @@ export const resolveAutoAgentFlags = ( if (requested === "auto") { return Either.right({ agentMode: undefined, agentAuto: true }) } - // eslint-disable-next-line unicorn/prefer-includes-over-repeated-comparisons - if (requested === "claude" || requested === "codex" || requested === "gemini" || requested === "grok") { - return Either.right({ agentMode: requested, agentAuto: true }) + const agentModes: readonly AgentMode[] = ["claude", "codex", "gemini", "grok"] + const matchedMode = agentModes.find((mode) => mode === requested) + if (matchedMode !== undefined) { + return Either.right({ agentMode: matchedMode, agentAuto: true }) } return Either.left({ _tag: "InvalidOption", diff --git a/packages/app/src/web/app-ready-terminal-storage.ts b/packages/app/src/web/app-ready-terminal-storage.ts index 385b593e..c18bd740 100644 --- a/packages/app/src/web/app-ready-terminal-storage.ts +++ b/packages/app/src/web/app-ready-terminal-storage.ts @@ -43,7 +43,7 @@ const readJsonArray = (value: JsonValue | undefined): ReadonlyArray | const isStoredTerminalStatus = ( value: string | null ): value is ActiveTerminalSession["session"]["status"] => - ["ready", "attached", "exited", "failed"].includes(value as string) + value !== null && ["ready", "attached", "exited", "failed"].includes(value) type StoredTerminalSessionFields = { readonly createdAt: string | null From 667e8d5b8cb64ed3a5e50ca7ceae3bc1f3434b04 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Fri, 12 Jun 2026 09:01:14 +0000 Subject: [PATCH 5/9] fix(lint): address remaining unicorn v65 violations and pin React to 19.2.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - prefer-includes: host-errors.ts (error._tag chain → .includes()) - prefer-includes: lib/core/auto-agent-flags.ts (same find() pattern as frontend-lib) - prefer-includes: app-terminal-session-handlers.ts (split 3-undefined chain into individual early returns to preserve TypeScript narrowing) - consistent-compound-words: rename isUnixUserName→isUnixUsername, sshUserNamePatternDescription→sshUsernamePatternDescription, unixUserNamePattern→unixUsernamePattern across frontend-lib/core/domain.ts, frontend-lib/core/command-builders-shared.ts, lib/core/domain.ts, lib/core/command-builders-shared.ts, lib/shell/config.ts - React: re-pin react/react-dom to 19.2.4 in root overrides, packages/app, packages/terminal (Renovate bumped them back to 19.2.7) All 448 tests pass locally. Co-Authored-By: Claude Sonnet 4.6 --- package.json | 4 ++-- packages/app/package.json | 4 ++-- .../frontend-lib/core/command-builders-shared.ts | 8 ++++---- .../app/src/docker-git/frontend-lib/core/domain.ts | 8 ++++---- packages/app/src/docker-git/host-errors.ts | 7 +------ packages/app/src/lib/core/auto-agent-flags.ts | 6 ++++-- packages/app/src/lib/core/command-builders-shared.ts | 8 ++++---- packages/app/src/lib/core/domain.ts | 8 ++++---- packages/app/src/lib/shell/config.ts | 8 ++++---- .../app/src/web/app-terminal-session-handlers.ts | 12 ++++++------ packages/terminal/package.json | 4 ++-- 11 files changed, 37 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index 91bf6175..e4fbdf45 100644 --- a/package.json +++ b/package.json @@ -62,8 +62,8 @@ "unrs-resolver" ], "overrides": { - "react": "19.2.7", - "react-dom": "19.2.7" + "react": "19.2.4", + "react-dom": "19.2.4" }, "repository": { "type": "git", diff --git a/packages/app/package.json b/packages/app/package.json index 40e4479c..c281d5b8 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -80,8 +80,8 @@ "@gridland/bun": "0.4.3", "@gridland/web": "0.4.3", "effect": "^3.21.3", - "react": "19.2.7", - "react-dom": "19.2.7", + "react": "19.2.4", + "react-dom": "19.2.4", "react-reconciler": "^0.33.0", "ts-morph": "^28.0.0" }, diff --git a/packages/app/src/docker-git/frontend-lib/core/command-builders-shared.ts b/packages/app/src/docker-git/frontend-lib/core/command-builders-shared.ts index 45d41080..0a015881 100644 --- a/packages/app/src/docker-git/frontend-lib/core/command-builders-shared.ts +++ b/packages/app/src/docker-git/frontend-lib/core/command-builders-shared.ts @@ -6,9 +6,9 @@ import { defaultTemplateConfig, isDockerNetworkMode, isGpuMode, - isUnixUserName, + isUnixUsername, type ParseError, - sshUserNamePatternDescription + sshUsernamePatternDescription } from "./domain.js" const parsePort = (value: string): Either.Either => { @@ -106,11 +106,11 @@ export const parseSshUser = ( option: "--ssh-user" }) } - if (!isUnixUserName(candidate)) { + if (!isUnixUsername(candidate)) { return Either.left({ _tag: "InvalidOption", option: "--ssh-user", - reason: `expected Linux user name matching ${sshUserNamePatternDescription}` + reason: `expected Linux user name matching ${sshUsernamePatternDescription}` }) } return Either.right(candidate) diff --git a/packages/app/src/docker-git/frontend-lib/core/domain.ts b/packages/app/src/docker-git/frontend-lib/core/domain.ts index 1e188ef0..8c5787ed 100644 --- a/packages/app/src/docker-git/frontend-lib/core/domain.ts +++ b/packages/app/src/docker-git/frontend-lib/core/domain.ts @@ -64,20 +64,20 @@ export type AgentMode = "claude" | "codex" | "gemini" | "grok" export type DockerNetworkMode = "shared" | "project" export type GpuMode = "none" | "all" -const unixUserNamePattern = /^[a-z_][a-z0-9_-]{0,31}$/ +const unixUsernamePattern = /^[a-z_][a-z0-9_-]{0,31}$/ -export const sshUserNamePatternDescription = "^[a-z_][a-z0-9_-]{0,31}$" +export const sshUsernamePatternDescription = "^[a-z_][a-z0-9_-]{0,31}$" // CHANGE: define the SSH user name invariant in the core domain // WHY: generated Dockerfiles and entrypoints interpolate sshUser into shell-sensitive user commands // QUOTE(ТЗ): n/a // REF: PR-281-coderabbit-sshUser-validation // SOURCE: n/a -// FORMAT THEOREM: forall u: isUnixUserName(u) -> not contains_shell_metacharacters(u) +// FORMAT THEOREM: forall u: isUnixUsername(u) -> not contains_shell_metacharacters(u) // PURITY: CORE // INVARIANT: accepted user names contain only lowercase Linux account-name characters // COMPLEXITY: O(n)/O(1) where n = |value| -export const isUnixUserName = (value: string): boolean => unixUserNamePattern.test(value) +export const isUnixUsername = (value: string): boolean => unixUsernamePattern.test(value) export interface TemplateConfig { readonly containerName: string diff --git a/packages/app/src/docker-git/host-errors.ts b/packages/app/src/docker-git/host-errors.ts index c92e6883..7badb4fd 100644 --- a/packages/app/src/docker-git/host-errors.ts +++ b/packages/app/src/docker-git/host-errors.ts @@ -56,12 +56,7 @@ export type HostError = export type CliError = ParseError | HostError const isParseError = (error: CliError): error is ParseError => - error._tag === "UnknownCommand" || - error._tag === "UnknownOption" || - error._tag === "MissingOptionValue" || - error._tag === "MissingRequiredOption" || - error._tag === "InvalidOption" || - error._tag === "UnexpectedArgument" + ["UnknownCommand", "UnknownOption", "MissingOptionValue", "MissingRequiredOption", "InvalidOption", "UnexpectedArgument"].includes(error._tag) const renderApiRequestError = (error: ApiRequestError): string => error.displayOnlyMessage === true diff --git a/packages/app/src/lib/core/auto-agent-flags.ts b/packages/app/src/lib/core/auto-agent-flags.ts index c5472b66..cec874a5 100644 --- a/packages/app/src/lib/core/auto-agent-flags.ts +++ b/packages/app/src/lib/core/auto-agent-flags.ts @@ -14,8 +14,10 @@ export const resolveAutoAgentFlags = ( if (requested === "auto") { return Either.right({ agentMode: undefined, agentAuto: true }) } - if (requested === "claude" || requested === "codex" || requested === "gemini" || requested === "grok") { - return Either.right({ agentMode: requested, agentAuto: true }) + const agentModes: readonly AgentMode[] = ["claude", "codex", "gemini", "grok"] + const matchedMode = agentModes.find((mode) => mode === requested) + if (matchedMode !== undefined) { + return Either.right({ agentMode: matchedMode, agentAuto: true }) } return Either.left({ _tag: "InvalidOption", diff --git a/packages/app/src/lib/core/command-builders-shared.ts b/packages/app/src/lib/core/command-builders-shared.ts index 45d41080..0a015881 100644 --- a/packages/app/src/lib/core/command-builders-shared.ts +++ b/packages/app/src/lib/core/command-builders-shared.ts @@ -6,9 +6,9 @@ import { defaultTemplateConfig, isDockerNetworkMode, isGpuMode, - isUnixUserName, + isUnixUsername, type ParseError, - sshUserNamePatternDescription + sshUsernamePatternDescription } from "./domain.js" const parsePort = (value: string): Either.Either => { @@ -106,11 +106,11 @@ export const parseSshUser = ( option: "--ssh-user" }) } - if (!isUnixUserName(candidate)) { + if (!isUnixUsername(candidate)) { return Either.left({ _tag: "InvalidOption", option: "--ssh-user", - reason: `expected Linux user name matching ${sshUserNamePatternDescription}` + reason: `expected Linux user name matching ${sshUsernamePatternDescription}` }) } return Either.right(candidate) diff --git a/packages/app/src/lib/core/domain.ts b/packages/app/src/lib/core/domain.ts index 9041ae89..d12cff9f 100644 --- a/packages/app/src/lib/core/domain.ts +++ b/packages/app/src/lib/core/domain.ts @@ -64,20 +64,20 @@ export type AgentMode = "claude" | "codex" | "gemini" | "grok" export type DockerNetworkMode = "shared" | "project" export type GpuMode = "none" | "all" -const unixUserNamePattern = /^[a-z_][a-z0-9_-]{0,31}$/ +const unixUsernamePattern = /^[a-z_][a-z0-9_-]{0,31}$/ -export const sshUserNamePatternDescription = "^[a-z_][a-z0-9_-]{0,31}$" +export const sshUsernamePatternDescription = "^[a-z_][a-z0-9_-]{0,31}$" // CHANGE: define the SSH user name invariant in the core domain // WHY: generated Dockerfiles and entrypoints interpolate sshUser into shell-sensitive user commands // QUOTE(ТЗ): n/a // REF: PR-281-coderabbit-sshUser-validation // SOURCE: n/a -// FORMAT THEOREM: forall u: isUnixUserName(u) -> not contains_shell_metacharacters(u) +// FORMAT THEOREM: forall u: isUnixUsername(u) -> not contains_shell_metacharacters(u) // PURITY: CORE // INVARIANT: accepted user names contain only lowercase Linux account-name characters // COMPLEXITY: O(n)/O(1) where n = |value| -export const isUnixUserName = (value: string): boolean => unixUserNamePattern.test(value) +export const isUnixUsername = (value: string): boolean => unixUsernamePattern.test(value) export interface TemplateConfig { readonly containerName: string diff --git a/packages/app/src/lib/shell/config.ts b/packages/app/src/lib/shell/config.ts index 37c63ceb..8e9567c7 100644 --- a/packages/app/src/lib/shell/config.ts +++ b/packages/app/src/lib/shell/config.ts @@ -9,9 +9,9 @@ import { Effect, Either } from "effect" import { defaultTemplateConfig, - isUnixUserName, + isUnixUsername, type ProjectConfig, - sshUserNamePatternDescription + sshUsernamePatternDescription } from "../core/domain.js" import { ConfigDecodeError, ConfigNotFoundError } from "./errors.js" import { resolveBaseDir } from "./paths.js" @@ -102,12 +102,12 @@ const validateProjectConfig = ( path: string, config: ProjectConfig ): Effect.Effect => - isUnixUserName(config.template.sshUser) + isUnixUsername(config.template.sshUser) ? Effect.succeed(config) : Effect.fail( new ConfigDecodeError({ path, - message: `template.sshUser must match ${sshUserNamePatternDescription}` + message: `template.sshUser must match ${sshUsernamePatternDescription}` }) ) diff --git a/packages/app/src/web/app-terminal-session-handlers.ts b/packages/app/src/web/app-terminal-session-handlers.ts index e2011f34..532d2b08 100644 --- a/packages/app/src/web/app-terminal-session-handlers.ts +++ b/packages/app/src/web/app-terminal-session-handlers.ts @@ -183,12 +183,12 @@ const projectTerminalAction = ( projectKey: string | undefined, terminalSessionId: string | undefined, action: (projectKey: string, terminalSessionId: string) => void -): (() => void) | undefined => - projectId === undefined || projectKey === undefined || terminalSessionId === undefined - ? undefined - : () => { - action(projectKey, terminalSessionId) - } +): (() => void) | undefined => { + if (projectId === undefined) return undefined + if (projectKey === undefined) return undefined + if (terminalSessionId === undefined) return undefined + return () => { action(projectKey, terminalSessionId) } +} export const useProjectActionHandlers = ( { onOpenTaskManagerRequest, projectId, projectKey, projectLabel, setMessage, terminalSessionId }: diff --git a/packages/terminal/package.json b/packages/terminal/package.json index 0c64a18b..28d5fa6b 100644 --- a/packages/terminal/package.json +++ b/packages/terminal/package.json @@ -22,7 +22,7 @@ "@effect/platform-node": "^0.107.0", "@effect/schema": "^0.75.5", "effect": "^3.21.3", - "react": "19.2.7", + "react": "19.2.4", "xterm": "^5.3.0", "xterm-addon-fit": "^0.8.0" }, @@ -55,7 +55,7 @@ "fast-check": "^4.8.0", "globals": "^17.6.0", "jscpd": "^5.0.8", - "react-dom": "19.2.7", + "react-dom": "19.2.4", "typescript": "^6.0.3", "typescript-eslint": "^8.61.0", "vite": "^8.0.16", From 79e4d4fe2152951613301616efc1bc506f05fc6e Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Fri, 12 Jun 2026 09:13:28 +0000 Subject: [PATCH 6/9] chore: regenerate bun.lock after React 19.2.4 pin bun install --frozen-lockfile was failing because package.json files were updated to pin react/react-dom to 19.2.4 but bun.lock still referenced 19.2.7. This caused all CI jobs to fail at install time. Co-Authored-By: Claude Sonnet 4.6 --- bun.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/bun.lock b/bun.lock index c0823a8f..8e2fc608 100644 --- a/bun.lock +++ b/bun.lock @@ -62,8 +62,8 @@ "@gridland/web": "0.4.3", "@prover-coder-ai/docker-git-session-sync": "workspace:*", "effect": "^3.21.3", - "react": "19.2.7", - "react-dom": "19.2.7", + "react": "19.2.4", + "react-dom": "19.2.4", "react-reconciler": "^0.33.0", "ts-morph": "^28.0.0", }, @@ -184,7 +184,7 @@ "@effect/platform-node": "^0.107.0", "@effect/schema": "^0.75.5", "effect": "^3.21.3", - "react": "19.2.7", + "react": "19.2.4", "xterm": "^5.3.0", "xterm-addon-fit": "^0.8.0", }, @@ -217,7 +217,7 @@ "fast-check": "^4.8.0", "globals": "^17.6.0", "jscpd": "^5.0.8", - "react-dom": "19.2.7", + "react-dom": "19.2.4", "typescript": "^6.0.3", "typescript-eslint": "^8.61.0", "vite": "^8.0.16", @@ -233,8 +233,8 @@ "@parcel/watcher", ], "overrides": { - "react": "19.2.7", - "react-dom": "19.2.7", + "react": "19.2.4", + "react-dom": "19.2.4", }, "packages": { "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "7.28.5", "js-tokens": "4.0.0", "picocolors": "1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], @@ -1577,9 +1577,9 @@ "rdf-canonize": ["rdf-canonize@5.0.0", "", { "dependencies": { "setimmediate": "^1.0.5" } }, "sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w=="], - "react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="], + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], - "react-dom": ["react-dom@19.2.7", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="], + "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], From 99b7eaf57f6651fa097b2ddf766c91a14b382ed4 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 13 Jun 2026 05:47:09 +0000 Subject: [PATCH 7/9] =?UTF-8?q?fix(lint,test):=20fix=20remaining=20unicorn?= =?UTF-8?q?=20violations=20and=20apply=20Biome=20http=E2=86=92https=20auto?= =?UTF-8?q?-fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lint: - errors.ts, gitlab-token-preflight.ts: convert remaining || === chains to .includes() Biome auto-fix (useHttpsProtocol and other rules applied to test files): - terminal-session-client.test.ts: mock URL http→https; update ws:// expectation to wss:// - controller-health.test.ts: http://controller.test → https://controller.test - controller-ready.test.ts: DOCKER_GIT_API_URL and expectations http→https - controller-revision.test.ts: .split("/")[0] → .split("/", 1)[0] - app-ready-create-fixture.ts: " " → " ".repeat(3) - menu-shared.test.ts: arrow function formatting CI setup: bump bun CI runner from 1.3.11 to 1.3.14 to match local dev environment All 448 tests pass locally. Co-Authored-By: Claude Sonnet 4.6 --- .github/actions/setup/action.yml | 2 +- packages/app/src/lib/usecases/errors.ts | 7 +------ packages/app/src/lib/usecases/gitlab-token-preflight.ts | 2 +- .../app/tests/docker-git/app-ready-create-fixture.ts | 2 +- packages/app/tests/docker-git/controller-health.test.ts | 2 +- packages/app/tests/docker-git/controller-ready.test.ts | 6 +++--- .../app/tests/docker-git/controller-revision.test.ts | 2 +- packages/app/tests/docker-git/menu-shared.test.ts | 9 ++++----- .../app/tests/docker-git/terminal-session-client.test.ts | 4 ++-- 9 files changed, 15 insertions(+), 21 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 0b19744d..0887ea34 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -4,7 +4,7 @@ inputs: bun-version: description: The version of Bun to install required: true - default: 1.3.11 + default: 1.3.14 node-version: description: The version of Node.js to install for compatibility/native builds required: true diff --git a/packages/app/src/lib/usecases/errors.ts b/packages/app/src/lib/usecases/errors.ts index 8b169b6d..13fd72a5 100644 --- a/packages/app/src/lib/usecases/errors.ts +++ b/packages/app/src/lib/usecases/errors.ts @@ -48,12 +48,7 @@ export type AppError = type NonParseError = Exclude const isParseError = (error: AppError): error is ParseError => - error._tag === "UnknownCommand" || - error._tag === "UnknownOption" || - error._tag === "MissingOptionValue" || - error._tag === "MissingRequiredOption" || - error._tag === "InvalidOption" || - error._tag === "UnexpectedArgument" + ["UnknownCommand", "UnknownOption", "MissingOptionValue", "MissingRequiredOption", "InvalidOption", "UnexpectedArgument"].includes(error._tag) const renderDockerAccessHeadline = (issue: DockerAccessError["issue"]): string => issue === "PermissionDenied" diff --git a/packages/app/src/lib/usecases/gitlab-token-preflight.ts b/packages/app/src/lib/usecases/gitlab-token-preflight.ts index 72c0247a..c680b2e2 100644 --- a/packages/app/src/lib/usecases/gitlab-token-preflight.ts +++ b/packages/app/src/lib/usecases/gitlab-token-preflight.ts @@ -93,7 +93,7 @@ const mapGitlabRepoAccessStatus = (status: number): GitlabRepoAccessStatus => { if (status >= 200 && status < 300) { return "accessible" } - if (status === 401 || status === 403 || status === 404) { + if ([401, 403, 404].includes(status)) { return "notAccessible" } return "unknown" diff --git a/packages/app/tests/docker-git/app-ready-create-fixture.ts b/packages/app/tests/docker-git/app-ready-create-fixture.ts index 3db675fc..a22b6128 100644 --- a/packages/app/tests/docker-git/app-ready-create-fixture.ts +++ b/packages/app/tests/docker-git/app-ready-create-fixture.ts @@ -292,7 +292,7 @@ export const expectEmptyRepoInlineError = ( submitCreateInputsMock: SubmitCreateInputsMock, mode: CreateSubmitMode = "advance" ) => { - const createView = createInitialFlowView(" ") + const createView = createInitialFlowView(" ".repeat(3)) const { context, setCreateViewSpy } = runSubmitCreateView(submitCreateView, createView, { mode }) expect(submitCreateInputsMock).not.toHaveBeenCalled() diff --git a/packages/app/tests/docker-git/controller-health.test.ts b/packages/app/tests/docker-git/controller-health.test.ts index f3bd375e..8a3e270b 100644 --- a/packages/app/tests/docker-git/controller-health.test.ts +++ b/packages/app/tests/docker-git/controller-health.test.ts @@ -48,7 +48,7 @@ const withHealthClient = ( revisions: ReadonlyArray, effect: (baseUrl: string) => Effect.Effect ): Effect.Effect => - effect("http://controller.test").pipe(Effect.provideService(HttpClient.HttpClient, makeHealthClient(revisions))) + effect("https://controller.test").pipe(Effect.provideService(HttpClient.HttpClient, makeHealthClient(revisions))) describe("controller health", () => { it.effect("selects the first reachable candidate whose revision matches the expected revision", () => diff --git a/packages/app/tests/docker-git/controller-ready.test.ts b/packages/app/tests/docker-git/controller-ready.test.ts index d6d431a7..4f24cb56 100644 --- a/packages/app/tests/docker-git/controller-ready.test.ts +++ b/packages/app/tests/docker-git/controller-ready.test.ts @@ -98,10 +98,10 @@ describe("controller readiness bootstrap", () => { it.effect("probes explicit API URL before preparing a local controller revision", () => Effect.gen(function*(_) { - process.env["DOCKER_GIT_API_URL"] = "http://api.example.test" + process.env["DOCKER_GIT_API_URL"] = "https://api.example.test" findReachableDirectHealthProbeMock.mockImplementation(({ explicitApiBaseUrl }) => Effect.succeed({ - apiBaseUrl: explicitApiBaseUrl ?? "http://api.example.test", + apiBaseUrl: explicitApiBaseUrl ?? "https://api.example.test", revision: "remote-revision" }) ) @@ -116,7 +116,7 @@ describe("controller readiness bootstrap", () => { expect(prepareLocalControllerRevisionMock).not.toHaveBeenCalled() expect(prepareControllerResourceLimitEnvMock).not.toHaveBeenCalled() expect(prepareControllerRuntimeEnvMock).not.toHaveBeenCalled() - expect(resolveApiBaseUrl()).toBe("http://api.example.test") + expect(resolveApiBaseUrl()).toBe("https://api.example.test") })) it.effect("falls back to local bootstrap when the default local API URL is not reachable", () => diff --git a/packages/app/tests/docker-git/controller-revision.test.ts b/packages/app/tests/docker-git/controller-revision.test.ts index 29049498..f8cd2664 100644 --- a/packages/app/tests/docker-git/controller-revision.test.ts +++ b/packages/app/tests/docker-git/controller-revision.test.ts @@ -141,7 +141,7 @@ const createMemoryFileSystemLayer = () => { if (candidate === directory || !candidate.startsWith(prefix)) { continue } - const name = candidate.slice(prefix.length).split("/")[0] + const name = candidate.slice(prefix.length).split("/", 1)[0] if (name !== undefined && name.length > 0) { names.add(name) } diff --git a/packages/app/tests/docker-git/menu-shared.test.ts b/packages/app/tests/docker-git/menu-shared.test.ts index b5572148..52081906 100644 --- a/packages/app/tests/docker-git/menu-shared.test.ts +++ b/packages/app/tests/docker-git/menu-shared.test.ts @@ -48,11 +48,10 @@ const restoreTerminalBindings = (): void => { Object.defineProperty(process.stdout, "isTTY", { configurable: true, value: originalStdoutTty }) } -const createRawModeStub = (events: Array): typeof process.stdin.setRawMode => - (enabled: boolean) => { - events.push(`raw:${String(enabled)}`) - return process.stdin - } +const createRawModeStub = (events: Array): typeof process.stdin.setRawMode => (enabled: boolean) => { + events.push(`raw:${String(enabled)}`) + return process.stdin +} const createWriteStub = ( events: Array diff --git a/packages/app/tests/docker-git/terminal-session-client.test.ts b/packages/app/tests/docker-git/terminal-session-client.test.ts index 24188a66..5645dcbb 100644 --- a/packages/app/tests/docker-git/terminal-session-client.test.ts +++ b/packages/app/tests/docker-git/terminal-session-client.test.ts @@ -194,7 +194,7 @@ describe("terminal-session-client", () => { vi.useFakeTimers() vi.resetModules() resolveApiBaseUrlMock.mockReset() - resolveApiBaseUrlMock.mockReturnValue("http://controller.example/api") + resolveApiBaseUrlMock.mockReturnValue("https://controller.example/api") writeToTerminalMock.mockReset() setRawModeMock.mockClear() stdinOnMock.mockClear() @@ -247,7 +247,7 @@ describe("terminal-session-client", () => { const socket = firstSocket() expect(socket.url).toBe( - "ws://controller.example/api/projects/%2Fcontroller%2Fprovercoderai%2Fdocker-git%2Fmain/terminal-sessions/session-1/ws?cols=132&rows=40" + "wss://controller.example/api/projects/%2Fcontroller%2Fprovercoderai%2Fdocker-git%2Fmain/terminal-sessions/session-1/ws?cols=132&rows=40" ) expect(socket.sent).toEqual([]) expect(setRawModeMock).toHaveBeenCalledWith(false) From a80a0f5351306e6bf5594c8edd9e79bc3c549343 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 13 Jun 2026 05:53:33 +0000 Subject: [PATCH 8/9] fix(lint): apply unicorn v65 fixes to packages/lib/src (missed in previous commits) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same changes as packages/app/src/lib — the lib package has its own copy that also gets linted: - prefer-includes: docker-git-config-search, state-repo/env, errors, gitlab-token-preflight - prefer-includes + find() pattern: core/auto-agent-flags (preserves AgentMode narrowing) - consistent-compound-words: isUnixUsername, sshUsernamePatternDescription, unixUsernamePattern in core/domain, core/command-builders-shared, shell/config Co-Authored-By: Claude Sonnet 4.6 --- packages/lib/src/core/auto-agent-flags.ts | 6 ++++-- packages/lib/src/core/command-builders-shared.ts | 8 ++++---- packages/lib/src/core/domain.ts | 8 ++++---- packages/lib/src/shell/config.ts | 8 ++++---- packages/lib/src/usecases/docker-git-config-search.ts | 7 +------ packages/lib/src/usecases/errors.ts | 7 +------ packages/lib/src/usecases/gitlab-token-preflight.ts | 2 +- packages/lib/src/usecases/state-repo/env.ts | 4 ++-- 8 files changed, 21 insertions(+), 29 deletions(-) diff --git a/packages/lib/src/core/auto-agent-flags.ts b/packages/lib/src/core/auto-agent-flags.ts index bd6bf1ed..f32c6391 100644 --- a/packages/lib/src/core/auto-agent-flags.ts +++ b/packages/lib/src/core/auto-agent-flags.ts @@ -13,8 +13,10 @@ export const resolveAutoAgentFlags = ( if (requested === "auto") { return Either.right({ agentMode: undefined, agentAuto: true }) } - if (requested === "claude" || requested === "codex" || requested === "gemini" || requested === "grok") { - return Either.right({ agentMode: requested, agentAuto: true }) + const agentModes: readonly AgentMode[] = ["claude", "codex", "gemini", "grok"] + const matchedMode = agentModes.find((mode) => mode === requested) + if (matchedMode !== undefined) { + return Either.right({ agentMode: matchedMode, agentAuto: true }) } return Either.left({ _tag: "InvalidOption", diff --git a/packages/lib/src/core/command-builders-shared.ts b/packages/lib/src/core/command-builders-shared.ts index da574b85..955caa63 100644 --- a/packages/lib/src/core/command-builders-shared.ts +++ b/packages/lib/src/core/command-builders-shared.ts @@ -5,9 +5,9 @@ import { defaultTemplateConfig, isDockerNetworkMode, isGpuMode, - isUnixUserName, + isUnixUsername, type ParseError, - sshUserNamePatternDescription + sshUsernamePatternDescription } from "./domain.js" const parsePort = (value: string): Either.Either => { @@ -105,11 +105,11 @@ export const parseSshUser = ( option: "--ssh-user" }) } - if (!isUnixUserName(candidate)) { + if (!isUnixUsername(candidate)) { return Either.left({ _tag: "InvalidOption", option: "--ssh-user", - reason: `expected Linux user name matching ${sshUserNamePatternDescription}` + reason: `expected Linux user name matching ${sshUsernamePatternDescription}` }) } return Either.right(candidate) diff --git a/packages/lib/src/core/domain.ts b/packages/lib/src/core/domain.ts index fa101e1f..91b9c543 100644 --- a/packages/lib/src/core/domain.ts +++ b/packages/lib/src/core/domain.ts @@ -63,20 +63,20 @@ export type AgentMode = "claude" | "codex" | "gemini" | "grok" export type DockerNetworkMode = "shared" | "project" export type GpuMode = "none" | "all" -const unixUserNamePattern = /^[a-z_][a-z0-9_-]{0,31}$/ +const unixUsernamePattern = /^[a-z_][a-z0-9_-]{0,31}$/ -export const sshUserNamePatternDescription = "^[a-z_][a-z0-9_-]{0,31}$" +export const sshUsernamePatternDescription = "^[a-z_][a-z0-9_-]{0,31}$" // CHANGE: define the SSH user name invariant in the core domain // WHY: generated Dockerfiles and entrypoints interpolate sshUser into shell-sensitive user commands // QUOTE(ТЗ): n/a // REF: PR-281-coderabbit-sshUser-validation // SOURCE: n/a -// FORMAT THEOREM: forall u: isUnixUserName(u) -> not contains_shell_metacharacters(u) +// FORMAT THEOREM: forall u: isUnixUsername(u) -> not contains_shell_metacharacters(u) // PURITY: CORE // INVARIANT: accepted user names contain only lowercase Linux account-name characters // COMPLEXITY: O(n)/O(1) where n = |value| -export const isUnixUserName = (value: string): boolean => unixUserNamePattern.test(value) +export const isUnixUsername = (value: string): boolean => unixUsernamePattern.test(value) export interface TemplateConfig { readonly containerName: string diff --git a/packages/lib/src/shell/config.ts b/packages/lib/src/shell/config.ts index f4a0d0e9..bf7d2127 100644 --- a/packages/lib/src/shell/config.ts +++ b/packages/lib/src/shell/config.ts @@ -8,9 +8,9 @@ import { Effect, Either } from "effect" import { defaultTemplateConfig, - isUnixUserName, + isUnixUsername, type ProjectConfig, - sshUserNamePatternDescription + sshUsernamePatternDescription } from "../core/domain.js" import { ConfigDecodeError, ConfigNotFoundError } from "./errors.js" import { resolveBaseDir } from "./paths.js" @@ -101,12 +101,12 @@ const validateProjectConfig = ( path: string, config: ProjectConfig ): Effect.Effect => - isUnixUserName(config.template.sshUser) + isUnixUsername(config.template.sshUser) ? Effect.succeed(config) : Effect.fail( new ConfigDecodeError({ path, - message: `template.sshUser must match ${sshUserNamePatternDescription}` + message: `template.sshUser must match ${sshUsernamePatternDescription}` }) ) diff --git a/packages/lib/src/usecases/docker-git-config-search.ts b/packages/lib/src/usecases/docker-git-config-search.ts index 95f6af84..68f37947 100644 --- a/packages/lib/src/usecases/docker-git-config-search.ts +++ b/packages/lib/src/usecases/docker-git-config-search.ts @@ -11,12 +11,7 @@ type DockerGitConfigSearchState = { const isDockerGitConfig = (entry: string): boolean => entry.endsWith("docker-git.json") const shouldSkipDir = (entry: string): boolean => - entry === ".git" || - entry === ".orch" || - entry === ".docker-git" || - entry === ".cache" || - entry === "node_modules" || - entry === "tmp" + [".git", ".orch", ".docker-git", ".cache", "node_modules", "tmp"].includes(entry) const isNotFoundStatError = (error: PlatformError): boolean => error._tag === "SystemError" && error.reason === "NotFound" diff --git a/packages/lib/src/usecases/errors.ts b/packages/lib/src/usecases/errors.ts index d84f1414..a6a823c1 100644 --- a/packages/lib/src/usecases/errors.ts +++ b/packages/lib/src/usecases/errors.ts @@ -47,12 +47,7 @@ export type AppError = type NonParseError = Exclude const isParseError = (error: AppError): error is ParseError => - error._tag === "UnknownCommand" || - error._tag === "UnknownOption" || - error._tag === "MissingOptionValue" || - error._tag === "MissingRequiredOption" || - error._tag === "InvalidOption" || - error._tag === "UnexpectedArgument" + ["UnknownCommand", "UnknownOption", "MissingOptionValue", "MissingRequiredOption", "InvalidOption", "UnexpectedArgument"].includes(error._tag) const renderDockerAccessHeadline = (issue: DockerAccessError["issue"]): string => issue === "PermissionDenied" diff --git a/packages/lib/src/usecases/gitlab-token-preflight.ts b/packages/lib/src/usecases/gitlab-token-preflight.ts index 72c0247a..c680b2e2 100644 --- a/packages/lib/src/usecases/gitlab-token-preflight.ts +++ b/packages/lib/src/usecases/gitlab-token-preflight.ts @@ -93,7 +93,7 @@ const mapGitlabRepoAccessStatus = (status: number): GitlabRepoAccessStatus => { if (status >= 200 && status < 300) { return "accessible" } - if (status === 401 || status === 403 || status === 404) { + if ([401, 403, 404].includes(status)) { return "notAccessible" } return "unknown" diff --git a/packages/lib/src/usecases/state-repo/env.ts b/packages/lib/src/usecases/state-repo/env.ts index 30d10a7f..41931436 100644 --- a/packages/lib/src/usecases/state-repo/env.ts +++ b/packages/lib/src/usecases/state-repo/env.ts @@ -1,11 +1,11 @@ export const isTruthyEnv = (value: string): boolean => { const normalized = value.trim().toLowerCase() - return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on" + return ["1", "true", "yes", "on"].includes(normalized) } export const isFalsyEnv = (value: string): boolean => { const normalized = value.trim().toLowerCase() - return normalized === "0" || normalized === "false" || normalized === "no" || normalized === "off" + return ["0", "false", "no", "off"].includes(normalized) } export const autoPullEnvKey = "DOCKER_GIT_STATE_AUTO_PULL" From 5a0b70b9b61e74cf880bc3dab2d87e328f795a1d Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 13 Jun 2026 06:35:28 +0000 Subject: [PATCH 9/9] fix(test): update lib/tests to use renamed isUnixUsername identifiers packages/lib/tests/shell/config.test.ts still referenced isUnixUserName (old name) after the consistent-compound-words rename. Updated import and all usages to isUnixUsername. Co-Authored-By: Claude Sonnet 4.6 --- packages/lib/tests/shell/config.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/lib/tests/shell/config.test.ts b/packages/lib/tests/shell/config.test.ts index b0b3ed74..ccbd9c81 100644 --- a/packages/lib/tests/shell/config.test.ts +++ b/packages/lib/tests/shell/config.test.ts @@ -5,7 +5,7 @@ import { describe, expect, it } from "@effect/vitest" import { Effect } from "effect" import * as fc from "fast-check" -import { defaultTemplateConfig, isUnixUserName, type TemplateConfig } from "../../src/core/domain.js" +import { defaultTemplateConfig, isUnixUsername, type TemplateConfig } from "../../src/core/domain.js" import { readProjectConfig } from "../../src/shell/config.js" const makeTemplateConfig = (overrides: Partial = {}): TemplateConfig => ({ @@ -53,7 +53,7 @@ const invalidPersistedSshUserArbitrary = fc.oneof( "dev:foo", "dev\nfoo" ), - fc.string({ minLength: 33, maxLength: 96 }).filter((value) => !isUnixUserName(value)) + fc.string({ minLength: 33, maxLength: 96 }).filter((value) => !isUnixUsername(value)) ) describe("readProjectConfig", () => { @@ -85,7 +85,7 @@ describe("readProjectConfig", () => { it("generates only invalid persisted sshUser candidates", () => { fc.assert( fc.property(invalidPersistedSshUserArbitrary, (sshUser) => { - expect(isUnixUserName(sshUser)).toBe(false) + expect(isUnixUsername(sshUser)).toBe(false) }) ) })