@dotenvx/dotenvx 2.2.1 → 2.2.2

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 CHANGED
@@ -2,7 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
- [Unreleased](https://github.com/dotenvx/dotenvx/compare/v2.2.1...main)
5
+ [Unreleased](https://github.com/dotenvx/dotenvx/compare/v2.2.2...main)
6
+
7
+ ## [2.2.2](https://github.com/dotenvx/dotenvx/compare/v2.2.1...v2.2.2) (2026-07-08)
8
+
9
+ ### Changed
10
+
11
+ * Move `login` and `logout` under armor ([#874](https://github.com/dotenvx/dotenvx/pull/874))
6
12
 
7
13
  ## [2.2.1](https://github.com/dotenvx/dotenvx/compare/v2.2.0...v2.2.1) (2026-07-08)
8
14
 
package/README.md CHANGED
@@ -2382,7 +2382,7 @@ Move private keys into [Dotenvx Armor ⛨](https://dotenvx.com/armor) for off-de
2382
2382
  Move a private key from `.env.keys` into Dotenvx Armor.
2383
2383
 
2384
2384
  ```sh
2385
- $ dotenvx login
2385
+ $ dotenvx armor login
2386
2386
  $ dotenvx armor up
2387
2387
  ```
2388
2388
 
@@ -2434,6 +2434,24 @@ Move an armored key to another team.
2434
2434
  $ dotenvx armor move --team acme
2435
2435
  ```
2436
2436
 
2437
+ </details>
2438
+ <details><summary>`armor login`</summary><br>
2439
+
2440
+ Log in to Dotenvx Armor.
2441
+
2442
+ ```sh
2443
+ $ dotenvx armor login
2444
+ ```
2445
+
2446
+ </details>
2447
+ <details><summary>`armor logout`</summary><br>
2448
+
2449
+ Log out of Dotenvx Armor.
2450
+
2451
+ ```sh
2452
+ $ dotenvx armor logout
2453
+ ```
2454
+
2437
2455
  </details>
2438
2456
  <details><summary>`help`</summary><br>
2439
2457
 
@@ -2470,9 +2488,8 @@ Commands:
2470
2488
  prevent including .env files in docker
2471
2489
 
2472
2490
  Professional Security:
2473
- login log in to move keys off-device, share with your team, and audit access
2474
- logout log out of connected security features
2475
- armor ⛨ move private keys off-device [www.dotenvx.com/armor]
2491
+ keychain ⌥ move private keys into macOS Keychain
2492
+ armor ⛨ move private keys into Dotenvx Armor [www.dotenvx.com/armor]
2476
2493
  ```
2477
2494
 
2478
2495
  You can get more detailed help per command with `dotenvx help COMMAND`.
@@ -2520,24 +2537,6 @@ X.X.X
2520
2537
 
2521
2538
  </details>
2522
2539
 
2523
- ### Utilities
2524
-
2525
- Additional workflow helpers.
2526
-
2527
- <details><summary>`ext scan`</summary><br>
2528
-
2529
- Scan for leaked secrets.
2530
-
2531
- ```sh
2532
- $ dotenvx ext scan
2533
- 100 commits scanned.
2534
- no leaks found
2535
- ```
2536
-
2537
- Uses [gitleaks](https://gitleaks.io) under the hood.
2538
-
2539
- </details>
2540
-
2541
2540
  ### Library 📦
2542
2541
 
2543
2542
  Use dotenvx directly in code.
@@ -2888,18 +2887,6 @@ This is known as *Decryption at Access* and is written about in [the whitepaper]
2888
2887
 
2889
2888
  &nbsp;
2890
2889
 
2891
- ## Whitepaper
2892
-
2893
- > **Dotenvx: Reducing Secrets Risk with Cryptographic Separation**
2894
- >
2895
- > Abstract. An ideal secrets solution would not only centralize secrets but also contain the fallout of a breach. While secrets managers offer centralized storage and distribution, their design creates a large blast radius, risking exposure of thousands or even millions of secrets. We propose a solution that reduces the blast radius by splitting secrets management into two distinct components: an encrypted secrets file and a separate decryption key.
2896
- >
2897
- > ...
2898
- >
2899
- > [Read the whitepaper](https://dotenvx.com/dotenvx.pdf)
2900
-
2901
- &nbsp;
2902
-
2903
2890
  ## Guides
2904
2891
 
2905
2892
  > Go deeper with `dotenvx` – detailed framework and platform guides.
@@ -2931,6 +2918,9 @@ This is known as *Decryption at Access* and is written about in [the whitepaper]
2931
2918
  * [Render](https://dotenvx.com/docs/platforms/render)
2932
2919
  * [CI/CDs](https://dotenvx.com/docs#cis)
2933
2920
  * [GitHub Actions](https://dotenvx.com/docs/cis/github-actions)
2921
+ * [Password Managers](https://dotenvx.com/docs#password-managers)
2922
+ * [1Password](https://dotenvx.com/docs/guides/1password)
2923
+ * [Bitwarden](https://dotenvx.com/docs/guides/bitwarden)
2934
2924
  * [Background Jobs](https://dotenvx.com/docs#background-jobs)
2935
2925
  * [Trigger.dev](https://dotenvx.com/docs/background-jobs/triggerdotdev)
2936
2926
  * [Package Managers](https://dotenvx.com/docs#package-managers)
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.2.1",
2
+ "version": "2.2.2",
3
3
  "name": "@dotenvx/dotenvx",
4
4
  "description": "a secure dotenv–from the creator of `dotenv`",
5
5
  "author": "@motdotla",
@@ -36,7 +36,7 @@
36
36
  "standard": "standard",
37
37
  "standard:fix": "standard --fix",
38
38
  "test": "tap run --test-env=DOTENVX_NO_ARMOR=true --allow-empty-coverage --disable-coverage --timeout=60000",
39
- "testshell": "bash shellspec",
39
+ "testshell": "shellspec --shell /bin/bash",
40
40
  "release:check": "npm test && npm run testshell",
41
41
  "prerelease": "npm run release:check",
42
42
  "release": "npm run release:check && standard-version"
@@ -66,6 +66,24 @@ function configureArmorCommand (armor) {
66
66
  .option('--token <token>', 'set token')
67
67
  .action(moveAction)
68
68
 
69
+ // dotenvx armor login
70
+ const loginAction = require('./../actions/login')
71
+ armor
72
+ .command('login')
73
+ .description('log in to Dotenvx Armor')
74
+ .allowUnknownOption()
75
+ .option('--hostname <hostname>', 'set Armor ⛨ hostname')
76
+ .action(loginAction)
77
+
78
+ // dotenvx armor logout
79
+ const logoutAction = require('./../actions/logout')
80
+ armor
81
+ .command('logout')
82
+ .description('log out of Dotenvx Armor')
83
+ .allowUnknownOption()
84
+ .option('--hostname <hostname>', 'set Armor ⛨ hostname')
85
+ .action(logoutAction)
86
+
69
87
  return armor
70
88
  }
71
89
 
@@ -231,7 +231,7 @@ program.command('doctor', { hidden: true })
231
231
  return require('./actions/doctor').apply(this, args)
232
232
  })
233
233
 
234
- // dotenvx login
234
+ // dotenvx login (compatibility alias for dotenvx armor login)
235
235
  program.command('login', { hidden: true })
236
236
  .description('log in to move keys off-device, share with your team, and audit access')
237
237
  .allowUnknownOption()
@@ -240,7 +240,7 @@ program.command('login', { hidden: true })
240
240
  return require('./actions/login').apply(this, args)
241
241
  })
242
242
 
243
- // dotenvx logout
243
+ // dotenvx logout (compatibility alias for dotenvx armor logout)
244
244
  program.command('logout', { hidden: true })
245
245
  .description('log out of connected security features')
246
246
  .allowUnknownOption()
@@ -268,8 +268,6 @@ program.command('help [command]')
268
268
  // dotenvx armor
269
269
  program.addHelpText('after', ' ')
270
270
  program.addHelpText('after', 'Professional Security: ')
271
- program.addHelpText('after', ' login log in to move keys off-device, share with your team, and audit access')
272
- program.addHelpText('after', ' logout log out of connected security features')
273
271
  program.addHelpText('after', ' keychain ⌥ move private keys into macOS Keychain')
274
272
  program.addHelpText('after', ' armor ⛨ move private keys into Dotenvx Armor [www.dotenvx.com/armor]')
275
273
 
package/src/db/session.js CHANGED
@@ -226,19 +226,19 @@ class Session {
226
226
  //
227
227
  login (hostname, id, username, accessToken) {
228
228
  if (!hostname) {
229
- throw new Error('DOTENVX_ARMOR_HOSTNAME not set. Run [dotenvx login]')
229
+ throw new Error('DOTENVX_ARMOR_HOSTNAME not set. Run [dotenvx armor login]')
230
230
  }
231
231
 
232
232
  if (!id) {
233
- throw new Error('DOTENVX_ARMOR_USER not set. Run [dotenvx login]')
233
+ throw new Error('DOTENVX_ARMOR_USER not set. Run [dotenvx armor login]')
234
234
  }
235
235
 
236
236
  if (!username) {
237
- throw new Error('DOTENVX_ARMOR_USERNAME not set. Run [dotenvx login]')
237
+ throw new Error('DOTENVX_ARMOR_USERNAME not set. Run [dotenvx armor login]')
238
238
  }
239
239
 
240
240
  if (!accessToken) {
241
- throw new Error('DOTENVX_ARMOR_TOKEN not set. Run [dotenvx login]')
241
+ throw new Error('DOTENVX_ARMOR_TOKEN not set. Run [dotenvx armor login]')
242
242
  }
243
243
 
244
244
  const store = this.createStore()
@@ -252,15 +252,15 @@ class Session {
252
252
 
253
253
  logout (hostname, id, accessToken) {
254
254
  if (!hostname) {
255
- throw new Error('DOTENVX_ARMOR_HOSTNAME not set. Run [dotenvx login]')
255
+ throw new Error('DOTENVX_ARMOR_HOSTNAME not set. Run [dotenvx armor login]')
256
256
  }
257
257
 
258
258
  if (!id) {
259
- throw new Error('DOTENVX_ARMOR_USER not set. Run [dotenvx login]')
259
+ throw new Error('DOTENVX_ARMOR_USER not set. Run [dotenvx armor login]')
260
260
  }
261
261
 
262
262
  if (!accessToken) {
263
- throw new Error('DOTENVX_ARMOR_TOKEN not set. Run [dotenvx login]')
263
+ throw new Error('DOTENVX_ARMOR_TOKEN not set. Run [dotenvx armor login]')
264
264
  }
265
265
 
266
266
  const store = this.openStore()