{"_id":"ultrascore","_rev":"14-17adcb3053988ab6fb38a2d1874ca143","name":"ultrascore","dist-tags":{"latest":"0.1.13"},"versions":{"0.1.0":{"name":"ultrascore","version":"0.1.0","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.0","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"4540bda89e3668a5d21954ea1167aee901d222fb","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.0.tgz","fileCount":6,"integrity":"sha512-H9ubKwEPbNFdQ5U5q/MdYtX+77LQMXsjoi6cYvFa2sXYTr+uOrbGJXSNDy7d/e/zUNKlPJ8RIFHsgLwHILg/bg==","signatures":[{"sig":"MEYCIQDIkCbEI0yryl5bDmYHAqMCVDMQxYQPyIznSyQgeg0DkwIhAJw8qOfLTnsfB1Ue/hsTHoCfe9qfp28THo0IRPMTse9k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44830},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.0_1789013136862_0.10404793146875946","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"ultrascore","version":"0.1.1","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.1","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"26c3ecb962bf6e4164cb037cd0addc800b82a47e","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.1.tgz","fileCount":6,"integrity":"sha512-JRabl3T6nqXCQpkYwf9xOG9CrrhRWJnRKypFg3EJ5vJKjtkeFwsJzltt0sRcBpghnTnpmM0rFOyvqXFlMS6tFA==","signatures":[{"sig":"MEYCIQDn1eF3Ee179sQWQwO4HnpyTNQNuYHoqMhm8qUd/4MdygIhAMtg3Sd7SppbmcgC7978wzTgQSp0+DjPpc9lRwg+5W/N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44931},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.1_1789014603807_0.4082747715595352","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"ultrascore","version":"0.1.2","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.2","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"7acbc069d8740855ee68320b3bcba0860d73c523","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.2.tgz","fileCount":6,"integrity":"sha512-9D0A60P83+Mauk/bq1/LiKzYohVSPtd9zf+LkoZn+gjc8pQpncC60MsNilkWW/HZlypaG/KEKgxJD3P6Qsrl6Q==","signatures":[{"sig":"MEQCIHAJ2GsGEp2eF0wOYQ+OrpDmFW7uGg+fF/K7RSHhwxTKAiBjbK9jpBkxv3ElRHlTF8gm5N5VKmiBDVpPo+24rN3qNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48971},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.2_1789015625967_0.2628937859127478","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"ultrascore","version":"0.1.3","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.3","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"f96c4e3652e556e01488cbe402d39b178c971427","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.3.tgz","fileCount":6,"integrity":"sha512-0HDU+OhBh1hkJ7hE/A++W7rAkt2mWNyp4nZS/hYn4M8Kym4P+7AAvjwfWD1dz+qLhEbAu8UlGuzjcuhcyXc5IQ==","signatures":[{"sig":"MEUCIQC1pwM3kW/c++oAu5hSrhKUd8h9XYJtE4RC+7nahgdkSQIgdr2Ar/ztsfp7Zp5K4Nz77rrS2KUMJO3hAelvcEFjQ38=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49539},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.3_1789015859938_0.0628749590694413","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"ultrascore","version":"0.1.4","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.4","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"a0be138ec016d9c877d982259e22eda8f745bffe","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.4.tgz","fileCount":6,"integrity":"sha512-K9z8IY64dFr9FnQiFF8UimfGSK2HSCgPAAH9O1rggce7NeQU1A4i0L3VjjcOGbOXltD3llMLpGRobVqrBfy0Fg==","signatures":[{"sig":"MEUCIQC/SHf4Dg573qmeUrQjMo49/pyt0YKXnqFJgO6SBNVJUwIgPwruGVv4Efb1i5bzNRPuYuyO17LaFwGgIPPOwLqQBf4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51754},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.4_1789015921160_0.4935209465417927","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"ultrascore","version":"0.1.5","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.5","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"a8099057e3fb91c6d69fd04b21a8e36cf3b9e7ac","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.5.tgz","fileCount":6,"integrity":"sha512-40CzI0vRs7c7+pW0kKq5GTvL1b3g2BGxNso65yRt16D4XvwtxF7VYkwz2MvVhKmH2llsJmbVJSEZyy/gKJ605w==","signatures":[{"sig":"MEUCIQDO9aCAVtp6sKJSvdHMaoz5lTuMyp5dtgr6hPy+HoG1zwIgYcEhYS62Zo1p7dgciLL9thTcylQ2TqwVmayM4s/Pqls=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52782},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.5_1789017335771_0.8630774052847201","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"ultrascore","version":"0.1.6","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.6","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"947efeb664f9be1236f199a4678328daebaadfab","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.6.tgz","fileCount":6,"integrity":"sha512-ydRbabq36gKZ3lCLRStmjV9VgJ79Sw/o94kzNwYO4znatbE1a7ufp+jtRMBeA1KpPcPPT+/v/PTFZSL3s+rXVg==","signatures":[{"sig":"MEUCIQC1eo9pf59w3ixpJ9hMXM/5UdXVdbYNaYU2sr4gp/K6AgIgC3WPWN0EeeGdjx4ola/WrMBvrmgSV2Qyg7I1KhPGKX4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59305},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.6_1789017549226_0.2744984591738773","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"ultrascore","version":"0.1.7","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.7","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"8f28cb801e424180b0894ac3c75a3cc91570b776","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.7.tgz","fileCount":6,"integrity":"sha512-GViHh4NkXtPJSpCmbpqNVzPsehWTkxb3ByYU1v98UydDYTR6tSzi+w3C8TDv2k6Uo06FB+GFtcw+MmBze706Rw==","signatures":[{"sig":"MEYCIQDgZBgE3wCRGJgsXAW1WMjoOLwl5P3DLPx5CPRdFYPSSwIhAIfjRSkds12lIk4hwC2d6eN+tV8gzIJ9IMmFT5qRGldB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65705},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.7_1789017767943_0.3640660780789009","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"ultrascore","version":"0.1.8","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.8","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"a9da3f4ff8a8a70718f7e8060b2f89d1b704d960","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.8.tgz","fileCount":6,"integrity":"sha512-Hk0+VMOP14e7rYDUW3ygHSyonHrQaIUPPRik/9ctv41p2npFfmnaBHPbNZtI3AVOTQ3dOpeATSxxcv1wO8qvOg==","signatures":[{"sig":"MEQCIE4SjcM58/vi6IrOBUMATMKZD56nV7qNQemiXELNAiY7AiBx3B+oL0K2KUmfq04yDPfsPctX8ZnsxMAzzjkdrksMsw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66613},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.8_1789017924593_0.6841504444118243","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"ultrascore","version":"0.1.9","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.9","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"e7ebcdbf46692ccd10632441a8de420543b786a6","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.9.tgz","fileCount":6,"integrity":"sha512-p8uDtWkb94PLBAonpi27F9Vkp0xntrgHtxL4elodOc4tLEzsN1P/m06RPStn6EH49Ed7hJ6BF3/MOrKjSdRjtw==","signatures":[{"sig":"MEUCIH0dSUvsF8YvXZ8oxjwvsOC6jZyGgTcgN4Ve3e8N0EKVAiEAhSi4x+KO4jvx6nD1YZKr3OvYs5473w15Y/zTGNeTUeI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67867},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.9_1789018069151_0.32225305436849494","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"ultrascore","version":"0.1.10","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.10","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"05d866445d83b99e853163ec19049950aef666bd","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.10.tgz","fileCount":6,"integrity":"sha512-zjmYmXpKufVT8ZumMnoZ4WPeXr6amBx+ijUBFM2t4f0PDgtCOebEEQSPyvJb8Unm5nbeP0jy1/cA6pTmlDIz/Q==","signatures":[{"sig":"MEYCIQDj+CrNeD4X5s7LZpEcb4Wu+Pzg52Ohhrf8nx7wK1LCagIhAKCblcZfF48516UtNo9E/V29WcLbOUwTPMn10maOzcTE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67737},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.10_1789018374980_0.12270346739524407","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"ultrascore","version":"0.1.11","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.11","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"7f759bfd2f30a41adac3a54b0c6147587ab6df76","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.11.tgz","fileCount":6,"integrity":"sha512-+tsorvmW2mCMU4IjOmBPFvZK1z6RB9L7Vm945WPePLw7rLF+7AKV232pCnLwNKkYv/kw+KVUPSxbPxJjt+CH1A==","signatures":[{"sig":"MEYCIQD3r4TCwh9nxfTZNI4fD/6IcXSQdlcW+pHI6JoYrGMwIwIhAMWVfI3exSqBoFe+PVkQR1R/2HtIlAm97Ehl6+9lUs4J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70781},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.11_1789018510679_0.14959182014693395","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"ultrascore","version":"0.1.12","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","_id":"ultrascore@0.1.12","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"dist":{"shasum":"645ba45b2813452d08d1814aaf707d488db4f116","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.12.tgz","fileCount":6,"integrity":"sha512-2uz6872r5EXMtg16qmvKgOHkLX/G0x0sZ6121gU1Wckm9m1ky0EuiCTc7yv6GcDeSo4Pb9D+Pn/xcMHcy/+8yA==","signatures":[{"sig":"MEUCIDLhld4E2kVQplB7sb7hzHZspaaA+HdI8VnCJHOcIUcrAiEAipj0HtmMbIuGo20fdsaO+idX3Md8sd03qP4IscPv0xE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69929},"type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","scripts":{"test":"bun run build.ts && bun test","build":"bun run build.ts","clean":"git clean -xdf .turbo dist node_modules","types":"tsgo --noEmit"},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"_npmVersion":"11.11.0","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"oxlint":"^1.82.0"},"_npmOperationalInternal":{"tmp":"tmp/ultrascore_0.1.12_1789018732272_0.6365076981444702","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"ultrascore","version":"0.1.13","description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"license":"MIT","type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config.d.ts","default":"./dist/config.js"}},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"bun run build.ts","test":"bun run build.ts && bun test","types":"tsgo --noEmit","clean":"git clean -xdf .turbo dist node_modules"},"devDependencies":{"oxlint":"^1.82.0"},"packageManager":"bun@1.4.2","gitHead":"38c3c284b5ccb450df2c41a0c075bf648a66b871","_id":"ultrascore@0.1.13","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-cIeUav6iiplhze1HIuHyDlBUcqFZI5LwvSZr4QOTJlboyVJV9Tta6shExoPj3CGOHVcOMe5PsphCbTUg2ukSIg==","shasum":"2c2a3a85497a0507289c89c613cd7815caa4c016","tarball":"https://registry.npmjs.org/ultrascore/-/ultrascore-0.1.13.tgz","fileCount":6,"unpackedSize":70691,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCrGTt2Jnu4jd5oSOYxRQjLz69fBmxSgCCz0AD1ON6PJAIhAL84jSZa8b7W7VMoUBB7qnHavT9m/LmCWO8DZpadm/kB"}]},"_npmUser":{"name":"curlyz","email":"curly.saigonese@gmail.com"},"directories":{},"maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ultrascore_0.1.13_1789020639694_0.15925793135538058"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-10T04:05:36.643Z","modified":"2026-09-10T06:10:40.036Z","0.1.0":"2026-09-10T04:05:37.026Z","0.1.1":"2026-09-10T04:30:03.997Z","0.1.2":"2026-09-10T04:47:06.104Z","0.1.3":"2026-09-10T04:51:00.088Z","0.1.4":"2026-09-10T04:52:01.298Z","0.1.5":"2026-09-10T05:15:35.908Z","0.1.6":"2026-09-10T05:19:09.362Z","0.1.7":"2026-09-10T05:22:48.081Z","0.1.8":"2026-09-10T05:25:24.733Z","0.1.9":"2026-09-10T05:27:49.292Z","0.1.10":"2026-09-10T05:32:55.098Z","0.1.11":"2026-09-10T05:35:10.806Z","0.1.12":"2026-09-10T05:38:52.422Z","0.1.13":"2026-09-10T06:10:39.829Z"},"license":"MIT","keywords":["oxlint","oxc","linter","plugin","underscore","naming","structure","eslint"],"description":"Opinionated oxlint plugin that enforces the underscore standard: every low-level concern (schemas, enums, tables, providers, repositories, ...) is exiled into one `_` folder behind a single namespace import, so the rest of the codebase reads as pure high-","maintainers":[{"name":"curlyz","email":"curly.saigonese@gmail.com"}],"readme":"# ultrascore\n\n[![npm version](https://img.shields.io/npm/v/ultrascore.svg)](https://www.npmjs.com/package/ultrascore)\n[![npm downloads](https://img.shields.io/npm/dm/ultrascore.svg)](https://www.npmjs.com/package/ultrascore)\n[![license](https://img.shields.io/npm/l/ultrascore.svg)](https://www.npmjs.com/package/ultrascore)\n\n**Built for:**\n![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)\n![oxlint](https://img.shields.io/badge/oxlint-EB3A16?logo=oxc&logoColor=white)\n![Zod](https://img.shields.io/badge/Zod-3E67B1?logo=zod&logoColor=white)\n![Drizzle](https://img.shields.io/badge/Drizzle_ORM-C5F74F?logo=drizzle&logoColor=black)\n![React](https://img.shields.io/badge/React-61DAFB?logo=react&logoColor=black)\n![Cloudflare Workers](https://img.shields.io/badge/Cloudflare_Workers-F38020?logo=cloudflareworkers&logoColor=white)\n\n**This is a quality-of-life plugin for the solo developer.** Increasingly\nthat means a solo developer plus a fleet of coding agents. The end result:\nyou open any repo, on any day, tired or not, and can immediately see what\nthe product *does* — not wade through validation, error classes, and\nprovider calls to find the one decision that's actually yours. Less time\nre-orienting yourself in your own code. More of every file spent on the\npart that matters.\n\nIt's a deliberate division of labor. **Everything that moves into `_` is\nthe surface an agent reviews for you** — exhaustively, tirelessly, file by\nmechanical file. **Everything left outside `_` is the surface you review\nyourself** — because it's short enough to hold in your head, and every line\nin it is a decision you actually need to see. Your attention is the scarce\nresource here, not the agent's; this is what spends it only on high-level\ndesign instead of on code that all looks the same after the tenth file.\n\n> **Who this is for.** This is only suitable if you're working alone, or\n> your whole team has explicitly opted in. It is a highly opinionated\n> standard optimized for agentic coding — a codebase one person (plus their\n> agents) reads and rewrites constantly and can afford to reshape at will —\n> not for team collaboration, where a shared placement law that nobody but\n> you agreed to becomes friction, not help. Every PR that touches shared code\n> now has to argue about which `_` category it belongs in. Don't impose this\n> on a team that hasn't asked for it.\n\n## Why this exists\n\nI run a lot of projects, and almost none of the code in them is typed by\nhand anymore — it's written by agents, often several running at once,\nacross dozens of repos. **Agents are extremely good at producing correct\ncode and completely indifferent to where they put it** — a Zod schema here,\na bespoke error class there, a raw provider call three lines into a route\nhandler nobody asked it to touch. Multiply that by every feature, every\nrepo, every week, and the signal drowns in noise. **Reviewing stopped being\nthe fast part.**\n\nThe fix was a rule I'd already been enforcing by hand across my own\nprojects, written down as a standing law every agent reads before touching a\nrepo: **every low-level concern — schemas, contracts, persistence, provider\ncalls, the boring 80% — moves into one folder, always named `_`**, organized\ninto one category per kind, consumed through exactly one namespace import. I\ncalled it **the underscore standard** because the folder itself, `_`, is the\nwhole idea: a name you choose specifically because it's easy to overlook and\nunglamorous to grow, so it stays that way — and everything else in the repo\ngets to **read almost like a sentence** instead of implementation detail.\n**You stop reading implementation and start reading intent.**\n\nWriting that convention down didn't make agents follow it. Telling an agent\n\"please respect the underscore standard\" in a prompt works about as well as\ntelling a teammate \"please remember to floss\" — sincere, forgotten by\nTuesday. **It needed to be a real, mechanical lint rule, not a suggestion.**\nAnd copy-pasting a bespoke enforcement script into every repo — which is\nexactly what I'd been doing — meant fixing the same bug in fifteen places\nand never trusting any of them fully. So I forked\n[ultracite](https://github.com/haydenbleasel/ultracite) — an already\nexcellent, battle-tested, zero-config strict linting preset — and grafted\nthe underscore standard onto it as a real oxlint plugin, published once,\nreused everywhere. **ultrascore** is exactly that: **ultra**cite +\n**underscore**.\n\n## Before\n\nThree real shapes of the same problem — a backend route, a frontend\ncomponent, a scheduled worker — so the pattern reads as general, not a\none-off example picked to look good. Everything below is real code, nothing\ncontrived: this is what \"just get it working\" looks like in most codebases,\nand it's exactly why nobody enjoys reading these files six months later.\n\n### An API route\n\n**Four unrelated concerns tangled into one function**: a validation schema,\nan error type, a raw HTTP call to a provider, and a pricing rule. To\nunderstand what `createOrder` actually *does*, you have to first read past\neverything it *doesn't* need to explain.\n\n```ts\n// api/orders/create.ts\nimport { z } from \"zod\";\n\nconst orderInputSchema = z.object({\n  sku: z.string().min(1),\n  quantity: z.number().int().positive(),\n  currency: z.enum([\"USD\", \"EUR\"]),\n});\n\nclass OutOfStockError extends Error {}\n\nexport async function createOrder(request: Request) {\n  const body = orderInputSchema.parse(await request.json());\n\n  const inventoryResponse = await fetch(`https://inventory.internal/skus/${body.sku}`, {\n    headers: { Authorization: `Bearer ${process.env.INVENTORY_TOKEN}` },\n  });\n  if (!inventoryResponse.ok) {\n    throw new Error(`Inventory lookup failed: ${inventoryResponse.status}`);\n  }\n  const inventory = (await inventoryResponse.json()) as { available: number };\n  if (inventory.available < body.quantity) {\n    throw new OutOfStockError(body.sku);\n  }\n\n  const total = body.quantity * (body.currency === \"USD\" ? 9.99 : 8.49);\n\n  return { sku: body.sku, quantity: body.quantity, total, currency: body.currency };\n}\n```\n\n### A frontend component\n\nA component that fetches, classifies, and formats, **all inline** — the\nfetch, the state-classification rule, and the display copy are three\nunrelated concerns with no separate owner.\n\n```tsx\n// components/AccountUsagePanel.tsx\nimport { useEffect, useState } from \"react\";\n\ntype UsageState = \"under\" | \"near\" | \"over\";\n\nfunction classifyUsage(used: number, cap: number): UsageState {\n  const ratio = used / cap;\n  if (ratio >= 1) return \"over\";\n  if (ratio >= 0.8) return \"near\";\n  return \"under\";\n}\n\nconst usageLabel: Record<UsageState, string> = {\n  under: \"On track\",\n  near: \"Approaching limit\",\n  over: \"Over limit\",\n};\n\nexport function AccountUsagePanel({ accountId }: { accountId: string }) {\n  const [usage, setUsage] = useState<{ used: number; cap: number } | null>(null);\n\n  useEffect(() => {\n    fetch(`/api/accounts/${accountId}/usage`)\n      .then((response) => response.json())\n      .then(setUsage)\n      .catch(() => setUsage(null));\n  }, [accountId]);\n\n  if (!usage) return null;\n  const state = classifyUsage(usage.used, usage.cap);\n\n  return <span className={`badge badge-${state}`}>{usageLabel[state]}</span>;\n}\n```\n\n### A scheduled worker\n\n**Scheduling glue, idempotency, retry, and the actual send are one\nfunction** — none of which is scheduling logic except the top-level `if`.\n\n```ts\n// workers/email/src/entrypoint.ts\nexport default {\n  async scheduled(event: ScheduledEvent, env: Env) {\n    const digestKey = `digest:${new Date().toISOString().slice(0, 10)}`;\n    if (await env.KV_DIGEST_LOG.get(digestKey)) return;\n\n    let attempts = 0;\n    while (attempts < 3) {\n      try {\n        const response = await fetch(\"https://api.resend.com/emails\", {\n          method: \"POST\",\n          headers: { Authorization: `Bearer ${env.RESEND_API_KEY}` },\n          body: JSON.stringify({ template: \"daily-digest\" }),\n        });\n        if (response.ok) break;\n      } catch {\n        // retry\n      }\n      attempts += 1;\n    }\n    await env.KV_DIGEST_LOG.put(digestKey, \"1\", { expirationTtl: 86_400 });\n  },\n};\n```\n\n## After\n\nSame three files, `ultrascore` enforced. **Each entrypoint keeps only\norchestration; everything mechanical has exactly one address.**\n\n### An API route\n\n**The route file only orchestrates:**\n\n```ts\n// api/orders/create.ts\nimport * as _ from \"@scope/underscore\";\n\nexport async function createOrder(request: Request) {\n  const body = _.orderInputSchema.parse(await request.json());\n  const inventory = await _.readSkuInventory(body.sku);\n\n  if (inventory.available < body.quantity) {\n    throw new _.OutOfStockError(body.sku);\n  }\n\n  return _.priceOrder(body);\n}\n```\n\n```ts\n// _/_schemas/_orderSchemas.ts\nimport { z } from \"zod\";\n\nexport const orderInputSchema = z.object({\n  sku: z.string().min(1),\n  quantity: z.number().int().positive(),\n  currency: z.enum([\"USD\", \"EUR\"]),\n});\n```\n\n```ts\n// _/_exceptions/_orderExceptions.ts\nexport class OutOfStockError extends Error {}\n```\n\n```ts\n// _/_providers/_inventoryProviders.ts\nexport async function readSkuInventory(sku: string) {\n  const response = await fetch(`https://inventory.internal/skus/${sku}`, {\n    headers: { Authorization: `Bearer ${process.env.INVENTORY_TOKEN}` },\n  });\n  if (!response.ok) {\n    throw new Error(`Inventory lookup failed: ${response.status}`);\n  }\n  return response.json() as Promise<{ available: number }>;\n}\n```\n\n```ts\n// _/_operations/_pricingOperations.ts\nimport type { OrderInput } from \"../_interfaces/_orderInterfaces\";\n\nconst unitPrice = { USD: 9.99, EUR: 8.49 } as const;\n\nexport function priceOrder(order: OrderInput) {\n  return { ...order, total: order.quantity * unitPrice[order.currency] };\n}\n```\n\n**Nothing was deleted** — every line of behavior above still exists. It\njust now has an address. `createOrder` reads top to bottom as four short\nsentences: parse the input, read the inventory, guard on stock, price the\norder. That's the whole idea: **the main codebase should read like natural\nlanguage, because it contains only the decisions that matter — everything\nmechanical moved into `_` where it belongs.**\n\n`ultrascore` is the plugin that keeps it that way. **It doesn't just check\nnaming — it reads the actual code**: a `z.object(...)` call is recognized as\na schema no matter what you name it, a class extending `Error` is recognized\nas an exception, a `pgTable(...)` call is recognized as a table definition.\nMove it to the wrong folder, or leave it inline where you wrote it, and the\nlinter tells you exactly where it belongs.\n\n### A frontend component\n\n**The component is purely presentational** — fetching is a hook, the\nclassification rule and the display copy both have one owner:\n\n```tsx\n// components/AccountUsagePanel.tsx\nimport * as _ from \"@scope/underscore\";\n\nexport function AccountUsagePanel({ accountId }: { accountId: string }) {\n  const usage = _.useAccountUsage(accountId);\n  if (!usage) return null;\n\n  const state = _.classifyUsage(usage.used, usage.cap);\n  return <span className={`badge badge-${state}`}>{_.usageLabel[state]}</span>;\n}\n```\n\n```ts\n// _/_operations/_usageOperations.ts\nexport type UsageState = \"under\" | \"near\" | \"over\";\n\nexport function classifyUsage(used: number, cap: number): UsageState {\n  const ratio = used / cap;\n  if (ratio >= 1) return \"over\";\n  if (ratio >= 0.8) return \"near\";\n  return \"under\";\n}\n```\n\n```ts\n// _/_labels/_usageStateLabels.ts\nimport type { UsageState } from \"../_operations/_usageOperations\";\n\nexport const usageLabel: Record<UsageState, string> = {\n  under: \"On track\",\n  near: \"Approaching limit\",\n  over: \"Over limit\",\n};\n```\n\n### A scheduled worker\n\n**The entrypoint is three verbs** — check, send, mark. Retry lives with the\nprovider that needs it; idempotency lives with the store that owns it:\n\n```ts\n// workers/email/src/entrypoint.ts\nimport * as _ from \"@scope/underscore\";\n\nexport default {\n  async scheduled(event: ScheduledEvent, env: Env) {\n    if (await _.wasDigestSentToday(env.KV_DIGEST_LOG)) return;\n    await _.sendDailyDigestWithRetry(env.RESEND_API_KEY);\n    await _.markDigestSent(env.KV_DIGEST_LOG);\n  },\n};\n```\n\n```ts\n// _/_providers/_emailProviders.ts\nexport async function sendDailyDigestWithRetry(apiKey: string, attempts = 3) {\n  for (let attempt = 0; attempt < attempts; attempt++) {\n    const response = await fetch(\"https://api.resend.com/emails\", {\n      method: \"POST\",\n      headers: { Authorization: `Bearer ${apiKey}` },\n      body: JSON.stringify({ template: \"daily-digest\" }),\n    }).catch(() => undefined);\n    if (response?.ok) return;\n  }\n}\n```\n\n```ts\n// _/_repositories/_digestLogRepositories.ts\nconst keyFor = (date: Date) => `digest:${date.toISOString().slice(0, 10)}`;\n\nexport async function wasDigestSentToday(kv: KVNamespace) {\n  return Boolean(await kv.get(keyFor(new Date())));\n}\n\nexport async function markDigestSent(kv: KVNamespace) {\n  await kv.put(keyFor(new Date()), \"1\", { expirationTtl: 86_400 });\n}\n```\n\n## How this changes review\n\nThe split isn't incidental — it assigns review work to the reviewer suited\nto it. **`_` is dense, mechanical, and exhaustively checkable: an agent's\njob.** The main tree is short, decision-bearing, and needs judgment: **your\njob.**\n\n|  | Before `ultrascore` | After `ultrascore` |\n| --- | --- | --- |\n| **Human reviewer** | Has to hold the whole function in working memory to find the one line that's actually a decision — the stock check reads the same as the schema, the fetch, and the retry loop: visually and cognitively interchangeable. At real volume this lands in one of two failure modes: exhaustive (careful, doesn't scale past a couple of PRs a day) or approximate (fast, and the bug that mattered was sitting in the boilerplate you stopped reading closely three lines in). | Reads four or five verbs and is done in seconds. Every noun already announced its category before the file was even opened: `_schemas/`, `_providers/`, `_operations/`, `_labels/`. A diff that only touches `entrypoint.ts` is orchestration — did it call the right things, in the right order, with the right guard? A diff that touches `_/_providers/_emailProviders.ts` is a provider change, read with different eyes, already knowing what kind of bug is even possible there. |\n| **Agent reviewer** | Doesn't get tired, but still has to load and re-derive where a concern lives from a 30-line handler before it can answer something as simple as \"does this respect the retry policy?\" | Goes straight to `_providers/_emailProviders.ts` for that question — the category is legible from the path before a single line is read. A second agent reviewing the first agent's diff can trust that a new file under `_schemas/` is *just* a schema, without re-verifying it isn't secretly doing a fetch call too, because the linter already forbids that. |\n\n**Structure that rescues a tired human's attention is the same structure\nthat shrinks an agent's context window** — the two audiences want the same\nthing for different reasons, and this is the one lint rule that serves\nboth.\n\n## Frontend vs backend: what's human-centered, what moves\n\nThe dividing line is the same on both sides: **orchestration is\nhuman-centered and stays put; implementation is low-level and moves to `_`.**\nWhat counts as \"implementation\" just looks different on each surface.\n\n**Frontend — human-centered, stays where it is:**\n\n- Pages and routes: which components render, in what order, under what\n  condition — the one specific composition that makes this screen this\n  screen and no other.\n- Page-local wiring with no reuse value outside that one page.\n\n**Frontend — moves to `_react/`:** for React specifically, that's pure\ncomponents, hooks, contexts, providers, labels, and locales —\n\n- Anything reused across more than one page.\n- Anything that encodes shared product vocabulary (an enum's display text, a\n  translated string) rather than one screen's specific decisions.\n\n**Backend — human-centered, stays where it is:**\n\n- Entrypoints, routers, and Workflow/procedure classes: the sequence of\n  steps, the platform wiring (retries, checkpoints, route registration), and\n  the plain guard that decides whether to continue.\n- The one-line call to each named operation, provider, or repository — never\n  its implementation.\n\n**Backend — moves to `_`:** schemas, enums, exceptions, constants, tables,\noperations, providers, repositories, mappers —\n\n- Any reusable unit of validation, business logic, persistence, or\n  transport, independent of which entrypoint happens to call it today.\n\nIf you're ever unsure which side of the line something is on, ask: *would a\nsecond, unrelated entrypoint plausibly want to call this exact thing?* Yes →\n`_`. No, it only makes sense here → it stays.\n\n## What's outside `_` in a full-stack repo\n\nWalking the same order/inventory/email-digest domain through a realistic\nmonorepo — everything below is what's *left* once the low-level 20% moves\ninto `_`:\n\n```text\nrepo/\n├── _/                                   everything above — the low-level 20%\n├── website/\n│   └── src/\n│       ├── app/\n│       │   ├── orders/\n│       │   │   ├── page.tsx             list: which columns, which filters render\n│       │   │   └── [id]/page.tsx        detail: which sections, in what order\n│       │   └── account/usage/page.tsx   composes <AccountUsagePanel />\n│       └── components/\n│           └── AccountUsagePanel.tsx    presentational only — calls _.useAccountUsage, _.classifyUsage, _.usageLabel\n├── workers/\n│   ├── gateway/src/\n│   │   ├── index.ts                     Hono app assembly: which routes exist, mount order\n│   │   └── routers/orderRouter.ts       one procedure per endpoint, each body 3–5 lines of `_.` calls\n│   └── email/src/\n│       └── entrypoint.ts                scheduled handler: check, send, mark (see Before/After above)\n├── oxlint.config.ts\n└── package.json\n```\n\n**`website/src/app/`** — pages and layouts. The only place that decides what\na URL renders. `<OrdersTable orders={data} />` is a composition decision — a\nhuman decision about what this screen shows — not implementation, so it\nstays.\n\n**`website/src/components/`** — components that render *one* page's specific\nview. The moment a component, hook, or context is reused by a second page,\nor encodes shared vocabulary instead of one screen's layout, it moves to\n`_react/` (see Frontend vs backend, above).\n\n**`workers/gateway/src/`** — the API surface: route registration, auth\nmiddleware, request/response wiring. Every procedure body is a short\nsequence of `_.` calls — the procedure explains *what* the endpoint does,\n`_operations/` explains *how*.\n\n**`workers/email/src/entrypoint.ts`** — the scheduled/queue/Durable Object\nglue the platform requires: bindings, `env`, lifecycle methods. Platform\nwiring is inherently one-worker-specific, so it's the one piece of \"backend\nimplementation\" allowed to stay outside `_`.\n\n**`oxlint.config.ts` / `package.json`** — toolchain configuration, not\nproduct code.\n\n**Notice what's absent from every file above:** no `z.object`, no\n`class X extends Error`, no `fetch(`, no raw Drizzle call. The moment one of\nthose shows up outside `_`, `migration-candidates` catches it before it\nbecomes a habit.\n\n## What it enforces\n\n- **`imports`** — a public package is consumed only as\n  `import * as _ from \"<package>\"`, with symbols touched directly through\n  `_.Name`; never aliased, destructured, or imported by deep path.\n- **`placement`** — every declaration inside the tree lives in the one\n  category folder its shape dictates (a Zod schema in `_schemas/`, a Drizzle\n  table in `_database/tables/`, an error class in `_exceptions/`, …), in a\n  `_<name><Suffix>.ts` leaf file.\n- **`star-exports`** — `index.ts` barrels contain nothing but `export *`.\n- **`type-imports`** — bindings used only as types use `import type`.\n- **`migration-candidates`** — exported declarations *outside* the tree that\n  look low-level (an enum, a mapper, a label record, …) get flagged for\n  review, so low-level code can't quietly accumulate outside `_` just because\n  nobody happened to import it through the namespace yet.\n\n## Install\n\n```sh\nnpm install --save-dev ultrascore\n```\n\n## Use\n\n```ts\n// oxlint.config.ts\nimport { defineConfig } from \"oxlint\";\nimport defineUltrascore from \"ultrascore/config\";\n\nconst ultrascore = defineUltrascore({\n  packageName: \"@scope/underscore\",\n});\n\nexport default defineConfig({\n  jsPlugins: ultrascore.jsPlugins,\n  rules: ultrascore.rules,\n});\n```\n\nEvery rule shares one options object, reshaping any part of the standard:\n\n| Option                     | Default                                                          | Meaning                                          |\n| --------------------------- | ------------------------------------------------------------------ | -------------------------------------------------- |\n| `root`                      | `\"_\"`                                                              | Tree folder name.                                 |\n| `packageName`               | —                                                                   | The public package the tree's facade publishes.   |\n| `categories`                | `interfaces, schemas, enums, exceptions, constants, tables, operations, providers, repositories, mappers, labels, tanstack, utils` | `category -> filename suffix`; set a value to `\"\"` to drop a default. |\n| `functionOwnerCategories`   | `operations, providers, repositories, mappers, tanstack`           | Categories a plain exported function/class is attributed to. |\n| `facadeCategory`            | `\"underscore\"`                                                     | Name of the barrel-only facade folder.            |\n| `strip`                     | `[\"^_?database/\"]`                                                 | Regex sources stripped before category matching.  |\n| `exceptions`                | drizzle config + documented table/repository infra                | Regex sources exempt from shape/barrel checks.    |\n| `subpaths`                  | `[]`                                                               | Package subpaths also valid as namespace imports. |\n| `bannedPrefixes`            | `[\"~/\"]`                                                           | Non-relative import prefixes treated as reaching into the tree. |\n| `severity`                  | `\"error\"`                                                          | Severity for every rule, including `migration-candidates`. |\n\nRenaming a default category (for example `tanstack` → `react`) needs two\nmatching overrides:\n\n```ts\ndefineUltrascore({\n  packageName: \"@scope/underscore\",\n  categories: { tanstack: \"\", react: \"Keys\" },\n  functionOwnerCategories: [\"operations\", \"providers\", \"repositories\", \"mappers\", \"react\"],\n});\n```\n\nOr merge `jsPlugins`/`rules` onto an existing config by hand instead of using\n`defineUltrascore`.\n\n## Appendix: the full folder shape\n\n```text\n_/\n├── _underscore/          the facade package — re-exports every category barrel\n├── _interfaces/          types and DTO shapes\n├── _schemas/              validation\n├── _enums/                closed enumerations\n├── _exceptions/           error classes\n├── _constants/            immutable values\n├── _database/             tables/, migrations/, drizzle tooling\n├── _operations/           business use cases\n├── _providers/            SDK/HTTP transport\n├── _repositories/         reads and writes\n├── _mappers/              conversions between representations\n├── _labels/               enum display text\n├── _locales/              i18n messages the labels map onto\n├── _utils/                pure helpers\n└── (docs/laws live beside it, never inside the main tree)\n```\n\nEvery leaf file is `_<name><Suffix>.ts` (one underscore, one category\nsuffix — `_channelSchemas.ts`, `_videoEnums.ts`); every `index.ts` is a pure\n`export *` barrel; consumers touch all of it through one\n`import * as _ from \"<package>\"`. That's the whole standard — `ultrascore`\nis what makes it a fact about the repository instead of a policy nobody\nchecks.\n\n## Appendix: what's inside each `_` folder\n\n### `_interfaces/` — types and DTO shapes\n\n```ts\n// _/_interfaces/_orderInterfaces.ts\nexport interface OrderInput {\n  sku: string;\n  quantity: number;\n  currency: \"USD\" | \"EUR\";\n}\n```\n\n### `_schemas/` — runtime validation\n\n```ts\n// _/_schemas/_orderSchemas.ts\nimport { z } from \"zod\";\n\nexport const orderInputSchema = z.object({\n  sku: z.string().min(1),\n  quantity: z.number().int().positive(),\n  currency: z.enum([\"USD\", \"EUR\"]),\n});\n```\n\n### `_enums/` — closed vocabularies\n\n```ts\n// _/_enums/_orderStatusEnums.ts\nexport const OrderStatusEnum = { Pending: \"pending\", Paid: \"paid\", Cancelled: \"cancelled\" } as const;\nexport const OrderStatusEnumValues = Object.values(OrderStatusEnum);\nexport type OrderStatus = (typeof OrderStatusEnum)[keyof typeof OrderStatusEnum];\n```\n\n### `_exceptions/` — error classes\n\n```ts\n// _/_exceptions/_orderExceptions.ts\nexport class OutOfStockError extends Error {}\n```\n\n### `_constants/` — immutable values\n\n```ts\n// _/_constants/_pricingConstants.ts\nexport const UNIT_PRICE = { USD: 9.99, EUR: 8.49 } as const;\n```\n\n### `_database/tables/` — Drizzle table declarations\n\n```ts\n// _/_database/tables/_orderTables.ts\nimport { pgTable, text, integer } from \"drizzle-orm/pg-core\";\n\nexport const orderTable = pgTable(\"order\", {\n  id: text(\"id\").primaryKey(),\n  sku: text(\"sku\").notNull(),\n  quantity: integer(\"quantity\").notNull(),\n});\n```\n\n### `_operations/` — business use cases\n\n```ts\n// _/_operations/_pricingOperations.ts\nimport type { OrderInput } from \"../_interfaces/_orderInterfaces\";\nimport { UNIT_PRICE } from \"../_constants/_pricingConstants\";\n\nexport function priceOrder(order: OrderInput) {\n  return { ...order, total: order.quantity * UNIT_PRICE[order.currency] };\n}\n```\n\n### `_providers/` — SDK/HTTP transport\n\n```ts\n// _/_providers/_inventoryProviders.ts\nexport async function readSkuInventory(sku: string) {\n  const response = await fetch(`https://inventory.internal/skus/${sku}`);\n  return response.json() as Promise<{ available: number }>;\n}\n```\n\n### `_repositories/` — reads and writes\n\n```ts\n// _/_repositories/_orderRepositories.ts\nimport type { Database } from \"./_database\";\nimport { orderTable } from \"../_database/tables/_orderTables\";\n\nexport async function insertOrder(database: Database, params: typeof orderTable.$inferInsert) {\n  const [row] = await database.insert(orderTable).values(params).returning();\n  return row;\n}\n```\n\n### `_mappers/` — conversions between representations\n\n```ts\n// _/_mappers/_orderMappers.ts\nimport type { OrderRow } from \"../_repositories/_orderRepositories\";\n\nexport function mapOrderRowToReceipt(row: OrderRow) {\n  return { orderId: row.id, total: `$${row.total.toFixed(2)}` };\n}\n```\n\n### `_labels/` — enum-keyed display text\n\nOne exhaustive `Record<Enum, string>` per enum — TypeScript fails to compile\nthe moment a new enum member ships without a label, so display text can never\nsilently fall behind the vocabulary it describes:\n\n```ts\n// _/_labels/_orderStatusLabels.ts\nimport type { OrderStatus } from \"../_enums/_orderStatusEnums\";\nimport * as m from \"../_locales/paraglide/messages\";\n\nexport const OrderStatusLabels: Record<OrderStatus, string> = {\n  pending: m.order_status_pending(),\n  paid: m.order_status_paid(),\n  cancelled: m.order_status_cancelled(),\n};\n```\n\n### `_locales/` — the i18n messages `_labels/` map onto\n\nNot TS declarations — this is the i18n project itself: one base-locale\nmessage file, compiled into typesafe functions labels call by name. No\nlabel ever hardcodes display text directly; the string always has a\ntranslation key behind it, even in a single-language project.\n\n```json\n// _/_locales/messages/en.json\n{\n  \"order_status_pending\": \"Awaiting payment\",\n  \"order_status_paid\": \"Paid\",\n  \"order_status_cancelled\": \"Cancelled\"\n}\n```\n\n```ts\n// _/_locales/paraglide/messages.js — generated, never hand-edited\nexport const order_status_pending = () => \"Awaiting payment\";\nexport const order_status_paid = () => \"Paid\";\nexport const order_status_cancelled = () => \"Cancelled\";\n```\n\n### `_tanstack/` (default name) or `_react/` (renamed) — query keys, hooks, components, contexts, providers shared across pages\n\nThe default category key is `tanstack` (suffix `Keys`) since its one\nnon-negotiable job is owning every TanStack Query key factory — the only\nplace a query key is built, so cache invalidation has one source of truth.\nMost projects rename it to `_react/` to also hold the rest of the shared\nfrontend surface (hooks, contexts, providers, pure components); see\n[Renaming a default category](#use) for the two-option change that takes.\n\n```ts\n// _/_tanstack/_queryKeys.ts  (or _/_react/_queryKeys.ts once renamed)\nexport const orderKeys = {\n  all: [\"orders\"] as const,\n  detail: (id: string) => [\"orders\", id] as const,\n};\n```\n\n```tsx\n// _/_react/_hooks/_useOrder.ts  (once the category is renamed and widened)\nimport { useQuery } from \"@tanstack/react-query\";\nimport { orderKeys } from \"../_queryKeys\";\nimport { fetchOrder } from \"../../_providers/_orderProviders\";\n\nexport function useOrder(orderId: string) {\n  return useQuery({ queryKey: orderKeys.detail(orderId), queryFn: () => fetchOrder(orderId) });\n}\n```\n\n### `_utils/` — pure helpers with no other owner\n\n```ts\n// _/_utils/_formatUtils.ts\nexport function formatCurrency(amountMinor: number, currency: string) {\n  return new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency }).format(amountMinor / 100);\n}\n```\n\n### `_underscore/` — the facade: a pure barrel, no implementation\n\n```ts\n// _/_underscore/index.ts\nexport * from \"../_schemas/index\";\nexport * from \"../_exceptions/index\";\nexport * from \"../_operations/index\";\nexport * from \"../_providers/index\";\nexport * from \"../_repositories/index\";\n// ...one line per category actually in use\n```\n","readmeFilename":"README.md"}