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 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
+ ![keymap incident railway, then a dry-run rotate](docs/keymap-demo.svg)
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; also lives at nowhere else
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(", ")}; also lives at ${it.allSinks.filter((s) => !it.exposedAt.includes(s)).join(", ") || "nowhere else"}`);
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");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keymap-cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Values-free map of every secret you run, where it lives, and one command to rotate it everywhere.",
5
5
  "license": "MIT",
6
6
  "author": "Nekruz Kasimov",