{"_id":"@dharmiklathiya/codesentinel_ai","_rev":"10-b1105dead4c5068cf9953dd170f2c657","name":"@dharmiklathiya/codesentinel_ai","dist-tags":{"latest":"0.14.0"},"versions":{"0.1.0":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.1.0","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","_id":"@dharmiklathiya/codesentinel_ai@0.1.0","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"homepage":"https://github.com/your-org/codesentinel-ai#readme","bugs":{"url":"https://github.com/your-org/codesentinel-ai/issues"},"bin":{"codesentinel":"dist/index.js"},"dist":{"shasum":"4b30c5e2f1f47d40c8fd701fe3c00b53d6e38cfc","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.1.0.tgz","fileCount":95,"integrity":"sha512-6oG7g7uAnxUuIMOoHWH/fEB6X/2aQqYE9pfoRjGVwQoOb60fvJ/x0At7d/DjOLDPsAcqUF8BoEWMznkxLssSlA==","signatures":[{"sig":"MEUCICxjbrZIwxrX7z6dBUHq+nawVQmkz/jb+B9CO/WCprG3AiEAjZW1z38E1wbA1G3mCCbrVbGyEHic+avpr8cviqyIHD4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":347186},"main":"dist/lib.js","type":"module","types":"dist/lib.d.ts","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"774d10952b2c40e833a810ba44c90680f2795b6b","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","build":"tsc -p tsconfig.json","start":"node dist/index.js","action":"node dist/github/action.js","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"repository":{"url":"git+https://github.com/your-org/codesentinel-ai.git","type":"git"},"_npmVersion":"10.9.8","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","codesentinel-ai":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"optionalDependencies":{"openai":"^4.56.0","probot":"^13.3.0","@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/codesentinel_ai_0.1.0_1784351940414_0.8509939752543565","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.1.1","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","_id":"@dharmiklathiya/codesentinel_ai@0.1.1","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"homepage":"https://github.com/your-org/codesentinel-ai#readme","bugs":{"url":"https://github.com/your-org/codesentinel-ai/issues"},"bin":{"codesentinel":"dist/index.js"},"dist":{"shasum":"d0d62d7818bf2f4baeaaf2b3c69c1a975de2bdba","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.1.1.tgz","fileCount":95,"integrity":"sha512-TtjyuaLUr1zjSu93J4y6xDNTYou9+LXOkW9f3KLhgSkReYeLYLqOS9G/FyGSwnhctCxVKoe95miMIwtayaD+qw==","signatures":[{"sig":"MEQCIBOXdVR29fT2NOegR7Rl1vnMRX91KhwtnbwGd3LRAn/OAiAuE32CJstMrvctV5Ov3N3b+V3csrKyky/OB/Bbn6wu8Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":353321},"main":"dist/lib.js","type":"module","types":"dist/lib.d.ts","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"efa7ac0f1d166c862b32d247d5bbea42c8e114c9","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","build":"tsc -p tsconfig.json","start":"node dist/index.js","action":"node dist/github/action.js","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"repository":{"url":"git+https://github.com/your-org/codesentinel-ai.git","type":"git"},"_npmVersion":"10.9.8","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","codesentinel-ai":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"optionalDependencies":{"openai":"^4.56.0","probot":"^13.3.0","@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/codesentinel_ai_0.1.1_1784355376720_0.40597214532753734","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.1.2","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","_id":"@dharmiklathiya/codesentinel_ai@0.1.2","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"homepage":"https://github.com/your-org/codesentinel-ai#readme","bugs":{"url":"https://github.com/your-org/codesentinel-ai/issues"},"bin":{"codesentinel":"dist/index.js"},"dist":{"shasum":"73863ac1817389f3feb41249cb6a708c414fcf27","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.1.2.tgz","fileCount":95,"integrity":"sha512-/cc8/qlLXpkqmni1XnqhEfgBoT7sq17fbDS1vvdbGawCJlF1v+PADY0VzKLgrDOTaBw0xbbdXw7KBuoKrVp/4A==","signatures":[{"sig":"MEQCIA7XWbCUJx1cs4jYyrVPeMBF6HZQbQ8UPhwoK7XwyoTHAiBj5EzMJ9xyAuk78B3xwRcepZNlgQdeA9KvcOOeRSwhzA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":353333},"main":"dist/lib.js","type":"module","types":"dist/lib.d.ts","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"8a178f87e43e7aae7f6c09b9390e553e3dca404b","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","build":"tsc -p tsconfig.json","start":"node dist/index.js","action":"node dist/github/action.js","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"repository":{"url":"git+https://github.com/your-org/codesentinel-ai.git","type":"git"},"_npmVersion":"10.9.8","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","codesentinel-ai":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"optionalDependencies":{"openai":"^4.56.0","probot":"^13.3.0","@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/codesentinel_ai_0.1.2_1784360141554_0.25404217099977844","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.1.3","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","_id":"@dharmiklathiya/codesentinel_ai@0.1.3","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"homepage":"https://github.com/your-org/codesentinel-ai#readme","bugs":{"url":"https://github.com/your-org/codesentinel-ai/issues"},"bin":{"codesentinel":"dist/index.js"},"dist":{"shasum":"a2b62c13c4f3aa77a34fbae5c8edd1ba0f633ea5","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.1.3.tgz","fileCount":95,"integrity":"sha512-ezje6iNbpXe2tp3ecBtN9QOJft8iL9XJ+tBx3ditmVdxwnUqK7rgmxhsBG5nfivZllmHTJKz3VWZqeO1KsA1Ig==","signatures":[{"sig":"MEYCIQDkBE39zB5U4qOPqQ6I1O31hSBwV+k8RGAOHksptU7YHgIhAJDFTc5sB0w23x91L1QNy8Aipy91HuTrM+HBSuaRf5ei","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":353897},"main":"dist/lib.js","type":"module","types":"dist/lib.d.ts","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"f5b3fedb20be5d316ef88161ba52714098cae396","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","build":"tsc -p tsconfig.json","start":"node dist/index.js","action":"node dist/github/action.js","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"repository":{"url":"git+https://github.com/your-org/codesentinel-ai.git","type":"git"},"_npmVersion":"10.9.8","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","codesentinel-ai":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"optionalDependencies":{"openai":"^4.56.0","probot":"^13.3.0","@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/codesentinel_ai_0.1.3_1784524916222_0.965313000658323","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.1.4","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","_id":"@dharmiklathiya/codesentinel_ai@0.1.4","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"homepage":"https://github.com/your-org/codesentinel-ai#readme","bugs":{"url":"https://github.com/your-org/codesentinel-ai/issues"},"bin":{"codesentinel":"dist/index.js"},"dist":{"shasum":"583fce74bff89882e97d2e4fcb430946374d7cd9","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.1.4.tgz","fileCount":95,"integrity":"sha512-ksfZVQm0mpCvEwC+5Q+VDrSfLjfTd4k0ukPG7gWhOozL2KUmjus6txKJgm2QfyOeJF1QZN5VjPNCG/n5MfiCLQ==","signatures":[{"sig":"MEYCIQDHk5MiWuZrkakZtLgFQe53zAu6VMHo3RDo2J+7muBSEwIhAO9q0/YQZ98MBlebTZf6X14zSFdZTilfRGOlPso703sS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":354106},"main":"dist/lib.js","type":"module","types":"dist/lib.d.ts","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"76142bb94185da977535e4911994af6190fc50c1","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","build":"tsc -p tsconfig.json","start":"node dist/index.js","action":"node dist/github/action.js","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"repository":{"url":"git+https://github.com/your-org/codesentinel-ai.git","type":"git"},"_npmVersion":"10.9.8","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","codesentinel-ai":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"optionalDependencies":{"openai":"^4.56.0","probot":"^13.3.0","@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/codesentinel_ai_0.1.4_1784525537718_0.0806905130402118","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.1.5","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","_id":"@dharmiklathiya/codesentinel_ai@0.1.5","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"homepage":"https://github.com/your-org/codesentinel-ai#readme","bugs":{"url":"https://github.com/your-org/codesentinel-ai/issues"},"bin":{"codesentinel":"dist/index.js"},"dist":{"shasum":"ba70966df2d4c4493c27495792e27e5afe533084","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.1.5.tgz","fileCount":95,"integrity":"sha512-DcgxQZMNuYBm0IuGSKUmnVP20re7umbVNeEWApbLIKhF1vUzhg0Sip8BWmj3SzFEG5dRNz2LB4P9afIkQl4naA==","signatures":[{"sig":"MEUCIQCqooB8LJGKXMHjjYjVexz4ZanOgsYZtZD0HWZfCmC1CQIgHJzOoyWKLWzK9eNeY5ZEBb7A+OG6cvvx7qdF1gtEcbw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":354160},"main":"dist/lib.js","type":"module","types":"dist/lib.d.ts","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"03f86ce9b9824ca53e473ded1fe7bd6c3ccc4137","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","build":"tsc -p tsconfig.json","start":"node dist/index.js","action":"node dist/github/action.js","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"repository":{"url":"git+https://github.com/your-org/codesentinel-ai.git","type":"git"},"_npmVersion":"10.9.8","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","codesentinel-ai":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"optionalDependencies":{"openai":"^4.56.0","probot":"^13.3.0","@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/codesentinel_ai_0.1.5_1784527762604_0.6639289938179136","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.1.6","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","_id":"@dharmiklathiya/codesentinel_ai@0.1.6","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"homepage":"https://github.com/your-org/codesentinel-ai#readme","bugs":{"url":"https://github.com/your-org/codesentinel-ai/issues"},"bin":{"codesentinel":"dist/index.js"},"dist":{"shasum":"e87d14a24578904993b7f7d35308929afa6dbe92","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.1.6.tgz","fileCount":95,"integrity":"sha512-1LrFAzJM/64HiHY/o+3H4D+Fc4m2Xheqsi0w/uPjc9BbgeqS1byh10JG62mT6wa4Wg7LZBzpMbhdbtELnf7CMg==","signatures":[{"sig":"MEQCID2GhSHjwX+AVtjCalg0EYXb/lPv3iJWEkg6vSbV76ksAiBcum+J8z1VvlJfy75KRQAe1BV7hSu0qjdPlS8PQG4qjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":364693},"main":"dist/lib.js","type":"module","types":"dist/lib.d.ts","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"0ceb5fdb9285c6a625c300b2ccb2fa821a68ff87","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","build":"tsc -p tsconfig.json","start":"node dist/index.js","action":"node dist/github/action.js","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"repository":{"url":"git+https://github.com/your-org/codesentinel-ai.git","type":"git"},"_npmVersion":"10.9.8","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^3.23.8","codesentinel-ai":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0"},"optionalDependencies":{"openai":"^4.56.0","probot":"^13.3.0","@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/codesentinel_ai_0.1.6_1784529939424_0.8750803221006214","host":"s3://npm-registry-packages-npm-production"}},"0.11.1":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.11.1","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","_id":"@dharmiklathiya/codesentinel_ai@0.11.1","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"homepage":"https://github.com/Dharmik-Lathiya/codesentinel_ai#readme","bugs":{"url":"https://github.com/Dharmik-Lathiya/codesentinel_ai/issues"},"bin":{"codesentinel":"dist/index.js"},"dist":{"shasum":"399e69bba51b1f0604a4e6a45d7fbc6f2bbec40d","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.11.1.tgz","fileCount":214,"integrity":"sha512-ZZwCJShCrLO88WkQOiixiauXNGBUXnNzlu0OvZNn6OQ14moegr66ja+NWcif7FCv8ez0Q25a2Z2zknkeEOs9cw==","signatures":[{"sig":"MEUCIApvEaWGfXUCJQjebQqPvZvbLz3eyZM5KOLnSLcL5emmAiEAnAMOu5P/iTjE5yrxuI+PymjIGPfESzeduwyXv42QSg8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3809040},"main":"dist/lib.js","type":"module","types":"dist/lib.d.ts","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"de2c81024c700e191fa2e78da171e7e6094e8dc9","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","build":"tsc -p tsconfig.json","start":"node dist/index.js","action":"node dist/github/action.js","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","build:action":"tsc -p tsconfig.json && ncc build dist/github/action.js -o dist/action-bundle --target es2022 && node scripts/postbundle.mjs","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"repository":{"url":"git+https://github.com/Dharmik-Lathiya/codesentinel_ai.git","type":"git"},"_npmVersion":"12.0.2","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"zod":"^3.25.76","js-yaml":"^5.2.1","better-sqlite3":"^13.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0","@vercel/ncc":"^0.45.0","@types/better-sqlite3":"^7.6.13"},"optionalDependencies":{"openai":"^4.56.0","probot":"^13.3.0","@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/codesentinel_ai_0.11.1_1786902089471_0.6692102086885148","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.12.0","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","_id":"@dharmiklathiya/codesentinel_ai@0.12.0","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"homepage":"https://github.com/Dharmik-Lathiya/codesentinel_ai#readme","bugs":{"url":"https://github.com/Dharmik-Lathiya/codesentinel_ai/issues"},"bin":{"codesentinel":"dist/index.js"},"dist":{"shasum":"a9f5b8f5729a3555b02ec01d8c7201bdc05a998e","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.12.0.tgz","fileCount":214,"integrity":"sha512-VuEUs7AeKOA7OA8tw+G2ZK5Iw2e62DkIq2GObWLo4z2JFDVcRYttGgIL99mi02vmOEEJQ8hwsnbzlxPDv9aDpg==","signatures":[{"sig":"MEYCIQD/3mCVEwRy0Yl/lQ9Ds66EhhrT5e1qJ5br0cvFPqkWcQIhAL34AGKHo719K4ah9bXaIT+JSFaDq8gLngKcRgqPSy+b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3812804},"main":"dist/lib.js","type":"module","types":"dist/lib.d.ts","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"803ea99240ff78419b6088894e0d576a064d9018","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","build":"tsc -p tsconfig.json","start":"node dist/index.js","action":"node dist/github/action.js","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","build:action":"tsc -p tsconfig.json && ncc build dist/github/action.js -o dist/action-bundle --target es2022 && node scripts/postbundle.mjs","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"repository":{"url":"git+https://github.com/Dharmik-Lathiya/codesentinel_ai.git","type":"git"},"_npmVersion":"12.0.2","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"zod":"^3.25.76","js-yaml":"^5.2.1","better-sqlite3":"^13.0.1","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.5.0","@types/node":"^22.0.0","@vercel/ncc":"^0.45.0","@types/better-sqlite3":"^7.6.13"},"optionalDependencies":{"openai":"^4.56.0","probot":"^13.3.0","@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0"},"_npmOperationalInternal":{"tmp":"tmp/codesentinel_ai_0.12.0_1786903283560_0.23661535260252675","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@dharmiklathiya/codesentinel_ai","version":"0.14.0","description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","type":"module","main":"dist/lib.js","types":"dist/lib.d.ts","bin":{"codesentinel":"dist/index.js"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"}},"./cli":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"build":"tsc -p tsconfig.json","build:action":"tsc -p tsconfig.json && ncc build dist/github/action.js -o dist/action-bundle --target es2022 && node scripts/postbundle.mjs","typecheck":"tsc -p tsconfig.json --noEmit","lint":"tsc -p tsconfig.json --noEmit","test":"vitest run","test:watch":"vitest","start":"node dist/index.js","action":"node dist/github/action.js","prepublishOnly":"npm run build && npm test"},"repository":{"type":"git","url":"git+https://github.com/Dharmik-Lathiya/codesentinel_ai.git"},"homepage":"https://github.com/Dharmik-Lathiya/codesentinel_ai#readme","bugs":{"url":"https://github.com/Dharmik-Lathiya/codesentinel_ai/issues"},"publishConfig":{"access":"public"},"keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","better-sqlite3":"^13.0.1","js-yaml":"^5.2.1","zod":"^3.25.76"},"optionalDependencies":{"@anthropic-ai/sdk":"^0.27.0","@google/generative-ai":"^0.21.0","openai":"^4.56.0","probot":"^13.3.0"},"devDependencies":{"@types/better-sqlite3":"^7.6.13","@types/node":"^22.0.0","@vercel/ncc":"^0.45.0","typescript":"^5.5.0","vitest":"^2.0.0"},"engines":{"node":">=18"},"gitHead":"1feaa2081bd7ebf50d1143cac0a2c37e8537d56d","_id":"@dharmiklathiya/codesentinel_ai@0.14.0","_nodeVersion":"26.7.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-1RqeX4GPcE9WyOzl53OhGSaQcgtxfeB4xA4n5KZ4wtbMYkXP1gEquX1gCLm1zYbyY4RGzXdQeAMqmmCBkMxZuw==","shasum":"00a9993b2623321575505adddfafd51e4103c876","tarball":"https://registry.npmjs.org/@dharmiklathiya/codesentinel_ai/-/codesentinel_ai-0.14.0.tgz","fileCount":217,"unpackedSize":3827734,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCFK8Ra9Q3QpfhF3QspHRjJ1+gM+CSGCllG1PHUxdEtjwIhAIJb1/F52tJFLD9S6iKdT9H1r0uxq7HPTKlJYzbZL9e8"}]},"_npmUser":{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"},"directories":{},"maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/codesentinel_ai_0.14.0_1787595239834_0.8046949434277271"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-18T05:19:00.252Z","modified":"2026-08-24T18:14:00.301Z","0.1.0":"2026-07-18T05:19:00.566Z","0.1.1":"2026-07-18T06:16:16.861Z","0.1.2":"2026-07-18T07:35:41.720Z","0.1.3":"2026-07-20T05:21:56.383Z","0.1.4":"2026-07-20T05:32:17.836Z","0.1.5":"2026-07-20T06:09:22.780Z","0.1.6":"2026-07-20T06:45:39.547Z","0.11.1":"2026-08-16T17:41:29.719Z","0.12.0":"2026-08-16T18:01:23.757Z","0.14.0":"2026-08-24T18:14:00.151Z"},"bugs":{"url":"https://github.com/Dharmik-Lathiya/codesentinel_ai/issues"},"license":"MIT","homepage":"https://github.com/Dharmik-Lathiya/codesentinel_ai#readme","keywords":["ai","code-review","static-analysis","github-action","probot","code-quality","lint","security","test-generation"],"repository":{"type":"git","url":"git+https://github.com/Dharmik-Lathiya/codesentinel_ai.git"},"description":"AI-powered code review, fix, audit, scoring, and test generation engine with multi-provider model support.","maintainers":[{"name":"dharmiklathiya","email":"dharmiklathiya.it@gmail.com"}],"readme":"<p align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://capsule-render.vercel.app/api?type=waving&color=0:00c6ff,100:0072ff&height=200&section=header&text=CodeSentinel%20AI&fontSize=70&fontColor=fff&animation=fadeIn&fontAlignY=38\">\n    <img alt=\"CodeSentinel AI\" src=\"https://capsule-render.vercel.app/api?type=waving&color=0:00c6ff,100:0072ff&height=200&section=header&text=CodeSentinel%20AI&fontSize=70&fontColor=fff&animation=fadeIn&fontAlignY=38\" width=\"100%\">\n  </picture>\n</p>\n\n<p align=\"center\">\n  <strong>AI-Powered Code Quality Orchestrator</strong><br>\n  Review PRs · Auto-fix Issues · Audit Repos · Score Quality · Generate Tests · Enforce Gates\n</p>\n\n<p align=\"center\">\n  <a href=\"#-quick-start\"><img src=\"https://img.shields.io/badge/🚀-Quick_Start-00c6ff?style=for-the-badge\" alt=\"Quick Start\"></a>\n  <a href=\"#-modes\"><img src=\"https://img.shields.io/badge/🎯-Modes-7c3aed?style=for-the-badge\" alt=\"Modes\"></a>\n  <a href=\"#-cli-usage\"><img src=\"https://img.shields.io/badge/💻-CLI-10b981?style=for-the-badge\" alt=\"CLI\"></a>\n  <a href=\"#-configuration\"><img src=\"https://img.shields.io/badge/⚙️-Config-f59e0b?style=for-the-badge\" alt=\"Config\"></a>\n  <a href=\"#-ai-providers\"><img src=\"https://img.shields.io/badge/🤖-AI_Providers-ef4444?style=for-the-badge\" alt=\"AI\"></a>\n  <a href=\"#-github-action\"><img src=\"https://img.shields.io/badge/🔄-GitHub_Action-6366f1?style=for-the-badge\" alt=\"Action\"></a>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/Node-%3E%3D18-339933?logo=node.js&logoColor=white\" alt=\"Node\">\n  <img src=\"https://img.shields.io/badge/TypeScript-5-3178C6?logo=typescript&logoColor=white\" alt=\"TS\">\n  <img src=\"https://img.shields.io/badge/ESM-Module-ffd700\" alt=\"ESM\">\n  <img src=\"https://img.shields.io/badge/Tests-111_Passing-22c55e\" alt=\"Tests\">\n  <img src=\"https://img.shields.io/badge/License-MIT-22c55e\" alt=\"License\">\n  <img src=\"https://img.shields.io/badge/PRs-Welcome-8b5cf6\" alt=\"PRs Welcome\">\n</p>\n\n---\n\n## 📡 The Signal\n\n```ascii\n  ╔══════════════════════════════════════════════════════════════╗\n  ║   ██████╗ ██████╗ ██████╗ ███████╗███████╗███╗   ██╗████████╗ ║\n  ║  ██╔════╝██╔═══██╗██╔══██╗██╔════╝██╔════╝████╗  ██║╚══██╔══╝ ║\n  ║  ██║     ██║   ██║██║  ██║█████╗  █████╗  ██╔██╗ ██║   ██║    ║\n  ║  ██║     ██║   ██║██║  ██║██╔══╝  ██╔══╝  ██║╚██╗██║   ██║    ║\n  ║  ╚██████╗╚██████╔╝██████╔╝███████╗███████╗██║ ╚████║   ██║    ║\n  ║   ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝╚═╝  ╚═══╝   ╚═╝    ║\n  ║                                                              ║\n  ║     █████╗ ██╗         ██████╗ ██╗   ██╗ █████╗ ██╗         ║\n  ║    ██╔══██╗██║         ██╔══██╗╚██╗ ██╔╝██╔══██╗██║         ║\n  ║    ███████║██║         ██████╔╝ ╚████╔╝ ███████║██║         ║\n  ║    ██╔══██║██║         ██╔══██╗  ╚██╔╝  ██╔══██║██║         ║\n  ║    ██║  ██║███████╗    ██████╔╝   ██║   ██║  ██║███████╗    ║\n  ║    ╚═╝  ╚═╝╚══════╝    ╚═════╝    ╚═╝   ╚═╝  ╚═╝╚══════╝    ║\n  ╚══════════════════════════════════════════════════════════════╝\n```\n\n**One CLI to review them all.** Drop it in any repo. Comment `/review` on a PR. Watch the AI burn through your code like a senior engineer with 3 espressos and something to prove.\n\n|                                                                                                                           |                                                                                                                           |                                                                                                                         |\n| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |\n| 🕵️ **Code Review** — catches bugs, security holes, perf crimes, and code smells before they hit production                | 🔧 **Auto-Fix** — AI writes the fix, lints it, tests it, loops until green (or gives up dramatically)                    | 🏆 **Quality Score** — 0-100 across 4 dimensions with AI-blended precision                                              |\n| 🔬 **Full Audit** — deep scans security, architecture, secrets, and performance across your entire repo                   | 🧪 **Test Generation** — finds untested functions and spits out Jest/Vitest tests on autopilot                            | 🚦 **Quality Gate** — CI gate that slams shut when score drops or findings pile up                                      |\n| 💀 **Dead Code** — sniffs out unused exports like a truffle pig for orphaned functions                                    | 💬 **Chat** — ask questions about your codebase, get answers with file references                                         | 📝 **PR Description** — generates structured PR summaries so your team stops writing ✨ war and peace ✨ in every PR body |\n\n---\n\n## 🚀 Quick Start\n\n```bash\n# 1. Install & build\nnpm install @dharmiklathiya/codesentinel_ai\nnpm run build\n\n# 2. Drop the GitHub Action into your project\nnpx @dharmiklathiya/codesentinel_ai@latest setup\n\n# 3. Go nuts\nnode dist/index.js review\nnode dist/index.js score --provider opencode\n```\n\nThen comment on **any PR or issue**:\n\n```\n/review   /fix   /audit   /score   /testgen   /gate   /deadcode   /describe   /ask <question>\n```\n\n---\n\n## 🎯 Modes\n\n| Mode | ⚡ CLI | 🧠 What It Does |\n|------|--------|-----------------|\n| **review** | `review` | Dissects PR diffs for bugs, security holes, performance crimes & code smells. Posts inline PR comments that actually make sense. |\n| **fix** | `fix` | AI writes the fix, runs linters, runs tests, iterates. No infinite loops — we have a max. |\n| **audit** | `audit` | Full-repo cavity search. Security, performance, architecture, secrets. Can auto-file GitHub Issues. |\n| **score** | `score` | Computes 0-100 quality score (readability, maintainability, security, test coverage). Bragging rights included. |\n| **testgen** | `testgen` | Finds untested functions, generates Jest/Vitest tests. Because nobody _wants_ to write tests. |\n| **chat** | `chat --ask <question>` | Ask questions about the codebase. Gets answers with file references. Like a senior dev who never sleeps. |\n| **gate** | `gate` | CI quality gate. Exits non-zero if score < threshold or findings exceed limits. Pipeline guardian. |\n| **describe** | `describe` | Generates structured PR descriptions (title, type, changes, highlights, todos). PR descriptions that don't suck. |\n\n---\n\n## 💻 CLI Usage\n\n```bash\ncodesentinel [mode] [options]\ncodesentinel setup              # Generate .github/workflows/codesentinel.yml\ncodesentinel init-hook          # Install pre-commit git hook\ncodesentinel dashboard          # Launch web dashboard\ncodesentinel dismiss ...        # Dismiss false positives\n```\n\n### 🏁 Flags\n\n| Flag | What It Does |\n|------|-------------|\n| `-m, --mode <mode>` | Pick your poison: review, fix, audit, score, testgen, chat, gate, describe |\n| `-c, --config <path>` | Path to `codesentinel.config.json` or `.opencode-reviewer.yml` |\n| `--provider <name>` | AI provider: `opencode` (default), `openai`, `anthropic`, `gemini` — nukes all task models |\n| `--max-iterations <n>` | Max fix-attempt loops (default: 5). Prevents infinite oopsies. |\n| `--auto-fix` | Greenlight the AI to actually modify files |\n| `--scoring / --no-scoring` | Toggle scoring on/off (default: on) |\n| `--test-gen` | Enable test generation |\n| `--ask <question>` | Activate chat mode with your question |\n| `--context <text>` | Extra project context injected into every prompt |\n| `--dry-run` | Show what would change without touching files (fix mode) |\n| `--log-level <level>` | `debug \\| info \\| warn \\| error` |\n| `--json` | Dump full `EngineReport` as JSON |\n| `--sarif` | SARIF 2.1.0 output (GitHub Advanced Security compatible) |\n| `--jsonl` | **NEW** — AI results in JSONL format, one typed entry per line |\n| `--mcp` | **NEW** — Fire up MCP servers for library doc enrichment |\n| `--learning-db <path>` | **NEW** — Enable the self-learning store (SQLite) |\n| `--yaml-config` | **NEW** — Auto-discover `.opencode-reviewer.yml` config |\n| `--min-score <n>` | Gate min score (0-100) |\n| `--max-critical <n>` | Gate max critical findings |\n| `--max-high <n>` | Gate max high findings |\n| `--auto-merge` | Auto-merge fix PRs when quality gates pass |\n| `--version` | Version flex |\n| `--help` | You're looking at it |\n\n### 🧪 Real Talk\n\n```bash\ncodesentinel review                                              # Review with defaults\ncodesentinel score --provider openai                             # Score with OpenAI\ncodesentinel fix --auto-fix --max-iterations 3 --provider anthropic  # Auto-fix with Claude\ncodesentinel gate --min-score 70 --max-critical 0 --max-high 5   # Guard the gates\ncodesentinel review --json \\| jq '.findings'                     # JSON pipeline fuel\ncodesentinel audit --sarif > results.sarif                       # SARIF for GitHub Advanced Security\ncodesentinel chat --ask \"How does auth work?\"                    # Ask the codebase anything\ncodesentinel review --jsonl                                      # JSONL output\ncodesentinel review --mcp                                        # With MCP library context\ncodesentinel review --learning-db .codesentinel/learning.db      # Self-learning mode\n```\n\n---\n\n## 🤖 AI Providers\n\nEach task can ride a different model. **OpenCode** (local, `http://localhost:4096`) is the default.\n\n```bash\n# Set your keys — pick your fighter\nexport OPENCODE_API_KEY=sk-...       # local, no key needed\nexport OPENAI_API_KEY=sk-...         # the OG\nexport ANTHROPIC_API_KEY=sk-ant-...  # Claude nation\nexport GEMINI_API_KEY=...            # Google's contender\n\n# CLI override — one flag to rule them all\ncodesentinel review --provider anthropic\n\n# CLI mode (opencode run) — default timeout 20 min per run\nexport OPENCODE_CLI_TIMEOUT_MINUTES=20   # override the agentic run timeout\n```\n\n```jsonc\n{\n  \"default_model\": { \"provider\": \"anthropic\", \"model\": \"claude-3-5-sonnet\" },\n  \"models\": {\n    \"review\": { \"provider\": \"anthropic\", \"model\": \"claude-3-5-sonnet\" },\n    \"fix\":    { \"provider\": \"openai\", \"model\": \"gpt-4o\" },\n    \"score\":  { \"provider\": \"gemini\", \"model\": \"gemini-1.5-pro\" }\n  }\n}\n```\n\n---\n\n## ⚙️ Configuration\n\n### JSON Config (`codesentinel.config.json`)\n\n```jsonc\n{\n  \"mode\": \"review\",\n  \"max_iterations\": 5,\n  \"enable_auto_fix\": false,\n  \"enable_scoring\": true,\n  \"enable_test_generation\": false,\n  \"include_positive_feedback\": true,\n  \"jsonl_output\": false,\n  \"project_context\": \"TypeScript monorepo. Keep functions pure.\",\n  \"default_model\": { \"provider\": \"opencode\", \"model\": \"opencode/default\" },\n  \"test_runner\": \"vitest\",\n  \"include\": [\"**/*.{ts,tsx,js,jsx}\"],\n  \"exclude\": [\"node_modules/**\", \"dist/**\", \"**/*.test.*\"],\n  \"gate\": {\n    \"minScore\": 70,\n    \"maxCritical\": 0,\n    \"maxHigh\": 5,\n    \"blockOnSecurity\": true,\n    \"blockOnBugs\": false\n  },\n  \"securityBlendStrategy\": \"min\",\n  \"output\": {\n    \"postGithubComments\": true,\n    \"createGithubIssues\": false,\n    \"writeReportFile\": true,\n    \"reportDir\": \"codesentinel-reports\"\n  },\n  \"autoMerge\": false,\n  \"enable_cache\": true,\n  \"cache_dir\": \".codesentinel-cache\",\n  \"plugins\": [],\n  \"learning\": {\n    \"enabled\": false,\n    \"dbPath\": \".codesentinel/learning.db\",\n    \"metaReview\": false,\n    \"patternDiscovery\": false\n  },\n  \"mcp\": {\n    \"enabled\": false,\n    \"servers\": []\n  },\n  \"batch\": {\n    \"enabled\": false,\n    \"batchSize\": 3,\n    \"maxFilesPerBatch\": 3,\n    \"maxLinesPerFile\": 500\n  }\n}\n```\n\nConfig is resolved as: **defaults → config file → overrides** (CLI / Action inputs).\n\n### 🟡 YAML Config (NEW)\n\nDrop a `.opencode-reviewer.yml` in your project root. Auto-discovered. No `--config` needed.\n\n```yaml\n# .opencode-reviewer.yml\nproject:\n  name: my-project\n  description: TypeScript monorepo\n  conventions:\n    - \"Keep functions pure\"\n    - \"Use named exports\"\n\nreview:\n  inline: true\n  customRules:\n    - id: \"no-console\"\n      pattern: \"console\\\\.\"\n      severity: \"low\"\n      category: \"smell\"\n      comment: \"Avoid console.log in production\"\n\nfix:\n  maxIterations: 3\n\nlearning:\n  enabled: true\n  metaReview: true\n  patternDiscovery: true\n\nmcpServers:\n  - name: context7\n    type: remote\n    url: https://context7.example.com/sse\n\noverrides:\n  - path: \"src/**/*.ts\"\n    review:\n      inline: true\n  - path: \"legacy/**\"\n    branch: \"main\"\n    fix:\n      maxIterations: 1\n```\n\n**Per-path & per-branch overrides** with glob matching. Yes, you can have different rules for `src/` vs `legacy/`. We don't judge.\n\nAlso supported: `.opencode-reviewer.yaml`, `codesentinel.config.yml`, `codesentinel.config.yaml`, `codesentinel.config.json`.\n\n### 🛡️ Security Blend Strategy\n\n| Strategy | Behavior |\n|----------|----------|\n| `min` (default) | Conservative — takes the lower score |\n| `avg` | Averages static and AI scores |\n| `static-only` | Ignores AI security opinions |\n\n### 🚦 Quality Gate\n\n| Option | What It Does |\n|--------|-------------|\n| `minScore` | Overall score must be >= this (0-100) |\n| `maxCritical` | Max critical findings before the gate slams |\n| `maxHigh` | Max high findings before the gate slams |\n| `blockOnSecurity` | **Any** security finding = fail |\n| `blockOnBugs` | **Any** bug finding = fail |\n\n---\n\n## 📤 Output Formats\n\n### 👤 Human-readable (default)\n\n```\n=== CodeSentinel [review] ===\nFound 3 issues (1 critical, 1 warning, 1 praise)\nScore: 78/100 (readability 85, maintainability 70, security 90, coverage 65)\n\nFindings (3):\n  [critical] src/auth.ts:42 — Hardcoded API key detected\n  [medium]   src/utils.ts:15 — Possible null dereference\n  [praise]   src/app.ts:1 — Good test coverage\n```\n\n### 📦 JSON (`--json`)\n\nFull `EngineReport` — findings, score, fix attempts, generated tests, metrics. Pipe to `jq`, feed dashboards, whatever.\n\n### 📋 SARIF (`--sarif`)\n\nSARIF 2.1.0 — GitHub Advanced Security compatible. Upload to your security tab.\n\n### 📃 JSONL (`--jsonl`) — NEW\n\nOne typed entry per line. Perfect for streaming pipelines:\n\n```jsonl\n{\"type\":\"summary\",\"summary\":\"Found 3 issues\"}\n{\"type\":\"verdict\",\"verdict\":\"changes_requested\"}\n{\"type\":\"issue\",\"file\":\"src/auth.ts\",\"line\":42,\"severity\":\"critical\",\"category\":\"security\",\"message\":\"Hardcoded API key\",\"suggestion\":\"Use environment variables\"}\n{\"type\":\"strength\",\"title\":\"Clean architecture\",\"description\":\"Well-structured dependency injection\"}\n```\n\n```ts\nimport { parseJsonlString, buildReviewBody, buildInlineComments } from \"codesentinel-ai\";\n\nconst entries = parseJsonlString(rawJsonl);\nconst body = buildReviewBody(entries);\nconst comments = buildInlineComments(entries);\n```\n\n---\n\n## 🔄 GitHub Action\n\n### Setup (one shot, zero thought)\n\n```bash\nnpx @dharmiklathiya/codesentinel_ai@latest setup\n```\n\nBoom — `.github/workflows/codesentinel.yml` appears. Commit & push.\n\n### Slash Commands on PRs & Issues\n\nWorks on **both PRs and issues**. On issues it runs against the default branch; on PRs it runs against the PR diff.\n\n| Command | Action |\n|---------|--------|\n| `/review` | AI code review with inline PR comments |\n| `/fix` | Propose & auto-fix issues |\n| `/audit` | Full repo audit |\n| `/score` | Quality score |\n| `/testgen` | Generate tests |\n| `/gate` | Quality gate |\n| `/deadcode` | Find unused exports |\n| `/describe` | Generate PR description |\n| `/ask <question>` | Chat with the codebase |\n\n---\n\n## 📦 Integration Into Other Projects\n\nAdd CodeSentinel to **any** GitHub repo's workflow. It runs against **that** repo's code, not CodeSentinel's own code.\n\n### Quick Integration\n\n```yaml\n# .github/workflows/codesentinel.yml\nname: CodeSentinel AI\non:\n  pull_request:\n    types: [opened, synchronize]\n  schedule:\n    - cron: '0 */6 * * *'  # every 6 hours\n  workflow_dispatch:\n\njobs:\n  codesentinel:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      - uses: Dharmik-Lathiya/codesentinel_ai@main\n        with:\n          mode: review\n          opencode_api_key: ${{ secrets.OPENCODE_API_KEY }}\n```\n\nThe `GITHUB_TOKEN` and `GITHUB_REPOSITORY` are automatically set by GitHub Actions — all API calls go to **your repo**, not CodeSentinel's.\n\n### Fix Mode — Auto PR Creation\n\nWhen `mode: fix` with `--auto-fix`, CodeSentinel runs on the default branch and:\n\n1. Finds issues across your codebase\n2. Applies AI-powered fixes\n3. Creates a branch `codesentinel/fix-<timestamp>`\n4. Opens a **Pull Request** against the default branch\n5. Optionally **auto-merges** (squash) when `auto_merge: true`\n\n```yaml\n- uses: Dharmik-Lathiya/codesentinel_ai@main\n  with:\n    mode: fix\n    enable_auto_fix: \"true\"\n    auto_merge: \"true\"\n    opencode_api_key: ${{ secrets.OPENCODE_API_KEY }}\n```\n\n### Gate Mode — Auto-Merge on Pass\n\nWhen `mode: gate` with `auto_merge: true`, CodeSentinel enables GitHub auto-merge on the PR **if** all quality checks pass:\n\n```yaml\n- uses: Dharmik-Lathiya/codesentinel_ai@main\n  with:\n    mode: gate\n    auto_merge: \"true\"\n    opencode_api_key: ${{ secrets.OPENCODE_API_KEY }}\n```\n\n### All Inputs\n\n| Input | Default | Description |\n|-------|---------|-------------|\n| `mode` | `review` | Operation mode |\n| `enable_auto_fix` | `false` | Allow AI to modify files |\n| `auto_merge` | `false` | Auto-merge PRs when quality gates pass |\n| `enable_scoring` | `true` | Compute quality score |\n| `opencode_api_key` | — | API key for OpenCode provider |\n| `openai_api_key` | — | API key for OpenAI |\n| `anthropic_api_key` | — | API key for Anthropic |\n| `gemini_api_key` | — | API key for Gemini |\n| `config_path` | — | Path to codesentinel config file |\n\n### Reusable Action\n\n```yaml\n- uses: Dharmik-Lathiya/codesentinel_ai@main\n  with:\n    mode: review\n    enable_scoring: \"true\"\n    opencode_api_key: ${{ secrets.OPENCODE_API_KEY }}\n```\n\nThe Action:\n- Posts inline PR comments\n- Creates Check Runs with annotations (`gate` mode)\n- Sets commit status (`codesentinel/gate`)\n- Opens fix PRs with auto-merge (`fix` mode + `auto_merge: true`)\n- Outputs `score` + `findings` for downstream steps\n\n### Slash Commands via Probot App\n\nFor PR comments, deploy the Probot app:\n\n```bash\nnode dist/github/app.js\n```\n\nThen comment on any PR: `/review`, `/fix`, `/audit`, `/score`, `/testgen`, `/gate`, `/deadcode`, `/describe`, `/ask <question>`\n\n---\n\n## 🐙 GitHub App (Probot)\n\n```bash\nnode dist/github/app.js\n```\n\nComment any slash command on a PR. The app handles `issue_comment.created` and `issue_comment.edited`, deduplicates, and responds.\n\n---\n\n## 📊 Dashboard\n\n```bash\ncodesentinel dashboard\n```\n\nOpens at `http://localhost:4173` (configurable). Historical run data. Graceful Ctrl+C shutdown.\n\n---\n\n## 🔗 Pre-commit Hook\n\n```bash\ncodesentinel init-hook\n```\n\nInstalls a pre-commit hook that quick-scans staged files. Because fixing things before they leave your machine is a life skill.\n\n---\n\n## 🙅 Dismissing False Positives\n\n```bash\n# Dismiss by rule\ncodesentinel dismiss --rule \"security:eval\" \"False positive — input is sanitized\"\n\n# Dismiss a specific file+line\ncodesentinel dismiss --file src/app.ts --line 42 \"Reviewed and approved\"\n```\n\nStored in JSON file (`dismissalsFile` config). Persisted across runs. Your word is law.\n\n---\n\n## 💀 Dead Code Detection\n\n```bash\ncodesentinel deadcode\n```\n\nSniffs out exported functions, variables, and types that nothing imports. In-process, zero AI calls.\n\n---\n\n## 🧠 Self-Learning Store (NEW)\n\nCodeSentinel records every finding it makes. Over time it spots patterns, suggests rule adjustments, and gets smarter.\n\n```bash\ncodesentinel review --learning-db .codesentinel/learning.db\n```\n\n| Option | What It Does |\n|--------|-------------|\n| `enabled` | Turn the learning brain on |\n| `dbPath` | SQLite path (or `postgres://` / `mysql://` URL) |\n| `metaReview` | Reviews past decisions to suggest rule tweaks |\n| `patternDiscovery` | Auto-discovers recurring issue patterns |\n| `metaReviewInterval` | How many runs before auto-review |\n\n```jsonc\n{\n  \"learning\": {\n    \"enabled\": true,\n    \"dbPath\": \".codesentinel/learning.db\",\n    \"metaReview\": true,\n    \"patternDiscovery\": true,\n    \"metaReviewInterval\": 10\n  }\n}\n```\n\nSQLite by default. Drop in a `postgres://` or `mysql://` URL and it switches engines. We don't discriminate.\n\n---\n\n## 🔌 MCP Server Integration (NEW)\n\nCodeSentinel connects to MCP servers to pull in library docs and context before every AI review. Smarter reviews, less hallucination.\n\n```bash\ncodesentinel review --mcp\n```\n\n```jsonc\n{\n  \"mcp\": {\n    \"enabled\": true,\n    \"servers\": [\n      {\n        \"name\": \"context7\",\n        \"type\": \"remote\",\n        \"url\": \"https://context7.example.com/sse\"\n      },\n      {\n        \"name\": \"docs-server\",\n        \"type\": \"local\",\n        \"command\": [\"npx\", \"-y\", \"@modelcontextprotocol/server-docs\"],\n        \"environment\": { \"DOCS_DIR\": \"./docs\" }\n      }\n    ]\n  }\n}\n```\n\n**Built-in presets** (auto-loaded when servers is empty):\n- **context7** (remote) — general library docs\n- **GitHub context** (local) — GitHub API / Actions docs\n\nWhen MCP fires up, it queries servers for relevant docs and stuffs them into the AI prompt. Context window goes 🚀.\n\n---\n\n## 📦 File Batching (NEW)\n\nPrevents context window overflow by grouping files into manageable batches.\n\n```jsonc\n{\n  \"batch\": {\n    \"enabled\": true,\n    \"batchSize\": 3,\n    \"maxFilesPerBatch\": 3,\n    \"maxLinesPerFile\": 500\n  }\n}\n```\n\n---\n\n## 📡 Event Bus (NEW)\n\nInternal pub/sub for extensibility. Powers Probot integration. Has a circuit breaker because bad subscribers don't get to bring down the party.\n\n```ts\nimport { EventBus } from \"codesentinel-ai\";\n\nconst bus = new EventBus();\n\nbus.register({\n  name: \"log-events\",\n  eventTypes: [\"review.complete\", \"fix.complete\"],\n  handler: async (event) => {\n    console.log(`Event: ${event.type}`, event.payload);\n  },\n});\n\nbus.emit({\n  type: \"review.complete\",\n  payload: { findings: 5, score: 85 },\n});\n```\n\n| Feature | What |\n|---------|------|\n| Pub/sub | Named subscribers with event type filtering |\n| Circuit breaker | 5 consecutive failures → 30s cooldown |\n| Concurrency limit | Configurable, default 10 |\n| Timeout | Subscribers get 120s, then they're out |\n| History | Full event history for debugging |\n\n---\n\n## ⚡ OpenCode CLI Auto-Install (NEW)\n\nCodeSentinel can download, verify, and cache the OpenCode CLI binary. No manual install needed.\n\n```ts\nimport { setupOpenCode, runOpenCode } from \"codesentinel-ai\";\n\nconst { binaryPath, version, cached } = await setupOpenCode(\"latest\");\nconsole.log(`OpenCode ${version} at ${binaryPath} (cached: ${cached})`);\n\nconst output = runOpenCode(binaryPath, [\"review\", \"--json\"]);\n```\n\nCached at `~/.codesentinel/opencode/`. Fallback to system PATH if download fails. SHA checksum verification included because we're not savages.\n\n---\n\n## 🔒 Caching\n\nAI responses cached on disk at `.codesentinel-cache`. 24h TTL, 500 entry max, content-addressed. Unchanged files skip AI re-analysis entirely. Your API budget says thanks.\n\n---\n\n## 🗂️ 19 Static Analysis Checks\n\n| Category | 🔍 What We Catch |\n|----------|-----------------|\n| 🛡️ **Security** | Secrets (API keys, tokens, connection strings, private keys), `eval()`, `child_process`, `Function()`, `exec`, regex DoS |\n| 🐛 **Bugs** | `==` vs `===`, `debugger;`, `console.log`, TODO/FIXME, empty catch, `any` casts, unused vars |\n| 🤢 **Smells** | Long functions (>100 lines), deep nesting (>4 levels), magic numbers, large files (>500 lines) |\n| ✨ **Style** | Naming conventions (camelCase, PascalCase) |\n\n## 🔐 Secrets Scanning\n\n19 built-in patterns + custom via `config.secretPatterns`:\n\n```\nAWS keys  ·  GitHub tokens  ·  JWT tokens  ·  RSA/EC/DSA/OpenSSH/PKCS#8 private keys\nGeneric API keys  ·  npm tokens  ·  PostgreSQL/Redis/MongoDB connection strings\nSlack tokens  ·  Google API keys  ·  and 9 more...\n```\n\n---\n\n## 🧩 Plugins\n\nExtend analysis with your own checks.\n\n```ts\nimport type { CodeSentinelPlugin } from \"codesentinel-ai\";\n\nconst plugin: CodeSentinelPlugin = {\n  name: \"no-console-log\",\n  analyze(files) {\n    return files\n      .filter(f => f.content.includes(\"console.log\"))\n      .map(f => ({\n        severity: \"low\",\n        category: \"smell\",\n        file: f.path,\n        line: null,\n        comment: \"Avoid console.log in production\",\n        source: \"static\",\n      }));\n  },\n  score(breakdown) {\n    breakdown.readability = Math.max(0, breakdown.readability - 5);\n    return breakdown;\n  },\n};\n\nexport default plugin;\n```\n\nList in `config.plugins`.\n\n---\n\n## 📚 Library Usage\n\n```ts\nimport { Engine, mergeConfig, DEFAULT_CONFIG } from \"codesentinel-ai\";\n\nconst engine = Engine.fromInputs({\n  configPath: \"./codesentinel.config.json\",\n  secrets: { opencode_api_key: process.env.OPENCODE_API_KEY },\n  root: \"/path/to/project\",\n});\n\nconst report = await engine.run();\nconsole.log(report.score?.overall);  // 0–100\nconsole.log(report.gatePassed);      // boolean (gate mode)\nconst answer = await engine.ask(\"How does auth work?\");\n```\n\n### 📦 Full Export Map\n\n```ts\n// Core\nimport { Engine, loadConfig, configFromInputs, DEFAULT_CONFIG, mergeConfig } from \"codesentinel-ai\";\n\n// AI\nimport { AIHub, extractJson, ProviderUnavailableError } from \"codesentinel-ai\";\n\n// Utilities\nimport { concurrentMap, renderSarif, renderHtmlReport } from \"codesentinel-ai\";\n\n// JSONL (NEW)\nimport { parseJsonlString, parseJsonlFile, validateAndNormalize, buildReviewBody, buildInlineComments } from \"codesentinel-ai\";\n\n// MCP (NEW)\nimport { MCPManager, getDefaultMCPServers } from \"codesentinel-ai\";\nimport type { MCPServerConfig, MCPContextEntry } from \"codesentinel-ai\";\n\n// Learning Store (NEW)\nimport { LearningStore } from \"codesentinel-ai\";\nimport type { FindingRecord, PatternRecord, CustomRuleRecord } from \"codesentinel-ai\";\n\n// Event Bus (NEW)\nimport { EventBus } from \"codesentinel-ai\";\nimport type { GitHubEvent, Subscriber } from \"codesentinel-ai\";\n\n// OpenCode CLI (NEW)\nimport { setupOpenCode, runOpenCode } from \"codesentinel-ai\";\n\n// Types\nimport type {\n  CodeSentinelConfig, EngineReport, Finding, ScoreBreakdown,\n  ModelConfig, Provider, Mode, RuntimeSecrets, CodeSentinelPlugin,\n  SecurityBlendStrategy, GateConfig, FixAttempt, ReviewComment,\n  LearningConfig, MCPConfig, BatchConfig,\n} from \"codesentinel-ai\";\n```\n\n---\n\n## 🧪 Testing\n\n```bash\nnpm test          # Vitest — 111 tests and counting\nnpm run typecheck # tsc --noEmit\nnpm run build     # Compile to dist/\n```\n\n---\n\n## 🏗️ Project Structure\n\n```\nsrc/\n├── config/        Types, defaults, JSONC/YAML config loader, validation\n├── prompts/       Prompt templates with {{variable}} rendering\n├── ai/            Provider abstraction: openai, anthropic, gemini, opencode\n├── analyzer/      19 static heuristics + progressive analysis + severity\n├── scorer/        Weighted quality score (0-100) with AI blending\n├── testgen/       Untested function detection + test generation\n├── cache/         File-based LRU cache, content-addressable, 24h TTL\n├── gate/          Quality gate evaluation\n├── plugins/       Plugin loader / lifecycle hooks\n├── dismiss/       False-positive dismissal manager\n├── secrets/       Secret pattern scanner (19 built-in)\n├── linters/       External linter runner (ESLint, Biome, Pylint)\n├── scanners/      3rd-party secret scanner integration\n├── deadcode/      Unused export detection\n├── suggestions/   Committable suggestion builder\n├── github/        Action entrypoint, Probot app, reporter\n├── engine/        Central orchestrator — dispatch, fix loop, batching\n├── dashboard/     Web dashboard server\n├── mcp/           MCP client + server presets (NEW)\n├── learning/      Self-learning store: SQLite/PostgreSQL/MySQL (NEW)\n├── event-bus/     Pub/sub with circuit breaker (NEW)\n├── opencode/      CLI auto-installer (NEW)\n├── types/         Zod schemas for JSONL (NEW)\n├── utils/         Logger, git, glob, concurrency, SARIF, retry, JSONC\n├── index.ts       CLI entrypoint\n└── lib.ts         Public API exports\n```\n\n---\n\n<p align=\"center\">\n  <img src=\"https://capsule-render.vercel.app/api?type=waving&color=0:0072ff,100:00c6ff&height=120&section=footer\" width=\"100%\">\n</p>\n\n<p align=\"center\">\n  <strong>MIT</strong> · Built with rage and caffeine<br>\n  <sub>PRs welcome. Issues welcome. Existential questions about AI code review also welcome.</sub>\n</p>\n","readmeFilename":"README.md"}