ctx-sync 1.0.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.
Files changed (145) hide show
  1. package/dist/commands/audit.d.ts +76 -0
  2. package/dist/commands/audit.d.ts.map +1 -0
  3. package/dist/commands/audit.js +367 -0
  4. package/dist/commands/audit.js.map +1 -0
  5. package/dist/commands/config.d.ts +58 -0
  6. package/dist/commands/config.d.ts.map +1 -0
  7. package/dist/commands/config.js +114 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/dir.d.ts +56 -0
  10. package/dist/commands/dir.d.ts.map +1 -0
  11. package/dist/commands/dir.js +172 -0
  12. package/dist/commands/dir.js.map +1 -0
  13. package/dist/commands/docker.d.ts +140 -0
  14. package/dist/commands/docker.d.ts.map +1 -0
  15. package/dist/commands/docker.js +380 -0
  16. package/dist/commands/docker.js.map +1 -0
  17. package/dist/commands/env.d.ts +96 -0
  18. package/dist/commands/env.d.ts.map +1 -0
  19. package/dist/commands/env.js +352 -0
  20. package/dist/commands/env.js.map +1 -0
  21. package/dist/commands/init.d.ts +89 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +272 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/key.d.ts +92 -0
  26. package/dist/commands/key.d.ts.map +1 -0
  27. package/dist/commands/key.js +274 -0
  28. package/dist/commands/key.js.map +1 -0
  29. package/dist/commands/list.d.ts +38 -0
  30. package/dist/commands/list.d.ts.map +1 -0
  31. package/dist/commands/list.js +84 -0
  32. package/dist/commands/list.js.map +1 -0
  33. package/dist/commands/note.d.ts +151 -0
  34. package/dist/commands/note.d.ts.map +1 -0
  35. package/dist/commands/note.js +411 -0
  36. package/dist/commands/note.js.map +1 -0
  37. package/dist/commands/pull.d.ts +47 -0
  38. package/dist/commands/pull.d.ts.map +1 -0
  39. package/dist/commands/pull.js +94 -0
  40. package/dist/commands/pull.js.map +1 -0
  41. package/dist/commands/push.d.ts +40 -0
  42. package/dist/commands/push.d.ts.map +1 -0
  43. package/dist/commands/push.js +94 -0
  44. package/dist/commands/push.js.map +1 -0
  45. package/dist/commands/restore.d.ts +116 -0
  46. package/dist/commands/restore.d.ts.map +1 -0
  47. package/dist/commands/restore.js +336 -0
  48. package/dist/commands/restore.js.map +1 -0
  49. package/dist/commands/service.d.ts +83 -0
  50. package/dist/commands/service.d.ts.map +1 -0
  51. package/dist/commands/service.js +259 -0
  52. package/dist/commands/service.js.map +1 -0
  53. package/dist/commands/show.d.ts +63 -0
  54. package/dist/commands/show.d.ts.map +1 -0
  55. package/dist/commands/show.js +243 -0
  56. package/dist/commands/show.js.map +1 -0
  57. package/dist/commands/status.d.ts +53 -0
  58. package/dist/commands/status.d.ts.map +1 -0
  59. package/dist/commands/status.js +150 -0
  60. package/dist/commands/status.js.map +1 -0
  61. package/dist/commands/sync.d.ts +105 -0
  62. package/dist/commands/sync.d.ts.map +1 -0
  63. package/dist/commands/sync.js +243 -0
  64. package/dist/commands/sync.js.map +1 -0
  65. package/dist/commands/team.d.ts +79 -0
  66. package/dist/commands/team.d.ts.map +1 -0
  67. package/dist/commands/team.js +233 -0
  68. package/dist/commands/team.js.map +1 -0
  69. package/dist/commands/track.d.ts +109 -0
  70. package/dist/commands/track.d.ts.map +1 -0
  71. package/dist/commands/track.js +406 -0
  72. package/dist/commands/track.js.map +1 -0
  73. package/dist/core/command-validator.d.ts +100 -0
  74. package/dist/core/command-validator.d.ts.map +1 -0
  75. package/dist/core/command-validator.js +299 -0
  76. package/dist/core/command-validator.js.map +1 -0
  77. package/dist/core/config-store.d.ts +76 -0
  78. package/dist/core/config-store.d.ts.map +1 -0
  79. package/dist/core/config-store.js +148 -0
  80. package/dist/core/config-store.js.map +1 -0
  81. package/dist/core/directories-handler.d.ts +116 -0
  82. package/dist/core/directories-handler.d.ts.map +1 -0
  83. package/dist/core/directories-handler.js +199 -0
  84. package/dist/core/directories-handler.js.map +1 -0
  85. package/dist/core/docker-handler.d.ts +183 -0
  86. package/dist/core/docker-handler.d.ts.map +1 -0
  87. package/dist/core/docker-handler.js +515 -0
  88. package/dist/core/docker-handler.js.map +1 -0
  89. package/dist/core/encryption.d.ts +79 -0
  90. package/dist/core/encryption.d.ts.map +1 -0
  91. package/dist/core/encryption.js +111 -0
  92. package/dist/core/encryption.js.map +1 -0
  93. package/dist/core/env-handler.d.ts +128 -0
  94. package/dist/core/env-handler.d.ts.map +1 -0
  95. package/dist/core/env-handler.js +272 -0
  96. package/dist/core/env-handler.js.map +1 -0
  97. package/dist/core/git-sync.d.ts +88 -0
  98. package/dist/core/git-sync.d.ts.map +1 -0
  99. package/dist/core/git-sync.js +143 -0
  100. package/dist/core/git-sync.js.map +1 -0
  101. package/dist/core/key-store.d.ts +51 -0
  102. package/dist/core/key-store.d.ts.map +1 -0
  103. package/dist/core/key-store.js +108 -0
  104. package/dist/core/key-store.js.map +1 -0
  105. package/dist/core/log-sanitizer.d.ts +72 -0
  106. package/dist/core/log-sanitizer.d.ts.map +1 -0
  107. package/dist/core/log-sanitizer.js +202 -0
  108. package/dist/core/log-sanitizer.js.map +1 -0
  109. package/dist/core/path-validator.d.ts +37 -0
  110. package/dist/core/path-validator.d.ts.map +1 -0
  111. package/dist/core/path-validator.js +127 -0
  112. package/dist/core/path-validator.js.map +1 -0
  113. package/dist/core/recipients.d.ts +99 -0
  114. package/dist/core/recipients.d.ts.map +1 -0
  115. package/dist/core/recipients.js +206 -0
  116. package/dist/core/recipients.js.map +1 -0
  117. package/dist/core/services-handler.d.ts +113 -0
  118. package/dist/core/services-handler.d.ts.map +1 -0
  119. package/dist/core/services-handler.js +176 -0
  120. package/dist/core/services-handler.js.map +1 -0
  121. package/dist/core/state-manager.d.ts +96 -0
  122. package/dist/core/state-manager.d.ts.map +1 -0
  123. package/dist/core/state-manager.js +165 -0
  124. package/dist/core/state-manager.js.map +1 -0
  125. package/dist/core/transport.d.ts +28 -0
  126. package/dist/core/transport.d.ts.map +1 -0
  127. package/dist/core/transport.js +79 -0
  128. package/dist/core/transport.js.map +1 -0
  129. package/dist/index.d.ts +20 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/dist/index.js +80 -0
  132. package/dist/index.js.map +1 -0
  133. package/dist/types/index.d.ts +5 -0
  134. package/dist/types/index.d.ts.map +1 -0
  135. package/dist/types/index.js +2 -0
  136. package/dist/types/index.js.map +1 -0
  137. package/dist/utils/errors.d.ts +81 -0
  138. package/dist/utils/errors.d.ts.map +1 -0
  139. package/dist/utils/errors.js +191 -0
  140. package/dist/utils/errors.js.map +1 -0
  141. package/dist/utils/secure-memory.d.ts +65 -0
  142. package/dist/utils/secure-memory.d.ts.map +1 -0
  143. package/dist/utils/secure-memory.js +86 -0
  144. package/dist/utils/secure-memory.js.map +1 -0
  145. package/package.json +58 -0
