@centient/secrets 0.2.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/cli/messages.d.ts +60 -0
- package/dist/cli/messages.d.ts.map +1 -0
- package/dist/cli/messages.js +63 -0
- package/dist/cli/messages.js.map +1 -0
- package/dist/cli/secrets-cli.d.ts +38 -0
- package/dist/cli/secrets-cli.d.ts.map +1 -0
- package/dist/cli/secrets-cli.js +532 -0
- package/dist/cli/secrets-cli.js.map +1 -0
- package/dist/crypto/vault-common.d.ts +63 -0
- package/dist/crypto/vault-common.d.ts.map +1 -0
- package/dist/crypto/vault-common.js +180 -0
- package/dist/crypto/vault-common.js.map +1 -0
- package/dist/environment/EnvironmentManager.d.ts +171 -0
- package/dist/environment/EnvironmentManager.d.ts.map +1 -0
- package/dist/environment/EnvironmentManager.js +604 -0
- package/dist/environment/EnvironmentManager.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/platform/agent-detect.d.ts +15 -0
- package/dist/platform/agent-detect.d.ts.map +1 -0
- package/dist/platform/agent-detect.js +22 -0
- package/dist/platform/agent-detect.js.map +1 -0
- package/dist/platform/platform.d.ts +51 -0
- package/dist/platform/platform.d.ts.map +1 -0
- package/dist/platform/platform.js +141 -0
- package/dist/platform/platform.js.map +1 -0
- package/dist/vault/types.d.ts +54 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +12 -0
- package/dist/vault/types.js.map +1 -0
- package/dist/vault/vault-env.d.ts +58 -0
- package/dist/vault/vault-env.d.ts.map +1 -0
- package/dist/vault/vault-env.js +73 -0
- package/dist/vault/vault-env.js.map +1 -0
- package/dist/vault/vault-gpg.d.ts +40 -0
- package/dist/vault/vault-gpg.d.ts.map +1 -0
- package/dist/vault/vault-gpg.js +149 -0
- package/dist/vault/vault-gpg.js.map +1 -0
- package/dist/vault/vault-libsecret.d.ts +51 -0
- package/dist/vault/vault-libsecret.d.ts.map +1 -0
- package/dist/vault/vault-libsecret.js +115 -0
- package/dist/vault/vault-libsecret.js.map +1 -0
- package/dist/vault/vault-utils.d.ts +12 -0
- package/dist/vault/vault-utils.d.ts.map +1 -0
- package/dist/vault/vault-utils.js +16 -0
- package/dist/vault/vault-utils.js.map +1 -0
- package/dist/vault/vault-windows.d.ts +71 -0
- package/dist/vault/vault-windows.d.ts.map +1 -0
- package/dist/vault/vault-windows.js +186 -0
- package/dist/vault/vault-windows.js.map +1 -0
- package/dist/vault/vault.d.ts +53 -0
- package/dist/vault/vault.d.ts.map +1 -0
- package/dist/vault/vault.js +132 -0
- package/dist/vault/vault.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages multi-environment support for the secrets management system.
|
|
5
|
+
* Provides isolated configuration and vault storage per environment.
|
|
6
|
+
*
|
|
7
|
+
* Directory structure:
|
|
8
|
+
* ~/.centient/environments/
|
|
9
|
+
* ├── dev/
|
|
10
|
+
* │ ├── config.json
|
|
11
|
+
* │ └── vault.enc
|
|
12
|
+
* ├── staging/
|
|
13
|
+
* │ ├── config.json
|
|
14
|
+
* │ └── vault.enc
|
|
15
|
+
* └── prod/
|
|
16
|
+
* ├── config.json
|
|
17
|
+
* └── vault.enc
|
|
18
|
+
* ~/.centient/current -> environments/dev/ (symlink)
|
|
19
|
+
*
|
|
20
|
+
* Security:
|
|
21
|
+
* - All operations that modify environments check for AI agent context
|
|
22
|
+
* - Agents can read/list environments but cannot switch or create
|
|
23
|
+
* - This prevents accidental environment changes during AI sessions
|
|
24
|
+
*/
|
|
25
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, lstatSync, symlinkSync, unlinkSync, readlinkSync, rmSync, } from "fs";
|
|
26
|
+
import { join, basename, relative } from "path";
|
|
27
|
+
import { homedir } from "os";
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// Constants
|
|
30
|
+
// =============================================================================
|
|
31
|
+
const CENTIENT_DIR = join(homedir(), ".centient");
|
|
32
|
+
const ENVIRONMENTS_DIR = join(CENTIENT_DIR, "environments");
|
|
33
|
+
const CURRENT_LINK = join(CENTIENT_DIR, "current");
|
|
34
|
+
const DEFAULT_ENVIRONMENT = "dev";
|
|
35
|
+
const RESERVED_NAMES = ["current", "environments", "config", "logs", "cache"];
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// Agent Detection
|
|
38
|
+
// =============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Check if running in an AI agent environment.
|
|
41
|
+
*
|
|
42
|
+
* Detects Claude Code and similar AI agent contexts by checking for
|
|
43
|
+
* environment variables that indicate an agent session.
|
|
44
|
+
*/
|
|
45
|
+
function isAgentEnvironment() {
|
|
46
|
+
return !!(process.env.CLAUDE_PROJECT_DIR ||
|
|
47
|
+
process.env.MCP_CONTEXT ||
|
|
48
|
+
process.env.CLAUDE_CODE_SESSION ||
|
|
49
|
+
process.env.CLAUDE_CODE_ENTRY_POINT);
|
|
50
|
+
}
|
|
51
|
+
// =============================================================================
|
|
52
|
+
// Path Utilities
|
|
53
|
+
// =============================================================================
|
|
54
|
+
/**
|
|
55
|
+
* Get the path to an environment directory
|
|
56
|
+
*/
|
|
57
|
+
function getEnvironmentPath(name) {
|
|
58
|
+
return join(ENVIRONMENTS_DIR, name);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the path to an environment's config.json
|
|
62
|
+
*/
|
|
63
|
+
function getEnvironmentConfigPath(name) {
|
|
64
|
+
return join(getEnvironmentPath(name), "config.json");
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get the path to an environment's vault.enc
|
|
68
|
+
*/
|
|
69
|
+
function getEnvironmentVaultPath(name) {
|
|
70
|
+
return join(getEnvironmentPath(name), "vault.enc");
|
|
71
|
+
}
|
|
72
|
+
// =============================================================================
|
|
73
|
+
// Validation
|
|
74
|
+
// =============================================================================
|
|
75
|
+
/**
|
|
76
|
+
* Validate environment name
|
|
77
|
+
*
|
|
78
|
+
* Rules:
|
|
79
|
+
* - 1-32 characters
|
|
80
|
+
* - Alphanumeric, hyphens, underscores only
|
|
81
|
+
* - Cannot be a reserved name
|
|
82
|
+
* - Cannot start with a hyphen or underscore
|
|
83
|
+
*/
|
|
84
|
+
function validateEnvironmentName(name) {
|
|
85
|
+
if (!name || name.length === 0) {
|
|
86
|
+
return { valid: false, error: "Environment name is required" };
|
|
87
|
+
}
|
|
88
|
+
if (name.length > 32) {
|
|
89
|
+
return {
|
|
90
|
+
valid: false,
|
|
91
|
+
error: "Environment name must be 32 characters or less",
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(name)) {
|
|
95
|
+
return {
|
|
96
|
+
valid: false,
|
|
97
|
+
error: "Environment name must start with alphanumeric and contain only alphanumeric, hyphens, and underscores",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (RESERVED_NAMES.includes(name.toLowerCase())) {
|
|
101
|
+
return {
|
|
102
|
+
valid: false,
|
|
103
|
+
error: `"${name}" is a reserved name and cannot be used as an environment name`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return { valid: true };
|
|
107
|
+
}
|
|
108
|
+
// =============================================================================
|
|
109
|
+
// Environment Manager Class
|
|
110
|
+
// =============================================================================
|
|
111
|
+
export class EnvironmentManager {
|
|
112
|
+
/**
|
|
113
|
+
* List all available environments
|
|
114
|
+
*
|
|
115
|
+
* Returns information about each environment including:
|
|
116
|
+
* - Name
|
|
117
|
+
* - Path
|
|
118
|
+
* - Whether it's currently active
|
|
119
|
+
* - Whether it has config and vault files
|
|
120
|
+
*/
|
|
121
|
+
listEnvironments() {
|
|
122
|
+
// Ensure environments directory exists
|
|
123
|
+
if (!existsSync(ENVIRONMENTS_DIR)) {
|
|
124
|
+
return {
|
|
125
|
+
success: true,
|
|
126
|
+
environments: [],
|
|
127
|
+
currentEnvironment: null,
|
|
128
|
+
message: "No environments configured. Run 'centient env create dev' to create your first environment.",
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const currentEnv = this.getCurrentEnvironment();
|
|
132
|
+
const environments = [];
|
|
133
|
+
try {
|
|
134
|
+
const entries = readdirSync(ENVIRONMENTS_DIR, { withFileTypes: true });
|
|
135
|
+
for (const entry of entries) {
|
|
136
|
+
if (entry.isDirectory()) {
|
|
137
|
+
const envPath = getEnvironmentPath(entry.name);
|
|
138
|
+
const configPath = getEnvironmentConfigPath(entry.name);
|
|
139
|
+
const vaultPath = getEnvironmentVaultPath(entry.name);
|
|
140
|
+
let lastModified;
|
|
141
|
+
try {
|
|
142
|
+
const stats = lstatSync(envPath);
|
|
143
|
+
lastModified = stats.mtime;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Ignore stat errors
|
|
147
|
+
}
|
|
148
|
+
environments.push({
|
|
149
|
+
name: entry.name,
|
|
150
|
+
path: envPath,
|
|
151
|
+
isActive: entry.name === currentEnv,
|
|
152
|
+
hasConfig: existsSync(configPath),
|
|
153
|
+
hasVault: existsSync(vaultPath),
|
|
154
|
+
lastModified,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Sort by name, but put active environment first
|
|
159
|
+
environments.sort((a, b) => {
|
|
160
|
+
if (a.isActive)
|
|
161
|
+
return -1;
|
|
162
|
+
if (b.isActive)
|
|
163
|
+
return 1;
|
|
164
|
+
return a.name.localeCompare(b.name);
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
success: true,
|
|
168
|
+
environments,
|
|
169
|
+
currentEnvironment: currentEnv,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
environments: [],
|
|
176
|
+
currentEnvironment: null,
|
|
177
|
+
message: `Failed to list environments: ${error instanceof Error ? error.message : String(error)}`,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get the currently active environment name
|
|
183
|
+
*
|
|
184
|
+
* Returns the name of the environment that the 'current' symlink points to,
|
|
185
|
+
* or null if no environment is set.
|
|
186
|
+
*/
|
|
187
|
+
getCurrentEnvironment() {
|
|
188
|
+
if (!existsSync(CURRENT_LINK)) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
const stats = lstatSync(CURRENT_LINK);
|
|
193
|
+
if (!stats.isSymbolicLink()) {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
const target = readlinkSync(CURRENT_LINK);
|
|
197
|
+
// Handle both absolute and relative symlink targets
|
|
198
|
+
const envName = target.includes("environments/")
|
|
199
|
+
? basename(target)
|
|
200
|
+
: basename(target);
|
|
201
|
+
// Verify the target environment exists
|
|
202
|
+
if (existsSync(getEnvironmentPath(envName))) {
|
|
203
|
+
return envName;
|
|
204
|
+
}
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get details about a specific environment
|
|
213
|
+
*/
|
|
214
|
+
getEnvironment(name) {
|
|
215
|
+
const validation = validateEnvironmentName(name);
|
|
216
|
+
if (!validation.valid) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
const envPath = getEnvironmentPath(name);
|
|
220
|
+
if (!existsSync(envPath)) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
const configPath = getEnvironmentConfigPath(name);
|
|
224
|
+
const vaultPath = getEnvironmentVaultPath(name);
|
|
225
|
+
const currentEnv = this.getCurrentEnvironment();
|
|
226
|
+
let lastModified;
|
|
227
|
+
try {
|
|
228
|
+
const stats = lstatSync(envPath);
|
|
229
|
+
lastModified = stats.mtime;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// Ignore stat errors
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
name,
|
|
236
|
+
path: envPath,
|
|
237
|
+
isActive: name === currentEnv,
|
|
238
|
+
hasConfig: existsSync(configPath),
|
|
239
|
+
hasVault: existsSync(vaultPath),
|
|
240
|
+
lastModified,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Switch to a different environment
|
|
245
|
+
*
|
|
246
|
+
* Updates the 'current' symlink to point to the specified environment.
|
|
247
|
+
* This operation is blocked for AI agents to prevent accidental
|
|
248
|
+
* environment changes during automated sessions.
|
|
249
|
+
*
|
|
250
|
+
* @param name - Name of the environment to switch to
|
|
251
|
+
*/
|
|
252
|
+
switchEnvironment(name) {
|
|
253
|
+
// Block agent access
|
|
254
|
+
if (isAgentEnvironment()) {
|
|
255
|
+
return {
|
|
256
|
+
success: false,
|
|
257
|
+
message: "Environment switching is not available to AI agents. " +
|
|
258
|
+
"This is a security measure to prevent accidental environment changes during automated sessions.",
|
|
259
|
+
nextAction: "Have a human run 'centient env switch <name>' from a terminal",
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// Validate name
|
|
263
|
+
const validation = validateEnvironmentName(name);
|
|
264
|
+
if (!validation.valid) {
|
|
265
|
+
return {
|
|
266
|
+
success: false,
|
|
267
|
+
message: validation.error || "Invalid environment name",
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// Check if environment exists
|
|
271
|
+
const envPath = getEnvironmentPath(name);
|
|
272
|
+
if (!existsSync(envPath)) {
|
|
273
|
+
return {
|
|
274
|
+
success: false,
|
|
275
|
+
message: `Environment "${name}" does not exist`,
|
|
276
|
+
nextAction: `Create it with 'centient env create ${name}'`,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// Check if already active
|
|
280
|
+
const currentEnv = this.getCurrentEnvironment();
|
|
281
|
+
if (currentEnv === name) {
|
|
282
|
+
return {
|
|
283
|
+
success: true,
|
|
284
|
+
message: `Already using environment "${name}"`,
|
|
285
|
+
environment: this.getEnvironment(name) || undefined,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
try {
|
|
289
|
+
// Remove existing symlink if it exists
|
|
290
|
+
if (existsSync(CURRENT_LINK)) {
|
|
291
|
+
unlinkSync(CURRENT_LINK);
|
|
292
|
+
}
|
|
293
|
+
// Create relative symlink (more portable)
|
|
294
|
+
const relativeTarget = relative(CENTIENT_DIR, envPath);
|
|
295
|
+
symlinkSync(relativeTarget, CURRENT_LINK);
|
|
296
|
+
const env = this.getEnvironment(name);
|
|
297
|
+
return {
|
|
298
|
+
success: true,
|
|
299
|
+
message: `Switched to environment "${name}"`,
|
|
300
|
+
environment: env || undefined,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
return {
|
|
305
|
+
success: false,
|
|
306
|
+
message: `Failed to switch environment: ${error instanceof Error ? error.message : String(error)}`,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Create a new environment
|
|
312
|
+
*
|
|
313
|
+
* Creates the environment directory with initial config.json.
|
|
314
|
+
* Optionally sets it as the current environment.
|
|
315
|
+
* This operation is blocked for AI agents.
|
|
316
|
+
*
|
|
317
|
+
* @param name - Name for the new environment
|
|
318
|
+
* @param options - Creation options
|
|
319
|
+
*/
|
|
320
|
+
createEnvironment(name, options) {
|
|
321
|
+
// Block agent access
|
|
322
|
+
if (isAgentEnvironment()) {
|
|
323
|
+
return {
|
|
324
|
+
success: false,
|
|
325
|
+
message: "Environment creation is not available to AI agents. " +
|
|
326
|
+
"This is a security measure to prevent automated environment modifications.",
|
|
327
|
+
nextAction: "Have a human run 'centient env create <name>' from a terminal",
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
// Validate name
|
|
331
|
+
const validation = validateEnvironmentName(name);
|
|
332
|
+
if (!validation.valid) {
|
|
333
|
+
return {
|
|
334
|
+
success: false,
|
|
335
|
+
message: validation.error || "Invalid environment name",
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
// Check if environment already exists
|
|
339
|
+
const envPath = getEnvironmentPath(name);
|
|
340
|
+
if (existsSync(envPath)) {
|
|
341
|
+
return {
|
|
342
|
+
success: false,
|
|
343
|
+
message: `Environment "${name}" already exists`,
|
|
344
|
+
environment: this.getEnvironment(name) || undefined,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
// Check if copying from another environment
|
|
348
|
+
let baseConfig = {};
|
|
349
|
+
if (options?.copyFrom) {
|
|
350
|
+
const sourceConfigPath = getEnvironmentConfigPath(options.copyFrom);
|
|
351
|
+
if (!existsSync(sourceConfigPath)) {
|
|
352
|
+
return {
|
|
353
|
+
success: false,
|
|
354
|
+
message: `Source environment "${options.copyFrom}" does not have a config to copy`,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
baseConfig = JSON.parse(readFileSync(sourceConfigPath, "utf-8"));
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
return {
|
|
362
|
+
success: false,
|
|
363
|
+
message: `Failed to read config from "${options.copyFrom}": ${error instanceof Error ? error.message : String(error)}`,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
try {
|
|
368
|
+
// Ensure environments directory exists
|
|
369
|
+
mkdirSync(ENVIRONMENTS_DIR, { recursive: true });
|
|
370
|
+
// Create environment directory
|
|
371
|
+
mkdirSync(envPath, { recursive: true });
|
|
372
|
+
// Create initial config
|
|
373
|
+
const envConfig = {
|
|
374
|
+
description: options?.description || `${name} environment`,
|
|
375
|
+
createdAt: new Date().toISOString(),
|
|
376
|
+
createdBy: process.env.USER || process.env.USERNAME || "unknown",
|
|
377
|
+
};
|
|
378
|
+
const fullConfig = {
|
|
379
|
+
...baseConfig,
|
|
380
|
+
_environment: envConfig,
|
|
381
|
+
};
|
|
382
|
+
writeFileSync(getEnvironmentConfigPath(name), JSON.stringify(fullConfig, null, 2), "utf-8");
|
|
383
|
+
// Set as current if requested or if it's the first environment
|
|
384
|
+
const shouldSetCurrent = options?.setAsCurrent ||
|
|
385
|
+
(!existsSync(CURRENT_LINK) && name === DEFAULT_ENVIRONMENT);
|
|
386
|
+
if (shouldSetCurrent) {
|
|
387
|
+
const switchResult = this.switchEnvironment(name);
|
|
388
|
+
if (!switchResult.success) {
|
|
389
|
+
// Environment created but switch failed - still report success with warning
|
|
390
|
+
return {
|
|
391
|
+
success: true,
|
|
392
|
+
message: `Environment "${name}" created but failed to set as current: ${switchResult.message}`,
|
|
393
|
+
environment: this.getEnvironment(name) || undefined,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return {
|
|
398
|
+
success: true,
|
|
399
|
+
message: shouldSetCurrent
|
|
400
|
+
? `Environment "${name}" created and set as current`
|
|
401
|
+
: `Environment "${name}" created`,
|
|
402
|
+
environment: this.getEnvironment(name) || undefined,
|
|
403
|
+
nextAction: shouldSetCurrent
|
|
404
|
+
? undefined
|
|
405
|
+
: `Switch to it with 'centient env switch ${name}'`,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
return {
|
|
410
|
+
success: false,
|
|
411
|
+
message: `Failed to create environment: ${error instanceof Error ? error.message : String(error)}`,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Delete an environment
|
|
417
|
+
*
|
|
418
|
+
* Removes the environment directory and all its contents.
|
|
419
|
+
* Cannot delete the currently active environment.
|
|
420
|
+
* This operation is blocked for AI agents.
|
|
421
|
+
*
|
|
422
|
+
* @param name - Name of the environment to delete
|
|
423
|
+
* @param options - Deletion options
|
|
424
|
+
*/
|
|
425
|
+
deleteEnvironment(name, options) {
|
|
426
|
+
// Block agent access
|
|
427
|
+
if (isAgentEnvironment()) {
|
|
428
|
+
return {
|
|
429
|
+
success: false,
|
|
430
|
+
message: "Environment deletion is not available to AI agents. " +
|
|
431
|
+
"This is a security measure to prevent accidental data loss.",
|
|
432
|
+
nextAction: "Have a human run 'centient env delete <name>' from a terminal",
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
// Validate name
|
|
436
|
+
const validation = validateEnvironmentName(name);
|
|
437
|
+
if (!validation.valid) {
|
|
438
|
+
return {
|
|
439
|
+
success: false,
|
|
440
|
+
message: validation.error || "Invalid environment name",
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
// Check if environment exists
|
|
444
|
+
const envPath = getEnvironmentPath(name);
|
|
445
|
+
if (!existsSync(envPath)) {
|
|
446
|
+
return {
|
|
447
|
+
success: false,
|
|
448
|
+
message: `Environment "${name}" does not exist`,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
// Cannot delete current environment
|
|
452
|
+
const currentEnv = this.getCurrentEnvironment();
|
|
453
|
+
if (currentEnv === name) {
|
|
454
|
+
return {
|
|
455
|
+
success: false,
|
|
456
|
+
message: `Cannot delete the current environment "${name}"`,
|
|
457
|
+
nextAction: `Switch to another environment first with 'centient env switch <other>'`,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
// Check for vault.enc if not forcing
|
|
461
|
+
const vaultPath = getEnvironmentVaultPath(name);
|
|
462
|
+
if (existsSync(vaultPath) && !options?.force) {
|
|
463
|
+
return {
|
|
464
|
+
success: false,
|
|
465
|
+
message: `Environment "${name}" has encrypted secrets. Use --force to delete anyway.`,
|
|
466
|
+
nextAction: `Run 'centient env delete ${name} --force' to confirm deletion`,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
try {
|
|
470
|
+
// Remove directory recursively
|
|
471
|
+
rmSync(envPath, { recursive: true, force: true });
|
|
472
|
+
return {
|
|
473
|
+
success: true,
|
|
474
|
+
message: `Environment "${name}" deleted`,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
return {
|
|
479
|
+
success: false,
|
|
480
|
+
message: `Failed to delete environment: ${error instanceof Error ? error.message : String(error)}`,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Initialize the environment system
|
|
486
|
+
*
|
|
487
|
+
* Creates the default 'dev' environment if no environments exist.
|
|
488
|
+
* Sets up the 'current' symlink to point to 'dev'.
|
|
489
|
+
* This operation is blocked for AI agents.
|
|
490
|
+
*/
|
|
491
|
+
initialize() {
|
|
492
|
+
// Block agent access for initialization
|
|
493
|
+
if (isAgentEnvironment()) {
|
|
494
|
+
return {
|
|
495
|
+
success: false,
|
|
496
|
+
message: "Environment initialization is not available to AI agents. " +
|
|
497
|
+
"This is a security measure to prevent automated environment setup.",
|
|
498
|
+
nextAction: "Have a human run 'centient env init' from a terminal",
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
// Check if already initialized
|
|
502
|
+
const listResult = this.listEnvironments();
|
|
503
|
+
if (listResult.environments.length > 0) {
|
|
504
|
+
return {
|
|
505
|
+
success: true,
|
|
506
|
+
message: `Environment system already initialized with ${listResult.environments.length} environment(s)`,
|
|
507
|
+
environment: listResult.environments.find((e) => e.isActive) || undefined,
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
// Create default environment
|
|
511
|
+
const createResult = this.createEnvironment(DEFAULT_ENVIRONMENT, {
|
|
512
|
+
setAsCurrent: true,
|
|
513
|
+
description: "Default development environment",
|
|
514
|
+
});
|
|
515
|
+
if (!createResult.success) {
|
|
516
|
+
return createResult;
|
|
517
|
+
}
|
|
518
|
+
return {
|
|
519
|
+
success: true,
|
|
520
|
+
message: `Environment system initialized with default "${DEFAULT_ENVIRONMENT}" environment`,
|
|
521
|
+
environment: createResult.environment,
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Get the path to the current environment's directory
|
|
526
|
+
*
|
|
527
|
+
* Returns the resolved path that the 'current' symlink points to,
|
|
528
|
+
* or null if no current environment is set.
|
|
529
|
+
*/
|
|
530
|
+
getCurrentEnvironmentPath() {
|
|
531
|
+
const currentEnv = this.getCurrentEnvironment();
|
|
532
|
+
if (!currentEnv) {
|
|
533
|
+
return null;
|
|
534
|
+
}
|
|
535
|
+
return getEnvironmentPath(currentEnv);
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Get the path to the current environment's config.json
|
|
539
|
+
*/
|
|
540
|
+
getCurrentConfigPath() {
|
|
541
|
+
const currentEnv = this.getCurrentEnvironment();
|
|
542
|
+
if (!currentEnv) {
|
|
543
|
+
return null;
|
|
544
|
+
}
|
|
545
|
+
return getEnvironmentConfigPath(currentEnv);
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Get the path to the current environment's vault.enc
|
|
549
|
+
*/
|
|
550
|
+
getCurrentVaultPath() {
|
|
551
|
+
const currentEnv = this.getCurrentEnvironment();
|
|
552
|
+
if (!currentEnv) {
|
|
553
|
+
return null;
|
|
554
|
+
}
|
|
555
|
+
return getEnvironmentVaultPath(currentEnv);
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Check if the environment system is initialized
|
|
559
|
+
*/
|
|
560
|
+
isInitialized() {
|
|
561
|
+
return existsSync(ENVIRONMENTS_DIR) && existsSync(CURRENT_LINK);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
// =============================================================================
|
|
565
|
+
// Singleton Instance
|
|
566
|
+
// =============================================================================
|
|
567
|
+
let defaultManager = null;
|
|
568
|
+
/**
|
|
569
|
+
* Get the singleton EnvironmentManager instance
|
|
570
|
+
*/
|
|
571
|
+
export function getEnvironmentManager() {
|
|
572
|
+
if (!defaultManager) {
|
|
573
|
+
defaultManager = new EnvironmentManager();
|
|
574
|
+
}
|
|
575
|
+
return defaultManager;
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Reset the singleton instance (for testing)
|
|
579
|
+
*/
|
|
580
|
+
export function resetEnvironmentManager() {
|
|
581
|
+
defaultManager = null;
|
|
582
|
+
}
|
|
583
|
+
// =============================================================================
|
|
584
|
+
// Convenience Exports
|
|
585
|
+
// =============================================================================
|
|
586
|
+
/**
|
|
587
|
+
* Get the environments directory path
|
|
588
|
+
*/
|
|
589
|
+
export function getEnvironmentsDir() {
|
|
590
|
+
return ENVIRONMENTS_DIR;
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Get the current symlink path
|
|
594
|
+
*/
|
|
595
|
+
export function getCurrentLinkPath() {
|
|
596
|
+
return CURRENT_LINK;
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* Get the default environment name
|
|
600
|
+
*/
|
|
601
|
+
export function getDefaultEnvironmentName() {
|
|
602
|
+
return DEFAULT_ENVIRONMENT;
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=EnvironmentManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentManager.js","sourceRoot":"","sources":["../../src/environment/EnvironmentManager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { encrypt, decrypt, encryptObject, decryptObject } from "./crypto/vault-common.js";
|
|
2
|
+
export { ALGORITHM, IV_LENGTH, AUTH_TAG_LENGTH, KEY_LENGTH } from "./crypto/vault-common.js";
|
|
3
|
+
export { storeCredential, getCredential, deleteCredential, getActiveVaultType, isSessionValid } from "./vault/vault.js";
|
|
4
|
+
export type { VaultBackend, VaultType, StoredCredentialMeta } from "./vault/types.js";
|
|
5
|
+
export { isTTY, canUnicode, isHeadless, canLaunchBrowser, isCIEnvironment, isDockerContainer, isSSHSession } from "./platform/platform.js";
|
|
6
|
+
export { isAgentEnvironment } from "./platform/agent-detect.js";
|
|
7
|
+
export { getEnvironmentManager, EnvironmentManager } from "./environment/EnvironmentManager.js";
|
|
8
|
+
export { runSecrets } from "./cli/secrets-cli.js";
|
|
9
|
+
export type { SecretsOptions } from "./cli/secrets-cli.js";
|
|
10
|
+
export { getKeyFromKeychain, storeKeyInKeychain, storeStringInKeychain, getStringFromKeychain, deleteFromKeychain } from "./crypto/vault-common.js";
|
|
11
|
+
export { isValidKey } from "./vault/vault-utils.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAG7F,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACxH,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGtF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3I,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAGhG,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGpJ,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Encryption
|
|
2
|
+
export { encrypt, decrypt, encryptObject, decryptObject } from "./crypto/vault-common.js";
|
|
3
|
+
export { ALGORITHM, IV_LENGTH, AUTH_TAG_LENGTH, KEY_LENGTH } from "./crypto/vault-common.js";
|
|
4
|
+
// Credential vault
|
|
5
|
+
export { storeCredential, getCredential, deleteCredential, getActiveVaultType, isSessionValid } from "./vault/vault.js";
|
|
6
|
+
// Platform detection
|
|
7
|
+
export { isTTY, canUnicode, isHeadless, canLaunchBrowser, isCIEnvironment, isDockerContainer, isSSHSession } from "./platform/platform.js";
|
|
8
|
+
export { isAgentEnvironment } from "./platform/agent-detect.js";
|
|
9
|
+
// Environment management
|
|
10
|
+
export { getEnvironmentManager, EnvironmentManager } from "./environment/EnvironmentManager.js";
|
|
11
|
+
// CLI
|
|
12
|
+
export { runSecrets } from "./cli/secrets-cli.js";
|
|
13
|
+
// Key storage helpers
|
|
14
|
+
export { getKeyFromKeychain, storeKeyInKeychain, storeStringInKeychain, getStringFromKeychain, deleteFromKeychain } from "./crypto/vault-common.js";
|
|
15
|
+
// Validation
|
|
16
|
+
export { isValidKey } from "./vault/vault-utils.js";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE7F,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGxH,qBAAqB;AACrB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3I,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,yBAAyB;AACzB,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEhG,MAAM;AACN,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,sBAAsB;AACtB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEpJ,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
|