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.
- package/dist/commands/audit.d.ts +76 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +367 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/config.d.ts +58 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +114 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dir.d.ts +56 -0
- package/dist/commands/dir.d.ts.map +1 -0
- package/dist/commands/dir.js +172 -0
- package/dist/commands/dir.js.map +1 -0
- package/dist/commands/docker.d.ts +140 -0
- package/dist/commands/docker.d.ts.map +1 -0
- package/dist/commands/docker.js +380 -0
- package/dist/commands/docker.js.map +1 -0
- package/dist/commands/env.d.ts +96 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +352 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/init.d.ts +89 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +272 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/key.d.ts +92 -0
- package/dist/commands/key.d.ts.map +1 -0
- package/dist/commands/key.js +274 -0
- package/dist/commands/key.js.map +1 -0
- package/dist/commands/list.d.ts +38 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +84 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/note.d.ts +151 -0
- package/dist/commands/note.d.ts.map +1 -0
- package/dist/commands/note.js +411 -0
- package/dist/commands/note.js.map +1 -0
- package/dist/commands/pull.d.ts +47 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +94 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +40 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +94 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/restore.d.ts +116 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +336 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/service.d.ts +83 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +259 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/show.d.ts +63 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +243 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/status.d.ts +53 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +150 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +105 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +243 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/team.d.ts +79 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +233 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/commands/track.d.ts +109 -0
- package/dist/commands/track.d.ts.map +1 -0
- package/dist/commands/track.js +406 -0
- package/dist/commands/track.js.map +1 -0
- package/dist/core/command-validator.d.ts +100 -0
- package/dist/core/command-validator.d.ts.map +1 -0
- package/dist/core/command-validator.js +299 -0
- package/dist/core/command-validator.js.map +1 -0
- package/dist/core/config-store.d.ts +76 -0
- package/dist/core/config-store.d.ts.map +1 -0
- package/dist/core/config-store.js +148 -0
- package/dist/core/config-store.js.map +1 -0
- package/dist/core/directories-handler.d.ts +116 -0
- package/dist/core/directories-handler.d.ts.map +1 -0
- package/dist/core/directories-handler.js +199 -0
- package/dist/core/directories-handler.js.map +1 -0
- package/dist/core/docker-handler.d.ts +183 -0
- package/dist/core/docker-handler.d.ts.map +1 -0
- package/dist/core/docker-handler.js +515 -0
- package/dist/core/docker-handler.js.map +1 -0
- package/dist/core/encryption.d.ts +79 -0
- package/dist/core/encryption.d.ts.map +1 -0
- package/dist/core/encryption.js +111 -0
- package/dist/core/encryption.js.map +1 -0
- package/dist/core/env-handler.d.ts +128 -0
- package/dist/core/env-handler.d.ts.map +1 -0
- package/dist/core/env-handler.js +272 -0
- package/dist/core/env-handler.js.map +1 -0
- package/dist/core/git-sync.d.ts +88 -0
- package/dist/core/git-sync.d.ts.map +1 -0
- package/dist/core/git-sync.js +143 -0
- package/dist/core/git-sync.js.map +1 -0
- package/dist/core/key-store.d.ts +51 -0
- package/dist/core/key-store.d.ts.map +1 -0
- package/dist/core/key-store.js +108 -0
- package/dist/core/key-store.js.map +1 -0
- package/dist/core/log-sanitizer.d.ts +72 -0
- package/dist/core/log-sanitizer.d.ts.map +1 -0
- package/dist/core/log-sanitizer.js +202 -0
- package/dist/core/log-sanitizer.js.map +1 -0
- package/dist/core/path-validator.d.ts +37 -0
- package/dist/core/path-validator.d.ts.map +1 -0
- package/dist/core/path-validator.js +127 -0
- package/dist/core/path-validator.js.map +1 -0
- package/dist/core/recipients.d.ts +99 -0
- package/dist/core/recipients.d.ts.map +1 -0
- package/dist/core/recipients.js +206 -0
- package/dist/core/recipients.js.map +1 -0
- package/dist/core/services-handler.d.ts +113 -0
- package/dist/core/services-handler.d.ts.map +1 -0
- package/dist/core/services-handler.js +176 -0
- package/dist/core/services-handler.js.map +1 -0
- package/dist/core/state-manager.d.ts +96 -0
- package/dist/core/state-manager.d.ts.map +1 -0
- package/dist/core/state-manager.js +165 -0
- package/dist/core/state-manager.js.map +1 -0
- package/dist/core/transport.d.ts +28 -0
- package/dist/core/transport.d.ts.map +1 -0
- package/dist/core/transport.js +79 -0
- package/dist/core/transport.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/errors.d.ts +81 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +191 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/secure-memory.d.ts +65 -0
- package/dist/utils/secure-memory.d.ts.map +1 -0
- package/dist/utils/secure-memory.js +86 -0
- package/dist/utils/secure-memory.js.map +1 -0
- 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"}
|