@@ -0,0 +1,380 @@
1
+ /**
2
+ * `ctx-sync docker` command group.
3
+ *
4
+ * Manages Docker container state for tracked projects:
5
+ * - `docker track <project>` — detect and save Docker Compose state.
6
+ * - `docker start <project>` — show Docker commands for approval, then execute.
7
+ * - `docker stop <project>` — stop tracked services.
8
+ * - `docker status [project]` — show running / tracked services.
9
+ *
10
+ * **Security:** `docker start` commands go through the command validator.
11
+ * All start commands require explicit user confirmation — there is no
12
+ * `--yes` or `--no-confirm` bypass.
13
+ *
14
+ * @module commands/docker
15
+ */
16
+ import * as fs from 'node:fs';
17
+ import * as path from 'node:path';
18
+ import { execSync } from 'node:child_process';
19
+ import { withErrorHandler } from '../utils/errors.js';
20
+ import { STATE_FILES } from '@ctx-sync/shared';
21
+ import { identityToRecipient } from 'age-encryption';
22
+ import { loadKey } from '../core/key-store.js';
23
+ import { readState } from '../core/state-manager.js';
24
+ import { commitState } from '../core/git-sync.js';
25
+ import { formatCommandsForDisplay, presentCommandsForApproval, } from '../core/command-validator.js';
26
+ import { detectDockerCompose, buildDockerStateEntry, saveDockerState, loadDockerState, loadAllDockerState, isDockerAvailable, } from '../core/docker-handler.js';
27
+ import { getConfigDir, getSyncDir } from './init.js';
28
+ // ─── Track Logic ──────────────────────────────────────────────────────────
29
+ /**
30
+ * Execute Docker track: detect and save Docker Compose state.
31
+ *
32
+ * @param options - Track options.
33
+ * @returns Track result.
34
+ */
35
+ export async function executeDockerTrack(options = {}) {
36
+ const projectDir = options.path ?? process.cwd();
37
+ const configDir = getConfigDir();
38
+ const syncDir = getSyncDir();
39
+ // Verify sync dir exists
40
+ if (!fs.existsSync(syncDir) || !fs.existsSync(path.join(syncDir, '.git'))) {
41
+ throw new Error('No sync repository found. Run `ctx-sync init` first.');
42
+ }
43
+ // Load key
44
+ const privateKey = loadKey(configDir);
45
+ const publicKey = await identityToRecipient(privateKey);
46
+ // Determine project name
47
+ let projectName = options.project;
48
+ if (!projectName) {
49
+ // Try to find from tracked projects
50
+ const state = await readState(syncDir, privateKey, 'state');
51
+ const matchingProject = state?.projects.find((p) => p.path === path.resolve(projectDir));
52
+ projectName = matchingProject?.name ?? path.basename(path.resolve(projectDir));
53
+ }
54
+ // Detect compose file
55
+ const compose = detectDockerCompose(projectDir);
56
+ if (!compose.found || !compose.filePath) {
57
+ throw new Error(`No Docker Compose file found in ${projectDir}.\n` +
58
+ 'Expected: docker-compose.yml, docker-compose.yaml, compose.yml, or compose.yaml');
59
+ }
60
+ // Build and save Docker state
61
+ const entry = buildDockerStateEntry(projectName, projectDir);
62
+ if (!entry) {
63
+ throw new Error('Failed to parse Docker Compose file.');
64
+ }
65
+ await saveDockerState(syncDir, projectName, entry, publicKey, privateKey);
66
+ // Commit if requested
67
+ if (!options.noSync) {
68
+ await commitState(syncDir, [STATE_FILES.DOCKER_STATE, STATE_FILES.MANIFEST], `feat: track Docker services for ${projectName}`);
69
+ }
70
+ return {
71
+ projectName,
72
+ serviceCount: entry.services.length,
73
+ serviceNames: entry.services.map((s) => s.name),
74
+ composeFile: compose.filePath,
75
+ networks: entry.networks ?? [],
76
+ };
77
+ }
78
+ // ─── Start Logic ──────────────────────────────────────────────────────────
79
+ /**
80
+ * Build pending commands from tracked Docker services.
81
+ *
82
+ * @param projectName - The project name.
83
+ * @param projectDocker - The Docker state for the project.
84
+ * @returns List of pending commands for approval.
85
+ */
86
+ export function buildDockerStartCommands(projectName, projectDocker) {
87
+ const commands = [];
88
+ for (const service of projectDocker.services) {
89
+ if (service.autoStart) {
90
+ commands.push({
91
+ command: `docker compose up -d ${service.name}`,
92
+ label: '🐳 Docker services',
93
+ port: service.port > 0 ? service.port : undefined,
94
+ image: service.image || undefined,
95
+ cwd: projectDocker.composeFile
96
+ ? path.dirname(projectDocker.composeFile)
97
+ : undefined,
98
+ });
99
+ }
100
+ }
101
+ return commands;
102
+ }
103
+ /**
104
+ * Execute Docker start: show Docker commands for approval and execute.
105
+ *
106
+ * @param projectName - The project name.
107
+ * @param options - Start options.
108
+ * @returns Start result.
109
+ */
110
+ export async function executeDockerStart(projectName, options = {}) {
111
+ const configDir = getConfigDir();
112
+ const syncDir = getSyncDir();
113
+ if (!fs.existsSync(syncDir) || !fs.existsSync(path.join(syncDir, '.git'))) {
114
+ throw new Error('No sync repository found. Run `ctx-sync init` first.');
115
+ }
116
+ const privateKey = loadKey(configDir);
117
+ // Load Docker state for the project
118
+ const projectDocker = await loadDockerState(syncDir, projectName, privateKey);
119
+ if (!projectDocker) {
120
+ throw new Error(`No Docker state found for project "${projectName}".\n` +
121
+ 'Run `ctx-sync docker track` in the project directory first.');
122
+ }
123
+ // Build commands
124
+ const commandsPresented = buildDockerStartCommands(projectName, projectDocker);
125
+ if (commandsPresented.length === 0) {
126
+ return {
127
+ projectName,
128
+ commandsPresented: [],
129
+ approval: { approved: [], rejected: [], skippedAll: false },
130
+ executedCommands: [],
131
+ failedCommands: [],
132
+ };
133
+ }
134
+ // Present for approval
135
+ const approval = await presentCommandsForApproval(commandsPresented, {
136
+ interactive: !options.noInteractive,
137
+ promptFn: options.promptFn,
138
+ selectFn: options.selectFn,
139
+ });
140
+ // Execute approved commands
141
+ const executedCommands = [];
142
+ const failedCommands = [];
143
+ for (const cmd of approval.approved) {
144
+ try {
145
+ execSync(cmd.command, {
146
+ cwd: cmd.cwd ?? process.cwd(),
147
+ stdio: 'pipe',
148
+ timeout: 60000,
149
+ });
150
+ executedCommands.push(cmd.command);
151
+ }
152
+ catch (err) {
153
+ const message = err instanceof Error ? err.message : String(err);
154
+ failedCommands.push({ command: cmd.command, error: message });
155
+ }
156
+ }
157
+ return {
158
+ projectName,
159
+ commandsPresented,
160
+ approval,
161
+ executedCommands,
162
+ failedCommands,
163
+ };
164
+ }
165
+ // ─── Stop Logic ───────────────────────────────────────────────────────────
166
+ /**
167
+ * Execute Docker stop: stop all tracked services for a project.
168
+ *
169
+ * @param projectName - The project name.
170
+ * @returns Stop result.
171
+ */
172
+ export async function executeDockerStop(projectName) {
173
+ const configDir = getConfigDir();
174
+ const syncDir = getSyncDir();
175
+ if (!fs.existsSync(syncDir) || !fs.existsSync(path.join(syncDir, '.git'))) {
176
+ throw new Error('No sync repository found. Run `ctx-sync init` first.');
177
+ }
178
+ const privateKey = loadKey(configDir);
179
+ const projectDocker = await loadDockerState(syncDir, projectName, privateKey);
180
+ if (!projectDocker) {
181
+ return {
182
+ projectName,
183
+ composeFound: false,
184
+ stopped: false,
185
+ error: `No Docker state found for project "${projectName}".`,
186
+ };
187
+ }
188
+ const composeDir = projectDocker.composeFile
189
+ ? path.dirname(projectDocker.composeFile)
190
+ : null;
191
+ if (!composeDir || !fs.existsSync(composeDir)) {
192
+ return {
193
+ projectName,
194
+ composeFound: false,
195
+ stopped: false,
196
+ error: `Compose directory not found: ${composeDir ?? 'unknown'}`,
197
+ };
198
+ }
199
+ try {
200
+ execSync('docker compose down', {
201
+ cwd: composeDir,
202
+ stdio: 'pipe',
203
+ timeout: 30000,
204
+ });
205
+ return {
206
+ projectName,
207
+ composeFound: true,
208
+ stopped: true,
209
+ };
210
+ }
211
+ catch (err) {
212
+ const message = err instanceof Error ? err.message : String(err);
213
+ return {
214
+ projectName,
215
+ composeFound: true,
216
+ stopped: false,
217
+ error: message,
218
+ };
219
+ }
220
+ }
221
+ // ─── Status Logic ─────────────────────────────────────────────────────────
222
+ /**
223
+ * Execute Docker status: show all tracked Docker projects and services.
224
+ *
225
+ * @param projectFilter - Optional project name to filter.
226
+ * @returns Status result.
227
+ */
228
+ export async function executeDockerStatus(projectFilter) {
229
+ const configDir = getConfigDir();
230
+ const syncDir = getSyncDir();
231
+ if (!fs.existsSync(syncDir) || !fs.existsSync(path.join(syncDir, '.git'))) {
232
+ throw new Error('No sync repository found. Run `ctx-sync init` first.');
233
+ }
234
+ const privateKey = loadKey(configDir);
235
+ const allDocker = await loadAllDockerState(syncDir, privateKey);
236
+ if (!allDocker) {
237
+ return { projects: [] };
238
+ }
239
+ const projects = [];
240
+ for (const [name, entry] of Object.entries(allDocker)) {
241
+ if (projectFilter && name !== projectFilter)
242
+ continue;
243
+ projects.push({
244
+ projectName: name,
245
+ composeFile: entry.composeFile,
246
+ services: entry.services.map((s) => ({
247
+ name: s.name,
248
+ image: s.image,
249
+ port: s.port,
250
+ autoStart: s.autoStart,
251
+ composeFile: entry.composeFile,
252
+ })),
253
+ });
254
+ }
255
+ return { projects };
256
+ }
257
+ // ─── CLI Registration ─────────────────────────────────────────────────────
258
+ /**
259
+ * Register the `docker` command group on the given Commander program.
260
+ */
261
+ export function registerDockerCommand(program) {
262
+ const docker = program
263
+ .command('docker')
264
+ .description('Manage Docker container state for tracked projects');
265
+ // docker track
266
+ docker
267
+ .command('track')
268
+ .description('Track Docker Compose services for the current project')
269
+ .option('-p, --path <path>', 'Project directory path (default: current directory)')
270
+ .option('--project <name>', 'Project name override')
271
+ .option('--no-sync', 'Skip syncing to Git after tracking')
272
+ .action(withErrorHandler(async (opts) => {
273
+ const options = {
274
+ path: opts['path'],
275
+ project: opts['project'],
276
+ noSync: opts['sync'] === false,
277
+ };
278
+ const chalk = (await import('chalk')).default;
279
+ const result = await executeDockerTrack(options);
280
+ console.log(chalk.green(`\nāœ… Docker services tracked for ${result.projectName}`));
281
+ console.log(` Compose file: ${result.composeFile}`);
282
+ console.log(` Services (${result.serviceCount}):`);
283
+ for (const name of result.serviceNames) {
284
+ console.log(` • ${name}`);
285
+ }
286
+ if (result.networks.length > 0) {
287
+ console.log(` Networks: ${result.networks.join(', ')}`);
288
+ }
289
+ console.log(chalk.dim('\n State encrypted and saved to docker-state.age'));
290
+ }));
291
+ // docker start <project>
292
+ docker
293
+ .command('start <project>')
294
+ .description('Start tracked Docker services (with confirmation)')
295
+ .option('--no-interactive', 'Show commands but skip execution')
296
+ .action(withErrorHandler(async (projectName, opts) => {
297
+ const options = {
298
+ noInteractive: opts['interactive'] === false,
299
+ };
300
+ const chalk = (await import('chalk')).default;
301
+ if (!isDockerAvailable()) {
302
+ console.error(chalk.red('Error: Docker is not available on this machine.'));
303
+ process.exitCode = 1;
304
+ return;
305
+ }
306
+ const result = await executeDockerStart(projectName, options);
307
+ if (result.commandsPresented.length === 0) {
308
+ console.log(chalk.yellow('No auto-start Docker services configured.'));
309
+ return;
310
+ }
311
+ console.log(chalk.yellow('\nāš ļø The following Docker commands will be executed:'));
312
+ console.log(formatCommandsForDisplay(result.commandsPresented));
313
+ console.log('');
314
+ if (result.approval.skippedAll) {
315
+ console.log(chalk.dim('Skipped (non-interactive mode)'));
316
+ }
317
+ else {
318
+ for (const cmd of result.executedCommands) {
319
+ console.log(chalk.green(` āœ“ ${cmd}`));
320
+ }
321
+ for (const { command, error } of result.failedCommands) {
322
+ console.log(chalk.red(` āœ— ${command}: ${error}`));
323
+ }
324
+ for (const cmd of result.approval.rejected) {
325
+ console.log(chalk.dim(` ā­ļø Skipped: ${cmd.command}`));
326
+ }
327
+ }
328
+ }));
329
+ // docker stop <project>
330
+ docker
331
+ .command('stop <project>')
332
+ .description('Stop tracked Docker services')
333
+ .action(withErrorHandler(async (projectName) => {
334
+ const chalk = (await import('chalk')).default;
335
+ const { default: ora } = await import('ora');
336
+ if (!isDockerAvailable()) {
337
+ console.error(chalk.red('Error: Docker is not available on this machine.'));
338
+ process.exitCode = 1;
339
+ return;
340
+ }
341
+ const spinner = ora(`Stopping Docker services for ${projectName}...`).start();
342
+ const result = await executeDockerStop(projectName);
343
+ spinner.stop();
344
+ if (!result.composeFound) {
345
+ console.log(chalk.yellow(result.error ?? 'No Docker state found.'));
346
+ return;
347
+ }
348
+ if (result.stopped) {
349
+ console.log(chalk.green(`āœ… Docker services stopped for ${projectName}`));
350
+ }
351
+ else {
352
+ console.error(chalk.red(`Failed to stop: ${result.error}`));
353
+ process.exitCode = 1;
354
+ }
355
+ }));
356
+ // docker status [project]
357
+ docker
358
+ .command('status [project]')
359
+ .description('Show tracked Docker services')
360
+ .action(withErrorHandler(async (projectFilter) => {
361
+ const chalk = (await import('chalk')).default;
362
+ const result = await executeDockerStatus(projectFilter);
363
+ if (result.projects.length === 0) {
364
+ console.log(chalk.yellow('No Docker services tracked.'));
365
+ console.log(chalk.dim('Run `ctx-sync docker track` in a project with a Docker Compose file.'));
366
+ return;
367
+ }
368
+ for (const project of result.projects) {
369
+ console.log(chalk.bold(`\n🐳 ${project.projectName}`));
370
+ console.log(chalk.dim(` Compose: ${project.composeFile}`));
371
+ for (const svc of project.services) {
372
+ const portStr = svc.port > 0 ? ` (port ${svc.port})` : '';
373
+ const autoStr = svc.autoStart ? ' [auto-start]' : '';
374
+ const imageStr = svc.image ? ` — ${svc.image}` : '';
375
+ console.log(` • ${svc.name}${imageStr}${portStr}${autoStr}`);
376
+ }
377
+ }
378
+ }));
379
+ }
380
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/commands/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * `ctx-sync env` command group.
3
+ *
4
+ * Subcommands:
5
+ * - `env import <project> <file>` — Import from .env file
6
+ * - `env add <project> <key>` — Add single var (hidden input / stdin)
7
+ * - `env scan <project>` — Scan current shell environment
8
+ * - `env list <project>` — List env vars (values hidden by default)
9
+ *
10
+ * Security:
11
+ * - Secret values are NEVER accepted as CLI arguments.
12
+ * - All env vars encrypted by default (encrypt-by-default).
13
+ * - Values are never displayed in CLI output unless --show-values.
14
+ *
15
+ * @module commands/env
16
+ */
17
+ import type { Command } from 'commander';
18
+ import type { ListedEnvVar } from '../core/env-handler.js';
19
+ /**
20
+ * Options for the env import command.
21
+ */
22
+ export interface EnvImportOptions {
23
+ project: string;
24
+ file?: string;
25
+ stdin?: boolean;
26
+ allowPlain?: boolean;
27
+ noSync?: boolean;
28
+ }
29
+ /**
30
+ * Result of env import.
31
+ */
32
+ export interface EnvImportResult {
33
+ importedCount: number;
34
+ encryptedCount: number;
35
+ plainCount: number;
36
+ }
37
+ /**
38
+ * Execute env import from a file or stdin.
39
+ */
40
+ export declare function executeEnvImport(options: EnvImportOptions): Promise<EnvImportResult>;
41
+ /**
42
+ * Options for the env add command.
43
+ */
44
+ export interface EnvAddOptions {
45
+ project: string;
46
+ key: string;
47
+ stdin?: boolean;
48
+ fromFd?: number;
49
+ noSync?: boolean;
50
+ }
51
+ /**
52
+ * Execute env add (single variable).
53
+ */
54
+ export declare function executeEnvAdd(options: EnvAddOptions & {
55
+ value?: string;
56
+ }): Promise<void>;
57
+ /**
58
+ * Options for env scan.
59
+ */
60
+ export interface EnvScanOptions {
61
+ project: string;
62
+ noSync?: boolean;
63
+ }
64
+ /** A candidate env var from the current shell */
65
+ export interface EnvScanCandidate {
66
+ key: string;
67
+ value: string;
68
+ isProjectRelated: boolean;
69
+ }
70
+ /**
71
+ * Scan the current shell environment for project-related variables.
72
+ *
73
+ * Heuristic: exclude common system vars and PATH-like variables.
74
+ * Returns candidates for user to select from.
75
+ */
76
+ export declare function scanEnvironment(): EnvScanCandidate[];
77
+ /**
78
+ * Execute env scan — import selected vars from current environment.
79
+ */
80
+ export declare function executeEnvScan(options: EnvScanOptions, selectedKeys: string[]): Promise<number>;
81
+ /**
82
+ * Options for env list.
83
+ */
84
+ export interface EnvListOptions {
85
+ project: string;
86
+ showValues?: boolean;
87
+ }
88
+ /**
89
+ * Execute env list.
90
+ */
91
+ export declare function executeEnvList(options: EnvListOptions): Promise<ListedEnvVar[]>;
92
+ /**
93
+ * Register the `env` command group on the given Commander program.
94
+ */
95
+ export declare function registerEnvCommand(program: Command): void;
96
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAW3D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAgE1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,gBAAgB,EAAE,CAqDpD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAWrF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmMzD"}