keymap-cli 0.1.4 → 0.1.5
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/README.md +3 -1
- package/dist/cli.js +6 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
A values-free map of every secret you run, where it lives, and one command to rotate it everywhere.
|
|
4
4
|
|
|
5
|
+

|
|
6
|
+
|
|
5
7
|
**It is a map, not a vault.** keymap never stores a secret value. The manifest and its state hold names, locations, timestamps and short salted hashes. Values move only between your existing CLIs (`gh`, `railway`, …) and the host, over stdin or a mode-600 temp file, never through a shell string or on a command line.
|
|
6
8
|
|
|
7
9
|
Built after the OpenCode (Oct 16, 2026) and Railway (Oct 21, 2026) key thefts, when "rotate every variable" met "I don't remember where half of these are used".
|
|
@@ -48,7 +50,7 @@ INCIDENT railway: 4 secrets to rotate, most dangerous first
|
|
|
48
50
|
[2] Database and storage credentials
|
|
49
51
|
DATABASE_URL custom exposed at railway:api; also lives at local:.env
|
|
50
52
|
[4] Package registry credentials
|
|
51
|
-
NPM_TOKEN custom exposed at railway:worker;
|
|
53
|
+
NPM_TOKEN custom exposed at railway:worker; lives nowhere else
|
|
52
54
|
```
|
|
53
55
|
|
|
54
56
|
The order follows Railway's own disclosure guidance: AI keys, cloud and payments, databases, source control, package registries. `--walk` asks for each new value, pushes it everywhere, and ends with the list of anything still exposed.
|
package/dist/cli.js
CHANGED
|
@@ -11150,7 +11150,7 @@ var supportedSinks = Object.keys(registry);
|
|
|
11150
11150
|
var import_yaml = __toESM(require_dist(), 1);
|
|
11151
11151
|
import { readFile as readFile3, writeFile as writeFile4 } from "fs/promises";
|
|
11152
11152
|
var MANIFEST_FILE = "keymap.yaml";
|
|
11153
|
-
var ISSUERS = /* @__PURE__ */ new Set(["openai", "anthropic", "openrouter", "google", "stripe", "supabase", "cloudflare", "custom"]);
|
|
11153
|
+
var ISSUERS = /* @__PURE__ */ new Set(["openai", "anthropic", "openrouter", "google", "stripe", "supabase", "cloudflare", "resend", "telegram", "github", "custom"]);
|
|
11154
11154
|
var SINKS = /* @__PURE__ */ new Set(["local", "github", "railway", "vercel", "fly", "cloudflare", "supabase"]);
|
|
11155
11155
|
var ManifestError = class extends Error {
|
|
11156
11156
|
};
|
|
@@ -11736,6 +11736,10 @@ function tierOf(name, issuer) {
|
|
|
11736
11736
|
if (/(NPM_|PYPI|CARGO_|NUGET|DOCKER|GHCR|REGISTRY)/.test(n)) return 4;
|
|
11737
11737
|
return 5;
|
|
11738
11738
|
}
|
|
11739
|
+
function elsewhere(it) {
|
|
11740
|
+
const rest = it.allSinks.filter((s) => !it.exposedAt.includes(s));
|
|
11741
|
+
return rest.length ? `also lives at ${rest.join(", ")}` : "lives nowhere else";
|
|
11742
|
+
}
|
|
11739
11743
|
function planIncident(manifest, host, filter) {
|
|
11740
11744
|
const items = [];
|
|
11741
11745
|
for (const [name, spec] of Object.entries(manifest.secrets)) {
|
|
@@ -11760,7 +11764,7 @@ function formatPlan(host, items) {
|
|
|
11760
11764
|
lines.push(`[${it.tier}] ${TIER_LABEL[it.tier]}`);
|
|
11761
11765
|
last = it.tier;
|
|
11762
11766
|
}
|
|
11763
|
-
lines.push(` ${it.secret.padEnd(28)} ${it.issuer.padEnd(10)} exposed at ${it.exposedAt.join(", ")};
|
|
11767
|
+
lines.push(` ${it.secret.padEnd(28)} ${it.issuer.padEnd(10)} exposed at ${it.exposedAt.join(", ")}; ${elsewhere(it)}`);
|
|
11764
11768
|
}
|
|
11765
11769
|
lines.push("", "Run `keymap incident <host> --walk` to rotate each one in turn, or `keymap rotate <SECRET>` individually.");
|
|
11766
11770
|
return lines.join("\n");
|