
ネイティブOSの資格情報ストア(macOSキーチェーン、Linux Secret Service、Windows Credential Manager)を使用して環境シークレットを管理するためのセキュアなCLIツール
ネイティブOS資格情報ストアを使用した安全な環境シークレット管理。

myapp.dev、stripe-api.prod、work.staging)cmdでコマンドを保存および再実行(検索、一覧表示、実行、削除).envファイルにエクスポート(auditによる生成追跡付き)eval $(envsec env)).envファイルからシークレットを読み込み(競合検出付き)envsec tui)これは以下のパッケージを含むモノレポです:
Node.jsまたはBunからシークレットにプログラムでアクセスするには、@envsec/sdkを使用します:```bash
npm install @envsec/sdk
I need the actual content of chunk 3 to translate it. Please provide the Markdown text you want translated.```typescript
import { loadSecrets } from "@envsec/sdk";
// Load and inject into process.env
await loadSecrets({ context: "myapp.dev", inject: true });
// Or use the client for full control
import { EnvsecClient } from "@envsec/sdk";
const client = await EnvsecClient.create({ context: "myapp.dev" });
const apiKey = await client.get("api.key");
await client.close();
SDKの全API、マルチコンテキスト対応、オプションについては、完全なSDKドキュメントを参照してください。
追加の依存関係は不要です。security CLIツールを介して、組み込みのKeychainを使用します。
libsecret-tools(secret-toolコマンドを提供)が必要です。これは、D-Busを介してGNOME Keyring、KDE Wallet、または任意のSecret Service APIプロバイダーと通信します。```bash
sudo apt install libsecret-tools
sudo dnf install libsecret
sudo pacman -S libsecret
D-Bus セッションが実行中であり、キーリングデーモン(例: `gnome-keyring-daemon`)がアクティブである必要があります。ほとんどのデスクトップ環境では、これが自動的に処理されます。
### Windows
追加の依存関係は不要です。`cmdkey` と PowerShell を介して、組み込みの Windows 資格情報マネージャーを使用します。
## インストール
### Homebrew(macOS / Linux)```bash
brew tap davidnussio/homebrew-tap
brew install envsec
npm install -g envsec
### npx(インストール不要)```bash
npx envsec
mise use -g npm:envsec
## 使用方法
ほとんどのコマンドでは、`--context`(または `-c`)でコンテキストを指定する必要があります。
コンテキストはシークレットをグループ化するための自由形式のラベルです(例: `myapp.dev`、`stripe-api.prod`、`work.staging`)。
### グローバルオプション
以下のオプションはすべてのコマンドで利用できます:
- `--context`, `-c` — コンテキスト名(例: `myapp.dev`、`stripe-api.prod`)。`ENVSEC_CONTEXT` 環境変数も読み取ります
- `--debug`, `-d` — デバッグログを有効化
- `--json` — スクリプト用にJSON形式で出力
- `--db` — SQLiteデータベースファイルへのパス(デフォルト: `~/.envsec/store.sqlite`)。`ENVSEC_DB` 環境変数も読み取ります
### カスタムデータベースパス
デフォルトでは、メタデータは `~/.envsec/store.sqlite` に保存されます。これは `--db` または `ENVSEC_DB` 環境変数で上書きできます:```bash
# Use a project-local database
envsec --db ./local-store.sqlite -c myapp.dev list
# Or via environment variable
export ENVSEC_DB=/shared/team/envsec.sqlite
envsec -c myapp.dev list
--db フラグは ENVSEC_DB よりも優先されます。ユースケースには、プロジェクトごとのデータベース、ネットワークドライブ上のチーム共有データベース、および一時ストレージを使用した CI/CD が含まれます。
シークレットを OS の資格情報ストアに保存します。
<key> — シークレットキー名(例: api.key、db.password)--value、-v — 保存する値(対話型のマスクプロンプトの場合は省略)--expires、-e — 有効期限(例: 30m、2h、7d、4w、3mo、1y)```bashenvsec -c myapp.dev add api.key --value "sk-abc123"
envsec -c myapp.dev add api.key -v "sk-abc123"
envsec -c myapp.dev add api.key
envsec -c myapp.dev add api.key -v "sk-abc123" --expires 30d
envsec -c myapp.dev add api.key -v "sk-abc123" -e 6mo
### シークレットを取得する
OSの資格情報ストアからシークレット値を取得します。
- `<key>` — 取得するシークレットキー名
- `--quiet`、`-q` — 生の値のみを出力します(警告や追加出力なし)
- `--json` — JSON形式で出力します(context、key、value、expires_atを含む)```bash
envsec -c myapp.dev get api.key
# Print only the raw value (no warnings or extra output)
envsec -c myapp.dev get api.key --quiet
envsec -c myapp.dev get api.key -q
OSの資格情報ストアからシークレットを削除します。
<key> — 削除するシークレットキー名(--all を使用する場合は任意)--yes, -y — 確認プロンプトをスキップ--all — コンテキスト内のすべてのシークレットを削除```bash
envsec -c myapp.dev delete api.keyenvsec -c myapp.dev del api.key
### シークレットの名前変更
同じコンテキスト内でシークレットキーの名前を変更します。値と有効期限のメタデータは保持されます。
- `<old-key>` — 現在のシークレットキー名
- `<new-key>` — 新しいシークレットキー名
- `--force`, `-f` — ターゲットが既に存在する場合に上書きします```bash
# Rename a key
envsec -c myapp.dev rename old.key new.key
# Overwrite target if it already exists
envsec -c myapp.dev rename old.key existing.key --force
コンテキスト内のすべてのシークレットキーとメタデータを一覧表示します。
--json — JSON形式で出力```bash
envsec -c myapp.dev list### すべてのコンテキストを一覧表示
シークレット数を含む、利用可能なすべてのコンテキストを一覧表示します。
- `--json` — JSON形式で出力```bash
# Without --context, lists all available contexts with secret counts
envsec list
グロブパターンを使用してシークレットまたはコンテキストを検索します。
<pattern> — 検索するグロブパターン(例: api.*、myapp.*)--json — JSON形式で出力```bashenvsec -c myapp.dev search "api.*"
envsec search "myapp.*"
### コンテキスト間でシークレットを移動する
シークレットをあるコンテキストから別のコンテキストへ移動します。移動後、元のシークレットは削除されます。
- `<pattern>` — 移動するグロブパターンまたは正確なキー(`--all` 使用時は任意)
- `--to`, `-t` — シークレットの移動先コンテキスト
- `--all` — ソースコンテキストからすべてのシークレットを移動
- `--force`, `-f` — ターゲットコンテキスト内の既存シークレットを上書き
- `--yes`, `-y` — 確認プロンプトをスキップ```bash
# Move a single secret
envsec -c myapp.dev move api.token --to myapp.prod
# Move secrets matching a glob pattern
envsec -c myapp.dev move "redis.*" --to myapp.prod -y
# Move all secrets from one context to another
envsec -c myapp.dev move --all --to myapp.prod -y
# Overwrite existing secrets in the target context
envsec -c myapp.dev move "redis.*" --to myapp.prod --force -y
あるコンテキストから別のコンテキストへシークレットをコピーします。コピー元のシークレットはそのまま残ります。
<pattern> — コピーするキーのグロブパターまたは完全一致キー(--all 使用時は任意)--to, -t — シークレットのコピー先コンテキスト--all — コピー元コンテキストからすべてのシークレットをコピー--force, -f — コピー先コンテキストの既存シークレットを上書き--yes, -y — 確認プロンプトをスキップ```bashenvsec -c myapp.dev copy api.token --to myapp.staging
envsec -c myapp.dev copy "redis.*" --to myapp.staging -y
envsec -c myapp.dev copy --all --to myapp.staging -y
envsec -c myapp.dev copy "redis.*" --to myapp.staging --force -y
### シークレットを使用してコマンドを実行する
プレースホルダーによるシークレット値の補間、または環境変数としての注入を行いながらコマンドを実行します。
- `<command>` — 実行するコマンド。シークレットの補間には `{key}` プレースホルダーを使用します
- `--inject`, `-i` — すべてのコンテキストシークレットを環境変数として注入します(`KEY.NAME` → `KEY_NAME`)
- `--save`, `-s` — このコマンドを後で使用するために保存します
- `--name`, `-n` — 保存するコマンドの名前(`--save` と併用時に省略した場合は対話的にプロンプト表示されます)```bash
# Placeholders {key} are resolved with secret values before execution
envsec -c myapp.dev run 'curl {api.url} -H "Authorization: Bearer {api.token}"'
# Any {dotted.key} in the command string is replaced with its value
envsec -c myapp.prod run 'psql {db.connection_string}'
# Inject ALL context secrets as environment variables (KEY.NAME → KEY_NAME)
envsec -c myapp.dev run --inject 'node server.js'
envsec -c myapp.dev run -i 'docker compose up'
# Combine --inject with placeholders
envsec -c myapp.dev run --inject 'curl {api.url} -H "Authorization: Bearer $API_TOKEN"'
# Save the command for later use with --save (-s) and --name (-n)
envsec -c myapp.dev run --save --name deploy 'kubectl apply -f - <<< {k8s.manifest}'
# If you use --save without --name, you'll be prompted interactively
envsec -c myapp.dev run --save 'psql {db.connection_string}'
If any placeholder references a secret that doesn't exist, the command won't execute and you'll see a clear error:``` ❌ Missing secrets in context "myapp.dev":
Add them with: envsec -c myapp.dev add
### 保存済みコマンド
保存済みコマンドは `cmd` サブコマンド配下に置かれ、シークレット操作とは分離されています。
#### cmd list
保存済みのすべてのコマンドを一覧表示します。```bash
envsec cmd list
保存されたコマンドを実行します(保存時に設定されたコンテキストを使用します)。
<name> — 実行する保存済みコマンドの名前--override-context, -o — 実行時に保存されたコンテキストを上書きします--quiet, -q — 情報出力を抑制します(コマンドの出力のみを表示)--inject, -i — すべてのコンテキストシークレットを環境変数として注入します```bash
envsec cmd run deployenvsec cmd run deploy --quiet envsec cmd run deploy -q
envsec cmd run deploy --override-context myapp.prod envsec cmd run deploy -o myapp.prod
envsec cmd run deploy --inject envsec cmd run deploy -i
#### cmd search
保存されたコマンドを名前またはコマンド文字列で検索します。
- `<pattern>` — 検索パターン
- `--name`、`-n` — コマンド名のみを検索
- `--command`、`-m` — コマンド文字列のみを検索```bash
envsec cmd search psql
# Search only by name
envsec cmd search deploy -n
# Search only by command string
envsec cmd search kubectl -m
保存済みのコマンドを削除します。
<name> — 削除するコマンドの名前```bash
envsec cmd delete deploy### .envファイルを生成する
コンテキストからすべてのシークレットを`.env`ファイルにエクスポートします。
- `--output`, `-o` — 出力ファイルパス(デフォルト: `.env`)```bash
# Creates .env with all secrets from the context
envsec -c myapp.dev env-file
# Specify a custom output path
envsec -c myapp.dev env-file --output .env.local
キーは UPPER_SNAKE_CASE に変換されます(例: api.token → API_TOKEN)。
eval やシェルのソース読み込みで使用できるエクスポート文を出力します。
--shell, -s — 対象シェルの構文: bash(デフォルト)、zsh、fish、powershell--unset, -u — エクスポートの代わりに unset/削除コマンドを出力```basheval $(envsec -c myapp.dev env)
envsec -c myapp.dev env --shell fish envsec -c myapp.dev env --shell powershell
eval $(envsec -c myapp.dev env --unset)
envsec -c myapp.dev env --unset --shell fish
サポートされているシェル: `bash`(デフォルト)、`zsh`、`fish`、`powershell`。キーは `UPPER_SNAKE_CASE` に変換されます(例: `api.token` → `API_TOKEN`)。出力はstdoutに送られるため、`eval` にパイプしたり直接ソースしたりできます — ディスクにファイルは書き込まれません。
### シークレットスコープのシェルセッションを開始する
コンテキストからすべてのシークレットを環境変数として注入した対話型サブシェルを起動します。`exit` するとシークレットは消去されます — クリーンアップは不要です。
- `--shell`、`-s` — 起動するシェル(`bash`、`zsh`、`fish`、`powershell`)。デフォルト: 自動検出
- `--no-inherit` — 親環境変数を継承しない
- `--quiet`、`-q` — 起動/終了バナーを抑制する```bash
envsec -c myapp.dev shell
I need the actual content of chunk 53 to translate it. Please provide the Markdown text you want translated.``` ▶ envsec shell — context: myapp.dev (8 secrets loaded) Type 'exit' or press Ctrl+D to leave the session.
(envsec:myapp.dev) ~ $ echo $DATABASE_URL postgres://user:pass@localhost/mydb
(envsec:myapp.dev) ~ $ exit → Exiting envsec shell — secrets cleared.
The `-p` flag is used to specify the port number, and the `-t` flag is used to specify the target IP address. The `-m` flag is used to specify the mode of operation, which can be either `scan` or `exploit`. The `-c` flag is used to specify the command to execute on the target system. The `-l` flag is used to specify the listener IP address for reverse shell connections. The `-r` flag is used to specify the listener port for reverse shell connections. The `-s` flag is used to specify the shell type, which can be either `cmd` or `powershell`. The `-d` flag is used to specify the delay between requests in seconds. The `-v` flag is used to enable verbose output. The `-h` flag is used to display the help menu.```bash
# Force a specific shell
envsec -c myapp.dev shell --shell zsh
# Only envsec secrets in env (no parent variables, except PATH)
envsec -c myapp.dev shell --no-inherit
# Suppress the startup/exit banner
envsec -c myapp.dev shell --quiet
変数 ENVSEC_CONTEXT はセッション内で常に設定されるため、スクリプトやプロンプトのカスタマイズで参照できます。
.env ファイルからシークレットをコンテキストにインポートします。
--input, -i — 入力 .env ファイルのパス(デフォルト: .env)--force, -f — プロンプトを表示せずに既存のシークレットを上書き--batch, -b — バッチモード: すべてのシークレットがインポートされるまでデータベースへの永続化を延期```bashenvsec -c myapp.dev load
envsec -c myapp.dev load --input .env.local
envsec -c myapp.dev load --force
キーは`UPPER_SNAKE_CASE`から`dotted.lowercase`(例:`API_TOKEN` → `api.token`)に変換されます。キーが既に存在する場合は、`--force`(`-f`)が指定されない限り、警告とともにスキップされます。
### シークレットの共有(GPG暗号化)
コンテキスト内のすべてのシークレットを、GPGを使用してチームメンバー向けに暗号化します。
- `--encrypt-to` — 暗号化対象のGPG受信者キー(メールアドレス、キーID、またはフィンガープリント)
- `--output`、`-o` — 出力ファイルパス(デフォルト:stdout)。明示的にstdoutを使用する場合は`-`を使用
- `--json` — 暗号化されたペイロード内でJSON形式を使用(デフォルト:`.env`形式)```bash
# Encrypt all secrets from a context for a team member
envsec -c myapp.dev share --encrypt-to [email protected]
# Save encrypted output to a file
envsec -c myapp.dev share --encrypt-to [email protected] -o secrets.enc
# Use JSON format inside the encrypted payload
envsec -c myapp.dev --json share --encrypt-to [email protected] -o secrets.enc
受信者は gpg --decrypt secrets.enc で復号し、その結果を envsec load にパイプできます。デフォルトでは暗号化ペイロードは .env 形式(KEY="value")を使用します。--json を指定すると構造化された JSON オブジェクトを使用します。GPG がインストールされており、受信者の公開鍵があなたのキーリングにある必要があります。
期限切れまたは期限が近いシークレットと、追跡されている .env ファイルのエクスポートを確認します。
--within, -w — この期間内に期限切れになるシークレットを表示します(デフォルト: 30d)。0d を使用すると、すでに期限切れのものだけを表示します--json — JSON 形式で出力します```bashenvsec -c myapp.dev audit
envsec -c myapp.dev audit --within 7d
envsec -c myapp.dev audit --within 0d
envsec audit
envsec -c myapp.dev audit --json
`--expires` 期間を指定して `envsec add` で設定されたシークレットは、メタデータで追跡されます。`audit` コマンドは、すでに期限切れのシークレット、または指定された期間内に期限切れになるシークレットをスキャンします。`get` コマンドと `list` コマンドも、期限切れの警告をインラインで表示します。
`audit` コマンドは、生成された `.env` ファイルも追跡します。`env-file` が使用されるたびに、出力パス、コンテキスト、タイムスタンプが記録されます。監査出力には、これらのファイルを一覧表示する2番目のセクションが含まれます。追跡された `.env` ファイルがディスク上に存在しなくなった場合、audit は自動的にそれをメタデータから削除し、クリーンアップを報告します。
### ランダムなシークレットを生成する
暗号学的に安全なランダムシークレットを生成し、必要に応じて保存します。
- `<key>` — シークレットキー名(オプション。スタンドアロンのパスワード生成時は省略)
- `--length`, `-l` — 生成されるシークレットの長さ(デフォルト: `32`)
- `--prefix`, `-p` — 生成されるシークレットの前に付けるプレフィックス(例: `sk_`)
- `--expires`, `-e` — 有効期限の期間(例: `30m`, `2h`, `7d`, `4w`, `3mo`, `1y`)
- `--alphanumeric`, `-a` — 英数字のみを使用 `[a-zA-Z0-9]`(デフォルト)
- `--special`, `-s` — 一般的な特殊文字を含める `[a-zA-Z0-9!@#$%^&*]`
- `--all-chars`, `-A` — 最大のエントロピーを得るために、すべての印刷可能な ASCII 文字を使用```bash
# Generate and store a 32-char alphanumeric secret
envsec -c myapp.dev secret api.key
# Custom length and prefix
envsec -c myapp.dev secret api.key --prefix "sk_" --length 48
# Character sets:
# --alphanumeric (-a) [a-zA-Z0-9] (default)
# --special (-s) [a-zA-Z0-9] + !@#$%^&*
# --all-chars (-A) all printable ASCII
envsec -c myapp.dev secret db.password --special --length 64
# With expiry
envsec -c myapp.dev secret api.key --prefix "sk_" -l 48 --expires 90d
# Standalone password generator (no store, just print)
envsec secret --length 32
envsec secret --special --length 64 --prefix "pk_"
コンテキストとキーの両方が指定された場合、生成された値は保存され、出力されます。どちらも指定されない場合、生の値が標準出力に送られます。これは、pbcopy、xclip、またはその他のツールへのパイプに便利です。
envsecには、シークレットを対話的に管理するための全画面ターミナルUIが含まれています。コマンドを覚える必要はありません。```bash
envsec tui
envsec -c myapp.dev tui
TUIはメインメニューからアクセスできる8つの画面を提供します:
- **Contexts** — すべてのコンテキストを閲覧し、`s`でアクティブコンテキストを設定、`x`でコンテキストをクリア、シークレット数を表示、コンテキスト全体を削除
- **Secrets** — シークレットをテーブルで一覧表示、値を表示、シークレットの追加または削除
- **Add Secret** — マスク入力とオプションの有効期限を備えた対話型フォーム
- **Search** — シークレットまたはコンテキストを横断するglobパターン検索
- **Saved Commands** — 保存済みコマンドテンプレートの一覧表示、閲覧、削除
- **Audit** — 期限切れ・期限間近のシークレットを確認、追跡された`.env`ファイルのエクスポートをレビュー
- **Import .env** — `.env`ファイルから現在のコンテキストにシークレットを読み込む
- **Export .env** — シークレットを`.env`ファイルにエクスポート(監査用に追跡)
キーボードショートカット:
| キー | アクション |
|-----|--------|
| `↑` / `↓` | メニュー項目とテーブル行を移動 |
| `Enter` | 選択 / 確定 |
| `c` | コンテキストビューを開く(メインメニュー) |
| `s` | 選択項目をアクティブコンテキストとして設定(コンテキストビュー) |
| `x` | アクティブコンテキストをクリア(コンテキストビュー) |
| `a` | 新しいシークレットを追加(シークレットビュー) |
| `d` | 選択項目を削除 |
| `r` | シークレット値を表示(詳細ビュー) |
| `Esc` | 戻る / キャンセル |
| `q` | TUIを終了 |
### セットアップを診断する
ヘルスチェックを実行して、envsecのインストールを検証します。
- `--json` — スクリプト処理用にJSON形式で出力```bash
# Run all health checks
envsec doctor
# JSON output for scripting
envsec --json doctor
doctor コマンドは、envsec のインストールが正しく機能しているかを検証します。以下の項目をチェックします:
ENVSEC_DB、ENVSEC_CONTEXT)envsec は bash、zsh、fish 向けの動的なタブ補完をサポートしています。補完はコンテキストを認識します: メタデータデータベースにクエリを実行することで、実際のコンテキスト名、シークレットキー、保存済みコマンド名をリアルタイムで提案します。```bash
eval "$(envsec --completions bash)"
eval "$(envsec --completions zsh)"
envsec --completions fish | source
動的に補完されるもの:
- `--context` / `-c` — すべてのコンテキストを一覧表示
- シークレットキー引数 (`get`、`add`、`delete`) — 現在のコンテキストのキーを一覧表示
- `cmd run` / `cmd delete` — 保存済みコマンド名を一覧表示
- `--override-context` / `-o` — `cmd run` のコンテキストを一覧表示
- サブコマンド、フラグ、静的選択肢 (シェルなど) も補完される
## 比較
envsec は、環境シークレットを管理する他のツールとどう違うのでしょうか?
| 機能 | envsec | dotenv / dotenvx | 1Password CLI (`op`) |
|---|---|---|---|
| シークレットの保存先 | OS の資格情報ストア (Keychain、Secret Service、Credential Manager) | ディスク上の `.env` ファイル (dotenvx は暗号化を追加) | 1Password クラウドボールト |
| 保存時の暗号化 | OS に委任 (Keychain、GNOME Keyring、DPAPI) | なし (dotenv) / ファイルごとに ECIES (dotenvx) | 1Password クラウドで AES-256 |
| ディスク上のシークレット | 一切なし — 値は OS の資格情報ストアに直接送られる | 常にあり — `.env` ファイルはデフォルトで平文 | ローカルには一切なし (実行時にクラウドから取得) |
| オフラインアクセス | 完全 — シークレットは OS ストア内にローカル保存 | 完全 — ファイルはローカル | ネットワークが必要 (アプリ内ではキャッシュされたアイテムがオフラインで利用可能) |
| アカウント / サブスクリプション | なし — 無料、オープンソース、サインアップ不要 | 無料 (dotenv) / 無料のオープンソース (dotenvx) | 有料サブスクリプション (個人は月額約 $3 から、ビジネスはユーザーあたり月額約 $8) |
| クロスプラットフォーム | macOS、Linux、Windows | Node.js が動作する任意のプラットフォーム / 任意のランタイム (dotenvx) | macOS、Linux、Windows |
| コンテキスト / 環境の整理 | コンテキスト (例: `myapp.dev`、`stripe.prod`) | 環境ごとに個別の `.env` ファイル | ボールトとアイテム |
| シークレット付きでコマンドを実行 | `envsec run` — プレースホルダー補間 + `--inject` 環境変数 | `dotenvx run -- cmd` — 暗号化された `.env` から注入 | `op run -- cmd` — シークレット参照経由で注入 |
| `.env` ファイルへのエクスポート | `envsec env-file` (監査用に追跡) | ネイティブ形式 — `.env` ファイルが信頼できる情報源 | `op inject --out-file` |
| `.env` ファイルからのインポート | `envsec load` (競合検出付き) | 該当なし — `.env` がプライマリストア | 手動でのアイテム作成 |
| シェル環境変数のエクスポート | `eval $(envsec env)` — bash、zsh、fish、powershell | `dotenvx run` または `node -r dotenv/config` | `op run --env-file` |
| 対話型シェルセッション | `envsec shell` — 自動クリーンアップ付きのスコープ付きサブシェル | 組み込みなし | 組み込みなし |
| シークレット検索 | キーとコンテキストに対するグロブパターン | 組み込みなし | `op item list --tags/--category` フィルタリング |
| 有効期限 / ローテーション監査 | `envsec audit` — 期限切れ、期限間近、追跡中の `.env` ファイル | 組み込みなし | Watchtower (アプリ内、CLI ではない) |
| 保存済みコマンド | `envsec cmd` — 保存、一覧表示、検索、実行、削除 | 組み込みなし | 組み込みなし |
| シークレットの移動 / コピー | コンテキスト間で `envsec move` と `envsec copy` | 手動でのファイルコピー | ボールト間で `op item move` |
| シークレットの名前変更 | `envsec rename` (値とメタデータを保持) | `.env` ファイルの手動編集 | `op item edit` |
| GPG 暗号化共有 | `envsec share --encrypt-to` | git にコミットされた暗号化 `.env` ファイル (dotenvx) | 組み込みのボールト共有、チームプロビジョニング |
| 対話型 TUI | `envsec tui` — 全画面ターミナル UI | 組み込みなし | 組み込みなし |
| ヘルス診断 | `envsec doctor` — プラットフォーム、キーチェーン、DB 整合性をチェック | 組み込みなし | 組み込みなし |
| シェル補完 | bash、zsh、fish 向けの動的補完 (コンテキスト、キー、コマンド) | 組み込みなし | bash、zsh、fish、powershell 向けの静的補完 |
| SDK / プログラムによるアクセス | Node.js / Bun 向け `@envsec/sdk` | `require('dotenv').config()` — コアユースケース | 1Password SDK (Node.js、Python、Go など) |
| チーム / 複数ユーザー | GPG 共有 (手動) | 暗号化された `.env` による git ベースの共有 (dotenvx) | 組み込みのチーム管理、RBAC、監査ログ |
<!-- | CI/CD 統合 | 標準 CLI — Node.js が動作する場所ならどこでも動作 | 任意の CI パイプラインで `dotenvx run` | サービスアカウント、ネイティブ CI/CD 統合 | -->
| 生体認証 | OS の生体認証を継承 (例: macOS Keychain のロック解除) | なし | アプリ統合による Fingerprint / Touch ID |
| メタデータ追跡 | SQLite (キー名、タイムスタンプ — 値は一切保存しない) | なし | クラウドベースのアイテム履歴と監査ログ |
要するに: dotenv は最もシンプルなアプローチ (ディスク上のファイル)、1Password CLI はクラウド同期と RBAC を備えたチーム向けの最も機能豊富なツール、そして envsec はその中間に位置します — アカウント不要、クラウド依存ゼロの OS ネイティブ暗号化と、`.env` ファイルでは実現できない開発者向けワークフローを提供します。
## 仕組み
シークレットは OS ネイティブの資格情報ストアに保存されます。バックエンドはプラットフォームに基づいて自動的に選択されます:
| OS | バックエンド | ツール / API |
|---------|--------------------------------|-------------------------------------|
| macOS | Keychain | `security` CLI |
| Linux | Secret Service API (D-Bus) | `secret-tool` (libsecret) |
| Windows | Credential Manager | `cmdkey` + PowerShell (advapi32) |
メタデータ (キー名、タイムスタンプ) は `~/.envsec/store.sqlite` の SQLite データベースに保持されます (`--db` または `ENVSEC_DB` で設定可能)。キーには少なくとも 1 つのドット区切り文字が含まれている必要があります (例: `service.account`)。これは資格情報ストアのサービス/アカウント構造にマッピングされます。
## セキュリティ
envsec は単純な原則に基づいて構築されています: シークレットは dotfiles ではなく OS に属するべきです。すべての設計上の決定はその基盤から始まります。
### envsec がシークレットを保護する方法
**OS ネイティブの暗号化、独自の暗号化はゼロ。** シークレット値は macOS Keychain、GNOME Keyring / KDE Wallet、または Windows Credential Manager に直接保存されます。envsec は独自の暗号化を考案することはありません — オペレーティングシステムがすでに提供している実戦テスト済みの資格情報ストアに委任し、ユーザーセッションと (macOS では) ログインキーチェーンによって保護されます。
**完全な Unicode サポート。** シークレット値には絵文字やアクセント付き文字を含む任意の Unicode 文字を含めることができます。値は OS 資格情報ストアに保存される前に base64 エンコードされ、プラットフォーム固有のエンコーディングの問題 (例: macOS `security` CLI が非 ASCII 出力を hex エンコードする) を回避します。レガシーの平文シークレットは後方互換性のために透過的に読み取られます。
**シークレットが平文でディスクに触れることはありません。** 値はターミナルから OS 資格情報ストアに直接送られます。設定ファイル、ログ、中間ストレージに書き込まれることは決してありません。
**ターミナル出力にシークレットは含まれません。** `list` および `search` コマンドはキー名のみを表示します — 値が出力されることは決してありません。これにより、シークレットがスクロールバックバッファ、画面録画、肩越し覗きの範囲から保護されます。
**安全なコマンド実行。** `run` コマンドは、コマンド文字列に補間するのではなく、シークレットを子プロセスの環境変数として注入します。これにより、シークレット値が `ps` 出力やシェル履歴に表示されることはありません。参照されたシークレットが 1 つでも欠落している場合、コマンドは完全にブロックされます — 不完全な資格情報での部分実行は行われません。
**入力検証とインジェクション防止。** コンテキスト名は厳格な許可リスト (英数字、ドット、ハイフン、アンダースコア) に対して検証され、パストラバーサルとプロトタイプ汚染チェックが行われます。すべての SQLite クエリはバインドパラメータ付きのプリペアドステートメントを使用し、SQL インジェクションを防止します。Windows の PowerShell 引数はコマンドインジェクションを防ぐためにエスケープされます。
**制限的なファイル権限。** メタデータディレクトリ (`~/.envsec/`) は `0700` 権限で作成され、SQLite データベースは `0600` 権限で作成され、所有ユーザーのみにアクセスが制限されます。
### 既知の制限と改善領域
envsec がまだカバーしていない点について率直に説明したいと考えています。これらはバグではなく実際のトレードオフであり、理解することで情報に基づいた意思決定が可能になります。
**メタデータは表示可能です。** `~/.envsec/store.sqlite` の SQLite データベースには、キー名、コンテキスト名、タイムスタンプが保存されます — シークレット値は決して保存されませんが、*どのような*シークレットが存在するかを明らかにするには十分です。保存済みコマンドテンプレート (`{key}` プレースホルダー付き) もそこに保存されます。メタデータの機密性が重要な場合は、ホームディレクトリが暗号化ボリューム上にあることを確認してください。
**`env-file` エクスポートは平文です。** `env-file` コマンドはシークレット値をディスク上の `.env` ファイルに書き込みます。これは本質的に機密性が高いものです — 出力ファイルを適切に扱い、バージョン管理にコミットしないでください。これはストレージメカニズムではなく、利便性のためのブリッジと考えてください。
**シェル実行には固有のリスクがあります。** `run` コマンドはコマンドテンプレートを `/bin/sh` (Windows では `cmd.exe`) に渡します。テンプレート自体が信頼できない入力から来た場合、シェルインジェクションが発生する可能性があります。自分で作成した、または信頼するコマンドテンプレートのみを実行してください。
**クロスコンテキストのアクセス制御はありません。** OS ユーザーとして実行されているプロセスは、すべてのコンテキストのすべてのシークレットを読み取ることができます。envsec は OS レベルのユーザー分離に依存しており、コンテキスト間に独自の認可レイヤーを追加しません。
**Linux ヘッドレス環境。** Linux では、envsec はアクティブな D-Bus セッションとキーリングデーモン (例: `gnome-keyring-daemon`) に依存します。グラフィカルセッションのないコンテナやヘッドレスサーバーでは、キーリングが利用できないか、シークレットがより弱い保護で保存される可能性があります。
**暗号化は OS に依存します。** envsec は、ネイティブの資格情報ストアが提供するもの以外の追加の保存時暗号化を追加しません。フルディスク暗号化のないシステムでは、物理アクセスを持つ攻撃者がキーチェーンからシークレットを抽出できる可能性があります。最強の保護のために、フルディスク暗号化 (FileVault、LUKS、BitLocker) を有効にすることをお勧めします。
## 開発
### 前提条件
- Node.js >= 22
- pnpm
コア、SDK、CLI、TUI パッケージは Effect 4 を使用しており、現在 `4.0.0-rc.112` に固定されています。Effect 4 がリリース候補の状態にある間、ワークスペース全体で Effect と `@effect/platform-node` のバージョンを揃えてください。
### セットアップ```bash
git clone https://github.com/davidnussio/envsec.git
cd envsec
pnpm install
pnpm run build
packages/
cli/ → envsec CLI (published as envsec)
sdk/ → Node.js/Bun SDK (published as @envsec/sdk)
core/ → Core engine, shared by CLI and SDK (published as @envsec/core)
tui/ → Interactive terminal UI (published as @envsec/tui)
apps/
website/ → Documentation website
### 一般的なコマンド```bash
# Build all packages
pnpm run build
# Lint and format check (all packages)
pnpm run check
# Auto-fix lint and formatting
pnpm run fix
# Run package unit and contract tests
pnpm run test:unit
# Run the CLI end-to-end suite with isolated database and credential fixtures
pnpm --filter envsec test
# Release (build + changeset publish)
pnpm run release
The isolated E2E suite never accesses the native credential store. To exercise
the real OS adapter on macOS or Linux, build first and opt in explicitly:```bash
ENVSEC_E2E_CLI="$PWD/packages/cli/dist/main.js"
ENVSEC_E2E_ISOLATED=0
pnpm --filter envsec test
Native E2Eテストは専用の`test.e2e*`コンテキストを使用し、その後それらを削除します。
### インストールせずにローカルで実行する
ローカルビルドをグローバルにインストールされたかのように使用するための一時的なエイリアスを作成します:```bash
# Bash / Zsh
alias envsec="node $(pwd)/packages/cli/dist/main.js"
# Fish
alias envsec "node (pwd)/packages/cli/dist/main.js"
ビルドとエイリアスの設定後、現在のセッションで補完を読み込みます:```bash
alias envsec="node $(pwd)/packages/cli/dist/main.js" eval "$(envsec --completions bash)"
alias envsec="node $(pwd)/packages/cli/dist/main.js" eval "$(envsec --completions zsh)"
alias envsec "node (pwd)/packages/cli/dist/main.js" envsec --completions fish | source
Then press TAB after `envsec -c ` to see your contexts, or after `envsec -c myapp.dev get ` to see secret keys.
### Running tests
End-to-end integration tests cover the full CLI lifecycle (add, get, list, search, env-file, load, delete, run, cmd, audit, share, completions).```bash
# Build first
pnpm run build
# macOS / Linux
bash packages/cli/test/e2e-test.sh
# Windows (PowerShell)
pwsh packages/cli/test/e2e-test.ps1
CIは、GitHub Actionsを介してmainへのプッシュ/PR時に自動的に実行され、macOSとUbuntuではe2e-test.sh、Windowsではe2e-test.ps1を実行します。
MIT
| パッケージ | 説明 | npm |
|---|
envsec | シークレット管理用CLIツール | |
@envsec/sdk | プログラムでシークレットを読み込むためのNode.js / Bun SDK | |
@envsec/core | コアエンジン — OS資格情報ストアアダプター + メタデータDB | |
@envsec/tui | シークレット管理用の対話型ターミナルUI |