{"_id":"@diego22rct/tenets","_rev":"12-0f5eb73c78c1d91506abe0b2f30464d8","name":"@diego22rct/tenets","dist-tags":{"latest":"0.5.4"},"versions":{"0.1.0":{"name":"@diego22rct/tenets","version":"0.1.0","license":"MIT","_id":"@diego22rct/tenets@0.1.0","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"dfd1c3df97a0beaee8f9112f8237b05d60423cc5","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.1.0.tgz","fileCount":31,"integrity":"sha512-GWUTlF8sOBy3k62+BVgC6dG/jFRCPQnkll+5a6nAKkFvJ8HEg+KORMsdHEghcVcLI69qnDnIjf1M7yLSm+XXYQ==","signatures":[{"sig":"MEUCIQCJzrgN57t2z2e8yfl5FMdzVfcthTEhBqOGUqBqH3/p9gIgfV9g/VAy8geI5XNECD7Q2FAi0qBpkJtUuhnXgJ5fQtY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28981},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"0990e59303eb6b0b773cd6e6409309cafdceaae6","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in HonoJS + Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.1.0_1786339070692_0.14505872078546922","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@diego22rct/tenets","version":"0.2.0","license":"MIT","_id":"@diego22rct/tenets@0.2.0","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"746e58d7b90a63f62f04cfecd562a7a0942c6ef9","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.2.0.tgz","fileCount":31,"integrity":"sha512-1GwpvNRvjrXPieH1kmc41nnwcJsDBMHd68FOSYCy5cokN6qlZFR7o7c1+WqaZ32TmPNnDyoAXLA5RmS/O2xyvw==","signatures":[{"sig":"MEUCIF1lNrrzMafPlXXqAt7B4aG6SFggi4a2Keth3koo6TKAAiEAlCP8iqX1NsFULm0m//mJmAhdBhorP7vehH0/Lwg2mHs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29656},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"6d98e93f79d52a70600185f4125ce7b9713e6748","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in HonoJS + Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.2.0_1786340224682_0.759796200164337","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@diego22rct/tenets","version":"0.3.0","license":"MIT","_id":"@diego22rct/tenets@0.3.0","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"b87566e9389bb08fbabf24df76ed4d96a0d111b1","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.3.0.tgz","fileCount":31,"integrity":"sha512-lZd5efhyfHAggqDQKsikVFfOan7YqG6evQaQ9A87/CkLyIVXH/E9xSLYpO2qJAqOvWOWNLbKp9A3tpd+oITAcw==","signatures":[{"sig":"MEUCIF+ewJffBYBfeDvvaik9vsNbfDlUVUkl84jLgiDmcuhCAiEA2CPAr8J5sd1PFPc2VwhS/lsS7TqFLiLyblze/5160KE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31507},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"60049986951f83ea9a072a64d93e4d5957dc6f0b","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in HonoJS + Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.3.0_1786406211113_0.36234964244140455","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@diego22rct/tenets","version":"0.3.1","license":"MIT","_id":"@diego22rct/tenets@0.3.1","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"3476c9bb5547b59825e7cd5efead7e19db4e8e53","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.3.1.tgz","fileCount":31,"integrity":"sha512-s42Nx7D4Vci8KbFfiEnLnP3dmXKBF4sdJX9LmRa5Mtf16k/yAvMTPDL3yfOHZeFytFJm46EuAGHIqgSeIdUPvA==","signatures":[{"sig":"MEUCIQCGpPRwM3dRV5pEvqrjAD61L89sS6v3KB7Eok/SiuqMswIgWzscjziDPAB0wtxDH5M1wddRXYKYB18N9t2NMFHsS0E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31507},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"c12a973977a35fd5f3395b8a8ea206628c45a86a","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in HonoJS + Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.3.1_1786480122179_0.5589478377014732","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@diego22rct/tenets","version":"0.3.2","license":"MIT","_id":"@diego22rct/tenets@0.3.2","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"e70b449ff3381c3ceaaa2adc4a7724f759e10044","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.3.2.tgz","fileCount":31,"integrity":"sha512-Z1sGefuw+db2ljpHZJvzbwedC9vEn9FlgVDt8EKS/tt+DN87c5B8cKc8PiOCb1gDFczakBfqwq36X+SXU61NwQ==","signatures":[{"sig":"MEQCIFGqo8qLkVwV+spdSUYP8urjkeqYuOSkrT1firoOmCyhAiBlEfAc2nItNO6tGgzn/NSHvhru1qUJclMTyUh0jqzQsQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38310},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"cfe915b0f1972272152f71c8b6dbc15bef66c21a","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in HonoJS + Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.3.2_1786491226002_0.42727524893527313","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@diego22rct/tenets","version":"0.4.0","license":"MIT","_id":"@diego22rct/tenets@0.4.0","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"599527f928a8823fe4b1136911a2090ccd1d06ea","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.4.0.tgz","fileCount":31,"integrity":"sha512-ivdYXipqm+pyZ7NcEJE3Fj1ztN+WEFZptv6CxdZjmac1ffXqOBWIgLNogf/xLMhNtAuFphy8lr/NcUj/YK2MyQ==","signatures":[{"sig":"MEUCIGKETbLQ8UhYNCGA0vdB95sbFqawempuaqo6qLFEtxcTAiEA0IPddgUefNWauty2Bj/W/PotYKaIcyZU8drXqI/rgH0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39207},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"ec8d7376b25762d35025b49fd79e2f1c747d624e","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in HonoJS + Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.4.0_1786492486731_0.8772525297461731","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@diego22rct/tenets","version":"0.4.1","license":"MIT","_id":"@diego22rct/tenets@0.4.1","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"55560082960102f94d7dc16886d101c5d7e41cda","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.4.1.tgz","fileCount":33,"integrity":"sha512-9mgQXStPpWFPhaSUfWdN1+B//Jtaeg4lmjgtZlX8bQx0YhWsJUCoR4CPGquGDKZ3tkUBwPFQ/pjsuXs1iKbREA==","signatures":[{"sig":"MEQCICJOCmvGLoIkPhBnyWbFzachOPS3Q3LBZNEbZrWGAWwWAiAxXLzZ3v22KS7FelnXQ8ZqC4Tgm8KrrzFJNjy5wHYE2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41147},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"cfd9deeccd1790edffc017a8507c7f918e506216","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in HonoJS + Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.4.1_1786492707448_0.6867141885995625","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@diego22rct/tenets","version":"0.4.2","license":"MIT","_id":"@diego22rct/tenets@0.4.2","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"4210bfe7f87aca2b3c8355800b3bfd0595854cee","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.4.2.tgz","fileCount":33,"integrity":"sha512-N58dMsJ5ZtcYKdX11DX2goPXoutBLeGPdC4tggn/X1ONtnE1EL23kQO3NoiXciSiaXRgVOFIM5NX1bLcNydB+g==","signatures":[{"sig":"MEYCIQDlAT93//8oW5nrhUNabKNpPlTnBWTTo2kkCRXLeiYAvQIhAONa9z56az+ep3Y8eB/2XzSQYiDLFmEZktGMs5x2qVFj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49784},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"0ebaf9a3ec8b0a856193325f58923473d5e9bcdf","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in Angular, NestJS, HonoJS, and Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","picocolors":"^1.1.1","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.4.2_1786494972655_0.7631774009642316","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@diego22rct/tenets","version":"0.4.3","license":"MIT","_id":"@diego22rct/tenets@0.4.3","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"dabc0993e0d99a6c9cf31a8b9f7b12b79d699a5a","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.4.3.tgz","fileCount":33,"integrity":"sha512-UPHJt5C62qJPrVoDC6tSxr7uxL1fTdrCdFaI3TuUeQjAxaCx3tzQE3qAiC0Fcq6FQ8n3BMDLwR5TUAJ/PkbuRg==","signatures":[{"sig":"MEQCIBp5ppUOzL1XkDZZK+1yeSBpSOZSR9aqUS+rNo4LjGlfAiBtb4dU10BXdSv0Xted6silDx7Ic3hW1XN1z30O1NrzPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51198},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"1feaccebaeab77769f7e50911590dc9cba6d6d6b","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in Angular, NestJS, HonoJS, and Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","picocolors":"^1.1.1","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.4.3_1786495928035_0.3437411717521388","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@diego22rct/tenets","version":"0.5.0","license":"MIT","_id":"@diego22rct/tenets@0.5.0","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"67a50078f6b3f28937e27da26373d26eca4b7e6e","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.5.0.tgz","fileCount":35,"integrity":"sha512-CBIeGm9NeY4Gg3zm5BPjZ+lLoXeesD3jnspD3oEa6YMrw0Ppr1K9JcG8iv5TW5pupqotfOZUzxtBMEwh+6JSrg==","signatures":[{"sig":"MEUCIQDZ+8pJTLirweKJYGUcb72DFgMfEFKFzfga+d9qGYBXwQIgNVQJ3Nlc9ZBGyaTn3YBpyrEtTyproQwGYg2K85NCNCY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63633},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"893ba33e10f5138c8cf57efe9785829b62298181","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"diego22rct","email":"itx.darkx@gmail.com"},"_npmVersion":"11.17.0","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in Angular, NestJS, HonoJS, and Next.js codebases","directories":{},"_nodeVersion":"26.5.1","dependencies":{"ignore":"^7.0.6","picocolors":"^1.1.1","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.5.0_1786760706840_0.9695981168884502","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@diego22rct/tenets","version":"0.5.3","license":"MIT","_id":"@diego22rct/tenets@0.5.3","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"homepage":"https://github.com/Diego22rct/tenets#readme","bugs":{"url":"https://github.com/Diego22rct/tenets/issues"},"bin":{"tenets":"dist/cli/index.js"},"dist":{"shasum":"985a02267a39c996771ec807c4a3a2f05f2e48f1","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.5.3.tgz","fileCount":35,"integrity":"sha512-uOptlQvSWpB0mTcx47/KblUa7NIyPfkDfh+sIsIENl+7I2J5BEYiAnbmw4+uMfOi1TS4FTlB+IVmW6IzmDqtQA==","signatures":[{"sig":"MEUCIQDyYiO3wId1JVu0DzZxTP1ILE553yCxT0fMTuRRPudpTgIgcIP4vVsDsVe2g2FeQw9qEi6Eyh6/AVyV7ZXOQ8mzCxc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@diego22rct%2ftenets@0.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":63573},"type":"module","engines":{"node":">=16.20.0"},"exports":{".":"./dist/core/index.js"},"gitHead":"915e6eeb5f70e5af7eced6acded87bca11fe3a11","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:db9e17cb-6e74-4e71-b51b-c48496b83d19"}},"repository":{"url":"git+https://github.com/Diego22rct/tenets.git","type":"git"},"_npmVersion":"12.0.2","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in Angular, NestJS, HonoJS, and Next.js codebases","directories":{},"_nodeVersion":"26.7.0","dependencies":{"ignore":"^7.0.6","picocolors":"^1.1.1","typescript":"^7.0.2"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.4","@types/node":"^22.9.0"},"_npmOperationalInternal":{"tmp":"tmp/tenets_0.5.3_1786772941136_0.6124838876866998","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@diego22rct/tenets","version":"0.5.4","description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in Angular, NestJS, HonoJS, and Next.js codebases","license":"MIT","repository":{"type":"git","url":"git+https://github.com/Diego22rct/tenets.git"},"type":"module","bin":{"tenets":"dist/cli/index.js"},"exports":{".":"./dist/core/index.js"},"engines":{"node":">=16.20.0"},"scripts":{"test":"vitest run","test:watch":"vitest","build":"tsc -p tsconfig.build.json","prepublishOnly":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit"},"dependencies":{"ignore":"^7.0.6","picocolors":"^1.1.1","typescript":"^7.0.2"},"devDependencies":{"@types/node":"^22.9.0","vitest":"^2.1.4"},"gitHead":"61a2ce84fe5df061fe47a2ad0ec3deefe58b1ab2","_id":"@diego22rct/tenets@0.5.4","bugs":{"url":"https://github.com/Diego22rct/tenets/issues"},"homepage":"https://github.com/Diego22rct/tenets#readme","_nodeVersion":"26.7.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-6+Dz0HcjLYQ+MavedR3QpOBjDJBG484GAjEBZT9gJzyZTaVtugQ/XWRFR5+W6K2SXy5VQU2xMdYI0Lc0wYMhTg==","shasum":"6d9d955bbed8622263da279ef2a3f30f95039862","tarball":"https://registry.npmjs.org/@diego22rct/tenets/-/tenets-0.5.4.tgz","fileCount":59,"unpackedSize":76451,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@diego22rct%2ftenets@0.5.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDi9LKZyvNf/TMJIVDKvdD+fBEJ14S7aeDysVS04a+UnAIgYj72jPESi4d3KE2tONEDFheVleNeRzE8MluNhGpPxjg="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:db9e17cb-6e74-4e71-b51b-c48496b83d19"}},"directories":{},"maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tenets_0.5.4_1787190998164_0.7114954012291814"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-10T05:17:50.574Z","modified":"2026-08-20T01:56:38.674Z","0.1.0":"2026-08-10T05:17:50.865Z","0.2.0":"2026-08-10T05:37:04.819Z","0.3.0":"2026-08-10T23:56:51.264Z","0.3.1":"2026-08-11T20:28:42.386Z","0.3.2":"2026-08-11T23:33:46.129Z","0.4.0":"2026-08-11T23:54:46.863Z","0.4.1":"2026-08-11T23:58:27.686Z","0.4.2":"2026-08-12T00:36:12.846Z","0.4.3":"2026-08-12T00:52:08.216Z","0.5.0":"2026-08-15T02:25:06.995Z","0.5.3":"2026-08-15T05:49:01.277Z","0.5.4":"2026-08-20T01:56:38.289Z"},"bugs":{"url":"https://github.com/Diego22rct/tenets/issues"},"license":"MIT","homepage":"https://github.com/Diego22rct/tenets#readme","repository":{"type":"git","url":"git+https://github.com/Diego22rct/tenets.git"},"description":"Static analysis CLI for SOLID/DRY/KISS/YAGNI violations in Angular, NestJS, HonoJS, and Next.js codebases","maintainers":[{"name":"diego22rct","email":"itx.darkx@gmail.com"}],"readme":"# @diego22rct/tenets\n\nStatic analysis CLI that flags SOLID/DRY/KISS/YAGNI violations in TypeScript codebases. Built with native support for HonoJS, Next.js, Angular, and NestJS conventions — automatically detecting the framework and applying specialized best practices, while generic code is analyzed with the standard rule set.\n\n## Usage\n\n```\nnpx @diego22rct/tenets [path] [options]\n```\n\n`path` defaults to the current directory.\n\n### Options\n\n| Flag | Values | Default | Meaning |\n|---|---|---|---|\n| `--format` | `terminal` \\| `json` | `terminal` | Output format |\n| `--fail-on` | `info` \\| `warning` \\| `error` | `warning` | Minimum severity that causes a non-zero exit code |\n| `--help`, `-h` | — | — | Print usage and exit — takes priority over every other flag/path |\n\n### Exit codes\n\n| Code | Meaning |\n|---|---|\n| `0` | Ran clean — no findings at or above the `--fail-on` threshold |\n| `1` | Findings at or above the `--fail-on` threshold |\n| `2` | Tool error — bad path, crash. Stdout includes the underlying error message. |\n\n### Example\n\n```\n$ npx @diego22rct/tenets ./src\n\nsrc/billing/calculate-totals.ts:\n  [warning] srp/function-length :85\n    Function 'calculateTotals' is 79 lines long, exceeding the 50-line threshold\n  [warning] yagni/unused-export :59\n    Export 'groupTaxTotals' is not imported anywhere in the analyzed set\n\ntenets: 2 finding(s), 4.1 findings/KLOC ██░░░░░░░░\ntenets: framework: Hono (specialized rules applied)\n```\n\nFindings are grouped by file, followed by a summary line with the total count, a severity-weighted **score** (findings per 1000 analyzed lines of code: `info`=1, `warning`=3, `error`=5), a visual score gauge, and the detected framework specialization.\n\n`--format json` outputs the same data as compact JSON, shaped as `{ summary: { totalFindings, score, framework }, framework, frameworks, files: { \"<path>\": Finding[] }, skippedFiles: string[] }`.\n\n## Framework Support & Auto-Detection\n\n`tenets` automatically detects the framework used by inspecting `package.json` dependencies and AST imports:\n\n- **Hono (`hono`)**: Recognizes `new Hono()` / `new OpenAPIHono()` apps and sub-routers, chained route handlers (`.get()`, `.post()`, etc.), `createMiddleware` / `factory.createMiddleware`, `createHandlers` / `factory.createHandlers`, `@hono/zod-openapi` `createRoute`, entry points (`export default app`, `serve({ fetch: app.fetch })`), and excludes standard `HTTPException`, router classes, and Web Standards (`Headers`, `Response`, `Request`, `FormData`, `ReadableStream`) from direct instantiation warnings.\n- **Next.js (`nextjs`)**: Recognizes App Router conventions (`page.tsx`, `layout.tsx`, `route.ts`), Pages Router APIs (`pages/api/*`), middleware, and instrumentation entry points.\n- **Angular (`angular`)**: Recognizes `@Component`, `@Directive`, `@Pipe`, `@NgModule`, `@Injectable`, `bootstrapApplication`, and excludes RxJS/Form primitives from direct instantiation warnings.\n- **NestJS (`nestjs`)**: Recognizes `@Controller`, `@Injectable`, `@Module`, `@Resolver`, `@Gateway`, `@Catch`, entry points (`NestFactory.create`), and excludes NestJS exceptions/utilities.\n- **Unspecialized**: When no specialized framework is detected, `tenets` informs you that generic rules apply.\n\n## Rules\n\nEvery finding carries a fixed `severity` (`info` | `warning` | `error` — `error` isn't used by any v1 rule) and `confidence` (`high` | `medium` | `low`), reflecting how heuristic the underlying signal is.\n\n| Rule | Principle | Signal | Default threshold | Severity | Confidence |\n|---|---|---|---|---|---|\n| `srp/function-length` | SOLID | Function body exceeds N lines | 50 | warning | medium |\n| `srp/class-method-count` | SOLID | Class has more than N methods | 10 | warning | medium |\n| `dip/direct-instantiation` | SOLID | `new X()` inside a class method, X not a native/runtime global (`Date`, `Map`, `Set`, `Array`, `Error`, `RegExp`, `Promise`, `URL`, `FormData`, `Headers`, `HTTPException`, `Hono`, ...) | — | info | medium |\n| `dry/exact-duplicate` | DRY | ≥2 functions share a structurally identical body (≥4 statements) | 4 statements | warning | high |\n| `kiss/cyclomatic-complexity` | KISS | Function's cyclomatic complexity exceeds N | 10 | warning | medium |\n| `kiss/nesting-depth` | KISS | Function nests control flow deeper than N levels | 4 | warning | high |\n| `yagni/unused-export` | YAGNI | Exported function/class with no matching import anywhere in the analyzed set | — | warning | medium |\n| `yagni/single-impl-interface` | YAGNI | Interface implemented by exactly one class | — | info | low |\n\n## AI agent integration\n\n```\nnpx @diego22rct/tenets install [path]\n```\n\nAdds a rule to `AGENTS.md` and `CLAUDE.md` in the target project (`path` defaults to the current directory) instructing AI coding agents — Claude Code, Codex CLI, Cursor, Windsurf, Antigravity, and tools reading `AGENTS.md` — to run `tenets` after completing tasks or before committing.\n\n### False positive reporting for agents\nIf an AI agent identifies that a finding is a false positive (such as a framework idiom or valid architecture pattern), the rule instructs the model not to write harmful workarounds, and instead report/create an issue at [Diego22rct/tenets Issues](https://github.com/Diego22rct/tenets/issues) with the rule ID, framework, code snippet, and explanation.\n\n## Programmatic usage\n\n```ts\nimport { analyze, detectProjectFrameworks } from '@diego22rct/tenets';\n\nconst result = await analyze({ path: './src' });\n// result.findings: Finding[]\n// result.skippedFiles: string[] — files that failed to resolve during parsing\n// result.score: number — severity-weighted findings per 1000 analyzed LOC\n// result.framework: 'hono' | 'nextjs' | 'angular' | 'nestjs' | 'unspecialized'\n// result.frameworks: Framework[]\n```\n\n## Known limitations\n\n- **No config file support yet.** Thresholds and severities are fixed defaults.\n- **Concurrent invocations on the same machine can stall.** The parsing engine spawns a native TypeScript compiler process per run; running multiple `tenets` invocations at once has been observed to cause severe IPC contention between them. A single invocation (the normal `npx` usage pattern) is unaffected.\n- **Built on TypeScript 7's `unstable/ast` API.** Microsoft has stated TypeScript 7.0's programmatic API is not yet stable and 7.1 will ship a different one — a future TypeScript upgrade may require adapter changes.\n\n## License\n\nMIT\n\n","readmeFilename":"README.md"}