{"_id":"@ai-plugins-cc/ai","_rev":"3-709e8d4fc0c6d4df45dcda5f857f7a4b","name":"@ai-plugins-cc/ai","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@ai-plugins-cc/ai","version":"0.1.0","license":"Apache-2.0","_id":"@ai-plugins-cc/ai@0.1.0","maintainers":[{"name":"builtwithlove","email":"norcal.kieran@gmail.com"}],"homepage":"https://github.com/dysfunc/ai-plugins-cc#readme","bugs":{"url":"https://github.com/dysfunc/ai-plugins-cc/issues"},"dist":{"shasum":"d25c03a9bbb1d68b5414da0eb66992b10a4b4e0e","tarball":"https://registry.npmjs.org/@ai-plugins-cc/ai/-/ai-0.1.0.tgz","fileCount":28,"integrity":"sha512-ZcJwyEDylNpBu15lL5bsS/MXIRj+zp+n6OQLLcZlBviUj8cQVoGTP1Q6ndcB5KwK8oWA0l63l6RLiNUWb1QTPA==","signatures":[{"sig":"MEQCIFI5OG8cgTlYoQK2xJZuIUR9mWzeig5dqqej0/kkXy6sAiATzISBixzDxUqqICMD5LZbIe8c3GdKTePlXzvPGG8Afg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105038},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"468b26667f7a9e2d4b0185807d6bb903bf7b99fd","private":false,"scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"builtwithlove","email":"norcal.kieran@gmail.com"},"repository":{"url":"git+https://github.com/dysfunc/ai-plugins-cc.git","type":"git","directory":"plugins/ai"},"_npmVersion":"10.9.7","description":"Umbrella Claude Code plugin: dispatches /ai:review|rescue|gater across codex, gemini, grok and adds /ai:compare for fan-out.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@ai-plugins-cc/core":"*","@ai-plugins-cc/codex-adapter":"*","@ai-plugins-cc/shared-prompts":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ai_0.1.0_1777645366459_0.6952437730202097","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@ai-plugins-cc/ai","version":"0.2.0","license":"Apache-2.0","_id":"@ai-plugins-cc/ai@0.2.0","maintainers":[{"name":"builtwithlove","email":"norcal.kieran@gmail.com"}],"homepage":"https://github.com/dysfunc/ai-plugins-cc#readme","bugs":{"url":"https://github.com/dysfunc/ai-plugins-cc/issues"},"dist":{"shasum":"0f281731c8bd8fed3c3c4627e1601174a7b3acbf","tarball":"https://registry.npmjs.org/@ai-plugins-cc/ai/-/ai-0.2.0.tgz","fileCount":28,"integrity":"sha512-4x0Yj2pI4cY6QEwAIk2ic/A41djfBhmLvhiuGCajJOnsDxgYKZQunffqPkL5uCQFeoOtUcmRuo1s+yGyRf3tfQ==","signatures":[{"sig":"MEYCIQCJRB6uTs+1MNteTPgqx4LEhOvTkpYyYXN/8A8zkIZFlQIhAJLNv1SivLsKoxoaOwJXR6FkHMoS2M8JeEZK6rQf0SNY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110562},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"175fa81430f60cfdf16be083249ace1208df7a70","private":false,"scripts":{"test":"node --test tests/*.test.mjs"},"_npmUser":{"name":"builtwithlove","email":"norcal.kieran@gmail.com"},"repository":{"url":"git+https://github.com/dysfunc/ai-plugins-cc.git","type":"git","directory":"plugins/ai"},"_npmVersion":"10.9.7","description":"Umbrella Claude Code plugin: dispatches /ai:review|rescue|gater across codex, gemini, grok and adds /ai:compare for fan-out.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@ai-plugins-cc/core":"*","@ai-plugins-cc/codex-adapter":"*","@ai-plugins-cc/shared-prompts":"*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ai_0.2.0_1777651128143_0.8134457621275994","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@ai-plugins-cc/ai","version":"0.2.1","private":false,"type":"module","description":"Umbrella Claude Code plugin: dispatches /ai:review|rescue|gater across codex, gemini, grok and adds /ai:compare for fan-out.","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/dysfunc/ai-plugins-cc.git","directory":"plugins/ai"},"homepage":"https://github.com/dysfunc/ai-plugins-cc#readme","bugs":{"url":"https://github.com/dysfunc/ai-plugins-cc/issues"},"publishConfig":{"access":"public"},"engines":{"node":">=20.0.0"},"dependencies":{"@ai-plugins-cc/core":"*","@ai-plugins-cc/codex-adapter":"*","@ai-plugins-cc/shared-prompts":"*"},"scripts":{"test":"node --test tests/*.test.mjs"},"_id":"@ai-plugins-cc/ai@0.2.1","gitHead":"96bb869df351494ada19ffe3391a016df6077d6e","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-efUVN0o3edNu6Ih+GVG/BHPHAYvIHOkUS+kHFrZb7NrEdszmM5MS4thFQtGnXIQkrpzqSPiEH6Q8wiBA5ZaZBg==","shasum":"a279a8b6c5877443e8cf5b354db63d97b707ee6a","tarball":"https://registry.npmjs.org/@ai-plugins-cc/ai/-/ai-0.2.1.tgz","fileCount":28,"unpackedSize":114389,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHLNAO/3ul4f408fwQV9mFMSdEDk37ZjFheuGS5QG9HPAiBtFBEnZ6G+fWT9rU7ldzCQbEwj610CeUJxk6/J+ZyQDA=="}]},"_npmUser":{"name":"builtwithlove","email":"norcal.kieran@gmail.com"},"directories":{},"maintainers":[{"name":"builtwithlove","email":"norcal.kieran@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai_0.2.1_1777658339206_0.9132426494119517"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-01T14:22:46.359Z","modified":"2026-05-01T17:58:59.464Z","0.1.0":"2026-05-01T14:22:46.618Z","0.2.0":"2026-05-01T15:58:48.306Z","0.2.1":"2026-05-01T17:58:59.346Z"},"bugs":{"url":"https://github.com/dysfunc/ai-plugins-cc/issues"},"license":"Apache-2.0","homepage":"https://github.com/dysfunc/ai-plugins-cc#readme","repository":{"type":"git","url":"git+https://github.com/dysfunc/ai-plugins-cc.git","directory":"plugins/ai"},"description":"Umbrella Claude Code plugin: dispatches /ai:review|rescue|gater across codex, gemini, grok and adds /ai:compare for fan-out.","maintainers":[{"name":"builtwithlove","email":"norcal.kieran@gmail.com"}],"readme":"# @ai-plugins-cc/ai\n\nUmbrella Claude Code plugin. Routes `/ai:*` commands to whichever provider you've configured, plus runs side-by-side comparisons with `/ai:compare`.\n\nPer-provider commands (`/codex:*`, `/gemini:*`, `/grok:*`) keep working from their own plugins — different prefixes, no collisions. Install the umbrella when you want one canonical command surface that works regardless of which provider you've set as default; install just a per-provider plugin when you want to commit to one.\n\n## Commands\n\n| Command | What it does |\n|---|---|\n| `/ai:setup` | First-run wizard: pick providers, install missing CLIs, walk through auth, verify each, save settings. |\n| `/ai:settings` | Show or change which providers are enabled, the default, and the `/ai:compare` set. Interactive when called with no args; subcommands also accepted (`enable <id>`, `disable <id>`, `set-default <id>`, `set-compare <ids>`). |\n| `/ai:review [--provider=ID] [...]` | Review the pending change with the configured provider. |\n| `/ai:rescue [--provider=ID] <prompt>` | Hand a substantial coding task to the configured provider's agent. |\n| `/ai:gater [--provider=ID]` | Run an adversarial review at session-stop time and emit `ALLOW:` / `BLOCK:`. |\n| `/ai:compare [--providers=A,B,C] [...]` | Fan the review out to multiple providers in parallel; render a side-by-side report. |\n| `/ai:codex-update [--tag=vX.Y.Z]` | Install or update the pinned upstream `openai/codex-plugin-cc`. Hash-verifies if a SHA is pinned in the codex-adapter. |\n\n## First-run hook\n\nThe umbrella plugin ships a `SessionStart` hook (`scripts/first-run-hook.mjs`) that prints a one-line nudge to stderr if `~/.claude/ai-plugins-cc.json` doesn't exist yet, suggesting `/ai:setup`. It never blocks the session.\n\n## Provider precedence\n\nResolved in this order — first hit wins:\n\n1. `--provider=ID` on the command line.\n2. `<workspace>/.claude-plugin/ai.json` with `{ \"provider\": \"...\", \"compareProviders\": [...] }`.\n3. `~/.claude/ai-plugins-cc.json` (same shape).\n4. `AI_PLUGINS_CC_DEFAULT_PROVIDER` env var.\n5. Default: `gemini`.\n\n`/ai:compare` uses `compareProviders` from the same files, falling back to every registered provider when not set.\n\n## How it dispatches\n\nThe umbrella subprocesses the target provider's companion script and surfaces its output verbatim. In-house providers (gemini, grok) are reached via package resolution — each plugin exposes `@ai-plugins-cc/<provider>/meta` which publishes its `companionPath`. External providers (codex) go through `@ai-plugins-cc/codex-adapter`. The result is a uniform shape: `{ providerId, status, stdout, stderr, signal, error, timedOut, stdoutOverrun }`.\n\n## Tests\n\n```sh\nnpm test --workspace=@ai-plugins-cc/ai\n```\n\n32 tests covering:\n\n- **Config precedence** (9): CLI → workspace → user → env → default; unknown-provider error messages.\n- **In-house dispatch** (4): status capture, stderr surfacing, timeout enforcement, uniform shape.\n- **Compare fan-out** (2): preserves order across mixed success and failure.\n- **Codex-update wiring** (1): adapter resolves through the umbrella's dependency tree.\n- **Settings persistence** (10): atomic writes, registry filtering, default-rollover on disable, ordered enable list, unknown-id rejection.\n- **Subcommand integration** (6): `setup --json` shape, `settings show/enable/disable/set-default` round-trip via subprocess, `verify --provider=ID` exit codes.\n","readmeFilename":"README.md"}