{"_id":"@ateriss_/aiv-cli","_rev":"6-ec4f23baba3032722ed268125ac7f55f","name":"@ateriss_/aiv-cli","dist-tags":{"latest":"1.0.4"},"versions":{"0.1.0":{"name":"@ateriss_/aiv-cli","version":"0.1.0","keywords":["ai","pr-review","cli","github","claude","openai"],"author":"","license":"MIT","_id":"@ateriss_/aiv-cli@0.1.0","maintainers":[{"name":"ateriss_","email":"alv2997@gmail.com"}],"bin":{"aiv":"dist/index.js"},"dist":{"shasum":"5a3d020a9d25d73b4af131b7f5b4f261799d57c2","tarball":"https://registry.npmjs.org/@ateriss_/aiv-cli/-/aiv-cli-0.1.0.tgz","fileCount":40,"integrity":"sha512-yDHpqxkwzsIPkTQc/u20QuelyPut1W5T9AGkFpbQdLrbNQdCqAS5l3DxzTcYu6REmcP85CNFpAdtZiLndl7vUA==","signatures":[{"sig":"MEUCIC6kZlG4PoaZA4IugrLp9uDeubSUQ8JvHg7SFZ9dbgixAiEAtzLzq+lGyKr7ISLag52U105wRMMrILT3DtOcCTe0vUM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":244122},"main":"dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"09b1177ba06d79af7b95903066d2ff80b2526363","scripts":{"dev":"ts-node src/index.ts","build":"tsup","start":"node dist/index.js","typecheck":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"ateriss_","email":"alv2997@gmail.com"},"_npmVersion":"10.8.2","description":"AI-powered PR reviewer CLI — local-first, multi-agent semantic analysis","directories":{},"_nodeVersion":"20.20.1","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","table":"^6.8.2","openai":"^4.77.0","js-yaml":"^4.1.0","inquirer":"^9.3.7","commander":"^12.1.0","node-fetch":"^3.3.2","@anthropic-ai/sdk":"^0.37.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","ts-node":"^10.9.2","typescript":"^5.7.2","@types/node":"^22.10.0","@types/js-yaml":"^4.0.9","@types/inquirer":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/aiv-cli_0.1.0_1779068994468_0.17826994773021254","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@ateriss_/aiv-cli","version":"1.0.0","keywords":["ai","pr-review","cli","github","claude","openai"],"author":"","license":"MIT","_id":"@ateriss_/aiv-cli@1.0.0","maintainers":[{"name":"ateriss_","email":"alv2997@gmail.com"}],"bin":{"aiv":"dist/index.js"},"dist":{"shasum":"f40e20a0435ff1fba0c4050d3f19f5c1efc3af7a","tarball":"https://registry.npmjs.org/@ateriss_/aiv-cli/-/aiv-cli-1.0.0.tgz","fileCount":40,"integrity":"sha512-sDO2a4ltl3EZz3D9yDBd+GdeCTfcIb8qeoPGBnZjwjhR/se3Vl7JmQdvg39aKUExwSV8Gdq865oc5alJWfKCWw==","signatures":[{"sig":"MEUCIC4nc41MeteWmqF05HUuU1jR1FZ1tDAB1qhe92SqLLN9AiEAxfuk5qarWop2y/FUos/m9sJveiefxMnaVbgXnYOygoQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":241757},"main":"dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"09b1177ba06d79af7b95903066d2ff80b2526363","scripts":{"dev":"ts-node src/index.ts","build":"tsup","start":"node dist/index.js","typecheck":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"ateriss_","email":"alv2997@gmail.com"},"_npmVersion":"10.8.2","description":"AI-powered PR reviewer CLI — local-first, multi-agent semantic analysis","directories":{},"_nodeVersion":"20.20.1","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","table":"^6.8.2","openai":"^4.77.0","js-yaml":"^4.1.0","inquirer":"^9.3.7","commander":"^12.1.0","node-fetch":"^3.3.2","@anthropic-ai/sdk":"^0.37.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","ts-node":"^10.9.2","typescript":"^5.7.2","@types/node":"^22.10.0","@types/js-yaml":"^4.0.9","@types/inquirer":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/aiv-cli_1.0.0_1779115102400_0.5435978543287112","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@ateriss_/aiv-cli","version":"1.0.1","keywords":["ai","pr-review","cli","github","claude","openai"],"author":"","license":"MIT","_id":"@ateriss_/aiv-cli@1.0.1","maintainers":[{"name":"ateriss_","email":"alv2997@gmail.com"}],"bin":{"aiv":"dist/index.js"},"dist":{"shasum":"403af2c84c97485d4a8434f2524fb11fed7fc846","tarball":"https://registry.npmjs.org/@ateriss_/aiv-cli/-/aiv-cli-1.0.1.tgz","fileCount":40,"integrity":"sha512-zASgfQQTL+dQ4X8MobI/WlQGY+LkwJcUGyS9A+Bc5NFZnR+FjePZuGFkdT/9K7zTj7QMGXkdPf8oi56yEwz7iw==","signatures":[{"sig":"MEUCIAsEBnMTGrsYu+SzU9DW4XJ+MFtHGoedZRrHZrwNWUs3AiEAsqd4HNvmpWYX+zIjvXEfLKLafP6nOWDxdQ5T3Cnfbjs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248731},"main":"dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"09b1177ba06d79af7b95903066d2ff80b2526363","scripts":{"dev":"ts-node src/index.ts","build":"tsup","start":"node dist/index.js","typecheck":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"ateriss_","email":"alv2997@gmail.com"},"_npmVersion":"10.8.2","description":"AI-powered PR reviewer CLI — local-first, multi-agent semantic analysis","directories":{},"_nodeVersion":"20.20.1","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","table":"^6.8.2","openai":"^4.77.0","js-yaml":"^4.1.0","inquirer":"^9.3.7","commander":"^12.1.0","node-fetch":"^3.3.2","@anthropic-ai/sdk":"^0.37.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","ts-node":"^10.9.2","typescript":"^5.7.2","@types/node":"^22.10.0","@types/js-yaml":"^4.0.9","@types/inquirer":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/aiv-cli_1.0.1_1779123425568_0.7754414069253537","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@ateriss_/aiv-cli","version":"1.0.2","keywords":["ai","pr-review","cli","github","claude","openai"],"author":"","license":"MIT","_id":"@ateriss_/aiv-cli@1.0.2","maintainers":[{"name":"ateriss_","email":"alv2997@gmail.com"}],"bin":{"aiv":"dist/index.js"},"dist":{"shasum":"7e6d9c7e908c5d1bd18e38d22c4e9d0a792929af","tarball":"https://registry.npmjs.org/@ateriss_/aiv-cli/-/aiv-cli-1.0.2.tgz","fileCount":40,"integrity":"sha512-K/ZyRgWA+B75xNqNXpkUQUHSy0LOK8o0mpoEqGLxXO6492BjkSK5qtzbhI+s+uJlRPX0i3dpCbdw/8lkKLIN1Q==","signatures":[{"sig":"MEQCIGNi/DKsVTfFvWJF9yCC3tW0pmz96lSSpG9HMlvu0620AiANhuCPkHBHHgoZ9s2o8CEe3X67MNoQujxvpKUyyP3T6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1952149},"main":"dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"4cc8d146e60ff9a2e9abedeca8b4c132d959ce9a","scripts":{"dev":"ts-node src/index.ts","build":"tsup","start":"node dist/index.js","typecheck":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"ateriss_","email":"alv2997@gmail.com"},"_npmVersion":"10.8.2","description":"AI-powered PR reviewer CLI — local-first, multi-agent semantic analysis","directories":{},"_nodeVersion":"20.20.1","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","table":"^6.8.2","openai":"^4.77.0","js-yaml":"^4.1.0","inquirer":"^9.3.7","commander":"^12.1.0","node-fetch":"^3.3.2","@anthropic-ai/sdk":"^0.37.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","ts-node":"^10.9.2","typescript":"^5.7.2","@types/node":"^22.10.0","@types/js-yaml":"^4.0.9","@types/inquirer":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/aiv-cli_1.0.2_1779133243287_0.40118175947882184","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@ateriss_/aiv-cli","version":"1.0.3","keywords":["ai","pr-review","cli","github","claude","openai"],"author":{"url":"Ateriss","name":"Alexandra Linares Viña"},"license":"MIT","_id":"@ateriss_/aiv-cli@1.0.3","maintainers":[{"name":"ateriss_","email":"alv2997@gmail.com"}],"bin":{"aiv":"dist/index.js"},"dist":{"shasum":"d678ea36379bc930343d37d72d85c406ecf836bb","tarball":"https://registry.npmjs.org/@ateriss_/aiv-cli/-/aiv-cli-1.0.3.tgz","fileCount":43,"integrity":"sha512-vlf/Q192RFSBxgZUb3LUVv1UaW+1HZB/K7bgVJZE5P92h3joVxEg+bDjlxmQCr3rPfsTfQmDV34+IcIVTZgVsg==","signatures":[{"sig":"MEYCIQDjLY5O16AEuHsRZGT6be2WO+4f7mauMVGhnTZuwi63+gIhAJedTnmClAKY2bsxQQJBJeJd5KWt40a+s6doaOJNc+yJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1997175},"main":"dist/index.js","engines":{"node":">=18.0.0"},"gitHead":"b4885cd11a912f9d144713b4d9f0fa4ee4df8371","scripts":{"dev":"ts-node src/index.ts","build":"tsup","start":"node dist/index.js","typecheck":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"ateriss_","email":"alv2997@gmail.com"},"_npmVersion":"10.8.2","description":"AI-powered PR reviewer CLI — local-first, multi-agent semantic analysis","directories":{},"_nodeVersion":"20.20.1","dependencies":{"ora":"^8.1.1","chalk":"^5.3.0","table":"^6.8.2","openai":"^4.77.0","js-yaml":"^4.1.0","inquirer":"^9.3.7","commander":"^12.1.0","node-fetch":"^3.3.2","@anthropic-ai/sdk":"^0.37.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","ts-node":"^10.9.2","typescript":"^5.7.2","@types/node":"^22.10.0","@types/js-yaml":"^4.0.9","@types/inquirer":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/aiv-cli_1.0.3_1779148435536_0.06749189393677146","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@ateriss_/aiv-cli","version":"1.0.4","description":"AI-powered PR reviewer CLI — local-first, multi-agent semantic analysis","main":"dist/index.js","bin":{"aiv":"dist/index.js"},"scripts":{"build":"tsup","typecheck":"tsc","dev":"ts-node src/index.ts","start":"node dist/index.js","prepublishOnly":"npm run build"},"keywords":["ai","pr-review","cli","github","claude","openai"],"author":{"name":"Alexandra Linares Viña","url":"Ateriss"},"license":"MIT","dependencies":{"@anthropic-ai/sdk":"^0.37.0","chalk":"^5.3.0","commander":"^12.1.0","inquirer":"^9.3.7","js-yaml":"^4.1.0","node-fetch":"^3.3.2","ora":"^8.1.1","openai":"^4.77.0","table":"^6.8.2"},"devDependencies":{"@types/inquirer":"^9.0.7","@types/js-yaml":"^4.0.9","@types/node":"^22.10.0","ts-node":"^10.9.2","tsup":"^8.3.5","typescript":"^5.7.2"},"engines":{"node":">=18.0.0"},"_id":"@ateriss_/aiv-cli@1.0.4","gitHead":"5894a469e50632b497d1f8a151c489f8eb4c90da","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-EiOUzkTYTyBqsHTNSTrvD8CbJvm2dD54qH6d2VWx8TBFB2RMh9kTVcJumC5O8EnjukyDYHcx5XttomdTkHwsMg==","shasum":"f876648faa13c708d9a685f68c5b0359c7b2ba3a","tarball":"https://registry.npmjs.org/@ateriss_/aiv-cli/-/aiv-cli-1.0.4.tgz","fileCount":85,"unpackedSize":2735298,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDzOIrJ6EkBNrx7iD6hmEisaiZ30tU1MIeg0QN+4zq1mwIhAMIuvEnwp9x61QSSn4TEz5t5634qkua3jS2VCbFYO6nU"}]},"_npmUser":{"name":"ateriss_","email":"alv2997@gmail.com"},"directories":{},"maintainers":[{"name":"ateriss_","email":"alv2997@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/aiv-cli_1.0.4_1779205988508_0.5291005194699419"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-18T01:49:54.382Z","modified":"2026-05-19T15:53:08.814Z","0.1.0":"2026-05-18T01:49:54.615Z","1.0.0":"2026-05-18T14:38:22.598Z","1.0.1":"2026-05-18T16:57:05.705Z","1.0.2":"2026-05-18T19:40:43.490Z","1.0.3":"2026-05-18T23:53:55.727Z","1.0.4":"2026-05-19T15:53:08.707Z"},"author":{"name":"Alexandra Linares Viña","url":"Ateriss"},"license":"MIT","keywords":["ai","pr-review","cli","github","claude","openai"],"description":"AI-powered PR reviewer CLI — local-first, multi-agent semantic analysis","maintainers":[{"name":"ateriss_","email":"alv2997@gmail.com"}],"readme":"# aiv — AI PR Reviewer\n\n```\n █████╗ ██╗    ██████╗ ██████╗     ██████╗ ███████╗██╗   ██╗██╗███████╗██╗    ██╗███████╗██████╗\n██╔══██╗██║    ██╔══██╗██╔══██╗    ██╔══██╗██╔════╝██║   ██║██║██╔════╝██║    ██║██╔════╝██╔══██╗\n███████║██║    ██████╔╝██████╔╝    ██████╔╝█████╗  ██║   ██║██║█████╗  ██║ █╗ ██║█████╗  ██████╔╝\n██╔══██║██║    ██╔═══╝ ██╔══██╗    ██╔══██╗██╔══╝  ╚██╗ ██╔╝██║██╔══╝  ██║███╗██║██╔══╝  ██╔══██╗\n██║  ██║██║    ██║     ██║  ██║    ██║  ██║███████╗ ╚████╔╝ ██║███████╗╚███╔███╔╝███████╗██║  ██║\n╚═╝  ╚═╝╚═╝    ╚═╝     ╚═╝  ╚═╝    ╚═╝  ╚═╝╚══════╝  ╚═══╝  ╚═╝╚══════╝ ╚══╝╚══╝ ╚══════╝╚═╝  ╚═╝\n\n   by Ateriss\n```\n\n---\n\n## What is aiv?\n\nCode review is one of the most important quality gates in a software team — and also one of the most time-consuming. Reviewers need to understand the business context, track architectural decisions, spot security risks, and catch regressions, all while reading through a diff that may span dozens of files.\n\n**aiv** is a local-first CLI that runs that analysis for you, before a human ever opens the PR.\n\nIt sends the diff to three specialized AI agents in parallel — one focused on **business logic and domain rules**, one on **architecture and structural patterns**, and one on **security vulnerabilities** — and returns a structured risk report with severity-rated findings, specific suggestions per file, and an executive summary. The report is anchored to your project: aiv reads your `context.md` (project background, architecture decisions, sensitive zones) and `rules.yml` (custom business rules, required calls, forbidden patterns) so findings are relevant to your codebase, not just generic linting advice.\n\n**What aiv catches that linters miss:**\n\n- A retry loop that could cause duplicate charges because it skips the idempotency check your team agreed on\n- A service that imports directly from a handler, breaking the layer contract\n- A new endpoint that reads user data without going through the authorization middleware\n- A payroll mutation that doesn't call `auditLog()` as required by your rules\n- A function moved to a shared module that now exposes internal state to layers that shouldn't see it\n\n**Two perspectives, one tool:**\n\naiv covers both sides of the code review workflow. As a **reviewer**, run `aiv review` to analyze an open PR and act directly from the terminal — approve, request changes, post the report as a comment, or merge. As the **author**, run `aiv check` before opening a PR to catch issues in your own branch first. If the report looks good, create the PR directly from the terminal; if not, save a `.aiv/checklist.md` with all findings as checkboxes so you know exactly what to fix.\n\n**What happens after the review:**\n\nOnce the report is in, aiv lets you act on it directly from the terminal — approve the PR, request changes, post the full report as a formatted GitHub comment, or merge with your preferred strategy (squash, merge, rebase). If you've already reviewed the PR in a previous session, aiv detects the cached analysis in the PR comments and asks if you want to reuse it instead of re-running the agents.\n\n**Works with any AI provider.** Claude, OpenAI, Gemini, Groq, Mistral, DeepSeek, Kimi, Ollama, or any OpenAI-compatible endpoint. Mix providers per agent — use a fast model for routine checks and a powerful one for security. Configure a fallback chain so a quota error on one provider silently switches to the next without losing the run.\n\n---\n\n## Table of Contents\n\n- [Requirements](#requirements)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Commands Reference](#commands-reference)\n  - [aiv review](#aiv-review)\n  - [aiv check](#aiv-check)\n- [Configuration](#configuration)\n  - [Global Config](#global-config)\n  - [Repo Config](#repo-config)\n  - [Rules](#rules)\n  - [Context](#context)\n- [GitHub Account Management](#github-account-management)\n- [AI Providers](#ai-providers)\n  - [Built-in: Claude](#claude-default)\n  - [Built-in: OpenAI](#openai)\n  - [Built-in: Gemini](#google-gemini)\n  - [OpenAI-compatible (custom)](#openai-compatible-providers)\n  - [Per-agent assignment](#per-agent-provider-assignment)\n  - [Fallback chain](#fallback-chain)\n  - [Mock](#mock-offline-testing)\n- [Review Output](#review-output)\n- [Post-review Actions](#post-review-actions)\n- [Multi-language](#multi-language)\n- [Environment Variables](#environment-variables)\n- [Error Reference](#error-reference)\n- [Best Practices](#best-practices)\n\n---\n\n## Requirements\n\n- Node.js 18 or higher\n- A GitHub personal access token with `repo` scope (or `public_repo` for public repos)\n- An API key for at least one supported AI provider (see [AI Providers](#ai-providers))\n\n---\n\n## Installation\n\n```bash\nnpm install -g @ateriss_/aiv-cli\n```\n\n---\n\n## Quick Start\n\n**1. Initialize aiv in your project repository:**\n\n```bash\ncd your-repo\naiv init\n```\n\nThis creates:\n- `~/.aiv/config.yml` — global config (AI providers, GitHub accounts)\n- `.aiv/config.yml` — repo config (owner, repo, account override)\n- `.aiv/rules.yml` — custom review rules for agents\n- `.aiv/context.md` — auto-generated project context\n- `.aiv/tree.json` — project file structure snapshot\n\n**2. Set your API key and GitHub token as persistent environment variables:**\n\n```bash\n# macOS / Linux (add to ~/.bashrc or ~/.zshrc)\nexport CLAUDE_API_KEY=sk-ant-...\nexport GITHUB_TOKEN=ghp_...\n\n# Windows (PowerShell — persists across sessions)\n[System.Environment]::SetEnvironmentVariable(\"CLAUDE_API_KEY\", \"sk-ant-...\", \"User\")\n[System.Environment]::SetEnvironmentVariable(\"GITHUB_TOKEN\", \"ghp_...\", \"User\")\n```\n\n**3. (Optional) Let AI generate your context and rules:**\n\n```bash\naiv context generate\n```\n\n**4. List open pull requests:**\n\n```bash\naiv prs\n```\n\n**5. Review a PR (as a reviewer):**\n\n```bash\naiv review 42\n```\n\nAfter the report, aiv asks if you want to approve, request changes, post the report as a PR comment, or merge directly from the terminal.\n\n**Or: analyze your own branch before opening a PR (as the author):**\n\n```bash\naiv check           # compares current branch vs origin/main (auto-detected)\naiv check qa        # compares current branch vs origin/qa\n```\n\nAfter the report, aiv asks: create the PR on GitHub or save a checklist of findings to `.aiv/checklist.md`.\n\n---\n\n## Commands Reference\n\nEvery command has a short alias. Long and short forms are identical.\n\n### Core\n\n| Long form | Short | Description |\n|-----------|-------|-------------|\n| `aiv init` | `aiv i` | Initialize aiv globally and in the current repo |\n| `aiv prs` | `aiv p` | List open PRs, then optionally review one |\n| `aiv review [pr-number]` | `aiv r` | Review a PR or pick interactively (reviewer perspective) |\n| `aiv check [base-branch]` | `aiv c` | Analyze local diff before opening a PR (author perspective) |\n| `aiv agents` | `aiv a` | List available agents and their focus areas |\n\n### Context\n\n| Long form | Short | Description |\n|-----------|-------|-------------|\n| `aiv context refresh` | `aiv ctx refresh` | Rebuild `context.md` and `tree.json` from the codebase |\n| `aiv context show` | `aiv ctx show` | Print current `context.md` |\n| `aiv context generate` | `aiv ctx generate` | Use AI to generate `context.md` and `rules.yml` |\n\n### Config — general\n\n| Long form | Short | Description |\n|-----------|-------|-------------|\n| `aiv config show` | `aiv cf show` | Show global and repo config files |\n| `aiv config set-provider <name>` | `aiv cf set-provider` | Set default AI provider |\n| `aiv config set-repo <owner> <repo>` | `aiv cf set-repo` | Set GitHub owner/repo in repo config |\n| `aiv config set-lang <lang>` | `aiv cf set-lang` | Change display language (`en` / `es`) |\n| `aiv config rules` | `aiv cf rules` | Print `rules.yml` |\n\n### Config — providers\n\n| Long form | Description |\n|-----------|-------------|\n| `aiv config add-provider <name>` | Add or update a provider (built-in or custom OpenAI-compatible) |\n| `aiv config remove-provider <name>` | Remove a custom provider |\n| `aiv config list-providers` | List all configured providers and their status |\n| `aiv config set-agent-provider <agent> [spec]` | Assign a specific provider/model to one agent |\n| `aiv config set-fallback [providers...]` | Set ordered fallback chain for quota/rate errors |\n| `aiv config show-agents` | Show per-agent provider assignments and fallback chain |\n\n### Config — GitHub accounts\n\n| Long form | Description |\n|-----------|-------------|\n| `aiv config accounts` | List GitHub accounts |\n| `aiv config add-account <name>` | Add a GitHub account |\n| `aiv config remove-account <name>` | Remove a GitHub account |\n| `aiv config default-account <name>` | Set global default account |\n| `aiv config use-account <name>` | Use a specific account for this repo |\n\n---\n\n### `aiv init`\n\n```bash\naiv init\naiv i\n```\n\nSafe to re-run — if `~/.aiv/config.yml` already exists it is preserved. Re-running inside a repo always rebuilds `context.md` and `tree.json`.\n\n---\n\n### `aiv prs`\n\nFetches open PRs in a table, then launches an interactive selector.\n\n```bash\naiv prs\naiv p\n\naiv prs --limit 10\naiv prs --owner myorg --repo myrepo\naiv prs --no-select           # list only, skip selector\n```\n\n**Repo auto-detection:** reads `git remote get-url origin`. If it fails, pass `--owner`/`--repo` or set them with `aiv config set-repo`.\n\n---\n\n### `aiv review`\n\nReviews a pull request. Omit the number to pick interactively.\n\n```bash\naiv review 42\naiv r 42\n\naiv review                    # interactive selector\naiv review 42 --owner myorg --repo myrepo\naiv review 42 --agent security\naiv review 42 --agent business architecture\naiv review 42 --json          # raw JSON, no interactive prompt\n```\n\nIf a previous aiv analysis exists as a comment on the PR, aiv asks whether to reuse it or run a fresh analysis. After the report, the post-review action menu lets you approve, request changes, post the report as a comment, or skip.\n\n---\n\n### `aiv check`\n\nAnalyzes your local branch against a remote base branch **before** opening a PR — the author's equivalent of `aiv review`.\n\n```bash\naiv check              # auto-detects base (origin/main, origin/master, origin/develop)\naiv c\n\naiv check qa           # compare current branch vs origin/qa\naiv check main         # compare current branch vs origin/main\naiv check --agent security           # run only the security agent\naiv check qa --json                  # raw JSON output\n```\n\nThe diff is always computed against the **remote** branch (`origin/<base>`), not your local copy, so findings reflect the actual gap that would be in the PR.\n\nAfter the report, aiv detects whether your branch has unpushed commits and adjusts the menu accordingly:\n\n```\n# If there are unpushed commits:\n? What would you like to do?\n❯ 🚀  Push y crear PR en GitHub\n  📋  Guardar checklist en .aiv/\n  ────────────────────────────────────────\n  ↩  Skip\n\n# If the branch is already up to date with the remote:\n? What would you like to do?\n❯ 🚀  Crear PR en GitHub\n  📋  Guardar checklist en .aiv/\n  ────────────────────────────────────────\n  ↩  Skip\n```\n\n- **Push y crear PR** — runs `git push origin <branch>`, then creates the PR via GitHub API. If the push fails, it stops before attempting PR creation.\n- **Crear PR** — branch is already pushed; creates the PR directly without a push.\n- **Guardar checklist** — writes `.aiv/checklist.md` with all findings as `- [ ]` checkboxes, grouped by severity. The `.aiv/` folder is gitignored so the file never reaches the remote.\n\n**Example checklist (`aiv/checklist.md`):**\n\n```markdown\n# aiv Check: feature/payments → main\nGenerated: 2026-05-18  |  Risk: HIGH (74/100)\n\n## Critical & High\n\n- [ ] **[HIGH]** Missing idempotency key on retry — `src/payments/retry.ts`\n  > Pass a stable key derived from the original transaction ID.\n- [ ] **[CRITICAL]** auditLog() not called in retry path\n\n## Medium\n\n- [ ] **[MEDIUM]** Direct database write outside billing module — `src/db/payments.ts`\n```\n\n---\n\n### `aiv context`\n\n```bash\naiv context refresh            # rebuild from codebase (static analysis)\naiv ctx refresh\n\naiv context show               # print context.md\naiv ctx show\n\naiv context generate           # AI-powered generation\naiv ctx generate\naiv ctx generate --context-only\naiv ctx generate --rules-only\naiv ctx generate --force       # overwrite without asking\n```\n\n`generate` uses the configured AI provider (or `providers.agents.context` if set) to analyze the project structure and produce a `context.md` and `rules.yml` tailored to your stack. Run it after `init` or whenever the project changes significantly — edit the output only where needed.\n\n---\n\n### `aiv agents`\n\n```bash\naiv agents\naiv a\n```\n\n| Agent | Focus areas |\n|-------|-------------|\n| business | Business logic, domain invariants, rule violations, functional regressions |\n| architecture | Layer violations, coupling, SRP, dependency direction, abstraction quality |\n| security | Auth bypass, injection, data leakage, OWASP Top 10, sensitive data handling |\n\n---\n\n## Configuration\n\naiv uses a two-level configuration system:\n\n| File | Scope | Purpose |\n|------|-------|---------|\n| `~/.aiv/config.yml` | Global | AI providers, GitHub accounts, defaults |\n| `.aiv/config.yml` | Repo | Owner/repo override, account override, token limits |\n\nRepo settings always override global defaults.\n\n---\n\n### Global Config\n\n`~/.aiv/config.yml` — created by `aiv init`, shared across all repos.\n\n```yaml\nlang: en                        # 'en' or 'es'\n\nproviders:\n  default: claude               # active provider\n  fallback: [openai, gemini]    # tried in order on quota/rate errors\n  agents:                       # per-agent overrides (provider or provider/model)\n    business:     claude/claude-sonnet-4-6\n    architecture: gemini/gemini-2.0-flash\n    security:     openai/gpt-4.1\n    context:      claude/claude-sonnet-4-6\n\n# Built-in providers\nclaude:\n  model: claude-sonnet-4-6\n  api_key_env: CLAUDE_API_KEY\n\nopenai:\n  model: gpt-4.1\n  api_key_env: OPENAI_API_KEY\n\ngemini:\n  model: gemini-2.0-flash\n  api_key_env: GEMINI_API_KEY\n\n# Custom OpenAI-compatible providers\ncustom_providers:\n  kimi:\n    base_url: https://api.moonshot.cn/v1\n    api_key_env: KIMI_API_KEY\n    model: moonshot-v1-8k\n  groq:\n    base_url: https://api.groq.com/openai/v1\n    api_key_env: GROQ_API_KEY\n    model: llama-3.3-70b-versatile\n\nreview:\n  max_tokens: 20000\n  max_findings: 20\n\ngithub:\n  default_account: personal\n  accounts:\n    personal:\n      token_env: GITHUB_TOKEN\n      username: alice\n      description: Personal account\n    work:\n      token_env: GITHUB_TOKEN_WORK\n      username: alice-corp\n      description: Work account\n```\n\n---\n\n### Repo Config\n\n`.aiv/config.yml` — created per repository by `aiv init`.\n\n```yaml\ngithub:\n  account: work                 # use the 'work' account from global config\n  owner: myorg                  # override auto-detected GitHub owner\n  repo: backend-api             # override auto-detected GitHub repo\n\nreview:\n  max_tokens: 30000             # allow larger diffs for this repo\n  max_findings: 30\n```\n\n---\n\n### Rules\n\n`.aiv/rules.yml` — custom review rules passed to every agent on every review.\n\n```yaml\nsensitive_modules:\n  - auth\n  - payroll\n  - payments\n  - billing\n\nbusiness_rules:\n  payroll:\n    required_calls:\n      - auditLog\n      - validateTransaction\n  auth:\n    required_checks:\n      - permissionValidation\n  payments:\n    forbidden_patterns:\n      - directDbWrite\n```\n\nThe more specific your rules, the fewer false positives and the more actionable the findings.\n\n---\n\n### Context\n\n`.aiv/context.md` — project background that agents read before analyzing the diff.\n\nAuto-generated by `aiv init`, `aiv context refresh`, and `aiv context generate`. You can edit it freely — the richer this file, the more accurate the findings.\n\n```markdown\n## Business Context\n\nE-commerce platform handling real-money transactions.\nAll changes in `src/payments/` must include an audit log entry.\n`UserBalance` must never be modified outside the `billing` module.\n\n## Architecture\n\nThree-layer: HTTP handlers → service layer → repositories.\nServices must not import from handlers.\n\n## Sensitive Zones\n\n- src/auth/ — JWT issuance and validation\n- src/payments/ — Stripe integration, never bypass PaymentGateway\n```\n\n---\n\n## GitHub Account Management\n\n### Add accounts\n\n```bash\naiv config add-account personal --token-env GITHUB_TOKEN\naiv config add-account work \\\n  --token-env GITHUB_TOKEN_WORK \\\n  --username alice-corp \\\n  --description \"Work GitHub\"\naiv config add-account work --token-env NEW_VAR --force   # overwrite\n```\n\n### Manage accounts\n\n```bash\naiv config accounts                     # list all accounts + token status\naiv config default-account work         # set global default\naiv config use-account work             # use this account for current repo\naiv config remove-account old-account\n```\n\n### Account resolution order\n\n1. `github.account` in `.aiv/config.yml`\n2. `github.default_account` in `~/.aiv/config.yml`\n3. First account in `~/.aiv/config.yml`\n4. `GITHUB_TOKEN` env var directly\n\n---\n\n## AI Providers\n\naiv supports three kinds of providers:\n\n| Type | Examples | Notes |\n|------|----------|-------|\n| **Built-in** | Claude, OpenAI, Gemini | Native adapters, no extra setup |\n| **OpenAI-compatible** | Kimi, Groq, Mistral, DeepSeek, Ollama, … | Any provider with a compatible endpoint |\n| **Mock** | — | Deterministic offline responses |\n\n---\n\n### Claude (default)\n\n```bash\nexport CLAUDE_API_KEY=sk-ant-...\naiv config set-provider claude\n```\n\nUpdate model or key env:\n\n```bash\naiv config add-provider claude --model claude-opus-4-7\naiv config add-provider claude --api-key-env MY_CLAUDE_KEY\n```\n\n```yaml\nclaude:\n  model: claude-sonnet-4-6\n  api_key_env: CLAUDE_API_KEY\n```\n\n---\n\n### OpenAI\n\n```bash\nexport OPENAI_API_KEY=sk-...\naiv config set-provider openai\n```\n\n```yaml\nopenai:\n  model: gpt-4.1\n  api_key_env: OPENAI_API_KEY\n```\n\n---\n\n### Google Gemini\n\nGemini uses a dedicated REST adapter — no extra SDK or dependency required.\n\n```bash\nexport GEMINI_API_KEY=AIza...\naiv config set-provider gemini\naiv config add-provider gemini --model gemini-2.0-flash-exp   # change model\n```\n\n```yaml\ngemini:\n  model: gemini-2.0-flash\n  api_key_env: GEMINI_API_KEY\n```\n\n---\n\n### OpenAI-compatible providers\n\nAny provider that exposes an OpenAI-compatible API can be registered with one command — no code changes needed when new providers launch.\n\n```bash\n# Kimi (Moonshot AI)\naiv config add-provider kimi \\\n  --base-url https://api.moonshot.cn/v1 \\\n  --api-key-env KIMI_API_KEY \\\n  --model moonshot-v1-8k\n\n# Groq\naiv config add-provider groq \\\n  --base-url https://api.groq.com/openai/v1 \\\n  --api-key-env GROQ_API_KEY \\\n  --model llama-3.3-70b-versatile\n\n# Mistral\naiv config add-provider mistral \\\n  --base-url https://api.mistral.ai/v1 \\\n  --api-key-env MISTRAL_API_KEY \\\n  --model mistral-large-latest\n\n# DeepSeek\naiv config add-provider deepseek \\\n  --base-url https://api.deepseek.com/v1 \\\n  --api-key-env DEEPSEEK_API_KEY \\\n  --model deepseek-chat\n\n# Together AI\naiv config add-provider together \\\n  --base-url https://api.together.xyz/v1 \\\n  --api-key-env TOGETHER_API_KEY \\\n  --model meta-llama/Llama-3-70b-chat-hf\n\n# Ollama (local, no key required)\naiv config add-provider ollama \\\n  --base-url http://localhost:11434/v1 \\\n  --api-key-env OLLAMA_API_KEY \\\n  --model llama3.2\n```\n\nOnce registered, custom providers work exactly like built-ins:\n\n```bash\naiv config set-provider kimi\naiv config list-providers                    # built-ins + custom\naiv config remove-provider kimi\naiv config add-provider kimi --model moonshot-v1-32k --force  # update\n```\n\n---\n\n### Per-agent provider assignment\n\nEach agent (and the context generator) can use a different provider or model:\n\n```bash\naiv config set-agent-provider business    claude/claude-sonnet-4-6\naiv config set-agent-provider security    openai/gpt-4.1\naiv config set-agent-provider architecture gemini/gemini-2.0-flash\naiv config set-agent-provider context     kimi/moonshot-v1-8k\n\n# Use just a provider name (uses that provider's default model)\naiv config set-agent-provider business groq\n\n# View current assignments\naiv config show-agents\n\n# Remove override (reverts to default provider)\naiv config set-agent-provider business --clear\n```\n\nValid agent roles: `business`, `architecture`, `security`, `context`.\n\n---\n\n### Fallback chain\n\nIf any provider hits a rate limit or quota error (HTTP 429, overloaded, insufficient quota), aiv automatically switches to the next provider in the chain — for the rest of that run.\n\n```bash\naiv config set-fallback openai gemini groq   # try in this order\naiv config set-fallback                       # clear the chain\n```\n\nWhen a fallback fires:\n\n```\n  ⚡ \"claude\" quota/rate limit — switching to \"openai\"\n```\n\n---\n\n### Mock (offline testing)\n\n```bash\naiv config set-provider mock\n```\n\nReturns deterministic placeholder findings. Use this to test the CLI without consuming API credits.\n\n---\n\n## Review Output\n\n```\n  aiv review — PR #42\n  Account: personal (GITHUB_TOKEN)\n\n✔ PR loaded: \"Add payment retry logic\" (8 files)\n✔ Context loaded\n\n  Running agents: business, architecture, security\n\n  Review: PR #42 — Add payment retry logic\n  Risk Score: 74/100  HIGH          Generated: 5/17/26\n\n  Executive Summary\n  ─────────────────\n  High-risk changes to the payment processing pipeline. The retry\n  loop lacks idempotency guards and could cause duplicate charges.\n  No audit log entries were added for the new retry paths.\n\n  Security Issues\n  ───────────────\n  [HIGH]  Missing idempotency key on retry\n          File: src/payments/retry.ts\n          Suggestion: Pass a stable idempotency key derived from\n          the original transaction ID.\n\n  Business Risks\n  ──────────────\n  [CRITICAL]  auditLog() not called in retry path\n              rules.yml requires auditLog for all payroll mutations.\n\n  Architecture Issues\n  ───────────────────\n  [MEDIUM]  Direct database write outside billing module\n\n  Agent Summaries\n  ───────────────\n  business      — 2 finding(s)  [score: 88]\n  architecture  — 1 finding(s)  [score: 55]\n  security      — 1 finding(s)  [score: 74]\n```\n\n### Risk score\n\n| Score  | Label    |\n|--------|----------|\n| 0–25   | LOW      |\n| 26–50  | MEDIUM   |\n| 51–75  | HIGH     |\n| 76–100 | CRITICAL |\n\nComputed as `max_score × 0.6 + average_score × 0.4` across all agents.\n\n### JSON output\n\n```bash\naiv review 42 --json | jq '.riskScore'\naiv review 42 --json > review-42.json\n```\n\nShape: `prNumber`, `prTitle`, `riskScore`, `riskLabel`, `executiveSummary`, `agents[]`, `securityIssues[]`, `businessRisks[]`, `architectureIssues[]`, `possibleRegressions[]`.\n\n`--json` skips the post-review action prompt.\n\n---\n\n## Post-review Actions\n\nAfter every review in an interactive terminal, aiv asks:\n\n```\n? What would you like to do with this PR?\n❯ ✔  Approve PR\n  ⚑  Request Changes\n  💬  Post as PR comment\n  ────────────────────────────────────────\n  ↩  Skip\n```\n\n- **Approve** — submits an `APPROVE` review to GitHub, then asks if you want to merge:\n\n  ```\n  ? Merge this PR now? (y/N)\n\n  ? Select merge strategy:\n  ❯ Squash and merge\n    Merge commit\n    Rebase and merge\n  ```\n\n  After approving (with or without merge), `context.md` and `tree.json` are refreshed automatically.\n\n- **Request Changes** — submits a `REQUEST_CHANGES` review to GitHub.\n- **Post as PR comment** — publishes the full report as a formatted GitHub comment. The comment includes severity-rated findings, suggestions, and agent summaries. It also embeds the analysis data so aiv can detect it on future runs.\n- **Skip** — does nothing, exits cleanly.\n\n### Analysis cache\n\nWhen you run `aiv review` on a PR that already has an aiv comment, aiv detects the previous analysis and asks:\n\n```\n  Found a previous aiv analysis on this PR.\n? Use cached analysis? (Y/n)\n```\n\nChoosing yes skips the AI agents entirely and uses the stored result — no API calls, instant output. Choose no to run a fresh analysis (useful after new commits are pushed).\n\n---\n\n## Multi-language\n\naiv supports English and Spanish. All output — errors, spinners, table headers, severity labels, and AI agent responses — follows the configured language.\n\n```bash\naiv config set-lang es\naiv config set-lang en\n\nAIV_LANG=es aiv prs      # per-session override\n```\n\n### Detection order\n\n1. `AIV_LANG` environment variable\n2. `lang` in `~/.aiv/config.yml`\n3. System `LANG` variable (`es_*` locales → Spanish)\n4. Default: `en`\n\n---\n\n## Environment Variables\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `GITHUB_TOKEN` | Yes | GitHub personal access token (default account) |\n| `CLAUDE_API_KEY` | Yes* | Anthropic API key (*when using Claude) |\n| `OPENAI_API_KEY` | Yes* | OpenAI API key (*when using OpenAI) |\n| `GEMINI_API_KEY` | Yes* | Google AI API key (*when using Gemini) |\n| `AIV_LANG` | No | Override display language (`en` or `es`) |\n| `LANG` | No | System locale (auto-detected by aiv) |\n\nFor custom providers, the env var name is whatever you passed to `--api-key-env`.\n\n### GitHub token permissions\n\n| Scope | Required for |\n|-------|-------------|\n| `repo` (private repos) or `public_repo` | Reading PRs and diffs |\n| `pull_requests: write` (fine-grained PAT) | Submitting reviews, posting comments, merging |\n\n---\n\n## Error Reference\n\n### `Not initialized. Run aiv init first.`\n\n`.aiv/config.yml` does not exist in the current directory.\n\n```bash\ncd your-repo && aiv init\n```\n\n---\n\n### `Missing env var: GITHUB_TOKEN (account: default)`\n\nThe token env var for the active account is not set. Check which variable name the account expects:\n\n```bash\naiv config accounts\n```\n\nThen set it (once, permanently on Windows):\n\n```powershell\n[System.Environment]::SetEnvironmentVariable(\"GITHUB_TOKEN\", \"ghp_...\", \"User\")\n```\n\n---\n\n### `Missing env var: CLAUDE_API_KEY`\n\n```bash\nexport CLAUDE_API_KEY=sk-ant-...\n# or switch providers:\naiv config set-provider openai\n```\n\n---\n\n### `Unknown provider: \"xyz\".`\n\n```bash\naiv config list-providers\naiv config add-provider xyz --base-url <url> --api-key-env XYZ_API_KEY --model <model>\n```\n\n---\n\n### `Could not detect GitHub owner/repo.`\n\n```bash\naiv prs --owner myorg --repo myrepo\n# or set permanently:\naiv config set-repo myorg myrepo\n```\n\n---\n\n### `Failed to fetch PR: ...`\n\n- Token lacks `repo` scope — regenerate with the correct scopes\n- PR number doesn't exist in this repo\n- GitHub rate limit — wait or switch to a different account\n- Wrong owner/repo — verify with `aiv config show`\n\n---\n\n### `Review failed: ...`\n\n- API key invalid or expired\n- Model quota exceeded — configure a [fallback chain](#fallback-chain)\n- Diff too large — reduce `max_tokens` in `.aiv/config.yml`:\n\n```yaml\nreview:\n  max_tokens: 10000\n```\n\n---\n\n## Best Practices\n\n### Let AI bootstrap your context and rules\n\nRight after `aiv init`, run:\n\n```bash\naiv context generate\n```\n\nThis produces a `context.md` and `rules.yml` based on what the AI infers from your project structure. Tune what it gets wrong rather than writing from scratch.\n\n### Write specific rules\n\nGeneric rules produce generic findings. The more specific `rules.yml` is, the more precise the business agent becomes:\n\n```yaml\nbusiness_rules:\n  orders:\n    required_calls: [validateInventory, reserveStock]\n    forbidden_patterns: [skipFraudCheck, directInventoryWrite]\n```\n\n### Check your own branch before opening a PR\n\n```bash\naiv check qa       # or whatever branch you're merging into\n```\n\nRunning `aiv check` before opening a PR catches issues that would otherwise land in the reviewer's lap. If the report shows problems, save a checklist to `.aiv/checklist.md`, fix, and run `aiv check` again. Once clean, aiv detects whether the branch needs a push and handles it — you go from analysis to open PR in one step.\n\n### Post the report as a PR comment\n\nAfter reviewing, choose **Post as PR comment** to make the findings visible to the whole team directly in GitHub. The comment is also used as a cache — the next time anyone runs `aiv review` on the same PR, aiv detects it and offers to skip the AI calls.\n\n### Refresh context after structural changes\n\n```bash\naiv context refresh\n```\n\nRun after merging large refactors, adding new modules, or reorganizing the project layout.\n\n### Use a fallback chain for reliability\n\n```bash\naiv config set-fallback openai gemini\n```\n\nIf your primary provider is rate-limited mid-review, aiv switches automatically without losing the run.\n\n### Match model to task\n\nUse a fast/cheap model for straightforward agents and a stronger one for the most critical:\n\n```bash\naiv config set-agent-provider business    claude/claude-haiku-4-5\naiv config set-agent-provider architecture claude/claude-haiku-4-5\naiv config set-agent-provider security    claude/claude-sonnet-4-6\n```\n\n### Use `--agent` to narrow focus\n\n```bash\naiv review 101 --agent security           # dependency bump — only security matters\naiv review 202 --agent business architecture  # domain change\n```\n\nFewer agents = faster, cheaper, more focused output.\n\n### Commit `.aiv/` to the repository\n\nCommitting `config.yml`, `rules.yml`, and `context.md` means every team member gets identical review behavior with no local setup. `aiv init` automatically gitignores only the files that shouldn't be shared:\n\n```\n# added automatically by aiv init\n.aiv/tree.json       # auto-generated snapshot — large, noise in diffs\n.aiv/checklist.md    # personal pre-PR draft — not team-relevant\n```\n\n### CI integration with `--json`\n\n```bash\nSCORE=$(aiv review $PR_NUMBER --json | jq '.riskScore')\nif [ \"$SCORE\" -gt 75 ]; then\n  echo \"High-risk PR — human review required\"\n  exit 1\nfi\n```\n\n### What aiv is not\n\n- Not a linter — it won't flag semicolons or indentation\n- Not a replacement for static analysis (ESLint, SonarQube)\n- Not a style checker\n\nIts value is **semantic understanding**: catching business rule violations, architectural drift, and security risks that automated tools miss because they don't know your project's context, rules, or intent.\n\n---\n\n## Project Structure\n\n```\nsrc/\n  agents/          — business, architecture, security reviewers\n  cli/\n    commands/      — init, prs, review, check, config, context, agents\n    banner.ts      — ASCII welcome banner\n    renderer.ts    — terminal renderer + GitHub comment builder\n    selector.ts    — interactive PR/action picker (inquirer)\n  config/          — two-level config load/save/merge\n  context/\n    builder.ts     — static project analysis\n    generator.ts   — AI-powered context + rules generation\n    manager.ts     — context reader + refreshContextFiles helper\n    tree.ts        — file tree scanner\n  git/             — GitHub REST client, remote detection, local diff builder\n  i18n/            — EN/ES translations (all user-facing strings)\n  orchestrator/    — runs agents in parallel, aggregates results\n  providers/\n    claude.ts      — Anthropic adapter\n    openai.ts      — OpenAI adapter (supports custom baseURL)\n    gemini.ts      — Google Gemini REST adapter\n    fallback.ts    — FallbackProvider (quota/rate pivot)\n    factory.ts     — resolves provider by name or agent role\n    mock.ts        — offline test provider\n  types.ts         — shared TypeScript interfaces\n  index.ts         — CLI entry point\n```\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md"}