@dotenvx/dotenvx 1.60.2 → 1.61.0

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,14 @@
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/v1.60.2...main)
5
+ [Unreleased](https://github.com/dotenvx/dotenvx/compare/v1.61.0...main)
6
+
7
+ ## [1.61.0](https://github.com/dotenvx/dotenvx/compare/v1.60.2...v1.61.0) (2026-04-08)
8
+
9
+ ### Added
10
+
11
+ * Add `login` and `logout` method that proxy to `dotenvx-ops login/logout` ([#780](https://github.com/dotenvx/dotenvx/pull/780))
12
+ * Note: dotenvx continues to make zero outgoing HTTP requests and includes no telemetry. Outgoing requests occur only if you explicitly install the [dotenvx-ops](https://dotenvx.com/ops) SDK or CLI.
6
13
 
7
14
  ## [1.60.2](https://github.com/dotenvx/dotenvx/compare/v1.60.1...v1.60.2) (2026-04-07)
8
15
 
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.60.2",
2
+ "version": "1.61.0",
3
3
  "name": "@dotenvx/dotenvx",
4
4
  "description": "secrets for agents–from the creator of `dotenv`",
5
5
  "author": "@motdotla",
@@ -190,6 +190,23 @@ program.command('ls')
190
190
  .option('-ef, --exclude-env-file <excludeFilenames...>', 'path(s) to exclude from your env file(s) (default: none)')
191
191
  .action(lsAction)
192
192
 
193
+ // dotenvx login
194
+ program.command('login')
195
+ .description('log in to unlock ⛨ ARMORED KEYS ✦ BETA')
196
+ .action(() => {
197
+ const rawArgs = ['ops', 'login', ...process.argv.slice(3)]
198
+ executeDynamic(program, 'ops', rawArgs)
199
+ })
200
+
201
+ // dotenvx logout
202
+ program.command('logout', { hidden: true })
203
+ .description('optional: log out of your dotenvx account')
204
+ .allowUnknownOption()
205
+ .action(() => {
206
+ const rawArgs = ['ops', 'logout', ...process.argv.slice(3)]
207
+ executeDynamic(program, 'ops', rawArgs)
208
+ })
209
+
193
210
  // dotenvx help
194
211
  program.command('help [command]')
195
212
  .description('display help for command')
@@ -18,7 +18,7 @@ function opsBanner (installCommand) {
18
18
  '',
19
19
  ' ⛨ ARMORED KEYS: Harden your private keys.',
20
20
  ` ⮕ install [${installCommand}]`,
21
- ' ⮕ and then run [dotenvx-ops login]'
21
+ ' ⮕ then run [dotenvx-ops login]'
22
22
  ]
23
23
 
24
24
  const innerWidth = Math.max(67, ...lines.map((line) => line.length))
@@ -5,6 +5,37 @@ function removeOptionsHelpParts (lines) {
5
5
  lines[i] = lines[i].replace(' [options]', '')
6
6
  }
7
7
 
8
+ let commandsStart = -1
9
+ for (let i = 0; i < lines.length; i++) {
10
+ if (lines[i] === 'Commands:') {
11
+ commandsStart = i + 1
12
+ break
13
+ }
14
+ }
15
+
16
+ if (commandsStart !== -1) {
17
+ const commands = []
18
+
19
+ for (let i = commandsStart; i < lines.length; i++) {
20
+ const line = lines[i]
21
+ if (line === '' || line.endsWith(':')) {
22
+ break
23
+ }
24
+
25
+ const match = line.match(/^(\s{2})(\S(?:.*\S)?)\s{2,}(\S.*)$/)
26
+ if (match) {
27
+ commands.push({ index: i, indent: match[1], command: match[2], description: match[3] })
28
+ }
29
+ }
30
+
31
+ if (commands.length > 0) {
32
+ const maxCommandLength = commands.reduce((max, item) => Math.max(max, item.command.length), 0)
33
+ for (const item of commands) {
34
+ lines[item.index] = `${item.indent}${item.command.padEnd(maxCommandLength + 2)}${item.description}`
35
+ }
36
+ }
37
+ }
38
+
8
39
  return lines
9
40
  }
10
41