{"_id":"@asharirfan/repolens","_rev":"4-56331949aaf661e33dbdeaab37a374c1","name":"@asharirfan/repolens","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"name":"@asharirfan/repolens","version":"0.0.1","keywords":["cli","repository","analysis","architecture","developer-tools","code-analysis","github"],"author":{"name":"Ashar Irfan"},"license":"Apache-2.0","_id":"@asharirfan/repolens@0.0.1","maintainers":[{"name":"asharirfan","email":"mrasharirfan@gmail.com"}],"homepage":"https://github.com/repolens/repolens#readme","bugs":{"url":"https://github.com/repolens/repolens/issues"},"bin":{"repolens":"dist/index.js"},"dist":{"shasum":"bd4cc095bfbebb451e1f8d19cb3a51d55703ab0a","tarball":"https://registry.npmjs.org/@asharirfan/repolens/-/repolens-0.0.1.tgz","fileCount":69,"integrity":"sha512-GsLI/ARp/DDOCwGXphgbj0c7pIe4dprasjytDcudggmdjHveXC4IkcolRzNP1QHjI7vGnP2e9aRjhxcoog20MQ==","signatures":[{"sig":"MEUCIQCNyCzR8sfAuTM/59oCKxSJOlrKplwfDzYNNB31L9PibgIgXDXGFSaP1rlG4e/g+YNYabzvXpgdOVNeWF6ZbuSu8DE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":235026},"type":"module","_from":"file:asharirfan-repolens-0.0.1.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsx src/cli/index.ts","lint":"eslint src tests","test":"vitest run","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"","lint:fix":"eslint src tests --fix","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"asharirfan","email":"mrasharirfan@gmail.com"},"_resolved":"/private/var/folders/wq/r_0qh7ns4p7_j80bcyq5mzqh0000gn/T/331007d4fc295869b5b213b06c548a90/asharirfan-repolens-0.0.1.tgz","_integrity":"sha512-GsLI/ARp/DDOCwGXphgbj0c7pIe4dprasjytDcudggmdjHveXC4IkcolRzNP1QHjI7vGnP2e9aRjhxcoog20MQ==","repository":{"url":"git+https://github.com/repolens/repolens.git","type":"git"},"_npmVersion":"11.7.0","description":"Analyze any local or remote GitHub repository and generate a clear overview of its architecture, dependencies, and structure.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ora":"^8.0.0","glob":"^11.0.0","boxen":"^7.1.0","fs-extra":"^11.2.0","commander":"^12.0.0","smol-toml":"^1.3.0","cli-table3":"^0.6.3","picocolors":"^1.1.0","simple-git":"^3.22.0","@octokit/rest":"^21.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.0.0","prettier":"^3.2.0","typescript":"^5.4.0","@types/node":"^22.0.0","@types/fs-extra":"^11.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/repolens_0.0.1_1772733203283_0.03377575223205387","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@asharirfan/repolens","version":"0.0.2","keywords":["cli","repository","analysis","architecture","developer-tools","code-analysis","github"],"author":{"name":"Ashar Irfan"},"license":"Apache-2.0","_id":"@asharirfan/repolens@0.0.2","maintainers":[{"name":"asharirfan","email":"mrasharirfan@gmail.com"}],"homepage":"https://github.com/repolens/repolens#readme","bugs":{"url":"https://github.com/repolens/repolens/issues"},"bin":{"repolens":"dist/index.js"},"dist":{"shasum":"426272b8996372966ad84390cd0823419b08f65e","tarball":"https://registry.npmjs.org/@asharirfan/repolens/-/repolens-0.0.2.tgz","fileCount":69,"integrity":"sha512-XcbF4sZyyt3PfTWczzAQ/ghKPhSlxu5FQdDQ8FggMCLe9qyChcYzfHwQRLfRC2SUYPYHg1MjXQBt/8gwE88s2Q==","signatures":[{"sig":"MEUCIQDjPJoPWGiISAFpAdS8lwMWAkPit/n9uYhE2OG+DXphYgIgPXYcztFV8Mnwke+oKyASlSuT9MDObbFRuIWC9TnlYGY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":235038},"type":"module","_from":"file:asharirfan-repolens-0.0.2.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsx src/cli/index.ts","lint":"eslint src tests","test":"vitest run","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"","lint:fix":"eslint src tests --fix","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"asharirfan","email":"mrasharirfan@gmail.com"},"_resolved":"/private/var/folders/wq/r_0qh7ns4p7_j80bcyq5mzqh0000gn/T/70d1401b15df07b319ec174c87362cea/asharirfan-repolens-0.0.2.tgz","_integrity":"sha512-XcbF4sZyyt3PfTWczzAQ/ghKPhSlxu5FQdDQ8FggMCLe9qyChcYzfHwQRLfRC2SUYPYHg1MjXQBt/8gwE88s2Q==","repository":{"url":"git+https://github.com/repolens/repolens.git","type":"git"},"_npmVersion":"11.7.0","description":"Analyze any local or remote GitHub repository and generate a clear overview of its architecture, dependencies, and structure.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ora":"^8.0.0","glob":"^11.0.0","boxen":"^7.1.0","fs-extra":"^11.2.0","commander":"^12.0.0","smol-toml":"^1.3.0","cli-table3":"^0.6.3","picocolors":"^1.1.0","simple-git":"^3.22.0","@octokit/rest":"^21.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.0.0","prettier":"^3.2.0","typescript":"^5.4.0","@types/node":"^22.0.0","@types/fs-extra":"^11.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/repolens_0.0.2_1772733497157_0.15027885549363673","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@asharirfan/repolens","version":"0.0.3","keywords":["cli","repository","analysis","architecture","developer-tools","code-analysis","github"],"author":{"name":"Ashar Irfan"},"license":"Apache-2.0","_id":"@asharirfan/repolens@0.0.3","maintainers":[{"name":"asharirfan","email":"mrasharirfan@gmail.com"}],"homepage":"https://github.com/asharirfan/repo-lens#readme","bugs":{"url":"https://github.com/asharirfan/repo-lens/issues"},"bin":{"repolens":"dist/index.js"},"dist":{"shasum":"2eb02a420fb31f4763ee117742419a578142c6b9","tarball":"https://registry.npmjs.org/@asharirfan/repolens/-/repolens-0.0.3.tgz","fileCount":69,"integrity":"sha512-+6HG7zV0/ScAVTriYAwLXiOBASJTqe8/0I31IdhvlKDMek94sTqpfuEolnRSupBg3lq+ATFOchRiB28qpRvsPg==","signatures":[{"sig":"MEYCIQCs+65U7Ol+bsv9htw/ZJT/SbGXmgYJbxIEt4pBxyQarQIhAOC7s9zjuRmlLexsw94dAoTFlOqo0eMB8hfBPr5n7VLp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":235105},"type":"module","_from":"file:asharirfan-repolens-0.0.3.tgz","engines":{"node":">=18.0.0"},"scripts":{"dev":"tsx src/cli/index.ts","lint":"eslint src tests","test":"vitest run","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js","format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"","lint:fix":"eslint src tests --fix","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"asharirfan","email":"mrasharirfan@gmail.com"},"_resolved":"/private/var/folders/wq/r_0qh7ns4p7_j80bcyq5mzqh0000gn/T/d3ed1c26e5a91c0537b9aa674f5dfd10/asharirfan-repolens-0.0.3.tgz","_integrity":"sha512-+6HG7zV0/ScAVTriYAwLXiOBASJTqe8/0I31IdhvlKDMek94sTqpfuEolnRSupBg3lq+ATFOchRiB28qpRvsPg==","repository":{"url":"git+https://github.com/asharirfan/repo-lens.git","type":"git"},"_npmVersion":"11.7.0","description":"Analyze any local or remote GitHub repository and generate a clear overview of its architecture, dependencies, and structure.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"ora":"^8.0.0","glob":"^11.0.0","boxen":"^7.1.0","fs-extra":"^11.2.0","commander":"^12.0.0","smol-toml":"^1.3.0","cli-table3":"^0.6.3","picocolors":"^1.1.0","simple-git":"^3.22.0","@octokit/rest":"^21.0.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.0.0","eslint":"^9.0.0","vitest":"^2.0.0","prettier":"^3.2.0","typescript":"^5.4.0","@types/node":"^22.0.0","@types/fs-extra":"^11.0.0","typescript-eslint":"^8.0.0","@vitest/coverage-v8":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/repolens_0.0.3_1772733706697_0.06882201190083004","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@asharirfan/repolens","version":"0.0.4","description":"Analyze any local or remote GitHub repository and generate a clear overview of its architecture, dependencies, and structure.","type":"module","bin":{"repolens":"dist/index.js"},"keywords":["cli","repository","analysis","architecture","developer-tools","code-analysis","github"],"author":{"name":"Ashar Irfan"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/asharirfan/repo-lens.git"},"homepage":"https://github.com/asharirfan/repo-lens#readme","engines":{"node":">=18.0.0"},"dependencies":{"@octokit/rest":"^21.0.0","boxen":"^7.1.0","cli-table3":"^0.6.3","commander":"^12.0.0","fs-extra":"^11.2.0","glob":"^13.0.0","ora":"^8.0.0","picocolors":"^1.1.0","simple-git":"^3.22.0","smol-toml":"^1.3.0"},"devDependencies":{"@types/fs-extra":"^11.0.0","@types/node":"^22.0.0","@vitest/coverage-v8":"^2.0.0","eslint":"^9.0.0","prettier":"^3.2.0","tsup":"^8.0.0","tsx":"^4.7.0","typescript":"^5.4.0","typescript-eslint":"^8.0.0","vitest":"^2.0.0"},"scripts":{"build":"tsup","dev":"tsx src/cli/index.ts","start":"node dist/index.js","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","lint":"eslint src tests","lint:fix":"eslint src tests --fix","format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"","typecheck":"tsc --noEmit","clean":"rm -rf dist"},"_id":"@asharirfan/repolens@0.0.4","bugs":{"url":"https://github.com/asharirfan/repo-lens/issues"},"_integrity":"sha512-sO8iRZcMgnhnap9+Td6fvvqAajnhnrzheEhBSh2IJCj2ug39P59ppanBfMLo9DHz+QMevoETRfQZJJQH0Qfjmg==","_resolved":"/private/var/folders/wq/r_0qh7ns4p7_j80bcyq5mzqh0000gn/T/285160fdffc18d9598cda54bd904340a/asharirfan-repolens-0.0.4.tgz","_from":"file:asharirfan-repolens-0.0.4.tgz","_nodeVersion":"24.13.0","_npmVersion":"11.7.0","dist":{"integrity":"sha512-sO8iRZcMgnhnap9+Td6fvvqAajnhnrzheEhBSh2IJCj2ug39P59ppanBfMLo9DHz+QMevoETRfQZJJQH0Qfjmg==","shasum":"976dff839e79c6a642956abe04e6f0ae53c49d24","tarball":"https://registry.npmjs.org/@asharirfan/repolens/-/repolens-0.0.4.tgz","fileCount":69,"unpackedSize":235105,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDtwdwLm4UZ8rb2HzLi5VtoUkcNiPwLa6XxVH1zKQA2AwIgDMKMgpoGARdIw6TsGpvq20aW2Qd8K37BvO8vM4wcZVc="}]},"_npmUser":{"name":"asharirfan","email":"mrasharirfan@gmail.com"},"directories":{},"maintainers":[{"name":"asharirfan","email":"mrasharirfan@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/repolens_0.0.4_1772734052116_0.3945829024626779"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-05T17:53:23.216Z","modified":"2026-03-05T18:07:32.412Z","0.0.1":"2026-03-05T17:53:23.427Z","0.0.2":"2026-03-05T17:58:17.333Z","0.0.3":"2026-03-05T18:01:46.841Z","0.0.4":"2026-03-05T18:07:32.288Z"},"bugs":{"url":"https://github.com/asharirfan/repo-lens/issues"},"author":{"name":"Ashar Irfan"},"license":"Apache-2.0","homepage":"https://github.com/asharirfan/repo-lens#readme","keywords":["cli","repository","analysis","architecture","developer-tools","code-analysis","github"],"repository":{"type":"git","url":"git+https://github.com/asharirfan/repo-lens.git"},"description":"Analyze any local or remote GitHub repository and generate a clear overview of its architecture, dependencies, and structure.","maintainers":[{"name":"asharirfan","email":"mrasharirfan@gmail.com"}],"readme":"# repolens\n\nA fast, extensible CLI tool for analyzing any local or remote GitHub repository — understand architecture, stack, and dependencies in seconds.\n\n## Features\n\n- **GitHub & local support** — pass a GitHub URL or a local folder path.\n- **Stack detection** — identifies Node.js, Next.js, React, Vue, Python, FastAPI, Django, Go, Rust, Docker, Tailwind, PostgreSQL, MongoDB, and more.\n- **Dependency analysis** — parses `package.json`, `requirements.txt`, `go.mod`, and `Cargo.toml`.\n- **Structure analysis** — detects entry points, module boundaries, test directories, and config files.\n- **Architecture summary** — generates a human-readable prose summary of the codebase.\n- **ASCII dependency diagram** — visual tree of stacks, folders, and dependencies.\n- **Three output formats** — rich CLI output, JSON, and Markdown report.\n- **Extensible analyzer system** — add a new language by implementing one interface in one file.\n- **Auto-cleanup** — GitHub repos are cloned to a temp dir and deleted after analysis, even on error.\n- **TypeScript strict mode** — `strict: true`, zero `any`.\n\n## Install\n\n```bash\npnpm install -g @asharirfan/repolens\n```\n\nOr run without installing:\n\n```bash\nnpx @asharirfan/repolens analyze <repo>\n```\n\n**Requirements:** Node.js ≥ 18.0.0\n\n## Quick Start\n\n```bash\n# Analyze a GitHub repository\nrepolens analyze https://github.com/vercel/next.js\n\n# Analyze a local folder\nrepolens analyze ./my-project\n\n# Output as JSON\nrepolens analyze https://github.com/fastapi/fastapi --json\n\n# Generate a Markdown report\nrepolens analyze https://github.com/supabase/supabase --markdown\n\n# Save JSON to a specific file\nrepolens analyze ./my-project --json --output analysis.json\n```\n\n## CLI Reference\n\n```\nUsage: repolens analyze <repo> [options]\n\nArguments:\n  repo                  Local path or GitHub URL to analyze\n\nOptions:\n  --json                Output results as JSON\n  --markdown            Generate a Markdown report\n  --output <file>       Write output to a specific file\n  --silent              Suppress all non-essential output\n  --verbose             Enable verbose/debug output\n  -v, --version         Output the current version\n  -h, --help            Display help\n```\n\n## Example Output\n\n### `vercel/next.js`\n\n```\n╭──────────────────────────────────────╮\n│                                      │\n│   RepoLens Analysis                  │\n│   vercel/next.js                     │\n│   The React Framework for the Web    │\n│                                      │\n╰──────────────────────────────────────╯\n\n  Detected Stacks\n  ────────────────────────────────────────\n  ● Node.js (high)\n  ● Next.js 14.2.3 (high)\n  ● React 18.3.0 (high)\n  ● TypeScript (high)\n  ● Tailwind CSS (high)\n\n  Architecture Summary\n  ────────────────────────────────────────\n  This repository appears to be a Node.js project. It uses Next.js and React\n  as the primary frameworks. The codebase is written in TypeScript. Tailwind\n  CSS is used for styling. Tests are located in: test.\n\n  Dependency Diagram\n  ────────────────────────────────────────\n  vercel/next.js\n  ├── Stack\n  │   ├── Node.js\n  │   ├── Next.js (14.2.3)\n  │   ├── React (18.3.0)\n  │   └── Tailwind CSS\n  ├── Structure\n  │   ├── packages/\n  │   ├── examples/\n  │   └── test/\n  └── Dependencies (package.json)\n      ├── react ^18.0.0\n      └── react-dom ^18.0.0\n\n  Analyzed 4821 files in 1243ms · repolens v0.0.1\n```\n\n### `fastapi/fastapi`\n\n```\n╭──────────────────────────────────────╮\n│                                      │\n│   RepoLens Analysis                  │\n│   fastapi/fastapi                    │\n│                                      │\n╰──────────────────────────────────────╯\n\n  Detected Stacks\n  ────────────────────────────────────────\n  ● Python (high)\n  ● FastAPI (high)\n  ◐ PostgreSQL (medium)\n\n  Architecture Summary\n  ────────────────────────────────────────\n  This is a Python project. It uses FastAPI for building APIs.\n  Tests are located in: tests.\n```\n\n### `supabase/supabase` — JSON output\n\n```json\n{\n  \"projectInfo\": {\n    \"repoName\": \"supabase/supabase\",\n    \"repoUrl\": \"https://github.com/supabase/supabase\",\n    \"isGitHub\": true,\n    \"stars\": 71000,\n    \"description\": \"The open source Firebase alternative.\"\n  },\n  \"detectedStacks\": [\n    { \"name\": \"nodejs\", \"displayName\": \"Node.js\", \"confidence\": \"high\" },\n    { \"name\": \"nextjs\", \"displayName\": \"Next.js\", \"confidence\": \"high\" },\n    { \"name\": \"react\", \"displayName\": \"React\", \"confidence\": \"high\" },\n    { \"name\": \"postgresql\", \"displayName\": \"PostgreSQL\", \"confidence\": \"high\" },\n    { \"name\": \"docker\", \"displayName\": \"Docker\", \"confidence\": \"high\" }\n  ]\n}\n```\n\n## Supported Stacks\n\n| Technology   | Detection Signal                                  |\n| ------------ | ------------------------------------------------- |\n| Node.js      | `package.json`                                    |\n| Next.js      | `next` in dependencies                            |\n| React        | `react` in dependencies                           |\n| Vue.js       | `vue` in dependencies                             |\n| Python       | `.py` files, `requirements.txt`, `pyproject.toml` |\n| FastAPI      | `fastapi` in requirements                         |\n| Django       | `django` in requirements                          |\n| Flask        | `flask` in requirements                           |\n| Go           | `go.mod`, `.go` files                             |\n| Rust         | `Cargo.toml`, `.rs` files                         |\n| Docker       | `Dockerfile`, `docker-compose.yml`                |\n| Tailwind CSS | `tailwindcss` in dependencies                     |\n| PostgreSQL   | `pg`, `psycopg2`, `lib/pq` in dependencies        |\n| MongoDB      | `mongoose`, `pymongo` in dependencies             |\n\n## Extending\n\nAdding a new language takes one file. Implement `IAnalyzer`:\n\n```typescript\n// src/analyzers/dartAnalyzer.ts\nimport { BaseAnalyzer, type AnalyzerResult } from './base/IAnalyzer.js';\nimport { hasFile } from '../utils/fileUtils.js';\n\nexport class DartAnalyzer extends BaseAnalyzer {\n  readonly name = 'dart';\n  readonly displayName = 'Dart / Flutter';\n\n  canAnalyze(files: string[], _repoPath: string): boolean {\n    return hasFile(files, 'pubspec.yaml') || files.some((f) => f.endsWith('.dart'));\n  }\n\n  async analyze(repoPath: string, files: string[]): Promise<AnalyzerResult> {\n    const result = this.emptyResult();\n    result.stacks.push({\n      name: 'dart',\n      displayName: 'Dart',\n      confidence: 'high',\n      evidence: ['pubspec.yaml found'],\n    });\n    result.architectureNotes.push('This is a Dart/Flutter project.');\n    return result;\n  }\n}\n```\n\nRegister it in `src/analyzers/index.ts`:\n\n```typescript\nimport { DartAnalyzer } from './dartAnalyzer.js';\n\nexport function createDefaultRegistry(): AnalyzerRegistry {\n  return (\n    new AnalyzerRegistry()\n      // ... existing analyzers\n      .register(new DartAnalyzer())\n  );\n}\n```\n\nNo other files need to change.\n\n## Architecture\n\n```\nrepolens analyze <repo>\n        │\n        ▼\n1. URL/Path Resolution\n   isGitHubUrl? → shallow clone to temp dir (simple-git)\n   local path?  → resolve directly\n        │\n        ▼\n2. File Scanner        glob all files, skip node_modules/dist\n3. Structure Scanner   entry points, folders, test dirs, config files\n4. Dependency Parsers  package.json / requirements.txt / go.mod / Cargo.toml\n        │\n        ▼\n5. Analyzer Registry (plugin system)\n   NodeAnalyzer / PythonAnalyzer / GoAnalyzer / RustAnalyzer / DockerAnalyzer\n        │\n        ▼\n6. Architecture Summary + ASCII Diagram\n        │\n        ▼\n7. Output  →  CLI  |  JSON  |  Markdown\n        │\n        ▼\n8. Cleanup (always runs, even on error)\n```\n\n### Module Structure\n\n```\nsrc/\n├── cli/          Commander.js entry point + command handlers\n├── models/       Pure TypeScript interfaces (no logic)\n├── analyzers/    IAnalyzer interface + per-stack implementations\n├── scanners/     File system traversal and structure detection\n├── parsers/      Dependency file parsers\n├── services/     Git cloning + GitHub API (Octokit)\n├── utils/        Logger, file utils, URL utils, temp dir\n└── output/       CLI, JSON, Markdown formatters + diagram generator\n```\n\n## Dev\n\n```bash\npnpm install\npnpm dev analyze ./some-project   # run without building\npnpm test                         # vitest\npnpm test:coverage\npnpm typecheck                    # tsc --noEmit\npnpm lint\npnpm format\npnpm build                        # tsup → dist/\n```\n\n## Contributing\n\n1. Fork the repo\n2. Create a branch: `git checkout -b feat/my-new-analyzer`\n3. Make your changes and add tests\n4. Run `pnpm typecheck && pnpm test && pnpm build`\n5. Open a Pull Request\n\nNew analyzers must implement `IAnalyzer` and be registered in `src/analyzers/index.ts`. New parsers must be added to `src/parsers/index.ts`.\n\nFor bugs, open an issue with the command you ran, the repo you analyzed, and the full error output (`--verbose` for stack traces).\n\n## Environment Variables\n\n| Variable       | Description                                                                                         |\n| -------------- | --------------------------------------------------------------------------------------------------- |\n| `GITHUB_TOKEN` | Optional GitHub personal access token. Increases API rate limits and enables private repo metadata. |\n\n```bash\nexport GITHUB_TOKEN=ghp_your_token_here\nrepolens analyze https://github.com/your-org/private-repo\n```\n\n## Stack\n\n- TypeScript (strict mode)\n- Commander.js (CLI)\n- picocolors + boxen + ora (terminal output)\n- simple-git (cloning)\n- @octokit/rest (GitHub API)\n- Vitest (tests)\n- tsup (bundling)\n- pnpm (package manager)\n\n## License\n\nApache-2.0 © [Ashar Irfan](https://x.com/MrAsharIrfan) built with [Command Code](https://commandcode.ai).\n","readmeFilename":"README.md"}