{"_id":"@djibrilm/lazy-review","_rev":"5-84980b68ed9a30e8ad8ae547596bf179","name":"@djibrilm/lazy-review","dist-tags":{"latest":"0.0.5"},"versions":{"0.0.1":{"name":"@djibrilm/lazy-review","version":"0.0.1","keywords":[],"author":"","license":"MIT","_id":"@djibrilm/lazy-review@0.0.1","maintainers":[{"name":"djibrilm","email":"mugishodjibril7@gmail.com"}],"bin":{"lrv":"dist/bin.js","lazy-review":"dist/bin.js"},"dist":{"shasum":"293af3cbedd306901bc592aa17dc38521e9bc5ad","tarball":"https://registry.npmjs.org/@djibrilm/lazy-review/-/lazy-review-0.0.1.tgz","fileCount":264,"integrity":"sha512-qDZSkyHDH1L/nBe3HNR6zbUD1Y54R5XZ+4hXRSD773aXVUf7Fnq5vWh9FxTb4xXzdQxP5daUYQyz9I5VUKCypQ==","signatures":[{"sig":"MEUCIGH4Tk47fZmPJKdQLmHUhymJdR9uM9BUPogBlsyDhKqMAiEA2E7P8UfcvtQC3IyvWxQLw8MW+MVX7s4btc8Ztmx+sq8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3027982},"main":"dist/bin.js","type":"module","_from":"file:djibrilm-lazy-review-0.0.1.tgz","types":"./dist/bin.d.ts","gitHead":"02b807954e169aa2e251ab07bd402669e0f5c73c","scripts":{"dev":"concurrently \"pnpm:watch\" \"pnpm:link-watch\" \"pnpm:frontend:dev\"","link":"pnpm run postbuild && pnpm run prod:build && pnpm link --global","lint":"eslint \"src/**/*.ts\"","test":"echo \"Error: no test specified\" && exit 0","agent":"tsx agent.ts","build":"tsc && cp .env dist/ || true","clean":"rm -rf dist","watch":"tsc --watch","format":"prettier --write \"**/*.{ts,js,json,md}\"","dev:local":"concurrently \"pnpm:watch\" \"pnpm:dev:server\" \"pnpm:frontend:dev\"","postbuild":"chmod +x dist/bin.js","dev:server":"nodemon --watch dist --ext js dist/dev.js","link-watch":"nodemon --watch dist --ext js --exec \"pnpm link --global\"","prod:build":"pnpm run clean && pnpm run build && pnpm run frontend:build","frontend:dev":"cd frontend && pnpm run dev","frontend:build":"cd frontend && pnpm run build"},"_npmUser":{"name":"djibrilm","email":"mugishodjibril7@gmail.com"},"_resolved":"/private/var/folders/jf/wx7bznbx501cd0xqyb6zfth40000gp/T/991b8ed212bc00accfde3e4201234956/djibrilm-lazy-review-0.0.1.tgz","_integrity":"sha512-qDZSkyHDH1L/nBe3HNR6zbUD1Y54R5XZ+4hXRSD773aXVUf7Fnq5vWh9FxTb4xXzdQxP5daUYQyz9I5VUKCypQ==","_npmVersion":"11.19.0","description":"<p align=\"center\">   <img src=\"frontend/public/resources/images/logo.png\" width=\"200\" alt=\"Lazy Review Logo\"> </p>","directories":{},"_nodeVersion":"26.7.0","dependencies":{"ora":"^9.0.0","zod":"^4.4.3","cors":"^2.8.6","open":"^10.2.0","ssh2":"^1.17.0","uuid":"^13.0.0","chalk":"^5.6.2","dotenv":"^17.4.2","express":"^5.1.0","octokit":"^5.0.5","sqlite3":"^6.0.1","typeorm":"^1.0.0","inquirer":"^12.9.6","@qvac/sdk":"^0.16.0","commander":"^14.0.1","socket.io":"^4.8.3","tweetnacl":"^1.0.3","simple-git":"^3.36.0","sqlite-vec":"^0.1.9","@types/cors":"^2.8.19","tree-sitter":"^0.25.1","@octokit/core":"^7.0.6","better-sqlite3":"^12.10.0","tree-sitter-go":"^0.25.0","tweetnacl-util":"^0.15.1","@langchain/core":"^1.1.48","chalk-animation":"^2.0.3","reflect-metadata":"^0.2.2","tree-sitter-rust":"^0.24.0","@langchain/openai":"^1.4.7","systeminformation":"^5.33.1","@aws-sdk/client-s3":"^3.1066.0","tree-sitter-python":"^0.25.0","@aws-sdk/client-ec2":"^3.1066.0","@langchain/anthropic":"^1.4.0","tree-sitter-javascript":"^0.25.0","tree-sitter-typescript":"^0.23.2","@langchain/google-genai":"^2.1.31","bare-runtime-darwin-x64":"^1.30.3"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^9.37.0","nodemon":"^3.1.10","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.6.2","@types/ssh2":"^1.15.5","concurrently":"^9.2.1","@types/express":"^5.0.3","typescript-eslint":"^8.45.0","@types/better-sqlite3":"^9.6.0","@types/chalk-animation":"^1.6.3","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","@typescript-eslint/parser":"^8.45.0","@typescript-eslint/eslint-plugin":"^8.45.0"},"_npmOperationalInternal":{"tmp":"tmp/lazy-review_0.0.1_1787965968639_0.21117581705816102","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@djibrilm/lazy-review","version":"0.0.2","keywords":[],"author":"","license":"MIT","_id":"@djibrilm/lazy-review@0.0.2","maintainers":[{"name":"djibrilm","email":"mugishodjibril7@gmail.com"}],"bin":{"lrv":"dist/bin.js","lazy-review":"dist/bin.js"},"dist":{"shasum":"e48c204294f2c3a0eb4e59c324362d3de4a605de","tarball":"https://registry.npmjs.org/@djibrilm/lazy-review/-/lazy-review-0.0.2.tgz","fileCount":265,"integrity":"sha512-G9zIkp7/fF1439EEwhgIW0BJUEDv+tjtaqmpeq1n3wQgT0WYxlibzOcTDxuW79lnYt+csiIsy0cDby119wRu+A==","signatures":[{"sig":"MEUCIH4ACXfh/2J70DdxhrBwyrgQRMzRVYBrVV/gPc+F61y3AiEAvjFAMWb0byfHNUS3p0606seeNyjRQui81994y+z46zw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3263594},"main":"dist/bin.js","type":"module","_from":"file:djibrilm-lazy-review-0.0.2.tgz","types":"./dist/bin.d.ts","gitHead":"02b807954e169aa2e251ab07bd402669e0f5c73c","scripts":{"dev":"concurrently \"pnpm:watch\" \"pnpm:link-watch\" \"pnpm:frontend:dev\"","link":"pnpm run postbuild && pnpm run prod:build && pnpm link --global","lint":"eslint \"src/**/*.ts\"","test":"echo \"Error: no test specified\" && exit 0","agent":"tsx agent.ts","build":"tsc && cp .env dist/ || true","clean":"rm -rf dist","watch":"tsc --watch","format":"prettier --write \"**/*.{ts,js,json,md}\"","dev:local":"concurrently \"pnpm:watch\" \"pnpm:dev:server\" \"pnpm:frontend:dev\"","postbuild":"chmod +x dist/bin.js","dev:server":"nodemon --watch dist --ext js dist/dev.js","link-watch":"nodemon --watch dist --ext js --exec \"pnpm link --global\"","prod:build":"pnpm run clean && pnpm run build && pnpm run frontend:build","frontend:dev":"cd frontend && pnpm run dev","frontend:build":"cd frontend && pnpm run build"},"_npmUser":{"name":"djibrilm","email":"mugishodjibril7@gmail.com"},"_resolved":"/private/var/folders/jf/wx7bznbx501cd0xqyb6zfth40000gp/T/caa6b4f2a88ae20f55bc9e7c43f8d9b8/djibrilm-lazy-review-0.0.2.tgz","_integrity":"sha512-G9zIkp7/fF1439EEwhgIW0BJUEDv+tjtaqmpeq1n3wQgT0WYxlibzOcTDxuW79lnYt+csiIsy0cDby119wRu+A==","_npmVersion":"11.19.0","description":"<p align=\"center\">   <img src=\"./logo.png\" width=\"200\" alt=\"Lazy Review Logo\"> </p>","directories":{},"_nodeVersion":"26.7.0","dependencies":{"ora":"^9.0.0","zod":"^4.4.3","cors":"^2.8.6","open":"^10.2.0","ssh2":"^1.17.0","uuid":"^13.0.0","chalk":"^5.6.2","dotenv":"^17.4.2","express":"^5.1.0","octokit":"^5.0.5","sqlite3":"^6.0.1","typeorm":"^1.0.0","inquirer":"^12.9.6","@qvac/sdk":"^0.16.0","commander":"^14.0.1","socket.io":"^4.8.3","tweetnacl":"^1.0.3","simple-git":"^3.36.0","sqlite-vec":"^0.1.9","@types/cors":"^2.8.19","tree-sitter":"^0.25.1","@octokit/core":"^7.0.6","better-sqlite3":"^12.10.0","tree-sitter-go":"^0.25.0","tweetnacl-util":"^0.15.1","@langchain/core":"^1.1.48","chalk-animation":"^2.0.3","reflect-metadata":"^0.2.2","tree-sitter-rust":"^0.24.0","@langchain/openai":"^1.4.7","systeminformation":"^5.33.1","@aws-sdk/client-s3":"^3.1066.0","tree-sitter-python":"^0.25.0","@aws-sdk/client-ec2":"^3.1066.0","@langchain/anthropic":"^1.4.0","tree-sitter-javascript":"^0.25.0","tree-sitter-typescript":"^0.23.2","@langchain/google-genai":"^2.1.31","bare-runtime-darwin-x64":"^1.30.3"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^9.37.0","nodemon":"^3.1.10","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.6.2","@types/ssh2":"^1.15.5","concurrently":"^9.2.1","@types/express":"^5.0.3","typescript-eslint":"^8.45.0","@types/better-sqlite3":"^9.6.0","@types/chalk-animation":"^1.6.3","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","@typescript-eslint/parser":"^8.45.0","@typescript-eslint/eslint-plugin":"^8.45.0"},"_npmOperationalInternal":{"tmp":"tmp/lazy-review_0.0.2_1787968005103_0.7808723093036272","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@djibrilm/lazy-review","version":"0.0.3","keywords":[],"author":"","license":"MIT","_id":"@djibrilm/lazy-review@0.0.3","maintainers":[{"name":"djibrilm","email":"mugishodjibril7@gmail.com"}],"bin":{"lrv":"dist/bin.js","lazy-review":"dist/bin.js"},"dist":{"shasum":"1fa758e626eaff7367712390351ff6d32625f6c9","tarball":"https://registry.npmjs.org/@djibrilm/lazy-review/-/lazy-review-0.0.3.tgz","fileCount":265,"integrity":"sha512-BIUQSkQju0QqDzanXLo80dbjJ89a946QEoGnqAWVj6BGQE+MJW+ZOYTxRPVZv/ZlZfnSbLDjpI+uY/6EzmaiqA==","signatures":[{"sig":"MEQCIEbH4CL0VMtpOcw2UF/j1imzEIcafFCnBTD6Agz3DrriAiBa7r8gJU+0imKNcutqPgJLKKPjNjzUnskfDtI9r7WH4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3262603},"main":"dist/bin.js","type":"module","_from":"file:djibrilm-lazy-review-0.0.3.tgz","types":"./dist/bin.d.ts","gitHead":"02b807954e169aa2e251ab07bd402669e0f5c73c","scripts":{"dev":"concurrently \"pnpm:watch\" \"pnpm:link-watch\" \"pnpm:frontend:dev\"","link":"pnpm run postbuild && pnpm run prod:build && pnpm link --global","lint":"eslint \"src/**/*.ts\"","test":"echo \"Error: no test specified\" && exit 0","agent":"tsx agent.ts","build":"tsc && cp .env dist/ || true","clean":"rm -rf dist","watch":"tsc --watch","format":"prettier --write \"**/*.{ts,js,json,md}\"","release":"pnpm run prod:build && pnpm publish --access public","dev:local":"concurrently \"pnpm:watch\" \"pnpm:dev:server\" \"pnpm:frontend:dev\"","postbuild":"chmod +x dist/bin.js","dev:server":"nodemon --watch dist --ext js dist/dev.js","link-watch":"nodemon --watch dist --ext js --exec \"pnpm link --global\"","prod:build":"pnpm run clean && pnpm run build && pnpm run frontend:build","frontend:dev":"cd frontend && pnpm run dev","frontend:build":"cd frontend && pnpm run build"},"_npmUser":{"name":"djibrilm","email":"mugishodjibril7@gmail.com"},"_resolved":"/private/var/folders/jf/wx7bznbx501cd0xqyb6zfth40000gp/T/483998fe3fa9ecaeec50823dfdc4c6e5/djibrilm-lazy-review-0.0.3.tgz","_integrity":"sha512-BIUQSkQju0QqDzanXLo80dbjJ89a946QEoGnqAWVj6BGQE+MJW+ZOYTxRPVZv/ZlZfnSbLDjpI+uY/6EzmaiqA==","_npmVersion":"11.19.0","description":"<p align=\"center\">   <img src=\"https://github.com/DjibrilM/lazy-review/raw/develop/frontend/public/resources/images/logo.png\" width=\"200\" alt=\"Lazy Review Logo\"> </p>","directories":{},"_nodeVersion":"26.7.0","dependencies":{"ora":"^9.0.0","zod":"^4.4.3","cors":"^2.8.6","open":"^10.2.0","ssh2":"^1.17.0","uuid":"^13.0.0","chalk":"^5.6.2","dotenv":"^17.4.2","express":"^5.1.0","octokit":"^5.0.5","sqlite3":"^6.0.1","typeorm":"^1.0.0","inquirer":"^12.9.6","@qvac/sdk":"^0.16.0","commander":"^14.0.1","socket.io":"^4.8.3","tweetnacl":"^1.0.3","simple-git":"^3.36.0","sqlite-vec":"^0.1.9","@types/cors":"^2.8.19","tree-sitter":"^0.25.1","@octokit/core":"^7.0.6","better-sqlite3":"^12.10.0","tree-sitter-go":"^0.25.0","tweetnacl-util":"^0.15.1","@langchain/core":"^1.1.48","chalk-animation":"^2.0.3","reflect-metadata":"^0.2.2","tree-sitter-rust":"^0.24.0","@langchain/openai":"^1.4.7","systeminformation":"^5.33.1","@aws-sdk/client-s3":"^3.1066.0","tree-sitter-python":"^0.25.0","@aws-sdk/client-ec2":"^3.1066.0","@langchain/anthropic":"^1.4.0","tree-sitter-javascript":"^0.25.0","tree-sitter-typescript":"^0.23.2","@langchain/google-genai":"^2.1.31","bare-runtime-darwin-x64":"^1.30.3"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^9.37.0","nodemon":"^3.1.10","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.6.2","@types/ssh2":"^1.15.5","concurrently":"^9.2.1","@types/express":"^5.0.3","typescript-eslint":"^8.45.0","@types/better-sqlite3":"^9.6.0","@types/chalk-animation":"^1.6.3","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","@typescript-eslint/parser":"^8.45.0","@typescript-eslint/eslint-plugin":"^8.45.0"},"_npmOperationalInternal":{"tmp":"tmp/lazy-review_0.0.3_1787995421002_0.7959125251329178","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@djibrilm/lazy-review","version":"0.0.4","keywords":[],"author":"","license":"MIT","_id":"@djibrilm/lazy-review@0.0.4","maintainers":[{"name":"djibrilm","email":"mugishodjibril7@gmail.com"}],"bin":{"lrv":"dist/bin.js","lazy-review":"dist/bin.js"},"dist":{"shasum":"ff2c96fe44f14e4f1840cd2065999bfeb512739c","tarball":"https://registry.npmjs.org/@djibrilm/lazy-review/-/lazy-review-0.0.4.tgz","fileCount":269,"integrity":"sha512-4s9RK7RuNt3tmK+MUke+TZA+R/wWznNEGJ8iN9d1FVFfzqL1idKklOq+InI4+qjL7jNcoguJt+FwyLu8tYDnsw==","signatures":[{"sig":"MEUCIQCIHTGpxUYQFmXwXrbGBQffjH3R+PBKbV4cGAtoeSe8gwIgeCa2WTDrwCSBkEtF54QcuPNGrKyyME8BOBJOchq9hL0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3265391},"main":"dist/bin.js","type":"module","_from":"file:djibrilm-lazy-review-0.0.4.tgz","types":"./dist/bin.d.ts","gitHead":"02b807954e169aa2e251ab07bd402669e0f5c73c","scripts":{"dev":"concurrently \"pnpm:watch\" \"pnpm:link-watch\" \"pnpm:frontend:dev\"","link":"pnpm run postbuild && pnpm run prod:build && pnpm link --global","lint":"eslint \"src/**/*.ts\"","test":"echo \"Error: no test specified\" && exit 0","agent":"tsx agent.ts","build":"tsc && cp .env dist/ || true","clean":"rm -rf dist","watch":"tsc --watch","format":"prettier --write \"**/*.{ts,js,json,md}\"","release":"pnpm run prod:build && pnpm publish --access public","dev:local":"concurrently \"pnpm:watch\" \"pnpm:dev:server\" \"pnpm:frontend:dev\"","postbuild":"chmod +x dist/bin.js","dev:server":"nodemon --watch dist --ext js dist/dev.js","link-watch":"nodemon --watch dist --ext js --exec \"pnpm link --global\"","prod:build":"pnpm run clean && pnpm run build && pnpm run frontend:build","frontend:dev":"cd frontend && pnpm run dev","frontend:build":"cd frontend && pnpm run build"},"_npmUser":{"name":"djibrilm","email":"mugishodjibril7@gmail.com"},"_resolved":"/private/var/folders/jf/wx7bznbx501cd0xqyb6zfth40000gp/T/6b22bf5879e4efe963c8ed2b47778cd7/djibrilm-lazy-review-0.0.4.tgz","_integrity":"sha512-4s9RK7RuNt3tmK+MUke+TZA+R/wWznNEGJ8iN9d1FVFfzqL1idKklOq+InI4+qjL7jNcoguJt+FwyLu8tYDnsw==","_npmVersion":"11.19.0","description":"<p align=\"center\">   <img src=\"https://github.com/DjibrilM/lazy-review/raw/develop/frontend/public/resources/images/logo.png\" width=\"200\" alt=\"Lazy Review Logo\"> </p>","directories":{},"_nodeVersion":"26.7.0","dependencies":{"ora":"^9.0.0","zod":"^4.4.3","cors":"^2.8.6","open":"^10.2.0","ssh2":"^1.17.0","uuid":"^13.0.0","chalk":"^5.6.2","dotenv":"^17.4.2","express":"^5.1.0","octokit":"^5.0.5","sqlite3":"^6.0.1","typeorm":"^1.0.0","inquirer":"^12.9.6","@qvac/sdk":"^0.16.0","commander":"^14.0.1","socket.io":"^4.8.3","tweetnacl":"^1.0.3","simple-git":"^3.36.0","sqlite-vec":"^0.1.9","@types/cors":"^2.8.19","tree-sitter":"^0.25.1","@octokit/core":"^7.0.6","better-sqlite3":"^12.10.0","tree-sitter-go":"^0.25.0","tweetnacl-util":"^0.15.1","@langchain/core":"^1.1.48","chalk-animation":"^2.0.3","reflect-metadata":"^0.2.2","tree-sitter-rust":"^0.24.0","@langchain/openai":"^1.4.7","systeminformation":"^5.33.1","@aws-sdk/client-s3":"^3.1066.0","tree-sitter-python":"^0.25.0","@aws-sdk/client-ec2":"^3.1066.0","@langchain/anthropic":"^1.4.0","tree-sitter-javascript":"^0.25.0","tree-sitter-typescript":"^0.23.2","@langchain/google-genai":"^2.1.31","bare-runtime-darwin-x64":"^1.30.3"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^9.37.0","nodemon":"^3.1.10","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.6.2","@types/ssh2":"^1.15.5","concurrently":"^9.2.1","@types/express":"^5.0.3","typescript-eslint":"^8.45.0","@types/better-sqlite3":"^9.6.0","@types/chalk-animation":"^1.6.3","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","@typescript-eslint/parser":"^8.45.0","@typescript-eslint/eslint-plugin":"^8.45.0"},"_npmOperationalInternal":{"tmp":"tmp/lazy-review_0.0.4_1788121459396_0.16871243123211577","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"type":"module","name":"@djibrilm/lazy-review","version":"0.0.5","description":"<p align=\"center\">   <img src=\"https://github.com/DjibrilM/lazy-review/raw/develop/frontend/public/resources/images/logo.png\" width=\"200\" alt=\"Lazy Review Logo\"> </p>","bin":{"lazy-review":"dist/bin.js","lrv":"dist/bin.js"},"main":"dist/bin.js","devDependencies":{"@eslint/js":"^9.37.0","@types/better-sqlite3":"^9.6.0","@types/chalk-animation":"^1.6.3","@types/express":"^5.0.3","@types/node":"^24.6.2","@types/ssh2":"^1.15.5","@typescript-eslint/eslint-plugin":"^8.45.0","@typescript-eslint/parser":"^8.45.0","concurrently":"^9.2.1","eslint":"^9.37.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","husky":"^9.1.7","nodemon":"^3.1.10","prettier":"^3.6.2","typescript":"^5.9.3","typescript-eslint":"^8.45.0"},"dependencies":{"@aws-sdk/client-ec2":"^3.1066.0","@aws-sdk/client-s3":"^3.1066.0","@langchain/anthropic":"^1.4.0","@langchain/core":"^1.1.48","@langchain/google-genai":"^2.1.31","@langchain/openai":"^1.4.7","@octokit/core":"^7.0.6","@qvac/sdk":"^0.16.0","@types/cors":"^2.8.19","bare-runtime-darwin-x64":"^1.30.3","better-sqlite3":"^12.10.0","chalk":"^5.6.2","chalk-animation":"^2.0.3","commander":"^14.0.1","cors":"^2.8.6","dotenv":"^17.4.2","express":"^5.1.0","inquirer":"^12.9.6","octokit":"^5.0.5","open":"^10.2.0","ora":"^9.0.0","reflect-metadata":"^0.2.2","simple-git":"^3.36.0","socket.io":"^4.8.3","sqlite-vec":"^0.1.9","sqlite3":"^6.0.1","ssh2":"^1.17.0","systeminformation":"^5.33.1","tree-sitter":"^0.25.1","tree-sitter-go":"^0.25.0","tree-sitter-javascript":"^0.25.0","tree-sitter-python":"^0.25.0","tree-sitter-rust":"^0.24.0","tree-sitter-typescript":"^0.23.2","tweetnacl":"^1.0.3","tweetnacl-util":"^0.15.1","typeorm":"^1.0.0","uuid":"^13.0.0","zod":"^4.4.3"},"keywords":[],"author":"","license":"MIT","scripts":{"agent":"tsx agent.ts","test":"echo \"Error: no test specified\" && exit 0","dev":"concurrently \"pnpm:watch\" \"pnpm:link-watch\" \"pnpm:frontend:dev\"","dev:server":"nodemon --watch dist --ext js dist/dev.js","dev:local":"concurrently \"pnpm:watch\" \"pnpm:dev:server\" \"pnpm:frontend:dev\"","watch":"tsc --watch","build":"tsc && cp .env dist/ || true","clean":"rm -rf dist","frontend:dev":"cd frontend && pnpm run dev","frontend:build":"cd frontend && pnpm run build","postbuild":"chmod +x dist/bin.js","prod:build":"pnpm run clean && pnpm run build && pnpm run frontend:build","link":"pnpm run postbuild && pnpm run prod:build && pnpm link --global","link-watch":"nodemon --watch dist --ext js --exec \"pnpm link --global\"","lint":"eslint \"src/**/*.ts\"","format":"prettier --write \"**/*.{ts,js,json,md}\"","release":"pnpm run prod:build && pnpm publish --access public"},"gitHead":"02b807954e169aa2e251ab07bd402669e0f5c73c","types":"./dist/bin.d.ts","_id":"@djibrilm/lazy-review@0.0.5","_integrity":"sha512-U/kAgOr0s56ZdOK5v8Pkxk4Kk+h94oByW9creCuD3uowMv9nWEP2TxTWbVWe97F2S/ZqMZX4x7eg0Qg5Uc23ZA==","_resolved":"/private/var/folders/jf/wx7bznbx501cd0xqyb6zfth40000gp/T/ef24d8710c4c0ac3d9c6e4946ab43e2a/djibrilm-lazy-review-0.0.5.tgz","_from":"file:djibrilm-lazy-review-0.0.5.tgz","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-U/kAgOr0s56ZdOK5v8Pkxk4Kk+h94oByW9creCuD3uowMv9nWEP2TxTWbVWe97F2S/ZqMZX4x7eg0Qg5Uc23ZA==","shasum":"39f3af541e39b2afd57c67b813572286e23c1167","tarball":"https://registry.npmjs.org/@djibrilm/lazy-review/-/lazy-review-0.0.5.tgz","fileCount":269,"unpackedSize":3274923,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDXuZpNi1S3KHpsr1THX3kZXRbQVrYEO0SeIlcQPeHOwQIhANHexPsymDJEvo1xz4hO30dBotmoAhtouZubWIpL2weE"}]},"_npmUser":{"name":"djibrilm","email":"mugishodjibril7@gmail.com"},"directories":{},"maintainers":[{"name":"djibrilm","email":"mugishodjibril7@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lazy-review_0.0.5_1788243952881_0.22689360563320715"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-29T01:12:48.458Z","modified":"2026-09-01T06:25:53.276Z","0.0.1":"2026-08-29T01:12:48.872Z","0.0.2":"2026-08-29T01:46:45.308Z","0.0.3":"2026-08-29T09:23:41.209Z","0.0.4":"2026-08-30T20:24:19.571Z","0.0.5":"2026-09-01T06:25:53.101Z"},"license":"MIT","keywords":[],"description":"<p align=\"center\">   <img src=\"https://github.com/DjibrilM/lazy-review/raw/develop/frontend/public/resources/images/logo.png\" width=\"200\" alt=\"Lazy Review Logo\"> </p>","maintainers":[{"name":"djibrilm","email":"mugishodjibril7@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"https://github.com/DjibrilM/lazy-review/raw/develop/frontend/public/resources/images/logo.png\" width=\"200\" alt=\"Lazy Review Logo\">\n</p>\n\n# Lazy Review — PR Review Assistant\n\nA CLI tool that reviews GitHub pull requests using local AI models. Point it at a repository, select a PR, and it posts a structured review comment back to GitHub — no cloud inference, no API keys beyond GitHub OAuth.\n\n## Installation\n\nLazy Review relies on several native C++ modules (like `better-sqlite3` and `tree-sitter`) for fast local vector search and code parsing. Because of this, **we strongly recommend using `npm`** for the global installation.\n\n```bash\nnpm install -g @djibrilm/lazy-review\nlrv run\n```\n\nThis will start the local server on `http://localhost:16500`.\n\n### Troubleshooting Installation Errors\n\nIf you encounter an error like `Error: Could not locate the bindings file`, it means the native dependencies failed to compile or download during installation.\n\n**1. Using `pnpm` or `yarn`**\nThese block build scripts by default, preventing C++ binaries from downloading.\n\n- **For pnpm:** Run `pnpm approve-builds -g`. Use the `Space` bar to select the blocked packages, then press `Enter`.\n- **For yarn:** Add `enableScripts: true` to your `.yarnrc.yml` before installing.\n  _(Alternatively, just install via `npm` instead)._\n\n**2. Missing Build Tools**\nIf you are on a very new or uncommon version of Node.js (e.g. Node 26), prebuilt binaries may not exist yet, forcing the modules to compile from source. If this fails, ensure you have C++ build tools installed:\n\n- **macOS:** Run `xcode-select --install`\n- **Linux:** Run `sudo apt-get install build-essential python3`\n- **Windows:** Run `npm install --global windows-build-tools`\n\n**3. EPERM: operation not permitted (macOS/Linux)**\nIf you are installing globally using `sudo npm install -g @djibrilm/lazy-review` and see a `Download failed: EPERM` error, `npm` has downgraded permissions during the post-install step. To fix this, tell `npm` to keep root permissions during the installation scripts:\n\n```bash\nsudo npm install -g @djibrilm/lazy-review --unsafe-perm\n```\n\n### From source\n\nRequires Node.js 18+ and pnpm.\n\n```bash\ngit clone https://github.com/djibrilm/lazy-review\ncd lazy-review\npnpm install\npnpm run dev\n```\n\nThis starts both the Express server (port `16500`) and the Vite dev server concurrently.\n\n## Overview\n\nLazy Review fetches PR diffs from GitHub and runs them through a multi-agent pipeline on your machine. The output is a structured GitHub PR review comment with categorized findings (`approve` / `request_changes` / `comment`), severity scores, and file-level annotations.\n\nIt uses two models:\n\n- A coding LLM (~5 GB RAM) for review generation\n- An embedding model (~2 GB RAM) for semantic codebase search\n\nBoth are downloaded and managed via the [QVAC SDK](https://www.npmjs.com/package/@qvac/sdk).\n\n## Review pipeline\n\nA review goes through five sequential stages:\n\n1. **Change Analyzer** — classifies the PR diff and selects which specialist reviewers are needed (e.g. `security`, `performance`, `concurrency`, `correctness`, `architecture`, `maintainability`)\n2. **Specialist Reviewers** — each runs a ReAct loop, forming hypotheses and querying the Repository Explorer for evidence rather than reading files directly\n3. **Repository Explorer** — a sub-agent with deterministic tools (`read_file`, `search_symbol`, `semantic_search`) that answers evidence queries from the Specialist Reviewers\n4. **Finding Verifier** — receives each candidate finding and attempts to disprove it by searching for cleanup handlers, timeouts, or lifecycle methods that would make the issue a false positive\n5. **Secret Scanner** — independently scans diff file names for sensitive candidates (`.env`, private keys, credential bundles), reads the actual diff content to confirm before reporting\n\nConfirmed findings are deduplicated by a hash of their text and location, ranked by `Impact × Likelihood`, and included in the final review verdict (`approve` / `request_changes` / `comment`).\n\n## Codebase indexing\n\nWhen you add a repository, Lazy Review scans the source tree and builds a local vector index. It:\n\n- Parses symbols from TypeScript, JavaScript, Python, Rust, and Go files using Tree-sitter\n- Chunks content at safe token boundaries (the embedding model has a 512-token context window)\n- Stores embeddings in SQLite using the `sqlite-vec` extension\n\nThe index is used during reviews to provide semantic context to the agents.\n\n## Tool-call parsing\n\nLocal models don't always return well-structured tool calls. The agent loop handles two fallback cases:\n\n- A regex parser for non-standard formats (e.g. the `<|tool_call|>` dialect used by some quantized models)\n- Tool results from fallback-parsed calls are injected as `user` messages to avoid strict API validation errors\n\n## Tech stack\n\n| Layer       | Tech                                          |\n| ----------- | --------------------------------------------- |\n| Backend     | Node.js, Express 5, TypeScript                |\n| AI          | QVAC SDK, LangChain                           |\n| Database    | SQLite (TypeORM + better-sqlite3), sqlite-vec |\n| AST Parsing | Tree-sitter (TS, JS, Python, Rust, Go)        |\n| Real-time   | socket.io                                     |\n| Frontend    | React, Vite, TanStack Query                   |\n| CLI         | Commander.js                                  |\n\n## Hardware requirements\n\nTested on a Mac Mini (Apple Silicon). You need ~7 GB of free RAM to hold both models simultaneously:\n\n| Model           | RAM   |\n| --------------- | ----- |\n| Coding LLM      | ~5 GB |\n| Embedding Model | ~2 GB |\n\nSince the models alone take up around 7 GB and other computer operations also need space, a good environment should have around 12 GB to 16 GB of total RAM.\n\nGPU inference can be toggled in Settings. If the app crashes during model initialization (common on older GPUs), switch to CPU inference.\n\n## CLI Commands\n\nThe CLI is available as either `lazy-review` or the `lrv` shorthand.\n\n### `run`\n\nStarts the Lazy Review server.\n\n```bash\nlrv run\n```\n\n## Setup\n\n1. Open Settings → Local AI Models and download both models.\n2. Open Settings → GitHub Authentication and connect your GitHub account.\n3. Add a repository from the dashboard. Lazy Review will clone it and index the codebase.\n4. Select a PR from the repository view and run a review.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}