
पर्यावरण रहस्यों को प्रबंधित करने के लिए सुरक्षित CLI उपकरण, जो देशी OS क्रेडेंशियल स्टोर (macOS Keychain, Linux Secret Service, Windows Credential Manager) का उपयोग करता है।
मूल 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
### Title
निम्न कमांड चलाकर इंस्टॉल करें:
`pip install title`
[`होमपेज`](https://github.com/billzorn-oss/title)```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();
सभी API, मल्टी-कॉन्टेक्स्ट समर्थन और विकल्पों के लिए पूर्ण SDK दस्तावेज़ीकरण देखें।
कोई अतिरिक्त निर्भरता नहीं। अंतर्निहित Keychain का उपयोग security CLI टूल के माध्यम से करता है।
इसे 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` env var पढ़ता है
- `--debug`, `-d` — डीबग लॉगिंग सक्षम करें
- `--json` — स्क्रिप्टिंग के लिए JSON प्रारूप में आउटपुट
- `--db` — SQLite डेटाबेस फ़ाइल का पथ (डिफ़ॉल्ट: `~/.envsec/store.sqlite`)। साथ ही `ENVSEC_DB` env var पढ़ता है
### कस्टम डेटाबेस पथ
डिफ़ॉल्ट रूप से, मेटाडेटा `~/.envsec/store.sqlite` पर संग्रहीत किया जाता है। आप इसे `--db` या `ENVSEC_DB` environment variable से ओवरराइड कर सकते हैं:```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 प्रारूप में आउटपुट (संदर्भ, कुंजी, मान, 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}'
यदि कोई प्लेसहोल्डर किसी ऐसे रहस्य को संदर्भित करता है जो मौजूद नहीं है, तो कमांड निष्पादित नहीं होगा और आपको एक स्पष्ट त्रुटि दिखाई देगी:``` ❌ 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
Keys are converted to UPPER_SNAKE_CASE (e.g. api.token → API_TOKEN).
eval या शेल सोर्सिंग के साथ उपयोग के लिए निर्यात कथन आउटपुट करें।
--shell, -s — लक्ष्य शेल सिंटैक्स: bash (डिफ़ॉल्ट), zsh, fish, powershell--unset, -u — निर्यात के बजाय अनसेट/निकालने के कमांड आउटपुट करें```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
Supported shells: `bash` (default), `zsh`, `fish`, `powershell`. Keys are converted to `UPPER_SNAKE_CASE` (e.g. `api.token` → `API_TOKEN`). Output goes to stdout so it can be piped to `eval` or sourced directly — no file is written to disk.
### Start a secrets-scoped शेल सत्र
सभी secrets को संदर्भ से पर्यावरण चर के रूप में इंजेक्ट करके एक इंटरैक्टिव उप-शेल प्रारंभ करें। जब आप `exit` करते हैं, तो secrets गायब हो जाते हैं — कोई सफाई आवश्यक नहीं।
- `--shell`, `-s` — प्रारंभ करने के लिए शेल (`bash`, `zsh`, `fish`, `powershell`). डिफ़ॉल्ट: स्वतः पता लगाएं
- `--no-inherit` — मूल पर्यावरण चर को इनहेरिट न करें
- `--quiet`, `-q` — स्टार्टअप/एक्जिट बैनर को दबाएं```bash
envsec -c myapp.dev shell
---``` ▶ 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.
### कार्य```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
The variable ENVSEC_CONTEXT is always set inside the session, so you can
reference it in scripts or prompt customizations.
किसी .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 प्राप्तकर्ता कुंजी (ईमेल, कुंजी आईडी, या फ़िंगरप्रिंट) जिसके लिए एन्क्रिप्ट करना है
- `--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
Secrets with an `--expires` duration set via `envsec add` are tracked in metadata. The `audit` command scans for secrets that are already expired or will expire within the specified window. The `get` and `list` commands also display expiry warnings inline.
The `audit` command also tracks generated `.env` files. Every time `env-file` is used, the output path, context, and timestamp are recorded. The audit output includes a second section listing these files. If a tracked `.env` file no longer exists on disk, audit automatically removes it from the metadata and reports the cleanup.
### एक यादृच्छिक गुप्त उत्पन्न करें
Generate a cryptographically secure random secret, optionally storing it.
- `<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_"
जब संदर्भ और कुंजी दोनों प्रदान किए जाते हैं, तो उत्पन्न मान संग्रहीत और मुद्रित किया जाता है। बिना किसी के, कच्चा मान stdout पर जाता है — pbcopy, xclip, या अन्य टूल्स में पाइप करने के लिए उपयोगी।
envsec tui
envsec -c myapp.dev tui
TUI मुख्य मेनू से आठ स्क्रीन प्रदान करता है:
- **संदर्भ** — सभी संदर्भ ब्राउज़ करें, `s` से सक्रिय संदर्भ सेट करें, `x` से संदर्भ साफ़ करें, गुप्त गणनाएँ देखें, पूरे संदर्भ हटाएँ
- **गुप्त** — तालिका में गुप्त सूचीबद्ध करें, मान प्रकट करें, गुप्त जोड़ें या हटाएँ
- **गुप्त जोड़ें** — मास्क किए गए इनपुट और वैकल्पिक समाप्ति अवधि के साथ इंटरैक्टिव फॉर्म
- **खोज** — गुप्त या संदर्भों में ग्लोब पैटर्न खोज
- **सहेजे गए कमांड** — सहेजे गए कमांड टेम्पलेट्स को सूचीबद्ध करें, देखें और हटाएँ
- **ऑडिट** — समाप्त/समाप्त होने वाले गुप्त जाँचें, ट्रैक किए गए `.env` फ़ाइल निर्यात की समीक्षा करें
- **आयात .env** — वर्तमान संदर्भ में `.env` फ़ाइल से गुप्त लोड करें
- **निर्यात .env** — गुप्त को `.env` फ़ाइल में निर्यात करें (ऑडिट के लिए ट्रैक किया गया)
कीबोर्ड शॉर्टकट:
| Key | Action |
|-----|--------|
| `↑` / `↓` | मेनू आइटम और तालिका पंक्तियों पर नेविगेट करें |
| `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
The 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 क्रेडेंशियल स्टोर (कीचेन, सीक्रेट सर्विस, क्रेडेंशियल मैनेजर) | डिस्क पर `.env` फ़ाइलें (dotenvx एन्क्रिप्शन जोड़ता है) | 1Password क्लाउड वॉल्ट |
| आराम के समय एन्क्रिप्शन | OS को सौंपा गया (कीचेन, GNOME कीरिंग, 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` (संघर्ष का पता लगाने के साथ) | N/A — `.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` फ़ाइलें | बिल्ट-इन नहीं | वॉचटावर (ऐप में, 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` (dotenvx) के साथ Git-आधारित साझाकरण | बिल्ट-इन टीम प्रबंधन, RBAC, ऑडिट लॉग |
<!-- | CI/CD एकीकरण | मानक CLI — जहाँ भी Node.js चलता है वहाँ काम करता है | किसी भी CI पाइपलाइन में `dotenvx run` | सेवा खाते, मूल CI/CD एकीकरण | -->
| बायोमेट्रिक प्रमाणीकरण | OS बायोमेट्रिक्स को इनहेरिट करता है (जैसे macOS कीचेन अनलॉक) | कोई नहीं | ऐप एकीकरण के माध्यम से फ़िंगरप्रिंट / Touch ID |
| मेटाडेटा ट्रैकिंग | SQLite (कुंजी नाम, टाइमस्टैम्प — कभी मान नहीं) | कोई नहीं | क्लाउड-आधारित आइटम इतिहास और ऑडिट लॉग |
संक्षेप में: dotenv सबसे सरल दृष्टिकोण है (डिस्क पर फ़ाइलें), 1Password CLI क्लाउड सिंक और RBAC वाली टीमों के लिए सबसे अधिक सुविधा-संपन्न है, और envsec बीच में आता है — शून्य खातों, शून्य क्लाउड निर्भरता और एक डेवलपर-केंद्रित वर्कफ़्लो के साथ OS-मूल एन्क्रिप्शन प्रदान करता है जो `.env` फ़ाइलों की क्षमता से परे है।
## यह कैसे काम करता है
गुप्त जानकारी मूल OS क्रेडेंशियल स्टोर में संग्रहीत की जाती है। बैकएंड प्लेटफ़ॉर्म के आधार पर स्वचालित रूप से चुना जाता है:
| OS | बैकएंड | टूल / API |
|---------|--------------------------------|-------------------------------------|
| macOS | कीचेन | `security` CLI |
| Linux | सीक्रेट सर्विस API (D-Bus) | `secret-tool` (libsecret) |
| Windows | क्रेडेंशियल मैनेजर | `cmdkey` + PowerShell (advapi32) |
मेटाडेटा (कुंजी नाम, टाइमस्टैम्प) `~/.envsec/store.sqlite` पर एक SQLite डेटाबेस में रखा जाता है (`--db` या `ENVSEC_DB` के माध्यम से कॉन्फ़िगर करने योग्य)। कुंजियों में कम से कम एक डॉट विभाजक होना चाहिए (जैसे, `service.account`) जो क्रेडेंशियल स्टोर की सेवा/खाता संरचना पर मैप होता है।
## सुरक्षा
envsec एक सरल सिद्धांत पर बनाया गया है: आपके गुप्त जानकारी आपके OS की है, डॉटफ़ाइल्स की नहीं। हर डिज़ाइन निर्णय उसी नींव से शुरू होता है।
### envsec आपकी गुप्त जानकारी की सुरक्षा कैसे करता है
**OS-मूल एन्क्रिप्शन, शून्य कस्टम क्रिप्टोग्राफी।** गुप्त मान सीधे macOS कीचेन, GNOME कीरिंग / KDE वॉलेट, या Windows क्रेडेंशियल मैनेजर में संग्रहीत होते हैं। envsec कभी भी अपना स्वयं का एन्क्रिप्शन नहीं बनाता — यह आपके ऑपरेटिंग सिस्टम द्वारा पहले से प्रदान किए गए युद्ध-परीक्षित क्रेडेंशियल स्टोरों को सौंपता है, जो आपके उपयोगकर्ता सत्र द्वारा और (macOS पर) लॉगिन कीचेन द्वारा संरक्षित होते हैं।
**पूर्ण यूनिकोड समर्थन।** गुप्त मानों में इमोजी और उच्चारित अक्षरों सहित कोई भी यूनिकोड वर्ण हो सकता है। मान OS क्रेडेंशियल स्टोर में संग्रहीत होने से पहले base64-एन्कोडेड होते हैं, जिससे प्लेटफ़ॉर्म-विशिष्ट एन्कोडिंग विचित्रताओं (जैसे macOS `security` CLI द्वारा गैर-ASCII आउटपुट को हेक्स-एनकोड करना) से बचा जाता है। पिछड़ी संगतता के लिए विरासत प्लेनटेक्स्ट गुप्त जानकारी पारदर्शी रूप से पढ़ी जाती है।
**गुप्त जानकारी कभी भी प्लेनटेक्स्ट के रूप में डिस्क को स्पर्श नहीं करती।** मान सीधे आपके टर्मिनल से OS क्रेडेंशियल स्टोर में जाते हैं। वे कभी भी कॉन्फ़िग फ़ाइलों, लॉग या मध्यवर्ती भंडारण में नहीं लिखे जाते हैं।
**टर्मिनल आउटपुट में कोई गुप्त जानकारी नहीं।** `list` और `search` कमांड केवल कुंजी नाम प्रदर्शित करते हैं — मान कभी प्रिंट नहीं होते हैं। यह स्क्रॉलबैक बफ़र्स, स्क्रीन रिकॉर्डिंग और शोल्डर-सर्फिंग रेंज से गुप्त जानकारी को बाहर रखता है।
**सुरक्षित कमांड निष्पादन।** `run` कमांड गुप्त जानकारी को कमांड स्ट्रिंग में इंटरपोलेट करने के बजाय चाइल्ड प्रक्रिया के पर्यावरण चर के रूप में इंजेक्ट करता है। इसका मतलब है कि गुप्त मान `ps` आउटपुट या शैल इतिहास में दिखाई नहीं देते हैं। यदि कोई संदर्भित गुप्त जानकारी गायब है, तो कमांड पूरी तरह से अवरुद्ध हो जाता है — अधूरे क्रेडेंशियल के साथ कोई आंशिक निष्पादन नहीं।
**इनपुट सत्यापन और इंजेक्शन रोकथाम।** संदर्भ नामों को पथ ट्रैवर्सल और प्रोटोटाइप प्रदूषण जाँच के साथ एक सख्त अनुमतिसूची (अल्फ़ान्यूमेरिक, डॉट्स, हाइफ़न, अंडरस्कोर) के विरुद्ध मान्य किया जाता है। सभी 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
### सेटअप```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
# Release (build + changeset publish)
pnpm run release
एक अस्थायी उपनाम बनाएँ ताकि स्थानीय बिल्ड का उपयोग ऐसे किया जा सके जैसे कि यह वैश्विक रूप से स्थापित हो:```bash
alias envsec="node $(pwd)/packages/cli/dist/main.js"
alias envsec "node (pwd)/packages/cli/dist/main.js"
### स्थानीय रूप से शेल पूर्णताओं का परीक्षण
निर्माण और उपनाम सेट करने के बाद, अपने वर्तमान सत्र में पूर्णताओं को लोड करें:```bash
# Bash
alias envsec="node $(pwd)/packages/cli/dist/main.js"
eval "$(envsec --completions bash)"
# Zsh
alias envsec="node $(pwd)/packages/cli/dist/main.js"
eval "$(envsec --completions zsh)"
# Fish
alias envsec "node (pwd)/packages/cli/dist/main.js"
envsec --completions fish | source
फिर अपने संदर्भों को देखने के लिए envsec -c के बाद TAB दबाएं, या गुप्त कुंजियाँ देखने के लिए envsec -c myapp.dev get के बाद TAB दबाएं।
एंड-टू-एंड एकीकरण परीक्षण पूर्ण CLI जीवनचक्र को कवर करते हैं (add, get, list, search, env-file, load, delete, run, cmd, audit, share, completions)।```bash
pnpm run build
bash packages/cli/test/e2e-test.sh
pwsh packages/cli/test/e2e-test.ps1
CI स्वचालित रूप से push/PR पर `main` पर GitHub Actions के माध्यम से चलता है, 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 |