diff --git a/.cspell.json b/.cspell.json index bc52b48..77fab9c 100644 --- a/.cspell.json +++ b/.cspell.json @@ -51,6 +51,7 @@ "globset", "hexdigit", "Homebrew", + "inlines", "journaled", "keypair", "Kratos", @@ -98,6 +99,7 @@ "toplevel", "topo", "tungstenite", + "uluru", "unmatch", "unrs", "vitaliytv", @@ -139,8 +141,10 @@ "бандлили", "батчинг", "Батчинг", + "батчингу", "батчі", "батчу", + "беклогу", "биндинги", "Биндінг", "білдах", @@ -255,6 +259,8 @@ "ін'єктуються", "інвалідація", "інвалідаціями", + "інвалідованих", + "інвалідували", "інвалідована", "інвалідований", "інвалідованого", @@ -571,6 +577,7 @@ "тенанта", "тенанти", "тенантів", + "термінації", "термінацію", "термінація", "типо", @@ -586,6 +593,8 @@ "фейл", "фейлиться", "фейляться", + "упоровся", + "фенсити", "фенсить", "фенситься", "фетчиться", diff --git a/.v8rignore b/.v8rignore index 0d9a4df..7d05ce0 100644 --- a/.v8rignore +++ b/.v8rignore @@ -4,3 +4,5 @@ .cursor/hooks.json .marksman.toml .claude/settings.local.json +crates/mt-core/tests/fixtures/name-vectors.json +layers/schemas/layers.schema.json diff --git a/bun.lock b/bun.lock index 4e4bddf..b1ddb13 100644 --- a/bun.lock +++ b/bun.lock @@ -9,11 +9,12 @@ "@7n/rules": "^1.55.3", "@7n/rules-ci-github": "^1.9.0", "@7n/rules-lang-js": "^0.9.0", - "@7n/rules-lang-rust": "^0.6.1", + "@7n/rules-lang-rust": "^0.16.1", "@nitra/cspell-dict": "^2.2.2", "@nitra/eslint-config": "^3.10.3", "@stryker-mutator/vitest-runner": "^9.6.1", "@vitest/coverage-v8": "^4.1.10", + "knip": "^6.32.1", "vitest": "^4.1.10", }, }, @@ -37,6 +38,7 @@ }, "trustedDependencies": [ "unrs-resolver", + "tree-sitter-rust", ], "packages": { "@7n/layers": ["@7n/layers@workspace:layers"], @@ -57,7 +59,7 @@ "@7n/rules-lang-js": ["@7n/rules-lang-js@0.9.0", "", { "dependencies": { "eslint": "^10.4.1", "globby": "^16.0.0", "ignore": "^7.0.5", "jscpd": "^5.0.11", "knip": "^6.22.0", "oxc-parser": "^0.137.0", "oxlint": "^1.68.0", "stylelint": "^17.6.0" }, "peerDependencies": { "@7n/rules": ">=1.27.0", "vue": "^3.0.0" }, "optionalPeers": ["vue"] }, "sha512-brPVWO46EXuSNIUbGF36tQCUirnrhbeIvKWhU+I0tHDevuxDMqojlETc8AuzxD+vVjxXCN1mH732LCdLfeT6UA=="], - "@7n/rules-lang-rust": ["@7n/rules-lang-rust@0.6.1", "", { "dependencies": { "smol-toml": "^1.7.0" }, "peerDependencies": { "@7n/rules": ">=1.15.0" } }, "sha512-V/UCQYWO9DCCmr1aD0SJ0JiEXfNARsgZTs9Px+i1LycaHLDC+qH8pi3kcBD4R/EiNLIZdVxEg6W4pN9aXn4xmg=="], + "@7n/rules-lang-rust": ["@7n/rules-lang-rust@0.16.1", "", { "dependencies": { "globby": "^16.0.0", "smol-toml": "^1.7.0", "tree-sitter-rust": "^0.24.0", "web-tree-sitter": "^0.26.11" }, "peerDependencies": { "@7n/llm-lib": ">=1.2.0", "@7n/rules": ">=1.52.0" }, "optionalPeers": ["@7n/llm-lib"] }, "sha512-nfk9HU+JRSPRoU7A3yB7vsi+zkGFdkhy+MmMlHWqyD5FqVGW92lweLVKU8q64Drdir6OcAQ7QNUi16V/U/+PrA=="], "@agentclientprotocol/claude-agent-acp": ["@agentclientprotocol/claude-agent-acp@0.59.0", "", { "dependencies": { "@agentclientprotocol/sdk": "1.2.1", "@anthropic-ai/claude-agent-sdk": "0.3.207", "zod": "^3.25.0 || ^4.0.0" }, "bin": { "claude-agent-acp": "dist/index.js" } }, "sha512-GejLH5qxsI5IoSDfhyOVDEsRNxqi6y0Rcj5FstVeOwMACSht/bUXII0HILbzOQNoA5qlyZle3FRvf+CAjD7Rpg=="], @@ -503,43 +505,43 @@ "@oxc-project/types": ["@oxc-project/types@0.137.0", "", {}, "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA=="], - "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.21.3", "", { "os": "android", "cpu": "arm" }, "sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg=="], + "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA=="], - "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.21.3", "", { "os": "android", "cpu": "arm64" }, "sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw=="], + "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg=="], - "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.21.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg=="], + "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w=="], - "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.21.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg=="], + "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q=="], - "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.21.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw=="], + "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw=="], - "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ=="], + "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg=="], - "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ=="], + "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA=="], - "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ=="], + "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA=="], - "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw=="], + "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw=="], - "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.21.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A=="], + "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA=="], - "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og=="], + "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw=="], - "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw=="], + "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w=="], - "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.21.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q=="], + "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ=="], - "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q=="], + "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg=="], - "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA=="], + "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw=="], - "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.21.3", "", { "os": "none", "cpu": "arm64" }, "sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg=="], + "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg=="], - "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.21.3", "", { "dependencies": { "@emnapi/core": "1.11.0", "@emnapi/runtime": "1.11.0", "@napi-rs/wasm-runtime": "^1.1.5" }, "cpu": "none" }, "sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA=="], + "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.24.2", "", { "dependencies": { "@emnapi/core": "1.11.2", "@emnapi/runtime": "1.11.2", "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q=="], - "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.21.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg=="], + "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg=="], - "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.21.3", "", { "os": "win32", "cpu": "x64" }, "sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q=="], + "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw=="], "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.75.0", "", { "os": "android", "cpu": "arm" }, "sha512-lutovtFzJqlRaqpZrCqSSGaHZzl9nIxxpjLzhSRLunN6dCLylj0uzlCyQGaQDIys7rrv8kVXiFO+R4Zpn0bX7g=="], @@ -1201,7 +1203,7 @@ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], + "get-tsconfig": ["get-tsconfig@4.14.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-Dz/6HxkrxgNehhxLVeyv8sad9UzF2xBVeaKBQNDfJ5XiSXmp2gTR0eO0RWiT2NCKS5aGP9jjkOMggTN90qU50A=="], "github-actionlint": ["github-actionlint@1.7.12", "", { "dependencies": { "adm-zip": "^0.5.16", "tar": "^7.4.0" }, "bin": { "github-actionlint": "dist/bin/actionlint.js" } }, "sha512-kSVz5clt9voatp2Tdh1BETKNooT358/nPChYseaDC4M6f9Hc/sBRMbhagx2FTu2F/WHzDoxlNPh2EqwBngTYQg=="], @@ -1469,7 +1471,7 @@ "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], - "knip": ["knip@6.27.0", "", { "dependencies": { "fdir": "^6.5.0", "formatly": "^0.3.0", "get-tsconfig": "4.14.0", "jiti": "^2.7.0", "oxc-parser": "^0.137.0", "oxc-resolver": "11.21.3", "picomatch": "^4.0.4", "smol-toml": "^1.6.1", "strip-json-comments": "5.0.3", "tinyglobby": "^0.2.17", "unbash": "^4.0.1", "yaml": "^2.9.0", "zod": "^4.1.11" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-CngYEYrD0n20N06FXA8n3u/0Wnnugoa+B9k14OP+iKIgkCHuzvIdsP3nfwjhByoc1WfogpxfiriMboAXFETDUw=="], + "knip": ["knip@6.32.1", "", { "dependencies": { "fdir": "^6.5.0", "formatly": "^0.3.0", "get-tsconfig": "4.14.1", "jiti": "^2.7.0", "oxc-parser": "^0.142.0", "oxc-resolver": "11.24.2", "picomatch": "^4.0.5", "smol-toml": "^1.7.1", "strip-json-comments": "5.0.3", "tinyglobby": "^0.2.17", "unbash": "^4.0.4", "yaml": "^2.9.0", "zod": "^4.4.3" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-mIiIHMTJVUgSlz0mxEgPt7wg8DmfbCp1Txqab3WpbMCJF7YHvHtC9jeAHHXfISMl72N8WzhyG71SQlaqCOGZtg=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], @@ -1685,12 +1687,16 @@ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + "node-addon-api": ["node-addon-api@8.9.1", "", {}, "sha512-4eUQWVPCUUUiBjLnHS3cXWeC6ryoPUc0U3rP7IuzapoGbzMqd/r6KKO0clr0b+snQhsrueFEhCZDdK+LK7hxKg=="], + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], "node-exports-info": ["node-exports-info@1.6.2", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag=="], "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + "node-releases": ["node-releases@2.0.51", "", {}, "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], @@ -1731,7 +1737,7 @@ "oxc-parser": ["oxc-parser@0.137.0", "", { "dependencies": { "@oxc-project/types": "^0.137.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.137.0", "@oxc-parser/binding-android-arm64": "0.137.0", "@oxc-parser/binding-darwin-arm64": "0.137.0", "@oxc-parser/binding-darwin-x64": "0.137.0", "@oxc-parser/binding-freebsd-x64": "0.137.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.137.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.137.0", "@oxc-parser/binding-linux-arm64-gnu": "0.137.0", "@oxc-parser/binding-linux-arm64-musl": "0.137.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.137.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.137.0", "@oxc-parser/binding-linux-riscv64-musl": "0.137.0", "@oxc-parser/binding-linux-s390x-gnu": "0.137.0", "@oxc-parser/binding-linux-x64-gnu": "0.137.0", "@oxc-parser/binding-linux-x64-musl": "0.137.0", "@oxc-parser/binding-openharmony-arm64": "0.137.0", "@oxc-parser/binding-wasm32-wasi": "0.137.0", "@oxc-parser/binding-win32-arm64-msvc": "0.137.0", "@oxc-parser/binding-win32-ia32-msvc": "0.137.0", "@oxc-parser/binding-win32-x64-msvc": "0.137.0" } }, "sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg=="], - "oxc-resolver": ["oxc-resolver@11.21.3", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.21.3", "@oxc-resolver/binding-android-arm64": "11.21.3", "@oxc-resolver/binding-darwin-arm64": "11.21.3", "@oxc-resolver/binding-darwin-x64": "11.21.3", "@oxc-resolver/binding-freebsd-x64": "11.21.3", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.21.3", "@oxc-resolver/binding-linux-arm-musleabihf": "11.21.3", "@oxc-resolver/binding-linux-arm64-gnu": "11.21.3", "@oxc-resolver/binding-linux-arm64-musl": "11.21.3", "@oxc-resolver/binding-linux-ppc64-gnu": "11.21.3", "@oxc-resolver/binding-linux-riscv64-gnu": "11.21.3", "@oxc-resolver/binding-linux-riscv64-musl": "11.21.3", "@oxc-resolver/binding-linux-s390x-gnu": "11.21.3", "@oxc-resolver/binding-linux-x64-gnu": "11.21.3", "@oxc-resolver/binding-linux-x64-musl": "11.21.3", "@oxc-resolver/binding-openharmony-arm64": "11.21.3", "@oxc-resolver/binding-wasm32-wasi": "11.21.3", "@oxc-resolver/binding-win32-arm64-msvc": "11.21.3", "@oxc-resolver/binding-win32-x64-msvc": "11.21.3" } }, "sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA=="], + "oxc-resolver": ["oxc-resolver@11.24.2", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.24.2", "@oxc-resolver/binding-android-arm64": "11.24.2", "@oxc-resolver/binding-darwin-arm64": "11.24.2", "@oxc-resolver/binding-darwin-x64": "11.24.2", "@oxc-resolver/binding-freebsd-x64": "11.24.2", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.24.2", "@oxc-resolver/binding-linux-arm-musleabihf": "11.24.2", "@oxc-resolver/binding-linux-arm64-gnu": "11.24.2", "@oxc-resolver/binding-linux-arm64-musl": "11.24.2", "@oxc-resolver/binding-linux-ppc64-gnu": "11.24.2", "@oxc-resolver/binding-linux-riscv64-gnu": "11.24.2", "@oxc-resolver/binding-linux-riscv64-musl": "11.24.2", "@oxc-resolver/binding-linux-s390x-gnu": "11.24.2", "@oxc-resolver/binding-linux-x64-gnu": "11.24.2", "@oxc-resolver/binding-linux-x64-musl": "11.24.2", "@oxc-resolver/binding-openharmony-arm64": "11.24.2", "@oxc-resolver/binding-wasm32-wasi": "11.24.2", "@oxc-resolver/binding-win32-arm64-msvc": "11.24.2", "@oxc-resolver/binding-win32-x64-msvc": "11.24.2" } }, "sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw=="], "oxlint": ["oxlint@1.75.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.75.0", "@oxlint/binding-android-arm64": "1.75.0", "@oxlint/binding-darwin-arm64": "1.75.0", "@oxlint/binding-darwin-x64": "1.75.0", "@oxlint/binding-freebsd-x64": "1.75.0", "@oxlint/binding-linux-arm-gnueabihf": "1.75.0", "@oxlint/binding-linux-arm-musleabihf": "1.75.0", "@oxlint/binding-linux-arm64-gnu": "1.75.0", "@oxlint/binding-linux-arm64-musl": "1.75.0", "@oxlint/binding-linux-ppc64-gnu": "1.75.0", "@oxlint/binding-linux-riscv64-gnu": "1.75.0", "@oxlint/binding-linux-riscv64-musl": "1.75.0", "@oxlint/binding-linux-s390x-gnu": "1.75.0", "@oxlint/binding-linux-x64-gnu": "1.75.0", "@oxlint/binding-linux-x64-musl": "1.75.0", "@oxlint/binding-openharmony-arm64": "1.75.0", "@oxlint/binding-win32-arm64-msvc": "1.75.0", "@oxlint/binding-win32-ia32-msvc": "1.75.0", "@oxlint/binding-win32-x64-msvc": "1.75.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-m9WzjRcRYA/uqIZDa9tclrieoPJ/ln1QYTKdFx6NUOs8uY5DiHlIwRQoCrHT6OM6O3ww3l2skY5gO7G7ZphE7g=="], @@ -1999,6 +2005,8 @@ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + "tree-sitter-rust": ["tree-sitter-rust@0.24.0", "", { "dependencies": { "node-addon-api": "^8.2.2", "node-gyp-build": "^4.8.4" }, "peerDependencies": { "tree-sitter": "^0.22.1" }, "optionalPeers": ["tree-sitter"] }, "sha512-NWemUDf629Tfc90Y0Z55zuwPCAHkLxWnMf2RznYu4iBkkrQl2o/CHGB7Cr52TyN5F1DAx8FmUnDtCy9iUkXZEQ=="], + "ts-algebra": ["ts-algebra@2.0.0", "", {}, "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="], "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], @@ -2033,7 +2041,7 @@ "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], - "unbash": ["unbash@4.0.3", "", {}, "sha512-3cudTErfToSc4Ggv8XGXVNVli/xHKUtUZvaY5UVwhOcUPbQGz7PeaEnT/SAVgNziZtX67KEN9swMUYkLghxA1w=="], + "unbash": ["unbash@4.0.10", "", {}, "sha512-b7zoBQvpWp0vuN5q2vK2RRBR2SvuruQAs50DApdDveBSn3eSYd84IaHodFqQIMlvY9K2VnyBUEXgwOBuGU9GBg=="], "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], @@ -2085,6 +2093,8 @@ "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + "web-tree-sitter": ["web-tree-sitter@0.26.12", "", {}, "sha512-fvqTNZQBGUgUgfP0mHw+iHf9Yf6bRQrp0A3pSf2v/hSKxkT1beCoIWoLVmlPL7O6dmySfSb/t1aJoJvrgTRStw=="], + "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], @@ -2139,6 +2149,8 @@ "@7n/rules/@earendil-works/pi-ai": ["@earendil-works/pi-ai@0.80.10", "", { "dependencies": { "@anthropic-ai/sdk": "0.91.1", "@aws-sdk/client-bedrock-runtime": "3.1048.0", "@google/genai": "1.52.0", "@mistralai/mistralai": "2.2.6", "@opentelemetry/api": "1.9.0", "@smithy/node-http-handler": "4.7.3", "http-proxy-agent": "7.0.2", "https-proxy-agent": "7.0.6", "openai": "6.26.0", "partial-json": "0.1.7", "typebox": "1.1.38" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-Moe/H8c87yacDGK9dPbWphZNjVsrb3nTrIHycOQJAkFEnY9PYxOOd74+ny44kATfPU9Dm7aTHefar3pZF+UKUA=="], + "@7n/rules-lang-js/knip": ["knip@6.27.0", "", { "dependencies": { "fdir": "^6.5.0", "formatly": "^0.3.0", "get-tsconfig": "4.14.0", "jiti": "^2.7.0", "oxc-parser": "^0.137.0", "oxc-resolver": "11.21.3", "picomatch": "^4.0.4", "smol-toml": "^1.6.1", "strip-json-comments": "5.0.3", "tinyglobby": "^0.2.17", "unbash": "^4.0.1", "yaml": "^2.9.0", "zod": "^4.1.11" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-CngYEYrD0n20N06FXA8n3u/0Wnnugoa+B9k14OP+iKIgkCHuzvIdsP3nfwjhByoc1WfogpxfiriMboAXFETDUw=="], + "@aws-sdk/credential-provider-http/@smithy/node-http-handler": ["@smithy/node-http-handler@4.9.9", "", { "dependencies": { "@smithy/core": "^3.29.7", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-xVBZ3hptB99iNO9XyWqEhC7KD9bP9UPXhuy3h5Y2ItCfBv160D9IIC/Fmmp3EbnWwit4C+KVqlSE+E29Nk/pPg=="], "@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1092.0", "", { "dependencies": { "@aws-sdk/core": "^3.976.0", "@aws-sdk/nested-clients": "^3.997.34", "@aws-sdk/types": "^3.974.2", "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" } }, "sha512-hBYUAr6iBLNFcsiWTgtBb0stdSw39VOUq4Sp4A5caCNf66BAZplWN4FleKrVpJx5li2YgdnK2DqoFSMWC642FQ=="], @@ -2185,9 +2197,9 @@ "@microsoft/eslint-plugin-sdl/eslint-plugin-security": ["eslint-plugin-security@1.4.0", "", { "dependencies": { "safe-regex": "^1.1.0" } }, "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA=="], - "@oxc-resolver/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q=="], + "@oxc-resolver/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], - "@oxc-resolver/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="], + "@oxc-resolver/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], "@stryker-mutator/core/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], @@ -2219,6 +2231,10 @@ "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "eslint-import-context/get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], + + "eslint-plugin-n/get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], + "eslint-plugin-n/globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], "eslint-plugin-n/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -2245,6 +2261,10 @@ "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + "knip/oxc-parser": ["oxc-parser@0.142.0", "", { "dependencies": { "@oxc-project/types": "^0.142.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.142.0", "@oxc-parser/binding-android-arm64": "0.142.0", "@oxc-parser/binding-darwin-arm64": "0.142.0", "@oxc-parser/binding-darwin-x64": "0.142.0", "@oxc-parser/binding-freebsd-x64": "0.142.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.142.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.142.0", "@oxc-parser/binding-linux-arm64-gnu": "0.142.0", "@oxc-parser/binding-linux-arm64-musl": "0.142.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.142.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.142.0", "@oxc-parser/binding-linux-riscv64-musl": "0.142.0", "@oxc-parser/binding-linux-s390x-gnu": "0.142.0", "@oxc-parser/binding-linux-x64-gnu": "0.142.0", "@oxc-parser/binding-linux-x64-musl": "0.142.0", "@oxc-parser/binding-openharmony-arm64": "0.142.0", "@oxc-parser/binding-wasm32-wasi": "0.142.0", "@oxc-parser/binding-win32-arm64-msvc": "0.142.0", "@oxc-parser/binding-win32-ia32-msvc": "0.142.0", "@oxc-parser/binding-win32-x64-msvc": "0.142.0" } }, "sha512-kKR+jPiRJYJDexVoziIg/FVGvr1fT1FZSSJOk6tVoMKKSlsf1Cso+cgGCJkOEDWOP174vRntCPFKg+AS7InWvw=="], + + "knip/smol-toml": ["smol-toml@1.7.1", "", {}, "sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ=="], + "loose-envify/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "markdownlint/string-width": ["string-width@8.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg=="], @@ -2303,6 +2323,12 @@ "yargs/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "@7n/rules-lang-js/knip/get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], + + "@7n/rules-lang-js/knip/oxc-resolver": ["oxc-resolver@11.21.3", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.21.3", "@oxc-resolver/binding-android-arm64": "11.21.3", "@oxc-resolver/binding-darwin-arm64": "11.21.3", "@oxc-resolver/binding-darwin-x64": "11.21.3", "@oxc-resolver/binding-freebsd-x64": "11.21.3", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.21.3", "@oxc-resolver/binding-linux-arm-musleabihf": "11.21.3", "@oxc-resolver/binding-linux-arm64-gnu": "11.21.3", "@oxc-resolver/binding-linux-arm64-musl": "11.21.3", "@oxc-resolver/binding-linux-ppc64-gnu": "11.21.3", "@oxc-resolver/binding-linux-riscv64-gnu": "11.21.3", "@oxc-resolver/binding-linux-riscv64-musl": "11.21.3", "@oxc-resolver/binding-linux-s390x-gnu": "11.21.3", "@oxc-resolver/binding-linux-x64-gnu": "11.21.3", "@oxc-resolver/binding-linux-x64-musl": "11.21.3", "@oxc-resolver/binding-openharmony-arm64": "11.21.3", "@oxc-resolver/binding-wasm32-wasi": "11.21.3", "@oxc-resolver/binding-win32-arm64-msvc": "11.21.3", "@oxc-resolver/binding-win32-x64-msvc": "11.21.3" } }, "sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA=="], + + "@7n/rules-lang-js/knip/unbash": ["unbash@4.0.3", "", {}, "sha512-3cudTErfToSc4Ggv8XGXVNVli/xHKUtUZvaY5UVwhOcUPbQGz7PeaEnT/SAVgNziZtX67KEN9swMUYkLghxA1w=="], + "@7n/rules/@7n/llm-lib/@7n/llm-lib-darwin-arm64": ["@7n/llm-lib-darwin-arm64@2.12.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-AHbWfwNXbQNxRqS+DwGVnDmd86Ru2+p5l/FOPnc8cKbUlTcMJP6RJWcmtNOtGSKbFX+uTgTeboUveqLza6qYCQ=="], "@7n/rules/@7n/llm-lib/@7n/llm-lib-linux-x64": ["@7n/llm-lib-linux-x64@2.12.2", "", { "os": "linux", "cpu": "x64" }, "sha512-cgYSO3rucl+iJMKmMK4FtlDSy1o0xlHgxHHkwCpjBD4IoDt5kg4EejeKV09DzIsex+0NdDNtDbD2uzHTCr1i8Q=="], @@ -2323,6 +2349,8 @@ "@graphql-tools/load/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "@microsoft/eslint-plugin-sdl/eslint-plugin-n/get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], + "@microsoft/eslint-plugin-sdl/eslint-plugin-n/globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], "@microsoft/eslint-plugin-sdl/eslint-plugin-n/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -2343,6 +2371,48 @@ "graphql-config/cosmiconfig/js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "knip/oxc-parser/@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.142.0", "", { "os": "android", "cpu": "arm" }, "sha512-ZiRGDutGsv1G6bL/ozy/koC0Sv39T1DqyoC4KD1DOy9ZoACm1O5UWhEK2c02Qdk+4lfLVkvFa/mQ0fm/4h1BtQ=="], + + "knip/oxc-parser/@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.142.0", "", { "os": "android", "cpu": "arm64" }, "sha512-WZkvGRLNQTz8lR9zP5nLjUdlroRCopBu3g9zF1p/laE6DzT1UbQo8Rdz5MWhaJUPYg/6gp+jo7HUgsyKaN1FtQ=="], + + "knip/oxc-parser/@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.142.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-l4khS8LQOOVYsGRVARo1gSaCT/aBSceUVXgtovWc2+drnxVuDr082WA3OCHVdVzIz5JIrP/y9CWsSKxBDNmYGg=="], + + "knip/oxc-parser/@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.142.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-QBsNF3nqlXmcH2B1YOPqQYmCJoy4HuIjUxGbBO/k5JAJUl68ghU2psRY2zPk+RyBaWqKP/qfL4oaFgEMCdwskA=="], + + "knip/oxc-parser/@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.142.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-b7Q7m4Cqc6XqNhri3R+QhU+GVy646Pn+bkdhrDdWym/Fdi0ZUa+d73H9dm5H91JtbtAQ/z1d8XKMW3oOV8a4tQ=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.142.0", "", { "os": "linux", "cpu": "arm" }, "sha512-3riVS5IhdH3uCZj1Y9ftDQlR0dvLsIlw/edrRqk8JhgNd5K0XSs+UBtgh50N13CAlW9/TXj6sVGXaKNBocd0Yg=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.142.0", "", { "os": "linux", "cpu": "arm" }, "sha512-NmXUOpgpTSkhl795TiXmWppTwmSJ92RC1qvD6e4XOF+slgmo3e6Ah+kEu+6AN8s7NAOEwqGmir58MgSQSWmBSA=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.142.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-gc0EXsKtXgerujmU2Bql3u1L1HsSQ2774R83idq/FoNMPVV/RY/1ErFsvnit7KoiP/sLvzQixeUo4Ut0ic0wmw=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.142.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-F2XvmWSE0uWpie+jHKKIFgdVOe9ypGhkEZxKx5DuW215K6cbAC274yYaPkcM7EqY4Df3Weyhpcz3lsURyH2LVg=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.142.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-wLMbT21U/QxknQsk+VvNF0b9D2/aGWhcaQQQ+VYlE8FwD5+GoWZIPPXNzyHmkYyhm0KB3itL+TBavjMatqNnYA=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.142.0", "", { "os": "linux", "cpu": "none" }, "sha512-+G8F/4ckwT7FCJV4H2bt09xEzJbjNCfuL4Sp1AYNaFtFMVtgIGMuJlteT82U+K0UIZ/DzAR/LDlMFnEuajG7Kw=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.142.0", "", { "os": "linux", "cpu": "none" }, "sha512-hTsHtTLxMAfCo+rpF5K3qZJKW2NpPN/CHd4mYB3y7XlSdspHkd2gehDIofP64AacA9nWQw2tY3O7wR6UY8IVOA=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.142.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-6y7qYY3TCUDYjqswImdTGl92y+KA/80twALegQPN27kfY+bG7Ib1+L3jbmrCZQx6wrVnai9IPsEZp07I0hx7JQ=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.142.0", "", { "os": "linux", "cpu": "x64" }, "sha512-i69kAWU+2LgoH5bR+zWiiu+UzAw7Oxkwv7COeJTeY19pn4e70nKQcr9Pm6cL2Z0Z54d+gl9qADlK/0yyuCPiBA=="], + + "knip/oxc-parser/@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.142.0", "", { "os": "linux", "cpu": "x64" }, "sha512-4SQs678MmjYVrmhAgCWD4o0vpaFszXw9xLX5p2Z9MMFcltxiLkA88wQjh80YHjPrXtpyZ2CWI5m+1yNKM0m2Pw=="], + + "knip/oxc-parser/@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.142.0", "", { "os": "none", "cpu": "arm64" }, "sha512-YHpx9N7Ln3a++Tc8rv+H7mrK1zyJQOAwCFg8LZ3lTs1T5afGWeZrLPhPT9HLnIwSjCyJqPWVMIrMxbjcmBr2oQ=="], + + "knip/oxc-parser/@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.142.0", "", { "dependencies": { "@emnapi/core": "1.11.2", "@emnapi/runtime": "1.11.2", "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-3pLDyY3+oogW73RM5uehNgAiR/Xfb7fvO2Q1Z1gIqZ2+50XDVQmBVlRkHXZTU4gKnQHpwETNsYQVsJ3joVB2iA=="], + + "knip/oxc-parser/@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.142.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Had/VeVY28Oyb0K+Q4FV8KCzoBycIh93oDK6pCbya9lkzdq+ikMHMgBubsdqqlybjJmQRawCQRrnBRHyQwYvcQ=="], + + "knip/oxc-parser/@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.142.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-GGi3+YphVHavvgs6gum2UXoNCqzHAmPt/nXkn8ZQZstV2Q1qZD1Mn8fz/nWrDkefHQtrG/+1/XrbMxsBTo6Svw=="], + + "knip/oxc-parser/@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.142.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Ny/Wv4Us1LGC/ljwNTp+Hx3r/pH15EFfeDF0p+n898gt+TtRd6C9SccHcuUhDiNTb8s5tt7jdeAMDRQZ4Vq6hg=="], + + "knip/oxc-parser/@oxc-project/types": ["@oxc-project/types@0.142.0", "", {}, "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ=="], + "markdownlint/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -2353,16 +2423,62 @@ "yargs/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.21.3", "", { "os": "android", "cpu": "arm" }, "sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.21.3", "", { "os": "android", "cpu": "arm64" }, "sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.21.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.21.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.21.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.21.3", "", { "os": "linux", "cpu": "arm" }, "sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.21.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.21.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.21.3", "", { "os": "linux", "cpu": "none" }, "sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.21.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.21.3", "", { "os": "linux", "cpu": "x64" }, "sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.21.3", "", { "os": "none", "cpu": "arm64" }, "sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.21.3", "", { "dependencies": { "@emnapi/core": "1.11.0", "@emnapi/runtime": "1.11.0", "@napi-rs/wasm-runtime": "^1.1.5" }, "cpu": "none" }, "sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.21.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.21.3", "", { "os": "win32", "cpu": "x64" }, "sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q=="], + "@microsoft/eslint-plugin-sdl/eslint-plugin-n/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], "eslint-plugin-react/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "knip/oxc-parser/@oxc-parser/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], + + "knip/oxc-parser/@oxc-parser/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], + "markdownlint/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "stylelint/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q=="], + + "@7n/rules-lang-js/knip/oxc-resolver/@oxc-resolver/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="], + "@microsoft/eslint-plugin-sdl/eslint-plugin-n/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], } } diff --git a/crates/agent-server/src/docs/graph.md b/crates/agent-server/src/docs/graph.md index df7f4e4..7ed93ff 100644 --- a/crates/agent-server/src/docs/graph.md +++ b/crates/agent-server/src/docs/graph.md @@ -3,7 +3,7 @@ type: Rust Module title: graph.rs resource: crates/agent-server/src/graph.rs docgen: - crc: b05874f3 + crc: 4d27361c model: openai-codex/gpt-5.4-mini tier: cloud-min score: 100 @@ -13,39 +13,25 @@ docgen: ## Огляд -Міст до графа для інтерактивного run вузла за контрактом `runtime.md` і `git.md`: сесія робить attach через CAS claim, працює в detached worktree, веде `session.jsonl` у run ref, підтримує handoff і завершується через fenced publish або переходить у release. Це не перевизначає граф: усі дії делегуються `mt-core` — тій самій реалізації, яку `@7n/mt` використовує через napi. - -Публічний обсяг цього модуля — `GraphConfig`, `new`, `InteractiveRun`, `HandoffTicket`, `attach`, `attach_resume`, `generation`, `add_approval`, `commit_turn`, `renew`, `done`, `release`, `handoff`. - -Виклики працюють fail-safe: помилки перехоплюються, назовні винятки не кидаються, а для окремих збоїв повертається порожнє значення замість exception. - -`.nitra/` існує лише в run ref під час сесії, не потрапляє в `main` і прибирається перед publish. +Містить інтерактивний run вузла як lifecycle від `CAS claim` і `run ref` з detached worktree до `session.jsonl`, `attach`/`attach_resume`, `done` або `release`, а також `handoff`. `done` завершує сесію fenced publish, `release` ставить її на паузу без публікації. Усі операції виконуються через `mt-core` через `napi`; графовий контракт не реімплементується, а використовується та сама реалізація, що й у `@7n/mt`. `GraphConfig`, `new`, `InteractiveRun`, `HandoffTicket`, `attach`, `attach_resume`, `generation`, `add_approval`, `commit_turn`, `renew`, `done`, `release`, `handoff`. `.nitra/` живе лише в run ref і прибирається перед publish, тому в `main` не потрапляє. Локальні fail-safe гілки можуть повертати порожнє значення замість винятку; інші помилки можуть поширюватися назовні. ## Поведінка -GraphConfig задає спільні параметри життєвого циклу вузла: шлях до tasks-дерева, тривалість lease і початкового актора. new створює цей контрактний стан із дефолтним lease та actor для подальших операцій. - -InteractiveRun описує живу сесію, у якій claim уже утримується, а worktree матеріалізовано. Усі наступні дії працюють у межах цього стану й або продовжують той самий run ref, або переводять його в нову фазу. - -HandoffTicket переносить мінімум, потрібний для кооперативного переходу між хостами: старий run ref і покоління claim-а, від якого треба продовжити. attach_resume використовує цей тікет, щоб відновити worktree не з main, а зі стану попереднього run ref, зберігши журнал і проміжні зміни. - -attach запускає сесію з CAS-claimом, створює detached worktree від базового стану й прив’язує його до run ref. Якщо вузол уже зайнято, відмова є явною, без переходу в напівживий стан. - -generation повертає fencing token поточного claim-а, який використовується як межа для side effects і для перевірки, що сесія ще належить цьому хосту. +GraphConfig задає спільні межі життєвого циклу run: звідки беруться tasks і скільки живе claim до renewal або takeover. new створює початковий контекст вузла, з якого далі будуються attach, renew, done, release і handoff. -add_approval доповнює сесію вже верифікованим підтвердженням, яке потім потрапляє в синтезовані артефакти run-а. +InteractiveRun тримає активний стан сесії: claim лишається захопленим, а worktree — матеріалізованим, доки вузол не завершить хід або не передасть естафету. Усі подальші дії працюють поверх цього стану і повертають результат або fail-safe помилку без ламання зовнішнього потоку. -commit_turn зберігає хід у журнал сесії та фіксує зміни в run ref, щоб відновлення, handoff і подальший publish бачили повну послідовність дій. Порожній хід не створює зайвих артефактів. +attach запускає звичайний старт інтерактивної сесії: бере claim, створює detached worktree від базового стану й піднімає run ref як основу для журналу та наступних комітів. Якщо claim уже зайнято, потік зупиняється явною помилкою, щоб не змішувати два активні вузли в одному графі. -renew продовжує lease для того самого claim-а, зберігаючи ownership лише поки CAS ще не втрачено. Якщо claim уже перехоплено, сесію треба зупинити. +commit_turn є базовою одиницею прогресу: зміни з worktree та журнал сесії накопичуються в run ref, а порожні ходи не створюють зайвих артефактів. add_approval входить у цей самий потік як підтверджений сигнал, що потім потрапляє в синтезовані run-артефакти. -handoff переводить живу сесію в кооперативний режим передачі: зберігає повний журнал у run ref, знімає claim і повертає тікет для attach_resume на новому хості. Це зберігає безперервність серії й не викидає проміжний стан. +generation і renew разом утримують fencing token для side effects: generation відображає поточну версію claim, а renew продовжує її без зміни власника. Якщо claim уже втрачено, renew повертає ознаку провалу, щоб сесію можна було безпечно зупинити. -release завершує активне утримання вузла без publish: claim знімається, worktree прибирається, а run ref лишається як база для відновлення або подальшого handoff. +handoff переводить активну сесію на інший хост без втрати журналу: run ref зберігається як база відновлення, claim знімається, а результатом стає HandoffTicket. attach_resume споживає цей тікет, відновлює worktree зі стану старого run ref і продовжує generation з наступного значення; якщо старий run ref недоступний, це явна помилка, а не прихований збій. -done завершує сесію тільки після успішного Check-гейту. Перед publish він синтезує контрактні артефакти run і fact, прибирає `.nitra/` з індексу та виконує fenced publish у main; при невдачі сесія лишається живою. +done завершує хід через перевірку стану, синтез run- і fact-артефактів та fenced publish у main. Тут `.nitra/` має бути прибраний із публічного результату; якщо перевірка не проходить, вузол лишається живим і може бути виправлений перед повторною спробою. -`HandoffTicket` і `attach_resume` разом реалізують міграцію сесії між хостами без втрати журналу та мідфлайт-змін, а `done` завершує той самий ланцюг публікацією без розриву в нумерації серії. +release відпускає вузол без публікації: claim знімається, worktree прибирається, а run ref лишається як база для подальшого attach або відновлення. ## Публічний API @@ -61,9 +47,9 @@ done завершує сесію тільки після успішного Chec - done — `mt done`: гейт `## Check` (контракт graph.md — fail → відмова сигналу, run лишається живим) → синтез `run_NNN.md`/`fact_NNN.md` → стрип `.nitra/` з індексу (інваріант git.md) → fenced publish (rebase на origin/main + atomic push main / видалення claim+run ref). Успіх → worktree прибирається. - release — Пауза/відпустити: CAS-delete claim + прибрати worktree; run ref лишається (журнал сесії — база відновлення наступного attach). - handoff — Кооперативний handoff (git.md, claim-операція `handoff`; runtime.md, «Міграція сесії між хостами», крок 2): синтезує `run_NNN.md (result: handoff)` → коміт → push run ref БЕЗ стрипу `.nitra/` — повний журнал розмови їде разом (checkpoint-режим із дистильованим summary — окрема задача) → CAS-delete claim. Повертає тікет для `attach_resume` на новому хості. -- new — створює новий інстанс модуля для роботи з NAPI-інтеграцією. +- new — створює новий об’єкт для публікації, щоб зібрати дані допису перед відправкою ## Гарантії поведінки -- Перехоплює помилки і не пропускає винятків назовні (fail-safe). -- За певних помилок повертає порожнє значення (напр. `null`) замість винятку. +- Містить локальні fail-safe гілки; інші помилки можуть поширюватися назовні. +- Деякі локальні fail-safe гілки повертають порожнє значення (напр. `null`) замість винятку. diff --git a/crates/agent-server/tests/docs/graph_wiring.md b/crates/agent-server/tests/docs/graph_wiring.md index c47779e..9ed4f7f 100644 --- a/crates/agent-server/tests/docs/graph_wiring.md +++ b/crates/agent-server/tests/docs/graph_wiring.md @@ -3,24 +3,24 @@ type: Rust Module title: graph_wiring.rs resource: crates/agent-server/tests/graph_wiring.rs docgen: - crc: ec604fa5 + crc: d9f8a134 model: openai-codex/gpt-5.4-mini + tier: cloud-min score: 100 judgeModel: openai-codex/gpt-5.4-mini --- ## Огляд -Файл інтегрує WS-сесії з graph-мостом для перевірки контракту між `UserMessage`, `DoneSession` і `ReleaseSession`. Тестовий контур працює на bare-репо як origin, використовує MockProvider-агент і реальний WS, щоб зафіксувати поведінку без втрати run ref: перше `UserMessage` прив’язує вузол, `DoneSession` запускає fenced publish, а `ReleaseSession` ставить сесію на паузу й звільняє вузол. +Інтеграція WS-сесій із graph-мостом: attach на першому UserMessage, журнал у run ref, DoneSession → fenced publish, ReleaseSession → пауза. Все герметично: bare-репо як origin, скриптований runner, реальний WS. ## Поведінка -1. Піднімає ізольоване середовище з bare-origin, робочим репозиторієм, вузлом `mt/demo` і WS-сервером із graph-мостом та scripted MockProvider. -2. Приймає перше `UserMessage` як момент захоплення вузла: сесія прив’язується до вузла, а хід агента стартує тільки після успішного attach. -3. Фіксує сесію в журналі окремого run ref, щоб історія звернення зберігалася незалежно від подальшого завершення або паузи. -4. Після завершення ходу через `DoneSession` публікує результат у `main` у fenced-режимі: службові refs прибираються, а `.nitra/` не потрапляє в публікацію. -5. Після `ReleaseSession` знімає блокування з вузла без втрати журналу: claim звільняється, run ref залишається доступним, і вузол можна знову захопити новим `UserMessage`. -6. Якщо вузол уже зайнятий іншим тримачем, завершує спробу помилкою `claim-lost` без виконання ходу. +Під час першого `UserMessage` сесія може прив’язати вузол до поточного тримача; якщо вузол уже зайнятий іншим тримачем, для клієнта приходить `Error` із `claim-lost`, і хід не стартує. + +Після завершення ходу публікація відбувається через fenced publish у `main`: `refs/mt/claims/` і `refs/mt/runs/` зникають, а службовий журнал не потрапляє в `.nitra/session.jsonl` на `main`. + +`DoneSession` завершує сесію коміт-станом із повідомленням про done; окремі контрактні артефакти спроби лишаються в `main`. `ReleaseSession` лише знімає claim і зберігає run ref та журнал, тож той самий вузол можна прив’язати знову. ## Гарантії поведінки diff --git a/crates/agent-server/tests/docs/handoff_ws.md b/crates/agent-server/tests/docs/handoff_ws.md index 465ad55..9f9295e 100644 --- a/crates/agent-server/tests/docs/handoff_ws.md +++ b/crates/agent-server/tests/docs/handoff_ws.md @@ -3,25 +3,15 @@ type: Rust Module title: handoff_ws.rs resource: crates/agent-server/tests/handoff_ws.rs docgen: - crc: b5181e7d + crc: bf0ca276 model: openai-codex/gpt-5.4-mini - score: 100 - judgeModel: openai-codex/gpt-5.4-mini + tier: cloud-min + score: 80 --- ## Огляд -Цей файл описує контрольований сценарій handoff сесії для кроків 2–3 у `runtime.md` («Міграція сесії між хостами»): дві незалежні `AppState` з окремими `state_dir` симулюють два хости в одному й тому самому git-репозиторії. Після `handoff_node` на хості 1 `resume_node` на хості 2 з тим самим тікетом успадковує журнал і продовжує `seq` без розривів. - -## Поведінка - -1. Піднімає два незалежні хости з окремими `state_dir`, але з одним і тим самим локальним git-репозиторієм, щоб змоделювати міграцію сесії між різними вузлами без зміни робочого дерева. -2. На першому хості відкриває сесію, приймає хід користувача й фіксує завершення агента, після чого переводить вузол у стан handoff. -3. Формує ticket для handoff і перевіряє, що він створений як нова генерація для передачі сесії. -4. На другому хості відновлює той самий вузол за цим ticket і перевіряє, що журнал попереднього хоста доступний локально ще до нового ходу. -5. Запускає новий хід на другому хості та підтверджує, що sequence номер продовжується без розривів після resume. -6. Не перевіряє паралельні гонки між хостами; сценарій навмисно послідовний. -7. Не перевіряє віддалену мережеву міграцію між різними машинами; обидва хости працюють у межах одного локального репозиторію як контрольована симуляція. +Кооперативний handoff на рівні AppState/session (runtime.md, «Міграція сесії між хостами», кроки 2-3): дві незалежні `AppState` (окремі `state_dir` — симуляція двох хостів), той самий git-репозиторій. Хід на хості 1 → `handoff_node` → `resume_node` на хості 2 з тим самим тікетом → журнал успадкований, наступний хід продовжує seq без розривів. ## Гарантії поведінки diff --git a/crates/mt-core/src/audit.rs b/crates/mt-core/src/audit.rs index a0e6786..6fb1e75 100644 --- a/crates/mt-core/src/audit.rs +++ b/crates/mt-core/src/audit.rs @@ -76,7 +76,9 @@ fn publish_artifact(tasks_dir: &str, dir: &Path, file: &str, message: &str) -> R }; let content = fs::read_to_string(&abs).map_err(|e| e.to_string())?; let config = crate::config::merge_config( - fs::read_to_string(repo_root.join(".mt.json")).ok().as_deref(), + fs::read_to_string(repo_root.join(".mt.json")) + .ok() + .as_deref(), ); let outcome = crate::publish::publish_lifecycle( &repo_root, @@ -196,8 +198,8 @@ pub fn amend( answer: &str, ) -> Result { let dir = node_dir(tasks_dir, node_path)?; - let open = open_audit(&dir) - .ok_or_else(|| format!("{node_path}: немає відкритого аудит-циклу"))?; + let open = + open_audit(&dir).ok_or_else(|| format!("{node_path}: немає відкритого аудит-циклу"))?; if open.clarification_file.is_none() { return Err(format!( "{node_path}: уточнення не запитували — відповідати нема на що" @@ -383,7 +385,11 @@ pub fn build_auditor_prompt(node_path: &str, dir: &Path, nnn: u64) -> String { let body = |name: &str| -> Option { let content = fs::read_to_string(dir.join(name)).ok()?; let body = crate::frontmatter::get_body(&content); - let text = if body.trim().is_empty() { content } else { body }; + let text = if body.trim().is_empty() { + content + } else { + body + }; let text = text.trim(); (!text.is_empty()).then(|| text.to_string()) }; @@ -417,7 +423,8 @@ pub fn build_auditor_prompt(node_path: &str, dir: &Path, nnn: u64) -> String { mod tests { use super::*; - const TASK: &str = "---\nschema_version: 1\ncreated_at: 2026-06-06T10:00:00Z\n---\n\n## Task\n\nx\n"; + const TASK: &str = + "---\nschema_version: 1\ncreated_at: 2026-06-06T10:00:00Z\n---\n\n## Task\n\nx\n"; /// Вузол із відкритим аудит-циклом на NNN=001. fn node_with_open_audit() -> (tempfile::TempDir, String) { @@ -426,7 +433,11 @@ mod tests { fs::create_dir_all(&dir).unwrap(); fs::write(dir.join("task.md"), TASK).unwrap(); fs::write(dir.join("fact_001.md"), "---\n---\n\n## Summary\n\nok\n").unwrap(); - fs::write(dir.join("pending-audit_001.md"), "---\nschema_version: 1\n---\n").unwrap(); + fs::write( + dir.join("pending-audit_001.md"), + "---\nschema_version: 1\n---\n", + ) + .unwrap(); let root = tmp.path().to_string_lossy().into_owned(); (tmp, root) } @@ -440,7 +451,11 @@ mod tests { "---\nschema_version: 1\n---\n\n## Task\n\nx\n\n## Done when\n\nтести зелені\n", ) .unwrap(); - fs::write(dir.join("run_001.md"), "---\nresult: failed\n---\n\n## Blockers\n\nмучився довго\n").unwrap(); + fs::write( + dir.join("run_001.md"), + "---\nresult: failed\n---\n\n## Blockers\n\nмучився довго\n", + ) + .unwrap(); let p = build_auditor_prompt("solo", &dir, 1); assert!(p.contains("Контракт (task.md)") && p.contains("тести зелені")); @@ -522,7 +537,10 @@ mod tests { .contains("не запитували")); clarification(&root, "solo", "auditor", "Чому?").unwrap(); - assert_eq!(amend(&root, "solo", "agent", "бо так").unwrap(), "amended_001.md"); + assert_eq!( + amend(&root, "solo", "agent", "бо так").unwrap(), + "amended_001.md" + ); assert!(amend(&root, "solo", "agent", "і ще").is_err()); } @@ -560,7 +578,11 @@ mod tests { "---\ncreated_at: 2020-01-01T00:00:00Z\n---\n\n## Question\n\nЧому?\n", ) .unwrap(); - fs::write(dir.join("amended_001.md"), "---\n---\n\n## Answer\n\nбо так\n").unwrap(); + fs::write( + dir.join("amended_001.md"), + "---\n---\n\n## Answer\n\nбо так\n", + ) + .unwrap(); assert!(expire_clarification(&root, "solo", 1).unwrap().is_none()); } diff --git a/crates/mt-core/src/frontmatter.rs b/crates/mt-core/src/frontmatter.rs index cb78866..221405d 100644 --- a/crates/mt-core/src/frontmatter.rs +++ b/crates/mt-core/src/frontmatter.rs @@ -558,7 +558,10 @@ mod tests { #[test] fn sequence_of_mappings() { let v = parse_yaml("retry_ladder:\n - {}\n - strategy: diagnose-first\n"); - assert_eq!(v["retry_ladder"], json!([{}, {"strategy": "diagnose-first"}])); + assert_eq!( + v["retry_ladder"], + json!([{}, {"strategy": "diagnose-first"}]) + ); } #[test] diff --git a/crates/mt-core/src/lib.rs b/crates/mt-core/src/lib.rs index edf3b8b..f2b1060 100644 --- a/crates/mt-core/src/lib.rs +++ b/crates/mt-core/src/lib.rs @@ -1,31 +1,55 @@ +//! Ядро MT-графа (канон, який `@7n/mt` споживає через napi): скан дерева +//! `mt/` у [`TaskNode`]-граф із виведенням станів ([`TaskState`]), прапори +//! виконавця `a.md`/`h.md`, створення вузлів і нормалізація імен; доменні +//! підсистеми (claims, runner, publish, orchestrate, …) — в окремих модулях. + use std::collections::HashMap; use std::fs; use std::path::{Path, PathBuf}; use serde::{Deserialize, Serialize}; +/// Version-chain артефакти вузла: read-модель переліку `task/plan/run/fact/…` для GUI-timeline і CLI. pub mod artifacts; +/// Аудит-цикл: закриття гейта, який відкриває `mt audit` (вердикт, уточнення, amend). pub mod audit; +/// Remote execution claims: read-модель ownership вузлів через git refs `refs/mt/claims/`. pub mod claims; +/// Конфігурація `.mt.json`: дефолти + merge рівнів у ефективний конфіг вузла. pub mod config; +/// Мапінг handle → PII з git-ignored `.mt/directory.json` (у git-файлах лишаються лише handles). pub mod directory; +/// Парсинг і байт-точна серіалізація YAML-frontmatter task-файлів. pub mod frontmatter; +/// Єдина межа взаємодії mt-core з Git. pub mod git; +/// Cost/time ledger: агрегація `wall_sec`/`tokens_*`/`cost_usd` з усіх `run_NNN.md` графу. pub mod ledger; +/// Lifecycle-мутації вузла: `mt invalidate` і `mt kill` (архівація version chain у `history/`). pub mod lifecycle; +/// NNN-нумерація артефактів (`run_NNN.md`, `fact_NNN.md`, …) — чисті функції над іменами файлів. pub mod nnn; +/// Оркестратор `run --auto`: одноразовий прохід по `waiting` агентських вузлах чергами по `agent_concurrency`. pub mod orchestrate; +/// Fenced publish protocol: atomic multi-ref push результату worktree у `main` з rebase і retry. pub mod publish; +/// Run-wrapper: CAS claim → detached worktree → spawn виконавця → watchdog → підсумок стану. pub mod runner; +/// Обгортка завершення виконавця: запис фактів, результатів і аудит-циклу вузла. pub mod signal; +/// Протокол spawn: валідація `## Children` плану й матеріалізація дітей після plan-review. pub mod spawn; +/// Тестові фікстури: версійні git-фіксації (bare `origin` + клон) для ізольованих тестів. #[cfg(any(test, feature = "test-support"))] #[doc(hidden)] pub mod test_support; +/// Іменування, матчінг і provisioning worktree для задач. pub mod worktree; // ── Types ───────────────────────────────────────────────────────────────────── +/// Стан вузла графа, виведений сканом файлового контракту (graph.md) — +/// від `Unassigned` до термінальних `Resolved`/`Failed`/`Unresolvable`. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "snake_case")] pub enum TaskState { @@ -43,6 +67,8 @@ pub enum TaskState { Unresolvable, // unresolvable.md exists (terminal) } +/// Вузол MT-графа: ідентичність, стан, залежності, бюджети й діти — +/// одиниця виводу `scan_tasks` для CLI/GUI. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TaskNode { pub id: String, @@ -65,6 +91,7 @@ pub struct TaskNode { pub warnings: Vec, } +/// Знайдений воркспейс із `mt/`-деревом: людська мітка + шлях до tasks-директорії. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct WorkspaceInfo { pub label: String, @@ -94,7 +121,10 @@ pub fn write_executor_flag( "skills": skills, "interactive": false, }); - write_atomic(&task_dir.join("a.md"), &frontmatter::build_markdown(&fm, ""))?; + write_atomic( + &task_dir.join("a.md"), + &frontmatter::build_markdown(&fm, ""), + )?; let _ = fs::remove_file(task_dir.join("h.md")); Ok("a.md") } @@ -110,13 +140,17 @@ pub fn write_executor_flag( } else { "\n" }; - write_atomic(&task_dir.join("h.md"), &frontmatter::build_markdown(&fm, body))?; + write_atomic( + &task_dir.join("h.md"), + &frontmatter::build_markdown(&fm, body), + )?; let _ = fs::remove_file(task_dir.join("a.md")); Ok("h.md") } } } +/// Виконавець вузла: `Agent` (прапор `a.md`) чи `Human` (прапор `h.md`). #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum Mode { @@ -485,8 +519,8 @@ fn is_running_marker(name: &str) -> bool { idx > 0 && rest[..idx].bytes().all(|b| b.is_ascii_digit()) } -// Sanitize task name for worktree comparison (mirrors JS sanitizeTaskName: [^A-Za-z0-9_-] → '-'). -// NOTE: must stay in sync with sanitizeTaskName in npm/lib/core/state.mjs (shared test vectors). +/// Санітизує ім'я задачі для порівняння worktree: `[^A-Za-z0-9_-]` → `'-'`. +/// ⚠️ Логіку синхронізовано з JS `sanitizeTaskName` у `npm/lib/core/state.mjs` (спільні тест-вектори). pub fn sanitize(name: &str) -> String { name.chars() .map(|c| { @@ -1006,7 +1040,9 @@ pub fn scan_tasks_with_claims( return Ok(nodes); }; let config = config::merge_config( - fs::read_to_string(repo_root.join(".mt.json")).ok().as_deref(), + fs::read_to_string(repo_root.join(".mt.json")) + .ok() + .as_deref(), ); let grace = config .get("claim_grace_sec") @@ -1494,8 +1530,14 @@ mod tests { ]; let w = warnings_of("task", &files); assert_eq!(w.len(), 2, "got: {w:?}"); - assert!(w[0].starts_with("task.md:") && w[0].contains('5'), "got: {w:?}"); - assert!(w[1].starts_with("a.md:") && w[1].contains("schema_version"), "got: {w:?}"); + assert!( + w[0].starts_with("task.md:") && w[0].contains('5'), + "got: {w:?}" + ); + assert!( + w[1].starts_with("a.md:") && w[1].contains("schema_version"), + "got: {w:?}" + ); } #[test] @@ -1790,10 +1832,7 @@ mod tests { #[test] fn no_trigger_on_healthy_node() { let runs: Vec<_> = (1..=2).map(failed_run).collect(); - let files: Vec<(&str, &str)> = runs - .iter() - .map(|(n, c)| (n.as_str(), c.as_str())) - .collect(); + let files: Vec<(&str, &str)> = runs.iter().map(|(n, c)| (n.as_str(), c.as_str())).collect(); // streak 2 < 3+1 → ще ретраїмо. assert!(reason_for(&files, serde_json::json!({})).is_none()); } @@ -1801,10 +1840,7 @@ mod tests { #[test] fn trigger_execution_ladder_exhausted() { let runs: Vec<_> = (1..=4).map(failed_run).collect(); - let files: Vec<(&str, &str)> = runs - .iter() - .map(|(n, c)| (n.as_str(), c.as_str())) - .collect(); + let files: Vec<(&str, &str)> = runs.iter().map(|(n, c)| (n.as_str(), c.as_str())).collect(); // agent_retry_max 3 + engineer_retry_max 1 = 4. let reason = reason_for(&files, serde_json::json!({})).expect("має спрацювати"); assert!(reason.contains("драбину виконання"), "got: {reason}"); @@ -1824,23 +1860,17 @@ mod tests { #[test] fn trigger_total_budget_exceeded() { let runs: Vec<_> = (1..=2).map(failed_run).collect(); - let files: Vec<(&str, &str)> = runs - .iter() - .map(|(n, c)| (n.as_str(), c.as_str())) - .collect(); + let files: Vec<(&str, &str)> = runs.iter().map(|(n, c)| (n.as_str(), c.as_str())).collect(); // 2 × 100s > 150s. - let reason = - reason_for(&files, serde_json::json!({"budget_total_sec": 150})).expect("має спрацювати"); + let reason = reason_for(&files, serde_json::json!({"budget_total_sec": 150})) + .expect("має спрацювати"); assert!(reason.contains("сумарний бюджет"), "got: {reason}"); } #[test] fn total_budget_trigger_is_opt_in() { let runs: Vec<_> = (1..=2).map(failed_run).collect(); - let files: Vec<(&str, &str)> = runs - .iter() - .map(|(n, c)| (n.as_str(), c.as_str())) - .collect(); + let files: Vec<(&str, &str)> = runs.iter().map(|(n, c)| (n.as_str(), c.as_str())).collect(); // Без budget_total_sec третій тригер неактивний (спека: опційний). assert!(reason_for(&files, serde_json::json!({})).is_none()); } diff --git a/crates/mt-core/src/lifecycle.rs b/crates/mt-core/src/lifecycle.rs index 46956b7..36a164d 100644 --- a/crates/mt-core/src/lifecycle.rs +++ b/crates/mt-core/src/lifecycle.rs @@ -78,8 +78,8 @@ pub fn reconcile_after_rerun(tasks_dir: &str, node_path: &str) -> Result Result, let mut skip: HashSet = HashSet::new(); let mut in_flight: HashSet = HashSet::new(); let concurrency = concurrency.max(1); - let (tx, rx) = std::sync::mpsc::channel::<(String, Result)>(); + let (tx, rx) = + std::sync::mpsc::channel::<(String, Result)>(); loop { // Rescan на кожній ітерації — не марнотратство, а і є backfill: diff --git a/crates/mt-core/src/runner.rs b/crates/mt-core/src/runner.rs index 6c7639c..331aab5 100644 --- a/crates/mt-core/src/runner.rs +++ b/crates/mt-core/src/runner.rs @@ -508,7 +508,8 @@ fn build_engineer_prompt( - правка `a.md` — інший `model_tier`, інший `agent_cli`, інші `skills`.\n\n\ Якщо причину усунуто і вузол готовий до звичайного виконання — опиши це \ в `run-draft.md` секціями `## Completed` / `## Blockers` / `## Next Attempt`. \ - Якщо ти сам довів задачу до результату — напиши `fact_" .to_string() + Якщо ти сам довів задачу до результату — напиши `fact_" + .to_string() + nnn + ".md` з `## Summary`.", ); @@ -614,7 +615,9 @@ fn build_agent_prompt( .map(|c| c.trim().to_string()) .filter(|c| !c.is_empty()) { - blocks.push(format!("## Прапор виконавця ({flag})\n\n```yaml\n{body}\n```")); + blocks.push(format!( + "## Прапор виконавця ({flag})\n\n```yaml\n{body}\n```" + )); } } let deps = dep_facts(tasks_root, node_dir); @@ -957,12 +960,7 @@ pub fn run_node(tasks_dir: &str, node_path: &str) -> Result /// [`run_node`] із явним актором — `mt run --actor engineer` (graph.md). pub fn run_node_as(tasks_dir: &str, node_path: &str, actor: Actor) -> Result { - run_node_env_as( - tasks_dir, - node_path, - &agent_cli_env_from_process(), - actor, - ) + run_node_env_as(tasks_dir, node_path, &agent_cli_env_from_process(), actor) } /// Як [`run_node`], але з явним конфігом виконавців (ін'єкція для тестів). @@ -1205,7 +1203,14 @@ pub fn run_node_env_as( ## Blockers\n\nнемає — потрібен людський апрув плану\n\n\ ## Next Attempt\n\n`mt spawn --approve` матеріалізує дітей\n" ); - let run_file = write_run_fm(&dir, &nnn_s, actor.as_str(), "decomposed", §ions, &extra_fm)?; + let run_file = write_run_fm( + &dir, + &nnn_s, + actor.as_str(), + "decomposed", + §ions, + &extra_fm, + )?; ("decomposed".to_string(), run_file, None, Vec::new()) } else if kill_reason.is_none() && has_fact { let policy_required = fs::read_to_string(dir.join("task.md")) @@ -1236,7 +1241,8 @@ pub fn run_node_env_as( let sections = format!( "\n## Completed\n\nfact записано, але ## Check не пройшов (fact відкликано)\n\n## Blockers\n\n{check_err}\n\n## Next Attempt\n\nвиправити і повторити done\n" ); - let run_file = write_run_fm(&dir, &nnn_s, actor.as_str(), "failed", §ions, &extra_fm)?; + let run_file = + write_run_fm(&dir, &nnn_s, actor.as_str(), "failed", §ions, &extra_fm)?; ("failed".to_string(), run_file, None, Vec::new()) } } @@ -1502,7 +1508,11 @@ mod tests { let before = build_agent_prompt("solo", &dir, tmp.path(), None, "004", 600); assert!(before.contains("Спроба 001")); - fs::write(dir.join("run-summary.md"), "Три спроби впирались у конфіг.\n").unwrap(); + fs::write( + dir.join("run-summary.md"), + "Три спроби впирались у конфіг.\n", + ) + .unwrap(); let after = build_agent_prompt("solo", &dir, tmp.path(), None, "004", 600); assert!(after.contains("Три спроби впирались")); assert!(!after.contains("Спроба 001"), "резюме витісняє перелік"); @@ -1553,8 +1563,11 @@ mod tests { let tmp = tempfile::tempdir().unwrap(); let dir = tmp.path().join("solo"); fs::create_dir_all(&dir).unwrap(); - fs::write(dir.join("run_001.md"), "---\nresult: failed\n---\n\n## Blockers\n\nстаре\n") - .unwrap(); + fs::write( + dir.join("run_001.md"), + "---\nresult: failed\n---\n\n## Blockers\n\nстаре\n", + ) + .unwrap(); fs::write(dir.join("fact_002.md"), "---\n---\n\n## Summary\n\nok\n").unwrap(); assert!(full_run_history(&dir).is_empty()); } @@ -1596,9 +1609,15 @@ mod tests { assert!(needs_planning(&dir, &no_hint), "рішення ще немає"); // Людський hint — рішення вже ухвалене, зайвий виклик моделі не потрібен. - assert!(!needs_planning(&dir, &serde_json::json!({"hint": "atomic"}))); + assert!(!needs_planning( + &dir, + &serde_json::json!({"hint": "atomic"}) + )); // composite-hint планування не скасовує: склад підзадач ще треба вигадати. - assert!(needs_planning(&dir, &serde_json::json!({"hint": "composite"}))); + assert!(needs_planning( + &dir, + &serde_json::json!({"hint": "composite"}) + )); // Наявний план (напр. від явного `mt plan`) теж закриває питання. fs::write(dir.join("plan_001.md"), "---\ndecision: atomic\n---\n").unwrap(); @@ -1656,8 +1675,7 @@ mod tests { crate::test_support::push_head(repo.work.path(), "refs/heads/main"); let r = root.to_string_lossy().into_owned(); - const WRITES_COMPOSITE_PLAN: &str = - r#"printf -- '---\nschema_version: 1\ndecision: composite\n---\n\n## Children\n\nchildren\n' > plan_001.md"#; + const WRITES_COMPOSITE_PLAN: &str = r#"printf -- '---\nschema_version: 1\ndecision: composite\n---\n\n## Children\n\nchildren\n' > plan_001.md"#; with_path_shims(&[("claude", WRITES_COMPOSITE_PLAN)], || { let out = run_node_env(&r, "solo", &env_default()).unwrap(); assert_eq!(out.result, "decomposed"); diff --git a/crates/mt-core/src/signal.rs b/crates/mt-core/src/signal.rs index e28f01a..2365401 100644 --- a/crates/mt-core/src/signal.rs +++ b/crates/mt-core/src/signal.rs @@ -571,7 +571,11 @@ mod tests { #[test] fn audit_is_gated_too() { let (repo, tasks) = repo_node("solo"); - fs::write(repo.work.path().join("mt/solo/task.md"), "---\nschema_version: 1\n---\n\n## Task\n\nпідмінено\n").unwrap(); + fs::write( + repo.work.path().join("mt/solo/task.md"), + "---\nschema_version: 1\n---\n\n## Task\n\nпідмінено\n", + ) + .unwrap(); write_fact(&tasks, "solo", "Зроблено.", None).unwrap(); assert!(audit(&tasks, "solo", "agent") diff --git a/crates/mt-core/src/spawn.rs b/crates/mt-core/src/spawn.rs index 5e16080..2adfcff 100644 --- a/crates/mt-core/src/spawn.rs +++ b/crates/mt-core/src/spawn.rs @@ -483,7 +483,9 @@ fn publish_spawn( return Ok(()); }; let config = crate::config::merge_config( - fs::read_to_string(repo_root.join(".mt.json")).ok().as_deref(), + fs::read_to_string(repo_root.join(".mt.json")) + .ok() + .as_deref(), ); let mut changes: Vec = Vec::new(); diff --git a/crates/mt/src/commands/audit.rs b/crates/mt/src/commands/audit.rs index bd5d8c7..4926162 100644 --- a/crates/mt/src/commands/audit.rs +++ b/crates/mt/src/commands/audit.rs @@ -33,10 +33,14 @@ pub fn run_verdict(args: VerdictArgs, json: bool) -> Result<(), String> { &args.reason, false, )?; - emit(json, &serde_json::json!({ "audit_result_file": file }), |_| { - let verdict = if args.success { "success" } else { "failed" }; - println!("audit verdict ({verdict}): {file}"); - }); + emit( + json, + &serde_json::json!({ "audit_result_file": file }), + |_| { + let verdict = if args.success { "success" } else { "failed" }; + println!("audit verdict ({verdict}): {file}"); + }, + ); Ok(()) } @@ -55,9 +59,13 @@ pub fn run_clarify(args: ClarifyArgs, json: bool) -> Result<(), String> { let node_path = resolve_node_path(args.name, &tasks_dir)?; let actor = args.actor.unwrap_or_else(|| "auditor".to_string()); let file = audit::clarification(&tasks_dir, &node_path, &actor, &args.question)?; - emit(json, &serde_json::json!({ "clarification_file": file }), |_| { - println!("clarification: {file}"); - }); + emit( + json, + &serde_json::json!({ "clarification_file": file }), + |_| { + println!("clarification: {file}"); + }, + ); Ok(()) } diff --git a/crates/mt/src/commands/docs/check.md b/crates/mt/src/commands/docs/check.md index 00baed1..b232f7a 100644 --- a/crates/mt/src/commands/docs/check.md +++ b/crates/mt/src/commands/docs/check.md @@ -3,35 +3,34 @@ type: Rust Module title: check.rs resource: crates/mt/src/commands/check.rs docgen: - crc: 39ba7ebf + crc: 58e04cec model: openai-codex/gpt-5.5 tier: cloud-avg score: 100 - issues: judge-refine:kept-original,judge:inaccurate:0.98 judgeModel: openai-codex/gpt-5.4-mini --- ## Огляд -Файл реалізує one-shot gate для `mt check` — колишнього `mt watch`, який показує, чи є в проєкті задачі або worktree, що потребують перегляду перед продовженням роботи чи в CI. Він звітує про pending-audit без результату, вузли на plan-review, провалені вузли й застарілі worktree, а exit-кодом відрізняє чистий стан від стану, де потрібна увага. - -Перевірка працює fail-safe: перехоплює помилки, не кидає винятків назовні і за окремих збоїв повертає порожній результат замість переривання виконання. +Виконує одноразовий attention-check для `mt check` — колишнього `mt watch`, щоб CLI або CI могли швидко визначити, чи є pending-audit без результату, `stale worktrees`, вузли на plan-review або провалені вузли. `CheckArgs` задає вхідні умови перевірки, а `run` запускає гейт і повертає exit-код: `0` для чистого стану, `1` коли є категорії, що потребують перегляду. ## Поведінка -`CheckArgs` позначає запуск перевірки без додаткових налаштувань: поведінку визначає поточний проєкт, режим виводу та стан задач і worktree. +`CheckArgs` задає порожню конфігурацію запуску: поведінка перевірки визначається поточним проєктом, знайденими задачами, worktree-станом і режимом виводу. + +`run` виконує одноразову перевірку уваги для CLI/CI. Спочатку визначається каталог задач, далі збираються пов’язані worktree та дерево задач; дерево розгортається в єдиний список, щоб усі вузли перевірялися за спільними правилами незалежно від вкладеності. + +Зі списку задач формуються групи для звіту: очікування audit-результату, очікування plan-review та провалені вузли. Окремо з конфігурації проєкту береться поріг застарілості worktree; інвентаризація worktree повертає застарілі записи. -`run` збирає актуальний зріз задач із директорії задач, розгортає дерево у спільний перелік вузлів і з нього формує групи, що потребують уваги: задачі на pending-audit, plan-review і failed. Додатково читає конфігурацію проєкту для порогу застарілості worktree, зіставляє знайдені задачі з worktree репозиторію та fail-safe повертає порожній список застарілих worktree, якщо корінь репозиторію або інвентаризація недоступні. +Результат іде або в JSON, або в людиночитний stdout. JSON містить усі зібрані групи та прапорець потреби уваги. Текстовий режим друкує «чисто — уваги не потребує», коли немає pending-audit, plan-review, stale worktrees і failed-вузлів; інакше виводить знайдені записи за категоріями. -Результат перевірки йде або в machine-readable JSON, або в текстовий вивід для людини. У чистому стані команда повідомляє, що увага не потрібна; інакше друкує кожну знайдену категорію окремими рядками. Процес завершується з кодом `0`, коли немає pending-audit, plan-review і stale worktrees, та з кодом `1`, коли такі сигнали є. Провалені вузли виводяться й потрапляють у JSON, але самі по собі не роблять стан таким, що потребує уваги для exit-коду. +Завершення процесу використовується як CI-гейт: код `0` означає відсутність уваги, код `1` — наявність pending-audit, plan-review або stale worktrees. Провалені вузли потрапляють у звіт, але самі по собі не формують прапорець потреби уваги. ## Публічний API -- CheckArgs — задає вхідні налаштування для одноразової перевірки уваги/CI-гейта `mt check`. -- run — виконує one-shot перевірку стану: знаходить `pending-audit` без результату, застарілі worktrees, вузли на `plan-review` і failed nodes. Завершується з `exit 0`, коли все чисто, або `exit 1`, коли є що переглянути. Працює fail-safe: перехоплює помилки, не викидає винятки назовні та в окремих помилкових сценаріях повертає порожнє значення на кшталт `null`. +- CheckArgs — описує налаштування запуску `mt check` як one-shot attention/CI-гейта. +- run — перевіряє стани для звіту: `pending-audit` без результату, stale worktrees, вузли на `plan-review` і провалені вузли. Завершується з exit `0`, коли перегляд не потрібен, і з exit `1`, коли є що переглянути. ## Гарантії поведінки - Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати. -- Перехоплює помилки і не пропускає винятків назовні (fail-safe). -- За певних помилок повертає порожнє значення (напр. `null`) замість винятку. diff --git a/crates/mt/src/commands/docs/doctor.md b/crates/mt/src/commands/docs/doctor.md new file mode 100644 index 0000000..7d20d58 --- /dev/null +++ b/crates/mt/src/commands/docs/doctor.md @@ -0,0 +1,37 @@ +--- +type: Rust Module +title: doctor.rs +resource: crates/mt/src/commands/doctor.rs +docgen: + crc: ff279eb9 + model: openai-codex/gpt-5.5 + tier: cloud-avg + score: 100 + issues: judge-refine:kept-original,judge:inaccurate:0.97 + judgeModel: openai-codex/gpt-5.4-mini +--- + +## Огляд + +Команда `mt doctor` збирає діагностику конфігурації `.mt.json`, робочої теки `mt/` і пов’язаного git-стану проєкту, щоб показати стан готовності середовища до роботи. Публічні точки входу: `DoctorArgs`, `run`. + +Окремі локальні fail-safe гілки пом’якшують збої й можуть повертати порожнє значення, зокрема `null`, замість винятку. Інші помилки можуть поширюватися назовні. + +## Поведінка + +`DoctorArgs` задає порожню форму командних опцій для діагностичної команди, тому поведінка перевірок визначається контекстом запуску та режимом виводу. + +`run` збирає діагностичні результати послідовно: спершу намагається знайти робочу теку задач на основі стану проєкту та `.mt.json`, потім, якщо це вдалося, перевіряє належність цієї теки до git-репозиторію й наявність віддаленого `origin`. Кожна перевірка перетворюється на запис зі статусом і поясненням, а невдалі локальні кроки не переривають збір решти доступної діагностики. + +Результат іде або в машинний JSON із загальним підсумком, або в текстовий список позначених перевірок для людини. Завершальний статус процесу відображає сукупний стан: успіх лише тоді, коли всі зібрані перевірки успішні; інакше команда завершується з помилковим кодом. + +## Публічний API + +- DoctorArgs — описує вхідні налаштування команди діагностики. +- run — виконує діагностику .mt.json, `mt/` і git-стану проєкту, щоб користувач побачив проблеми, які заважають коректній роботі інструмента. + +## Гарантії поведінки + +- Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати. +- Містить локальні fail-safe гілки; інші помилки можуть поширюватися назовні. +- Деякі локальні fail-safe гілки повертають порожнє значення (напр. `null`) замість винятку. diff --git a/crates/mt/src/commands/docs/index.md b/crates/mt/src/commands/docs/index.md index db7c8a8..029b3b6 100644 --- a/crates/mt/src/commands/docs/index.md +++ b/crates/mt/src/commands/docs/index.md @@ -4,6 +4,7 @@ title: crates/mt/src/commands resource: crates/mt/src/commands/ --- -| Файл | Тип | -| -------------------- | ----------- | -| [check.rs](check.md) | Rust Module | +| Файл | Тип | +| ---------------------- | ----------- | +| [check.rs](check.md) | Rust Module | +| [doctor.rs](doctor.md) | Rust Module | diff --git a/deny.toml b/deny.toml index 689111b..8c86cb6 100644 --- a/deny.toml +++ b/deny.toml @@ -1,10 +1,6 @@ -version = 2 - [advisories] -vulnerability = "deny" -unmaintained = "warn" +unmaintained = "workspace" yanked = "warn" -notice = "warn" ignore = [] [bans] @@ -14,7 +10,6 @@ highlight = "all" skip = [] [licenses] -unlicensed = "deny" allow = [ "Apache-2.0", "Apache-2.0 WITH LLVM-exception", @@ -23,6 +18,11 @@ allow = [ "ISC", "MIT", "Unicode-3.0", + "Zlib", +] +exceptions = [ + # uluru — транзитивна залежність gix-odb; MPL-2.0 (file-level copyleft) точково, не глобально + { allow = ["MPL-2.0"], crate = "uluru" }, ] confidence-threshold = 0.8 diff --git a/knip.json b/knip.json index 7f1ef2a..8f61182 100644 --- a/knip.json +++ b/knip.json @@ -1,43 +1,14 @@ { - "$schema": "https://unpkg.com/knip@5/schema.json", - "project": ["**/*.{js,mjs,cjs,jsx,ts,tsx,mts,cts}"], - "ignore": ["**/__fixtures__/**"], - "ignoreDependencies": ["@nitra/cspell-dict", "/@cspell\\/dict-.+/", "ajv", "globals", "graphql"], - "ignoreBinaries": [ - "actionlint", - "cspell", - "eslint", - "git-ai", - "jscpd", - "markdownlint-cli2", - "oxfmt", - "oxlint", - "shellcheck", - "trufflehog", - "uvx", - "v8r", - "zizmor" - ], - "workspaces": { - ".": { - "entry": [ - "eslint.config.{js,mjs,cjs}", - "stylelint.config.{js,cjs,mjs}", - "oxlint.config.{js,mjs}", - "jscpd.config.{js,mjs}", - "markdownlint-cli2.config.{js,mjs,cjs,jsonc}", - ".markdownlint-cli2.{jsonc,cjs,mjs}", - "commitlint.config.{js,cjs,mjs}", - ".pi/extensions/**/index.ts" - ] - }, - "relay": { - "entry": ["lib/relay.mjs", "stryker.config.mjs", "**/*.test.{js,mjs}"], - "project": ["**/*.{js,mjs}"] - }, - "layers": { - "entry": ["lib/cli.mjs", "lib/status.mjs", "stryker.config.mjs", "**/*.test.{js,mjs}"], - "project": ["**/*.{js,mjs}"] - } - } + "$schema": "https://unpkg.com/knip@6/schema.json", + "ignore": [".pi/**", "eslint.config.js", "**/stryker.config.mjs"], + "ignoreBinaries": ["oxfmt"], + "ignoreDependencies": [ + "@7n/mt", + "@7n/rules-ci-github", + "@7n/rules-lang-js", + "@7n/rules-lang-rust", + "@nitra/cspell-dict", + "@nitra/eslint-config", + "@stryker-mutator/vitest-runner" + ] } diff --git a/layers/lib/cli.mjs b/layers/lib/cli.mjs index dfbebf0..b9ea523 100644 --- a/layers/lib/cli.mjs +++ b/layers/lib/cli.mjs @@ -39,7 +39,7 @@ const VALUE_FLAGS = new Set(['--only', '--lang']) * @param {string[]} argv аргументи після імені скрипта * @returns {{command?: string, docsDir?: string, flags: Record}} розібрані аргументи */ -export function parseArgv(argv) { +function parseArgv(argv) { /** @type {Record} */ const flags = {} const positional = [] @@ -61,7 +61,7 @@ export function parseArgv(argv) { * @param {string} docsDir корінь полігона документації * @returns {{readFile: (rel: string) => string | null, writeFile: (rel: string, text: string) => void}} io-пара */ -export function createIo(docsDir) { +function createIo(docsDir) { return { /** * @param {string} rel відносний шлях diff --git a/layers/lib/layers.mjs b/layers/lib/layers.mjs index 923c491..909b3e5 100644 --- a/layers/lib/layers.mjs +++ b/layers/lib/layers.mjs @@ -3,7 +3,7 @@ import { readFileSync } from 'node:fs' import { join } from 'node:path' -export const CONFIG_NAME = 'layers.json' +const CONFIG_NAME = 'layers.json' const LAYER_RE = /^L(\d+)$/ const MD_EXT_RE = /\.md$/ @@ -120,7 +120,7 @@ function validateFragmentSources(docs, sourcedBy) { * @param {ReturnType} config результат loadConfig * @returns {string[]} помилки (порожньо — конфіг валідний) */ -export function validateConfig(config) { +function validateConfig(config) { const errors = [] const sourcedBy = new Map() for (const [file, entry] of Object.entries(config.docs)) { diff --git a/package.json b/package.json index a9d4768..0408f7e 100644 --- a/package.json +++ b/package.json @@ -18,11 +18,12 @@ "@7n/rules": "^1.55.3", "@7n/rules-ci-github": "^1.9.0", "@7n/rules-lang-js": "^0.9.0", - "@7n/rules-lang-rust": "^0.6.1", + "@7n/rules-lang-rust": "^0.16.1", "@nitra/cspell-dict": "^2.2.2", "@nitra/eslint-config": "^3.10.3", "@stryker-mutator/vitest-runner": "^9.6.1", "@vitest/coverage-v8": "^4.1.10", + "knip": "^6.32.1", "vitest": "^4.1.10" }, "engines": { @@ -30,6 +31,7 @@ "node": ">=25" }, "trustedDependencies": [ + "tree-sitter-rust", "unrs-resolver" ] }