keyshroud 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +77 -15
  3. package/package.json +12 -3
package/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes are documented here. This project follows
4
4
  [Semantic Versioning](https://semver.org/).
5
5
 
6
+ ## [0.5.1] - 2026-10-14
7
+
8
+ ### Added
9
+ - `mcpName` in `package.json` and a `server.json` for the official MCP Registry
10
+ (`io.github.dinhkarate/keyshroud`).
11
+
12
+ ### Fixed
13
+ - `bin` path written as `dist/cli.js` so `npm publish` no longer rewrites it.
14
+
15
+ ### Docs
16
+ - README: supported agents table, use cases, FAQ, demo GIF; Vietnamese,
17
+ Simplified Chinese and Japanese translations; OpenCode v2 setup via
18
+ `opencode mcp add`; `approval_mode` note for non-interactive `codex exec`.
19
+
6
20
  ## [0.5.0] - 2026-10-13
7
21
 
8
22
  First public release, renamed from `pi-vaultwarden` to **keyshroud**.
package/README.md CHANGED
@@ -9,18 +9,24 @@
9
9
 
10
10
  **Your agents use the keys. They never see them.**
11
11
 
12
- Agent-safe secrets for Claude Code, Codex, Cursor, pi and omp — backed by your own
13
- self-hosted [Vaultwarden](https://github.com/dani-garcia/vaultwarden) (or Bitwarden).
12
+ **Keep API keys out of Claude Code, Codex, Cursor, Cline, OpenCode, Gemini CLI, pi and omp** —
13
+ secrets stay in your own self-hosted [Vaultwarden](https://github.com/dani-garcia/vaultwarden)
14
+ (or Bitwarden), and every value is masked before the model reads it.
14
15
 
15
16
  [![npm](https://img.shields.io/npm/v/keyshroud.svg)](https://www.npmjs.com/package/keyshroud)
17
+ [![Downloads](https://img.shields.io/npm/dm/keyshroud.svg)](https://www.npmjs.com/package/keyshroud)
16
18
  [![CI](https://github.com/dinhkarate/keyshroud/actions/workflows/ci.yml/badge.svg)](https://github.com/dinhkarate/keyshroud/actions/workflows/ci.yml)
17
19
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
18
20
  [![Node](https://img.shields.io/node/v/keyshroud.svg)](package.json)
19
21
 
20
- [Quickstart](#quickstart) · [How it works](#how-it-works) · [Claude Code](#claude-code) · [pi / omp](#pi--omp) · [MCP](#any-mcp-client-codex-cursor-claude-desktop) · [Security model](#security-model)
22
+ [🚀 Quickstart](#quickstart) · [🔌 Supported agents](#supported-agents) · [⚙️ How it works](#how-it-works) · [❓ FAQ](#faq) · [🛡️ Security model](#security-model) · [🌐 Website](https://keyshroud.dev)
23
+
24
+ [🇻🇳 Tiếng Việt](i18n/README.vi.md) · [🇨🇳 简体中文](i18n/README.zh-CN.md) · [🇯🇵 日本語](i18n/README.ja-JP.md)
21
25
 
22
26
  </div>
23
27
 
28
+ <p align="center"><img src="assets/demo.gif" alt="Demo: keyshroud masks a GitHub token in command output while the command still uses it, and scan finds a key leaked into a test file" width="860"></p>
29
+
24
30
  ```console
25
31
  $ keyshroud run --mask -- sh -c 'echo "deploying with $GH_TOKEN"; gh api user -q .login'
26
32
  deploying with <redacted:GH_TOKEN>
@@ -31,21 +37,22 @@ The command got the real token. The transcript — and the model reading it —
31
37
  `<redacted:GH_TOKEN>`. (Masking is automatic when an agent runs the command;
32
38
  `--mask` forces it in a human terminal.)
33
39
 
34
- ## Why
40
+ ## Why keyshroud?
35
41
 
36
42
  Coding agents need credentials to do real work: `gh`, `npm publish`, cloud CLIs,
37
43
  webhooks, databases. The usual options are bad:
38
44
 
39
- - **Paste the key into the chat.** It is now in the transcript, the provider's
40
- logs, and every future context window.
41
- - **Put it in `.env`.** The agent reads `.env`, `cat`s it while debugging, or
42
- commits it.
43
- - **Use a paid secrets manager.** Good, but `op run` needs a 1Password
44
- subscription, and most "agent vaults" are hosted SaaS.
45
+ - ❌ **Paste the key into the chat** — now it is in the transcript, the provider's logs, and every future context window
46
+ - ❌ **Put it in `.env`** — the agent `cat`s it while debugging, or commits it
47
+ - ❌ **Pay for a secrets manager** — `op run` needs a 1Password subscription, and most "agent vaults" are hosted SaaS
48
+ - ❌ **Use a vault MCP server** — most of them return the plaintext value straight to the model
49
+
50
+ **keyshroud fixes this:**
45
51
 
46
- keyshroud keeps secrets in a vault you host, hands agents **names and
47
- references**, injects values only into the child processes that need them, and
48
- scrubs every value from tool output before the model sees it.
52
+ - ✅ **Names, not values** — agents see `GH_TOKEN` and `bw://GitHub CLI token`, never the token
53
+ - ✅ **Masked output** — any value that reaches stdout/stderr becomes `<redacted:GH_TOKEN>`
54
+ - ✅ **Your vault** — Vaultwarden on a $5 VPS or a Raspberry Pi, or Bitwarden; no account with us
55
+ - ✅ **Free** — MIT-licensed, no telemetry
49
56
 
50
57
  ## Features
51
58
 
@@ -62,6 +69,32 @@ scrubs every value from tool output before the model sees it.
62
69
  | 🏠 **Self-hosted, free** | Vaultwarden on a $5 VPS or a Raspberry Pi. No SaaS account, no telemetry. |
63
70
  | 🧾 **Audit log** | `audit.jsonl` records which *names* were used, when, by which command. Never values. |
64
71
 
72
+ ## Supported agents
73
+
74
+ | Agent | Install | What you get |
75
+ |---|---|---|
76
+ | **Claude Code** | [plugin](#claude-code) | SessionStart + PostToolUse redaction hooks, MCP tools, skill |
77
+ | **pi / omp** | [`pi install npm:keyshroud`](#pi--omp) | env hydration, `tool_result` redaction (failed calls too), `/secret` |
78
+ | **Codex** | [`codex mcp add keyshroud -- keyshroud mcp`](#any-mcp-client) | MCP tools with masked output |
79
+ | **Cursor, Claude Desktop, Cline, Gemini CLI** | [`mcpServers` JSON](#any-mcp-client) | MCP tools with masked output |
80
+ | **OpenCode** | [`opencode mcp add keyshroud -- keyshroud mcp`](#any-mcp-client) | MCP tools with masked output |
81
+ | **Any shell or CI** | `keyshroud run -- <cmd>` | env injection + masked output |
82
+
83
+ ## Use cases
84
+
85
+ **"Claude Code keeps reading my `.env`."** Move the values into the vault, commit a
86
+ `.env.refs` file with `GH_TOKEN=bw://GitHub CLI token`, and start the agent with
87
+ `keyshroud run -- claude`. The plugin's hooks mask anything that still slips into a tool result.
88
+
89
+ **"I already self-host Vaultwarden."** Point `bw` at it, run `keyshroud doctor`, and you
90
+ are done — keyshroud adds no server of its own.
91
+
92
+ **"I like `op run` but don't want 1Password."** `keyshroud run` is the same idea —
93
+ references in, masked output out — on a vault you host.
94
+
95
+ **"My agent needs to add a new key."** It calls `secrets_request` (MCP) or `/secret` (pi);
96
+ you type the value into a masked prompt in your own terminal. It never enters the chat.
97
+
65
98
  ## Quickstart
66
99
 
67
100
  **Requirements:** Node.js ≥ 22.18, the Bitwarden CLI (`npm i -g @bitwarden/cli`),
@@ -195,13 +228,23 @@ export KEYSHROUD_PLANNER_MODEL=qwen3-4b
195
228
 
196
229
  Without a planner, names are derived from the description and you can edit them.
197
230
 
198
- ## Any MCP client (Codex, Cursor, Claude Desktop)
231
+ ## Any MCP client
232
+
233
+ Codex, Cursor, Claude Desktop, Cline, Gemini CLI and any other client that speaks MCP over stdio:
199
234
 
200
235
  ```json
201
236
  { "mcpServers": { "keyshroud": { "command": "keyshroud", "args": ["mcp"] } } }
202
237
  ```
203
238
 
204
- Codex: `codex mcp add keyshroud -- keyshroud mcp`.
239
+ Codex: `codex mcp add keyshroud -- keyshroud mcp`. Non-interactive `codex exec` refuses MCP calls that need approval; allow keyshroud's tools explicitly:
240
+
241
+ ```toml
242
+ # ~/.codex/config.toml
243
+ [mcp_servers.keyshroud.tools.secrets_run]
244
+ approval_mode = "approve"
245
+ ```
246
+
247
+ OpenCode: `opencode mcp add keyshroud -- keyshroud mcp`.
205
248
 
206
249
  | Tool | Does | Returns |
207
250
  |---|---|---|
@@ -265,6 +308,25 @@ closed (exit `4`) instead of guessing.
265
308
  | `KEYSHROUD_AUDIT` | on | `0` disables `audit.jsonl` |
266
309
  | `KEYSHROUD_PLANNER_URL` / `_MODEL` / `_API_KEY` | unset | optional naming helper for `/secret` |
267
310
 
311
+ ## FAQ
312
+
313
+ **Do I need Vaultwarden?** No. The official Bitwarden cloud works too; keyshroud talks to
314
+ whatever server `bw` is configured for.
315
+
316
+ **Do secrets leave my machine?** Only between `bw` and your vault server. keyshroud has no
317
+ backend and sends no telemetry; values go into the environment of the command you run.
318
+
319
+ **Can the agent still use the key?** Yes. The command gets the real value; only the text
320
+ the model reads is masked.
321
+
322
+ **Is this a sandbox?** No. It stops *accidental* disclosure. A hostile or prompt-injected
323
+ agent can still exfiltrate a value it can use — see the [security model](#security-model).
324
+
325
+ **Why not just `.gitignore` my `.env`?** That stops commits, not reads. Agents read `.env`
326
+ to debug, and whatever they read goes to the model provider.
327
+
328
+ **Does it work on Windows?** Not tested yet. macOS and Linux are supported.
329
+
268
330
  ## Security model
269
331
 
270
332
  keyshroud protects against **accidental disclosure**: secrets ending up in
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "keyshroud",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
+ "mcpName": "io.github.dinhkarate/keyshroud",
4
5
  "description": "Let AI coding agents use your secrets without ever seeing them. Self-hosted Vaultwarden/Bitwarden, masked output, MCP server, Claude Code + pi plugins.",
5
6
  "keywords": [
6
7
  "secrets",
@@ -15,7 +16,15 @@
15
16
  "pi-package",
16
17
  "pi-extension",
17
18
  "dotenv",
18
- "op-run"
19
+ "op-run",
20
+ "codex",
21
+ "cursor",
22
+ "cline",
23
+ "opencode",
24
+ "gemini-cli",
25
+ "api-keys",
26
+ "secrets-management",
27
+ "mcp-server"
19
28
  ],
20
29
  "license": "MIT",
21
30
  "author": "dinhkarate (https://github.com/dinhkarate)",
@@ -29,7 +38,7 @@
29
38
  },
30
39
  "type": "module",
31
40
  "bin": {
32
- "keyshroud": "./dist/cli.js"
41
+ "keyshroud": "dist/cli.js"
33
42
  },
34
43
  "exports": {
35
44
  ".": {