{
  "markdown": "<div align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/I4cTime/q-ring/main/assets/social-card-optimized.jpg\" alt=\"q-ring — never paste an API key into .env again\" width=\"100%\" />\n</div>\n\n# q-ring\n\n**OS keychain secrets for AI coding agents, over MCP.**\n\n[![CI](https://img.shields.io/github/actions/workflow/status/I4cTime/q-ring/ci.yml?style=flat-square&label=CI)](https://github.com/I4cTime/q-ring/actions/workflows/ci.yml)\n[![NPM Version](https://img.shields.io/npm/v/@i4ctime/q-ring?style=flat-square&color=0ea5e9)](https://www.npmjs.com/package/@i4ctime/q-ring)\n[![NPM Downloads](https://img.shields.io/npm/dm/@i4ctime/q-ring?style=flat-square&color=0ea5e9&label=downloads)](https://www.npmjs.com/package/@i4ctime/q-ring)\n[![Docs](https://img.shields.io/badge/docs-website-0ea5e9?style=flat-square)](https://qring.i4c.studio/docs)\n[![MCP Tools](https://img.shields.io/badge/MCP_tools-44-0ea5e9?style=flat-square)](https://glama.ai/mcp/servers/I4cTime/q-ring)\n[![Smithery](https://img.shields.io/badge/smithery-i4ctime%2Fq--ring-0ea5e9?style=flat-square)](https://smithery.ai/servers/i4ctime/q-ring)\n[![Cursor Directory](https://img.shields.io/badge/cursor_directory-q--ring-0ea5e9?style=flat-square)](https://cursor.directory/plugins/q-ring)\n[![PulseMCP](https://img.shields.io/badge/pulsemcp-q--ring-0ea5e9?style=flat-square)](https://www.pulsemcp.com/servers/i4ctime-q-ring)\n[![mcpservers.org](https://img.shields.io/badge/mcpservers.org-q--ring-0ea5e9?style=flat-square)](https://mcpservers.org/servers/i4ctime/q-ring)\n[![License](https://img.shields.io/npm/l/@i4ctime/q-ring?style=flat-square&color=0ea5e9)](https://github.com/I4cTime/q-ring/blob/main/LICENSE)\n[![Discord](https://img.shields.io/badge/discord-join%20the%20studio-5865F2?style=flat-square&logo=discord&logoColor=white)](https://discord.gg/5uEApw5uEz)\n[![YouTube](https://img.shields.io/badge/youtube-%40qring__dev-FF0000?style=flat-square&logo=youtube&logoColor=white)](https://www.youtube.com/@qring_dev)\n[![X](https://img.shields.io/badge/follow-%40i4c__studio-000000?style=flat-square&logo=x&logoColor=white)](https://x.com/i4c_studio)\n\n<a href=\"https://glama.ai/mcp/servers/I4cTime/q-ring\">\n  <img src=\"https://glama.ai/mcp/servers/I4cTime/q-ring/badges/card.svg\" alt=\"q-ring MCP server\" width=\"400\" />\n</a>\n\nStop pasting API keys into plain-text `.env` files or wrestling with clunky secret managers. **q-ring** securely anchors your credentials to your OS's native vault (macOS Keychain, Linux Secret Service, Windows Credential Vault) and supercharges them with mechanics from quantum physics.\n\n> 📖 **[View the Official Documentation](https://qring.i4c.studio/docs)** for a complete CLI reference, MCP prompt cookbooks, and architecture details.\n\n### Why q-ring?\n- **Superposition:** Store one key with multiple states (dev/staging/prod) that collapse based on context.\n- **Entanglement:** Link keys across projects so rotating one automatically updates them all.\n- **Tunneling:** Create ephemeral, in-memory secrets that self-destruct after a set time or read count.\n- **Teleportation:** Securely pack and share AES-256-GCM encrypted secret bundles.\n- **Seamless AI Integration:** 44 built-in MCP tools for native use in **Cursor**, **Kiro**, and **Claude Code**.\n\n## 🚀 Installation\n\nq-ring is designed to be installed globally so it's available anywhere in your terminal. Pick your favorite package manager:\n\n```bash\n# pnpm (recommended)\npnpm add -g @i4ctime/q-ring\n\n# npm\nnpm install -g @i4ctime/q-ring\n\n# yarn\nyarn global add @i4ctime/q-ring\n\n# Homebrew (macOS / Linux)\nbrew install i4ctime/tap/qring\n```\n\n### Docker (MCP server)\n\nThe repo ships a `Dockerfile` that builds the MCP server and exposes it through [`mcp-proxy`](https://github.com/punkpeye/mcp-proxy) — useful for hosted MCP deployments (e.g. Glama) or keeping the server off the host entirely:\n\n```bash\ngit clone https://github.com/I4cTime/q-ring.git\ncd q-ring\ndocker build -t qring-mcp .\ndocker run --rm -p 8080:8080 qring-mcp\n```\n\n> Note: inside a container there is no OS keychain (GNOME Keyring / macOS Keychain), so this path is for the MCP protocol surface, ephemeral use, and CI experiments — not for durable local secret storage. For day-to-day use install the CLI natively via one of the package managers above.\n\n## ⚡ Quick Start\n\n```bash\n# 1️⃣ Store a secret (prompts securely if value is omitted)\nqring set OPENAI_API_KEY sk-...\n\n# 2️⃣ Retrieve it anytime\nqring get OPENAI_API_KEY\n\n# 3️⃣ List all keys (values are never shown)\nqring list\n\n# 4️⃣ Generate a cryptographic secret and save it\nqring generate --format api-key --prefix \"sk-\" --save MY_KEY\n\n# 5️⃣ Run a full health scan\nqring health\n\n# Something not working? Diagnose the install (keyring, audit, MCP wiring)\nqring doctor\n\n# Tab completion for your shell\nqring completion zsh > ~/.zsh/completions/_qring   # also: bash, fish\n```\n\n## Quantum Features\n\n### Superposition — One Key, Multiple Environments\n\nA single secret can hold different values for dev, staging, and prod simultaneously. The correct value resolves based on your current context.\n\n```bash\n# Set environment-specific values\nqring set API_KEY \"sk-dev-123\" --env dev\nqring set API_KEY \"sk-stg-456\" --env staging\nqring set API_KEY \"sk-prod-789\" --env prod\n\n# Value resolves based on context\nQRING_ENV=prod qring get API_KEY   # → sk-prod-789\nQRING_ENV=dev  qring get API_KEY   # → sk-dev-123\n\n# Inspect the quantum state\nqring inspect API_KEY\n```\n\n### Wavefunction Collapse — Smart Environment Detection\n\nq-ring auto-detects your environment without explicit flags. Resolution order:\n\n1. `--env` flag\n2. `QRING_ENV` environment variable\n3. `NODE_ENV` environment variable\n4. Git branch heuristics (`main`/`master` → prod, `develop` → dev)\n5. `.q-ring.json` project config\n6. Default environment from the secret\n\n```bash\n# See what environment q-ring detects\nqring env\n\n# Project config (.q-ring.json)\necho '{\"env\": \"staging\", \"branchMap\": {\"release/*\": \"staging\"}}' > .q-ring.json\n```\n\n### Quantum Decay — Secrets with TTL\n\nSecrets can have a time-to-live. Expired secrets are blocked from reads. Stale secrets (75%+ lifetime) trigger warnings.\n\n```bash\n# Set a secret that expires in 1 hour\nqring set SESSION_TOKEN \"tok-...\" --ttl 3600\n\n# Set with explicit expiry\nqring set CERT_KEY \"...\" --expires \"2026-06-01T00:00:00Z\"\n\n# Health check shows decay status\nqring health\n```\n\n### Observer Effect — Audit Everything\n\nEvery secret read, write, and delete is logged with a tamper-evident hash chain. Access patterns are tracked for anomaly detection.\n\n```bash\n# View audit log\nqring audit\nqring audit --key OPENAI_KEY --limit 50\n\n# Detect anomalies (burst access, unusual hours, chain tampering)\nqring audit --anomalies\n\n# Verify audit chain integrity\nqring audit:verify\n\n# Export audit log\nqring audit:export --format json --since 2026-03-01\nqring audit:export --format csv --output audit-report.csv\n```\n\n### Quantum Noise — Secret Generation\n\nGenerate cryptographically strong secrets in common formats.\n\n```bash\nqring generate                          # API key (default)\nqring generate --format password -l 32  # Strong password\nqring generate --format uuid            # UUID v4\nqring generate --format token           # Base64url token\nqring generate --format hex -l 64       # 64-byte hex\nqring generate --format api-key --prefix \"sk-live-\" --save STRIPE_KEY\n```\n\n### Entanglement — Linked Secrets\n\nLink secrets across projects. When you rotate one, all entangled copies update automatically.\n\n```bash\n# Entangle two secrets\nqring entangle API_KEY API_KEY_BACKUP\n\n# Now updating API_KEY also updates API_KEY_BACKUP\nqring set API_KEY \"new-value\"\n\n# Unlink entangled secrets\nqring disentangle API_KEY API_KEY_BACKUP\n```\n\n### Tunneling — Ephemeral Secrets\n\nCreate secrets that exist only in memory. They never touch disk. Optional TTL and max-read self-destruction.\n\n```bash\n# Create an ephemeral secret (returns tunnel ID)\nqring tunnel create \"temporary-token-xyz\" --ttl 300 --max-reads 1\n\n# Read it (self-destructs after this read)\nqring tunnel read tun_abc123\n\n# List active tunnels\nqring tunnel list\n```\n\n### Teleportation — Encrypted Sharing\n\nPack secrets into AES-256-GCM encrypted bundles for secure transfer between machines. Keys are derived with PBKDF2-HMAC-SHA512 (210 000 iterations) from your passphrase; each bundle records its iteration count, so bundles produced by older versions still unpack.\n\n```bash\n# Pack secrets (prompts for passphrase)\nqring teleport pack --keys \"API_KEY,DB_PASS\" > bundle.txt\n\n# On another machine: unpack (prompts for passphrase)\ncat bundle.txt | qring teleport unpack\n\n# Preview without importing\nqring teleport unpack <bundle> --dry-run\n```\n\n### Import — Bulk Secret Ingestion\n\nImport secrets from `.env` files directly into q-ring. Supports standard dotenv syntax including comments, quoted values, and escape sequences. The CLI accepts either a file path or raw content; the `import_dotenv` MCP tool only accepts raw content (it never reads files from disk) so an agent can't coerce it into reading arbitrary local files.\n\n```bash\n# Import all secrets from a .env file\nqring import .env\n\n# Import to project scope, skipping existing keys\nqring import .env --project --skip-existing\n\n# Preview what would be imported\nqring import .env --dry-run\n```\n\n### Selective Export\n\nExport only the secrets you need using key names or tag filters.\n\n```bash\n# Export specific keys\nqring export --keys \"API_KEY,DB_PASS,REDIS_URL\"\n\n# Export by tag\nqring export --tags \"backend\"\n\n# Combine with format\nqring export --keys \"API_KEY,DB_PASS\" --format json\n```\n\n### Secret Search and Filtering\n\nFilter `qring list` output by tag, expiry state, or key pattern.\n\n```bash\n# Filter by tag\nqring list --tag backend\n\n# Show only expired secrets\nqring list --expired\n\n# Show only stale secrets (75%+ decay)\nqring list --stale\n\n# Glob pattern on key name\nqring list --filter \"API_*\"\n\n# Script-friendly existence check (exit 0 if present, 1 if not; decay-aware)\nqring has OPENAI_API_KEY --quiet && echo \"configured\"\n```\n\n### Project Secret Manifest\n\nDeclare required secrets in `.q-ring.json` and validate project readiness with a single command.\n\n```bash\n# Validate project secrets against the manifest\nqring check\n\n# See which secrets are present, missing, expired, or stale\nqring check --project-path /path/to/project\n```\n\n### Env File Sync\n\nGenerate a `.env` file from the project manifest, resolving each key from q-ring with environment-aware superposition collapse.\n\n```bash\n# Generate to stdout\nqring env:generate\n\n# Write to a file\nqring env:generate --output .env\n\n# Force a specific environment\nqring env:generate --env staging --output .env.staging\n```\n\n### Secret References & Least-Privilege Run\n\nA `qring://` reference is a committable pointer to a secret — it goes in your `.env` file instead of the value. `qring run` resolves references and manifest keys at spawn time, injecting **only what the project declares** (unlike `exec`, which injects the whole scope). Output is auto-redacted.\n\n```bash\n# .env — safe to commit: these are references, not values\nDATABASE_URL=qring://project/DATABASE_URL\nOPENAI_API_KEY=qring://global/OPENAI_API_KEY\nSTRIPE_KEY=qring:///STRIPE_KEY            # auto scope: project, then global\nSESSION_TTL=3600                          # plain values pass through\n\n# Run with declared secrets injected (manifest + .env refs)\nqring run -- pnpm dev\n\n# Preview what would be injected, without running\nqring run --dry-run -- pnpm dev\n\n# Pin an environment, use a specific env file, or skip the manifest\nqring run --env prod --env-file .env.prod --no-manifest -- ./deploy.sh\n```\n\nThe key lives in the **path**, never the host (`qring://project/KEY`, not `qring://KEY`) — URL hosts are case-insensitive, and env-var keys are not. Malformed references fail loudly instead of leaking a literal `qring://…` string into the child. A reference pinned to an environment: `qring://project/DATABASE_URL?env=prod`.\n\n### Editor Setup\n\nWire the q-ring MCP server into an editor's MCP config with one command. Merges non-destructively — other servers are preserved, and an existing q-ring entry is only replaced with `--force`.\n\n```bash\nqring setup cursor          # .cursor/mcp.json (project) or --global for ~/.cursor\nqring setup kiro            # .kiro/settings/mcp.json, with read-only autoApprove list\nqring setup claude          # .mcp.json (project scope)\n\n# Preview without writing\nqring setup cursor --dry-run\n```\n\n### Push to Deployment Platforms\n\nPush manifest secrets to GitHub Actions, Vercel, or Cloudflare Workers through each platform's **own authenticated CLI** (`gh` / `vercel` / `wrangler`) — q-ring never holds platform tokens, and values travel over stdin, never argv. Every push is recorded in the audit chain.\n\n```bash\n# Push the .q-ring.json manifest keys to GitHub Actions secrets\nqring push github --repo you/your-app\n\n# Push to Vercel environments\nqring push vercel --vercel-env production,preview\n\n# Push to Cloudflare Workers secrets\nqring push cloudflare\n\n# Explicit keys, preview first\nqring push github --keys DATABASE_URL,API_KEY --dry-run\n```\n\n### Secret Liveness Validation\n\nTest if a secret is actually valid with its target service. q-ring auto-detects the provider from key prefixes (`sk-` → OpenAI, `ghp_` → GitHub, etc.) or accepts an explicit provider name.\n\n```bash\n# Validate a single secret\nqring validate OPENAI_API_KEY\n\n# Force a specific provider\nqring validate SOME_KEY --provider stripe\n\n# Validate all secrets with detectable providers\nqring validate --all\n\n# Only validate manifest-declared secrets\nqring validate --all --manifest\n\n# List available providers\nqring validate --list-providers\n```\n\n**Built-in providers:** OpenAI, Anthropic, OpenRouter, Google AI (Gemini), Groq, Hugging Face, ElevenLabs*, Vercel*, Stripe, GitHub, AWS (format check), Generic HTTP. Keys are only ever sent in headers, never URLs. (*no safe public prefix — select explicitly with `--provider` or the manifest `provider` field.)\n\nOutput:\n\n```\n  ✓ OPENAI_API_KEY   valid    (openai, 342ms)\n  ✗ STRIPE_KEY       invalid  (stripe, 128ms) — API key has been revoked\n  ⚠ AWS_ACCESS_KEY   error    (aws, 10002ms) — network timeout\n  ○ DATABASE_URL     unknown  — no provider detected\n```\n\n### Hooks — Callbacks on Secret Change\n\nRegister webhooks, shell commands, or process signals that fire when secrets are created, updated, or deleted. Supports key matching, glob patterns, tag filtering, and scope constraints.\n\n```bash\n# Run a shell command when a secret changes\nqring hook add --key DB_PASS --exec \"docker restart app\"\n\n# POST to a webhook on any write/delete\nqring hook add --key API_KEY --url \"https://hooks.example.com/rotate\"\n\n# Trigger on all secrets tagged \"backend\"\nqring hook add --tag backend --exec \"pm2 restart all\"\n\n# Signal a process when DB secrets change\nqring hook add --key-pattern \"DB_*\" --signal-target \"node\"\n\n# List all hooks\nqring hook list\n\n# Remove a hook\nqring hook remove <id>\n\n# Enable/disable\nqring hook enable <id>\nqring hook disable <id>\n\n# Dry-run test a hook\nqring hook test <id>\n```\n\nHooks are fire-and-forget: a failing hook never blocks secret operations. The hook registry is stored at `~/.config/q-ring/hooks.json`.\n\n**SSRF protection:** HTTP hook URLs targeting private/loopback IP ranges (`127.0.0.0/8`, `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`, `169.254.0.0/16`, `::1`, `fc00::/7`) are blocked by default. DNS is checked up front *and* re-validated at connect time, so a hostname can't pass the check then rebind to a private address before the socket opens. To allow hooks targeting local services (e.g. during development), set the environment variable `Q_RING_ALLOW_PRIVATE_HOOKS=1`.\n\n### Configurable Rotation\n\nSet a rotation format per secret so the agent auto-rotates with the correct value shape.\n\n```bash\n# Store a secret with rotation format metadata\nqring set STRIPE_KEY \"sk-...\" --rotation-format api-key --rotation-prefix \"sk-\"\n\n# Store a password with password rotation format\nqring set DB_PASS \"...\" --rotation-format password\n```\n\n### Secure Execution & Auto-Redaction\n\nRun commands with secrets securely injected into the environment. All known secret values are automatically redacted from stdout and stderr to prevent leaking into terminal logs or agent transcripts. Exec profiles restrict which commands may be run.\n\n```bash\n# Execute a deployment script with secrets injected\nqring exec -- npm run deploy\n\n# Inject only specific tags\nqring exec --tags backend -- node server.js\n\n# Run with a restricted profile (blocks network tools and interpreters/shells, 30s timeout)\nqring exec --profile restricted -- npm test\n```\n\n### Codebase Secret Scanner\n\nMigrating a legacy codebase? Quickly scan directories for hardcoded credentials using regex heuristics and Shannon entropy analysis.\n\n```bash\n# Scan current directory\nqring scan .\n```\n\nOutput:\n```\n  ✗ src/db/connection.js:12\n    Key:     DB_PASSWORD\n    Entropy: 4.23\n    Context: const DB_PASSWORD = \"...\"\n```\n\n### Composite / Templated Secrets\n\nStore complex connection strings that dynamically resolve other secrets. If `DB_PASS` rotates, `DB_URL` is automatically correct without manual updates.\n\n```bash\nqring set DB_USER \"admin\"\nqring set DB_PASS \"supersecret\"\nqring set DB_URL \"postgres://{{DB_USER}}:{{DB_PASS}}@localhost/mydb\"\n\n# Resolves embedded templates automatically\nqring get DB_URL \n# Output: postgres://admin:supersecret@localhost/mydb\n```\n\n### User Approvals (Zero-Trust Agent)\n\nProtect sensitive production secrets from being read autonomously by the MCP server without explicit user approval. Each approval token is HMAC-verified, scoped, reasoned, and time-limited. The gate applies to bulk reads too — `export_secrets` and `teleport_pack` over MCP skip approval-protected keys that lack a valid grant.\n\n```bash\n# Mark a secret as requiring approval\nqring set PROD_DB_URL \"...\" --requires-approval\n\n# Temporarily grant MCP access for 1 hour with a reason\nqring approve PROD_DB_URL --for 3600 --reason \"deploying v2.0\"\n\n# List all approvals with verification status\nqring approvals\n\n# Revoke an approval\nqring approve PROD_DB_URL --revoke\n```\n\nWhen an agent is blocked on an approval-protected key, q-ring raises a desktop notification (Linux `notify-send`, macOS `osascript`) naming the key and the exact `qring approve` command — throttled per key, disabled with `QRING_NOTIFY=off`.\n\n### Canary Honeytokens\n\nPlant fake credentials that look and read exactly like real ones. Anything that touches one — a compromised MCP server, an over-curious agent, exfiltrated tooling sweeping the ring — gets the fake value back with no tell, while q-ring fires a desktop alert and writes a `canary` event into the tamper-evident audit chain.\n\n```bash\n# Plant a canary shaped like a real AWS access key\nqring canary plant AWS_SECRET_ACCESS_KEY --format aws\n\n# Other shapes: github, openai, anthropic, stripe, generic\nqring canary plant GHP_BACKUP_TOKEN --format github\n\n# See what's been tripped\nqring canary list\nqring audit --action canary\n```\n\nValues are CSPRNG noise in the provider's real token shape (an `aws` canary matches `AKIA[A-Z0-9]{16}`) — plausible enough to be taken, never valid. Alerts are throttled to one per key per 30 seconds; the audit trail records every read.\n\nCanaries are built to stay covert: they carry no identifying description (add an innocuous cover story with `--description` if you like), their flag never appears in MCP tool responses, and trip records are visible only from the operator's terminal — never to agents via MCP audit tools. Bulk `export` and `delete` trip them just like reads, so sweeping the ring or removing the tripwire both ring the bell. Done with one? `qring canary disarm <key>` turns it back into an ordinary secret (`qring set` over a canary warns you first — the flag deliberately survives overwrites so an agent can't launder it away).\n\n### MCP Airlock\n\nRun a third-party MCP server behind q-ring. The airlock sits between your agent host and the wrapped server, spawns it with a **stripped environment** (no inherited API keys — opt back in with `--inherit-env`), and records every tool call that crosses it as a `wrap` event in the audit chain, grouped per session and labeled with the calling client's identity. Tool arguments are never logged — they may contain secrets.\n\n```json\n{\n  \"mcpServers\": {\n    \"some-server\": {\n      \"command\": \"qring\",\n      \"args\": [\"mcp\", \"wrap\", \"--\", \"npx\", \"-y\", \"some-mcp-server\"]\n    }\n  }\n}\n```\n\nTools-only proxy today: `tools/list` and `tools/call` pass through verbatim (pagination, progress notifications, cancellation, and `tools/list_changed` included; long-running tools are governed by the host's own timeout, with a generous airlock ceiling configurable via `QRING_WRAP_TIMEOUT_MS`). A wrapped server's *resources and prompts* are not proxied yet — a resources-heavy server will look tools-only behind the airlock.\n\nBe clear about what the airlock is: env stripping plus a tamper-evident record of every tool call. It is **not a sandbox** — the wrapped process still runs as your user with normal filesystem, network, and OS-keychain access, and tool descriptions/results pass through uninspected. See `docs/threat-model.md` for the honest boundary picture.\n\n### Just-In-Time (JIT) Provisioning\n\nInstead of storing static credentials, configure `q-ring` to dynamically generate short-lived tokens on the fly when requested (e.g. AWS STS, generic HTTP endpoints).\n\n```bash\n# Store the STS role configuration\nqring set AWS_TEMP_KEYS '{\"roleArn\":\"arn:aws:iam::123:role/AgentRole\", \"durationSeconds\":3600}' --jit-provider aws-sts\n\n# Resolving the secret automatically assumes the role and caches the temporary token\nqring get AWS_TEMP_KEYS\n```\n\n### Project Context for AI Agents\n\nA safe, redacted overview of the project's secrets, configuration, and state. Designed to be fed into an AI agent's system prompt without ever exposing secret values.\n\n```bash\n# Human-readable summary\nqring context\n\n# JSON output (for MCP / programmatic use)\nqring context --json\n```\n\n### Secret-Aware Linter\n\nScan specific files for hardcoded secrets with optional auto-fix. When `--fix` is used, detected secrets are replaced with `process.env.KEY` references and stored in q-ring.\n\n```bash\n# Lint files for hardcoded secrets\nqring lint src/config.ts src/db.ts\n\n# Auto-fix: replace hardcoded values and store in q-ring\nqring lint src/config.ts --fix\n\n# Scan entire directory with auto-fix\nqring scan . --fix\n```\n\n### Agent Memory\n\nEncrypted, persistent key-value store that survives across AI agent sessions. Useful for remembering rotation history, project decisions, or context.\n\n```bash\n# Store a memory\nqring remember last_rotation \"Rotated STRIPE_KEY on 2026-03-21\"\n\n# Retrieve it\nqring recall last_rotation\n\n# List all memories\nqring recall\n\n# Forget\nqring forget last_rotation\n```\n\n### Pre-Commit Secret Scanning\n\nInstall a git pre-commit hook that automatically blocks commits containing hardcoded secrets.\n\n```bash\n# Install the hook\nqring hook:install\n\n# Uninstall\nqring hook:uninstall\n```\n\n### Secret Analytics\n\nAnalyze usage patterns and get optimization suggestions for your secrets.\n\n```bash\nqring analyze\n```\n\nOutput includes most accessed secrets, unused/stale secrets, scope optimization suggestions, and rotation recommendations.\n\n### Service Setup Wizard\n\nQuickly set up a new service integration with secrets, manifest entries, and hooks in one command.\n\n```bash\n# Create secrets for a new Stripe integration\nqring wizard stripe --keys STRIPE_KEY,STRIPE_SECRET --provider stripe --tags payment\n\n# With a hook to restart the app on change\nqring wizard myservice --hook-exec \"pm2 restart app\"\n```\n\n### Governance Policy\n\nDefine project-level governance rules in `.q-ring.json` to control which MCP tools can be used, which keys are accessible, and which commands can be executed. Policy is enforced at both the MCP server and keyring level.\n\nOver MCP, policy is resolved from the directory the server was **launched** in — not from the `projectPath` a caller passes — so an agent can't sidestep restrictions by pointing at a directory with no policy. Launch the MCP server from your project root (where `.q-ring.json` lives). Edits to `.q-ring.json` are picked up automatically (the policy cache invalidates on file change), so you don't need to restart the server.\n\nPolicy files are schema-validated and **fail closed**: an invalid `policy` object (say, a typo like `denytools`) raises a `PolicyConfigError` instead of being silently ignored, so a malformed rule can never widen access.\n\n```bash\n# View the active policy\nqring policy\n\n# JSON output\nqring policy --json\n```\n\nExample policy in `.q-ring.json`:\n\n```json\n{\n  \"policy\": {\n    \"mcp\": {\n      \"denyTools\": [\"delete_secret\"],\n      \"deniedKeys\": [\"PROD_DB_PASSWORD\"],\n      \"deniedTags\": [\"production\"]\n    },\n    \"exec\": {\n      \"denyCommands\": [\"curl\", \"wget\", \"ssh\"],\n      \"maxRuntimeSeconds\": 30\n    },\n    \"secrets\": {\n      \"requireApprovalForTags\": [\"production\"],\n      \"maxTtlSeconds\": 86400\n    }\n  }\n}\n```\n\n### Exec Profiles\n\nRestrict command execution with named profiles that control allowed commands, network access, timeouts, and environment sanitization.\n\n```bash\n# Run with the \"restricted\" profile (blocks network tools and interpreters/shells; 30s timeout)\nqring exec --profile restricted -- npm test\n\n# Run with the \"ci\" profile (5min timeout, allows network)\nqring exec --profile ci -- npm run deploy\n\n# Default: unrestricted\nqring exec -- echo \"hello\"\n```\n\n**Built-in profiles:** `unrestricted`, `restricted` (denies network tools *and* interpreters/shells — `python -c`, `node -e`, `bash` and friends can't exfiltrate injected secrets; 30s limit), `ci` (5min limit, blocks destructive commands).\n\n### Tamper-Evident Audit\n\nEvery audit event includes a SHA-256 hash of the previous event, creating a tamper-evident chain. Since v0.14 the chain is also anchored with a keyed HMAC stored in the OS keyring, so `qring audit:verify` detects truncation and whole-file rewrites — not just in-place edits. Verify integrity and export logs in multiple formats. Events from MCP sessions are additionally stamped with the connecting client's self-reported identity (`clientInfo` name@version) — shown in `qring audit` output and filterable with `qring audit --agent <label>`. It's an audit label for \"which agent did this\", never an authorization boundary, since clients choose what to report.\n\n```bash\n# Verify the entire audit chain\nqring audit:verify\n\n# Export as JSON\nqring audit:export --format json --since 2026-03-01\n\n# Export as CSV\nqring audit:export --format csv --output audit-report.csv\n```\n\n### Encrypted File Backend (Headless / CI)\n\nHosts with no OS keyring at all (headless Linux, containers, CI) can opt into an encrypted file store. Everything — secrets, the audit anchor, the agent-memory key — routes through it.\n\n```bash\nexport QRING_BACKEND=file\nexport QRING_FILE_PASSPHRASE=\"a strong passphrase\"   # required — no passphrase, no access\nqring set CI_TOKEN\n```\n\nThe store is AES-256-GCM at `~/.config/q-ring/file-backend.enc` (mode `0600`, path override via `QRING_FILE_BACKEND_PATH`), keyed by PBKDF2 from the passphrase. It is **explicit-only**: a missing OS keyring never falls back to it silently, and without the passphrase every operation fails closed — q-ring never encrypts under a machine-derivable key.\n\n### Team & Org Scopes\n\nExtend beyond `global` and `project` scopes with `team` and `org` scopes for shared secrets across groups. Resolution order: project → team → org → global (most specific wins).\n\n```bash\n# Store a secret in team scope\nqring set SHARED_API_KEY \"sk-...\" --team my-team\n\n# Store in org scope\nqring set ORG_LICENSE \"lic-...\" --org acme-corp\n\n# Resolution cascades: project > team > org > global\nqring get API_KEY --team my-team --org acme-corp\n```\n\n### Issuer-Native Rotation\n\nAttempt provider-native secret rotation (for providers that support it) or fall back to local generation.\n\n```bash\n# Rotate via the detected provider\nqring rotate STRIPE_KEY\n\n# Force a specific provider\nqring rotate API_KEY --provider openai\n```\n\n### CI Secret Validation\n\nBatch-validate all secrets against their providers in a CI-friendly mode. Returns a structured pass/fail report with exit code 1 on failure.\n\n```bash\n# Validate all secrets (CI mode)\nqring ci:validate\n\n# JSON output for pipeline parsing\nqring ci:validate --json\n```\n\n### Agent Mode — Autonomous Monitoring\n\nA background daemon that continuously monitors secret health, detects anomalies, and optionally auto-rotates expired secrets.\n\n```bash\n# Start the agent\nqring agent --interval 60 --verbose\n\n# With auto-rotation of expired secrets\nqring agent --auto-rotate\n\n# Single scan (for CI/cron)\nqring agent --once\n```\n\n### Quantum Status Dashboard — Live Monitoring\n\nLaunch a real-time dashboard in your browser that turns the entire quantum subsystem into one glanceable page. It's a single self-contained HTML page served locally — no cloud, no config, fully offline — built as a Preact + htm app (runtime bundled and inlined). It streams updates every 5 seconds via Server-Sent Events and diffs the DOM in place, so data refreshes without re-running entrance animations and your search input, caret, and scroll position are preserved across ticks.\n\nWhat you get:\n\n- **KPI strip** — total secrets, detected environment, protected count, active approvals, hooks, 24-hour reads, and live anomaly count.\n- **Health summary** — donut chart of healthy / stale / expired / no-decay secrets plus per-scope counts (global / project / team / org).\n- **Environment** — wavefunction collapse details: detected env, source, branch, and any project context.\n- **Manifest** — `.q-ring.json` summary with declared / required / missing / expired / stale keys.\n- **Policy** — at-a-glance view of MCP, exec, and secret policies (allow/deny tools, deny keys/tags, allow/deny commands, approval & rotation requirements).\n- **Secrets table** — searchable, sortable view of every secret (key, scope, env, type, decay, tags, last read), with quick chips for `expired`, `stale`, and `protected` filters. Press `/` to focus the search box.\n- **Quantum cards** — decay timers, superposition states, entanglement pairs, and active quantum tunnels.\n- **Approvals & hooks** — live list of valid (and tampered) approval grants and every registered hook with its match summary.\n- **Agent memory** — count of encrypted memory keys persisted at `~/.config/q-ring/agent-memory.enc`.\n- **Anomaly alerts** — burst reads, off-hours access, tampered audit chain, and other suspicious patterns.\n- **Audit log (24h)** — filterable feed with action chips (`read`/`write`/`delete`/`export`), source chips (`cli`/`mcp`/`hook`/`agent`), and a free-text filter.\n\nTop-bar controls let you **pause** SSE updates (handy while reading the audit feed), **refresh** on demand, or jump to the raw JSON snapshot at `/api/status`. Keyboard shortcuts: `/` focus secrets search · `P` pause · `R` refresh.\n\nThe dashboard binds to `127.0.0.1` only and **never** exposes secret values, but it does surface key names, the audit log, and approval grants — so every route is gated by a random, per-launch token. `qring status` prints (and opens) the full URL including `?token=…`; requests without the token get a `403`. Stop the server to invalidate the token.\n\n```bash\n# Open the dashboard (auto-launches your browser at http://127.0.0.1:9876/?token=…)\nqring status\n\n# Specify a custom port\nqring status --port 4200\n\n# Don't auto-open the browser (copy the printed tokenized URL yourself)\nqring status --no-open\n```\n\n## MCP Server\n\nq-ring includes a full MCP server with 44 tools for AI agent integration.\n\n### Core Tools\n\n| Tool | Description |\n|------|-------------|\n| `get_secret` | Read a secret value (collapses superposition, audits the read) |\n| `list_secrets` | List keys + metadata in scope (values never exposed); filter by tag, expiry, glob |\n| `set_secret` | Create or overwrite a single secret with optional TTL, per-env state, tags, rotation format |\n| `delete_secret` | Permanently remove a secret value (not undoable from q-ring) |\n| `has_secret` | Boolean existence check that respects decay (no audit read) |\n| `export_secrets` | Render multiple secrets as `.env` or JSON for one-off export (skips approval-protected keys without a grant) |\n| `import_dotenv` | Parse `.env` text and bulk-store every key/value pair (accepts raw content only — never reads files) |\n| `check_project` | Compare `.q-ring.json` manifest against the keyring for missing/expired/stale keys |\n| `env_generate` | Render a complete `.env` body from the project manifest, with warnings for gaps |\n\n### Quantum Tools\n\n| Tool | Description |\n|------|-------------|\n| `inspect_secret` | Show metadata for one key (states, decay, entanglement, access count) without revealing the value |\n| `detect_environment` | Resolve which env slug should drive superposition collapse for the current context |\n| `generate_secret` | Generate a CSPRNG-backed value in a chosen format and optionally store it |\n| `entangle_secrets` | Link two keys so future writes/rotations propagate the same value |\n| `disentangle_secrets` | Break the sync link between two keys (does not delete values) |\n\n### Tunneling Tools\n\n| Tool | Description |\n|------|-------------|\n| `tunnel_create` | Stash a value in process memory and return an opaque ID (never touches disk) |\n| `tunnel_read` | Fetch a tunneled value by ID — may self-destruct on read |\n| `tunnel_list` | Enumerate active tunnels with remaining read budget and TTL (IDs only) |\n| `tunnel_destroy` | Immediately remove a tunnel from memory before its TTL/reads run out |\n\n### Teleportation Tools\n\n| Tool | Description |\n|------|-------------|\n| `teleport_pack` | Encrypt selected secrets into a passphrase-protected AES-256-GCM bundle |\n| `teleport_unpack` | Decrypt a teleport bundle and import each secret (with optional dry-run) |\n\n### Validation Tools\n\n| Tool | Description |\n|------|-------------|\n| `validate_secret` | Hit the upstream service (OpenAI/Stripe/GitHub/AWS/HTTP) to confirm a single key is still live |\n| `list_providers` | Enumerate built-in validation providers and their auto-detect prefixes |\n\n### Hook Tools\n\n| Tool | Description |\n|------|-------------|\n| `register_hook` | Register a shell/HTTP/signal side-effect that fires on write/delete/rotate |\n| `list_hooks` | Show every registered hook with match criteria, type, and enabled flag |\n| `remove_hook` | Detach a single hook by ID without touching any secrets |\n\n### Execution & Scanning Tools\n\n| Tool | Description |\n|------|-------------|\n| `exec_with_secrets` | Run a child command with secrets injected as env vars and any leaked values redacted from output |\n| `scan_codebase_for_secrets` | Walk a directory tree and flag hardcoded secrets via regex + entropy heuristics |\n| `lint_files` | Inspect a specific file list for hardcoded secrets with optional auto-fix to `process.env.KEY` |\n\n### AI Agent Tools\n\n| Tool | Description |\n|------|-------------|\n| `get_project_context` | Single redacted snapshot of secrets, env, manifest, hooks, and recent audit activity |\n| `agent_remember` | Persist a non-secret note in encrypted agent memory across sessions |\n| `agent_recall` | Read a memory value, or list every stored key when no key is supplied |\n| `agent_forget` | Permanently delete a key from agent memory |\n| `analyze_secrets` | Usage profile: most-accessed, stale, never-accessed, no-rotation candidates |\n\n### Observer & Health Tools\n\n| Tool | Description |\n|------|-------------|\n| `audit_log` | Query the tamper-evident audit log filtered by key, action, and limit |\n| `detect_anomalies` | Surface burst-read and off-hours findings from audit history |\n| `verify_audit_chain` | Recompute the audit hash chain and report the first break point if tampered |\n| `export_audit` | Export audit events as jsonl, json, or csv for archival/SIEM |\n| `health_check` | Read-only scope sweep: decay/stale/expired counts plus current anomalies |\n| `status_dashboard` | Start a local SSE dashboard with live KPIs, secrets, hooks, and audit feed (returns a token-gated `127.0.0.1` URL) |\n| `agent_scan` | Multi-project health pass with optional `autoRotate` for expired secrets |\n\n### Governance & Policy Tools\n\n| Tool | Description |\n|------|-------------|\n| `check_policy` | Dry-run a tool/key/exec action against `.q-ring.json` policy without performing it |\n| `get_policy_summary` | High-level overview of policy rule counts and approval/rotation requirements |\n| `rotate_secret` | Ask the upstream provider to issue a new credential and store it back in the keyring |\n| `ci_validate_secrets` | Batch-validate every accessible secret in scope and return a structured pass/fail report |\n\n### Cursor / Kiro Configuration\n\nAdd to `.cursor/mcp.json` or `.kiro/mcp.json`:\n\n**If q-ring is installed globally** (e.g. `pnpm add -g @i4ctime/q-ring`):\n\n```json\n{\n  \"mcpServers\": {\n    \"q-ring\": {\n      \"command\": \"qring-mcp\"\n    }\n  }\n}\n```\n\n**If using a local clone:**\n\n```json\n{\n  \"mcpServers\": {\n    \"q-ring\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/q-ring/dist/mcp.js\"]\n    }\n  }\n}\n```\n\n### Claude Code Configuration\n\nAdd to `~/.claude/claude_desktop_config.json`:\n\n**Global install:**\n\n```json\n{\n  \"mcpServers\": {\n    \"q-ring\": {\n      \"command\": \"qring-mcp\"\n    }\n  }\n}\n```\n\n**Local clone:**\n\n```json\n{\n  \"mcpServers\": {\n    \"q-ring\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/q-ring/dist/mcp.js\"]\n    }\n  }\n}\n```\n\n### VS Code Configuration\n\nVS Code speaks MCP natively — add to `.vscode/mcp.json` (note the `servers` key, not `mcpServers`):\n\n```json\n{\n  \"servers\": {\n    \"q-ring\": {\n      \"command\": \"qring-mcp\"\n    }\n  }\n}\n```\n\n`qring setup` does not write this file yet — VS Code is config-only (no first-party plugin bundle).\n\n## Editor Plugins\n\nThe q-ring repo ships three first-party editor packs — each one adds rules/steering, agents, commands, skills, hooks, and the MCP connector to its host editor.\n\n| Plugin | Editor | Highlights |\n|--------|--------|-----------|\n| [`cursor-plugin/`](cursor-plugin/README.md) | [Cursor](https://cursor.com) | 3 rules, 5 skills, 2 agents, 8 slash commands, 3 hooks, MCP autoconnect |\n| [`kiro-plugin/`](kiro-plugin/README.md) | [Kiro](https://kiro.dev) | Official [Power](https://kiro.dev/docs/powers/create/) layout: `POWER.md`, root `mcp.json`, `steering/`, `hooks/`; or flatten with `plugin:sync:kiro` |\n| [`claude-code-plugin/`](claude-code-plugin/README.md) | [Claude Code](https://docs.claude.com/en/docs/claude-code/overview) | `CLAUDE.md` memory, project `.mcp.json`, 2 subagents, 8 slash commands, 5 skills, 3 hook scripts |\n\n### Cursor Plugin\n\nThe **q-ring Cursor Plugin** brings quantum secret management directly into your IDE with rules, skills, agents, commands, hooks, and a built-in MCP connector.\n\n| Component | What it does |\n|-----------|-------------|\n| **3 Rules** | Always-on guidance: never hardcode secrets, use q-ring for all ops, warn about `.env` files |\n| **5 Skills** | Auto-triggered by context: secret management, scanning, rotation, project onboarding, exec-with-secrets |\n| **2 Agents** | `security-auditor` (proactive monitoring) and `secret-ops` (day-to-day assistant) |\n| **8 Commands** | `/qring:scan-secrets`, `/qring:health-check`, `/qring:rotate-expired`, `/qring:setup-project`, `/qring:teleport-secrets`, `/qring:dashboard`, `/qring:exec-safe`, `/qring:analyze` |\n| **3 Hooks** | `afterFileEdit` (lint scan), `sessionStart` (project context), `beforeShellExecution` (`.env` guard) |\n| **MCP Connector** | Auto-connects to `qring-mcp` via stdio — all 44 tools available |\n\nInstall from the Cursor marketplace or see [`cursor-plugin/README.md`](cursor-plugin/README.md) for manual setup.\n\n### Kiro Plugin (Power)\n\nThe [`kiro-plugin/`](kiro-plugin/) directory is a Kiro **Power** per [Create powers](https://kiro.dev/docs/powers/create/): `POWER.md` (metadata, onboarding, steering map), root [`mcp.json`](kiro-plugin/mcp.json) (MCP server must match the server name referenced in the power), and [`steering/`](kiro-plugin/steering/) for workflows. Install from Kiro → **Powers** → **Add power from Local Path** and select `kiro-plugin`, or publish the folder on GitHub and use **Add power from GitHub**.\n\nAlways-on steering blocks hardcoded secrets and routes everything through q-ring; `manual` steering files act as agent personas (`#qring-secret-ops`, `#qring-security-auditor`), skill packs, and slash-style commands (`#qring-cmd-scan-secrets`, etc.). Optional hooks live in `hooks/` for copy into `.kiro/hooks/`.\n\n```bash\n# Alternative: flatten into ~/.kiro (settings + steering + hooks)\npnpm run plugin:sync:kiro\n\n# Or scope to a single project\npnpm run plugin:sync:kiro -- /path/to/your/project/.kiro\n```\n\nSee [`kiro-plugin/README.md`](kiro-plugin/README.md) for the full breakdown.\n\n### Claude Code Plugin\n\nFor [Claude Code](https://docs.claude.com/en/docs/claude-code/overview), q-ring ships a `CLAUDE.md` memory file, a project-scoped `.mcp.json`, two [subagents](https://docs.claude.com/en/docs/claude-code/sub-agents) (`secret-ops`, `security-auditor`), eight [slash commands](https://docs.claude.com/en/docs/claude-code/slash-commands) (`/qring-scan-secrets`, `/qring-health-check`, …), five [skills](https://docs.claude.com/en/docs/claude-code/skills), and three [hooks](https://docs.claude.com/en/docs/claude-code/hooks) (post-edit lint reminder, pre-Bash `.env` guard, session-start context primer).\n\n```bash\n# Install into the current project ($PWD)\npnpm run plugin:sync:claude\n\n# Install agents/commands/skills/hooks at user scope (~/.claude)\npnpm run plugin:sync:claude -- --user\n\n# Or target a specific project\npnpm run plugin:sync:claude -- /path/to/your/project\n```\n\nExisting `CLAUDE.md`, `.mcp.json`, or `.claude/settings.json` files are never silently overwritten — the script writes a `<filename>.qring-template` next to them so you can merge by hand. Pass `--force` to overwrite.\n\nSee [`claude-code-plugin/README.md`](claude-code-plugin/README.md) for the full breakdown.\n\n## Architecture\n\n```\nqring CLI ─────┐\n               ├──▶ Core Engine ──▶ @napi-rs/keyring ──▶ OS Keyring\nMCP Server ────┘       │\n                       ├── Envelope (quantum metadata)\n                       ├── Scope Resolver (global / project / team / org)\n                       ├── Collapse (env detection + branchMap globs)\n                       ├── Observer (tamper-evident audit chain)\n                       ├── Policy (governance-as-code engine)\n                       ├── Noise (secret generation)\n                       ├── Entanglement (cross-secret linking)\n                       ├── Validate (provider-based liveness + rotation)\n                       ├── Hooks (shell/HTTP/signal callbacks)\n                       ├── Import (.env file ingestion)\n                       ├── Exec (profile-restricted injection + redaction)\n                       ├── Scan (codebase entropy heuristics)\n                       ├── Provision (JIT ephemeral credentials)\n                       ├── Approval (HMAC-verified zero-trust tokens)\n                       ├── Context (safe redacted project view)\n                       ├── Linter (secret-aware code scanning)\n                       ├── Memory (encrypted agent persistence)\n                       ├── Tunnel (ephemeral in-memory)\n                       ├── Teleport (encrypted sharing)\n                       ├── Agent (autonomous monitor + rotation)\n                       └── Dashboard (live status via SSE)\n```\n\n## Project Config (`.q-ring.json`)\n\nOptional per-project configuration:\n\n```json\n{\n  \"env\": \"dev\",\n  \"defaultEnv\": \"dev\",\n  \"branchMap\": {\n    \"main\": \"prod\",\n    \"develop\": \"dev\",\n    \"staging\": \"staging\",\n    \"release/*\": \"staging\",\n    \"feature/*\": \"dev\"\n  },\n  \"secrets\": {\n    \"OPENAI_API_KEY\": { \"required\": true, \"description\": \"OpenAI API key\", \"format\": \"api-key\", \"prefix\": \"sk-\", \"provider\": \"openai\" },\n    \"DATABASE_URL\": { \"required\": true, \"description\": \"Postgres connection string\", \"validationUrl\": \"https://api.example.com/health\" },\n    \"SENTRY_DSN\": { \"required\": false, \"description\": \"Sentry error tracking\" }\n  },\n  \"policy\": {\n    \"mcp\": {\n      \"denyTools\": [\"delete_secret\"],\n      \"deniedKeys\": [\"PROD_DB_PASSWORD\"],\n      \"deniedTags\": [\"production\"]\n    },\n    \"exec\": {\n      \"denyCommands\": [\"curl\", \"wget\"],\n      \"maxRuntimeSeconds\": 60\n    }\n  }\n}\n```\n\n- **`branchMap`** supports glob patterns with `*` wildcards (e.g., `release/*` matches `release/v1.0`)\n- **`secrets`** declares the project's required secrets — use `qring check` to validate, `qring env:generate` to produce a `.env` file\n- **`provider`** associates a liveness validation provider with a secret (e.g., `\"openai\"`, `\"stripe\"`, `\"github\"`) — use `qring validate` to test\n- **`validationUrl`** configures the generic HTTP provider's endpoint for custom validation\n- **`policy`** defines governance rules for MCP tool gating, key access restrictions, exec allowlists, and secret lifecycle requirements\n\n## 📚 Docs\n\n- [Quickstart: Claude Code](docs/quickstart-claude-code.md) · [Cursor](docs/quickstart-cursor.md) · [Kiro](docs/quickstart-kiro.md)\n- [Troubleshooting](docs/troubleshooting.md) — keyring backends, MCP connection, approval gate, policy pinning\n- [CLI ↔ MCP parity](docs/cli-mcp-parity.md) — every command mapped to its MCP tool\n- [Releasing](docs/releasing.md) — tag-driven release flow\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide (dev environment, conventions, files to keep in sync). The short version:\n\n- Run **`pnpm run lint`**, **`pnpm run typecheck`**, and **`pnpm run test:ci`** before opening a PR.\n- Tests or sandboxes can point the audit log elsewhere with **`QRING_AUDIT_DIR`** (directory is created if missing); default is `~/.config/q-ring/audit.jsonl`.\n- Optional local pre-commit: **`qring hook:install`** (uses this package’s `precommit` hook when `qring` is on your `PATH`).\n- After changing one of the editor plugins:\n  - **Cursor:** `pnpm run plugin:sync` copies `cursor-plugin/` to `~/.cursor/plugins/local/my-plugin` (or pass a custom path).\n  - **Kiro:** `pnpm run plugin:sync:kiro` copies `kiro-plugin/mcp.json` → `~/.kiro/settings/mcp.json`, plus `steering/` and `hooks/` (or pass a project `.kiro` path). Prefer adding `kiro-plugin/` as a [Power](https://kiro.dev/docs/powers/create/) from the Powers panel instead.\n  - **Claude Code:** `pnpm run plugin:sync:claude` copies `claude-code-plugin/` into the current directory (or pass a project path; add `--user` to install at `~/.claude/`).\n- See also [docs/cli-mcp-parity.md](docs/cli-mcp-parity.md).\n\n## 🔒 Security\n\n- **Local-first.** Core storage is your OS keychain — there is no q-ring cloud and no account. The MCP surface, audit log, and agent memory live on your machine (audit and memory files are written owner-only, `0600`).\n- **Written-down threat model.** What q-ring protects, what it doesn't, and where the residual risk lives — including an honest answer to the agent-exfiltration question — in [docs/threat-model.md](docs/threat-model.md).\n- **Hardened by adversarial review.** v0.14.0 shipped the results of an internal adversarial audit — policy-bypass, approval-scoping, and exec-profile findings all fixed, each with regression tests. Details are in the [CHANGELOG](CHANGELOG.md) `Security` sections (house style since 0.12.0: fix first, then disclose there).\n- **Reporting a vulnerability.** Use [GitHub private vulnerability reporting](https://github.com/I4cTime/q-ring/security/advisories/new) — see [SECURITY.md](SECURITY.md) for the supported-versions table and response commitments (48-hour acknowledgement, 7-day assessment).\n\n## 📜 License\n\n[AGPL-3.0](LICENSE) - Free to use, modify, and share. Any derivative work or hosted service must release its source code under the same license.\n",
  "bytes": 47927,
  "sha": "92738d8ec9d50b2b9e4601dfd9134be0e5060b7688d8b8b49bdacaae0b47e659",
  "repo_slug": "i4ctime/q-ring",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_i4ctime_q_ring_2b83fd1e/readme"
}