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.
- package/CHANGELOG.md +14 -0
- package/README.md +77 -15
- 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
|
-
|
|
13
|
-
self-hosted [Vaultwarden](https://github.com/dani-garcia/vaultwarden)
|
|
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
|
[](https://www.npmjs.com/package/keyshroud)
|
|
17
|
+
[](https://www.npmjs.com/package/keyshroud)
|
|
16
18
|
[](https://github.com/dinhkarate/keyshroud/actions/workflows/ci.yml)
|
|
17
19
|
[](LICENSE)
|
|
18
20
|
[](package.json)
|
|
19
21
|
|
|
20
|
-
[Quickstart](#quickstart) · [
|
|
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
|
|
40
|
-
|
|
41
|
-
- **
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
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.
|
|
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": "
|
|
41
|
+
"keyshroud": "dist/cli.js"
|
|
33
42
|
},
|
|
34
43
|
"exports": {
|
|
35
44
|
".": {
|