@fentz26/envcp 1.0.91 → 1.1.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/README.md +104 -20
- package/dist/adapters/base.d.ts +10 -2
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +160 -11
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/gemini.d.ts +3 -3
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +10 -4
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/openai.d.ts +3 -3
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +10 -4
- package/dist/adapters/openai.js.map +1 -1
- package/dist/adapters/rest.d.ts +3 -3
- package/dist/adapters/rest.d.ts.map +1 -1
- package/dist/adapters/rest.js +10 -4
- package/dist/adapters/rest.js.map +1 -1
- package/dist/cli/index.js +238 -53
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config-guard.d.ts +37 -0
- package/dist/config/config-guard.d.ts.map +1 -0
- package/dist/config/config-guard.js +212 -0
- package/dist/config/config-guard.js.map +1 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +17 -11
- package/dist/config/manager.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/server/unified.d.ts.map +1 -1
- package/dist/server/unified.js +18 -8
- package/dist/server/unified.js.map +1 -1
- package/dist/storage/index.d.ts +1 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +35 -31
- package/dist/storage/index.js.map +1 -1
- package/dist/types.d.ts +150 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +26 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/crypto.d.ts +18 -0
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +31 -0
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/fs.d.ts +4 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +40 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/http.d.ts +1 -1
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +8 -2
- package/dist/utils/http.js.map +1 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +24 -25
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/update-checker.d.ts +45 -0
- package/dist/utils/update-checker.d.ts.map +1 -0
- package/dist/utils/update-checker.js +200 -0
- package/dist/utils/update-checker.js.map +1 -0
- package/dist/vault/index.d.ts +13 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +90 -0
- package/dist/vault/index.js.map +1 -0
- package/package.json +1 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AAGrD,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,EAAE,MAAM,EAAE,cAAc,GAAE,MAAW,EAAE,aAAa,GAAE,MAAU;IAMjF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B1C,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA0ChD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ3B,MAAM,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiCjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,UAAU,IAAI,OAAO,GAAG,IAAI;IAI5B,gBAAgB,IAAI,MAAM;CAQ3B"}
|
package/dist/utils/session.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import fs from 'fs
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as nodefs from 'fs/promises';
|
|
2
3
|
import * as path from 'path';
|
|
3
|
-
import
|
|
4
|
+
import { withLock } from './lock.js';
|
|
5
|
+
import { ensureDir } from './fs.js';
|
|
4
6
|
import { SessionSchema } from '../types.js';
|
|
5
7
|
import { generateId, encrypt, decrypt } from './crypto.js';
|
|
6
8
|
export class SessionManager {
|
|
@@ -15,7 +17,7 @@ export class SessionManager {
|
|
|
15
17
|
this.maxExtensions = maxExtensions;
|
|
16
18
|
}
|
|
17
19
|
async init() {
|
|
18
|
-
await
|
|
20
|
+
await ensureDir(path.dirname(this.sessionPath));
|
|
19
21
|
}
|
|
20
22
|
async create(password) {
|
|
21
23
|
const now = new Date();
|
|
@@ -32,25 +34,26 @@ export class SessionManager {
|
|
|
32
34
|
session: this.session,
|
|
33
35
|
});
|
|
34
36
|
const encrypted = await encrypt(sessionData, password);
|
|
35
|
-
|
|
36
|
-
await
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
await fs.writeFile(this.sessionPath, encrypted, { encoding: 'utf8', mode: 0o600 });
|
|
40
|
-
}
|
|
41
|
-
finally {
|
|
42
|
-
await releaseCreate();
|
|
43
|
-
}
|
|
37
|
+
await nodefs.writeFile(this.sessionPath, '', { encoding: 'utf8', mode: 0o600, flag: 'a' });
|
|
38
|
+
await withLock(this.sessionPath, async () => {
|
|
39
|
+
await nodefs.writeFile(this.sessionPath, encrypted, { encoding: 'utf8', mode: 0o600 });
|
|
40
|
+
});
|
|
44
41
|
return this.session;
|
|
45
42
|
}
|
|
46
43
|
async load(password) {
|
|
47
44
|
let encrypted;
|
|
48
45
|
try {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
const handle = await nodefs.open(this.sessionPath, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
|
|
47
|
+
try {
|
|
48
|
+
const stat = await handle.stat();
|
|
49
|
+
if (!stat.isFile()) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
encrypted = await handle.readFile({ encoding: 'utf8' });
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await handle.close();
|
|
52
56
|
}
|
|
53
|
-
encrypted = await fs.readFile(this.sessionPath, 'utf8');
|
|
54
57
|
}
|
|
55
58
|
catch (err) {
|
|
56
59
|
if (err.code === 'ENOENT')
|
|
@@ -102,21 +105,17 @@ export class SessionManager {
|
|
|
102
105
|
session: this.session,
|
|
103
106
|
});
|
|
104
107
|
const encrypted = await encrypt(sessionData, this.password);
|
|
105
|
-
await
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
finally {
|
|
111
|
-
await releaseExtend();
|
|
112
|
-
}
|
|
108
|
+
await nodefs.writeFile(this.sessionPath, '', { encoding: 'utf8', mode: 0o600, flag: 'a' });
|
|
109
|
+
await withLock(this.sessionPath, async () => {
|
|
110
|
+
await nodefs.writeFile(this.sessionPath, encrypted, { encoding: 'utf8', mode: 0o600 });
|
|
111
|
+
});
|
|
113
112
|
return this.session;
|
|
114
113
|
}
|
|
115
114
|
async destroy() {
|
|
116
115
|
this.session = null;
|
|
117
116
|
this.password = null;
|
|
118
117
|
try {
|
|
119
|
-
await
|
|
118
|
+
await nodefs.unlink(this.sessionPath);
|
|
120
119
|
}
|
|
121
120
|
catch (err) {
|
|
122
121
|
if (err.code !== 'ENOENT')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface VersionInfo {
|
|
2
|
+
latest: string;
|
|
3
|
+
current: string;
|
|
4
|
+
updateAvailable: boolean;
|
|
5
|
+
critical: boolean;
|
|
6
|
+
advisory?: {
|
|
7
|
+
id: string;
|
|
8
|
+
summary: string;
|
|
9
|
+
severity: string;
|
|
10
|
+
url: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface CachedCheck {
|
|
14
|
+
timestamp: number;
|
|
15
|
+
latest: string;
|
|
16
|
+
critical: boolean;
|
|
17
|
+
advisory?: {
|
|
18
|
+
id: string;
|
|
19
|
+
summary: string;
|
|
20
|
+
severity: string;
|
|
21
|
+
url: string;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface ReleaseInfo {
|
|
25
|
+
tag: string;
|
|
26
|
+
critical: boolean;
|
|
27
|
+
body: string;
|
|
28
|
+
url: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function getCurrentVersion(): string;
|
|
31
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
32
|
+
export declare function parseRelease(data: any): ReleaseInfo;
|
|
33
|
+
export declare function extractAdvisory(body: string, url: string): {
|
|
34
|
+
id: string;
|
|
35
|
+
summary: string;
|
|
36
|
+
severity: string;
|
|
37
|
+
url: string;
|
|
38
|
+
} | undefined;
|
|
39
|
+
export declare function getCachedResult(projectPath: string): CachedCheck | null;
|
|
40
|
+
export declare function writeCache(projectPath: string, data: CachedCheck): void;
|
|
41
|
+
export declare function fetchLatestRelease(): Promise<ReleaseInfo>;
|
|
42
|
+
export declare function checkForUpdate(projectPath?: string, fetcher?: () => Promise<ReleaseInfo>): Promise<VersionInfo>;
|
|
43
|
+
export declare function formatUpdateMessage(info: VersionInfo): string;
|
|
44
|
+
export declare function logUpdateCheck(projectPath: string, info: VersionInfo): Promise<void>;
|
|
45
|
+
//# sourceMappingURL=update-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/utils/update-checker.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAW1C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,WAAW,CAKnD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAgBrI;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAUvE;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CASvE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,CAkC/D;AAED,wBAAsB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAuDrH;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAyB7D;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1F"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
const GITHUB_REPO = 'fentz26/EnvCP';
|
|
4
|
+
const CACHE_FILE = '.envcp/.update-cache.json';
|
|
5
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
6
|
+
export function getCurrentVersion() {
|
|
7
|
+
try {
|
|
8
|
+
/* istanbul ignore next -- ts-jest ESM __dirname source-mapping artifact */
|
|
9
|
+
const pkgPath = path.join(__dirname, '..', '..', 'package.json');
|
|
10
|
+
/* istanbul ignore next */
|
|
11
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
12
|
+
/* istanbul ignore next */
|
|
13
|
+
return pkg.version;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return '0.0.0';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function compareVersions(a, b) {
|
|
20
|
+
const pa = a.replace(/^v/, '').split('.').map(Number);
|
|
21
|
+
const pb = b.replace(/^v/, '').split('.').map(Number);
|
|
22
|
+
const len = Math.max(pa.length, pb.length);
|
|
23
|
+
for (let i = 0; i < len; i++) {
|
|
24
|
+
const na = pa[i] || 0;
|
|
25
|
+
const nb = pb[i] || 0;
|
|
26
|
+
if (na > nb)
|
|
27
|
+
return 1;
|
|
28
|
+
if (na < nb)
|
|
29
|
+
return -1;
|
|
30
|
+
}
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
export function parseRelease(data) {
|
|
34
|
+
const tag = (data.tag_name || '').replace(/^v/, '');
|
|
35
|
+
const body = data.body || '';
|
|
36
|
+
const critical = /\[critical\]|severity:\s*critical|🚨/i.test(body);
|
|
37
|
+
return { tag, critical, body, url: data.html_url || '' };
|
|
38
|
+
}
|
|
39
|
+
export function extractAdvisory(body, url) {
|
|
40
|
+
const advMatch = body.match(/advisory[_\s-]?id:\s*(\S+)/i) ||
|
|
41
|
+
body.match(/(ENVCP-\d{4}-\d+)/i);
|
|
42
|
+
const sevMatch = body.match(/severity:\s*(critical|high|medium|low)/i);
|
|
43
|
+
if (!advMatch && !sevMatch)
|
|
44
|
+
return undefined;
|
|
45
|
+
const lines = body.split('\n').filter(l => l.trim().length > 0);
|
|
46
|
+
const summaryLine = lines.find(l => /summary|description|fixes|security/i.test(l) && l.length > 10 && l.length < 200);
|
|
47
|
+
return {
|
|
48
|
+
id: advMatch ? advMatch[1] : 'N/A',
|
|
49
|
+
summary: summaryLine ? summaryLine.replace(/^#+\s*/, '').trim() : 'Security update available',
|
|
50
|
+
severity: sevMatch ? sevMatch[1].toLowerCase() : 'medium',
|
|
51
|
+
url: url || `https://github.com/${GITHUB_REPO}/security/advisories`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function getCachedResult(projectPath) {
|
|
55
|
+
try {
|
|
56
|
+
const cachePath = path.join(projectPath, CACHE_FILE);
|
|
57
|
+
if (!fs.existsSync(cachePath))
|
|
58
|
+
return null;
|
|
59
|
+
const cached = JSON.parse(fs.readFileSync(cachePath, 'utf8'));
|
|
60
|
+
if (Date.now() - cached.timestamp > CACHE_TTL_MS)
|
|
61
|
+
return null;
|
|
62
|
+
return cached;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function writeCache(projectPath, data) {
|
|
69
|
+
try {
|
|
70
|
+
const cachePath = path.join(projectPath, CACHE_FILE);
|
|
71
|
+
const cacheDir = path.dirname(cachePath);
|
|
72
|
+
if (!fs.existsSync(cacheDir)) {
|
|
73
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
74
|
+
}
|
|
75
|
+
fs.writeFileSync(cachePath, JSON.stringify(data, null, 2), 'utf8');
|
|
76
|
+
}
|
|
77
|
+
catch { /* ignore */ }
|
|
78
|
+
}
|
|
79
|
+
export async function fetchLatestRelease() {
|
|
80
|
+
const https = await import('https');
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const options = {
|
|
83
|
+
hostname: 'api.github.com',
|
|
84
|
+
path: `/repos/${GITHUB_REPO}/releases/latest`,
|
|
85
|
+
method: 'GET',
|
|
86
|
+
headers: {
|
|
87
|
+
'User-Agent': 'envcp-update-checker',
|
|
88
|
+
'Accept': 'application/vnd.github+json',
|
|
89
|
+
},
|
|
90
|
+
timeout: 5000,
|
|
91
|
+
};
|
|
92
|
+
const req = https.request(options, (res) => {
|
|
93
|
+
let body = '';
|
|
94
|
+
res.on('data', (chunk) => { body += chunk.toString(); });
|
|
95
|
+
res.on('end', () => {
|
|
96
|
+
try {
|
|
97
|
+
const data = JSON.parse(body);
|
|
98
|
+
if (res.statusCode !== 200) {
|
|
99
|
+
reject(new Error(data.message || `GitHub API returned ${res.statusCode}`));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
resolve(parseRelease(data));
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
reject(new Error('Failed to parse response'));
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
req.on('error', reject);
|
|
110
|
+
req.on('timeout', () => { req.destroy(); reject(new Error('Request timed out')); });
|
|
111
|
+
req.end();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export async function checkForUpdate(projectPath, fetcher) {
|
|
115
|
+
const current = getCurrentVersion();
|
|
116
|
+
const cwd = projectPath || process.cwd();
|
|
117
|
+
const cached = getCachedResult(cwd);
|
|
118
|
+
let latest;
|
|
119
|
+
let critical = false;
|
|
120
|
+
let advisoryBody = '';
|
|
121
|
+
let advisoryUrl = '';
|
|
122
|
+
let advisoryData;
|
|
123
|
+
const doFetch = fetcher || fetchLatestRelease;
|
|
124
|
+
if (cached) {
|
|
125
|
+
latest = cached.latest;
|
|
126
|
+
critical = cached.critical;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
try {
|
|
130
|
+
const release = await doFetch();
|
|
131
|
+
latest = release.tag;
|
|
132
|
+
critical = release.critical;
|
|
133
|
+
advisoryBody = release.body;
|
|
134
|
+
advisoryUrl = release.url;
|
|
135
|
+
writeCache(cwd, {
|
|
136
|
+
timestamp: Date.now(),
|
|
137
|
+
latest,
|
|
138
|
+
critical,
|
|
139
|
+
advisory: extractAdvisory(advisoryBody, advisoryUrl),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return {
|
|
144
|
+
latest: current,
|
|
145
|
+
current,
|
|
146
|
+
updateAvailable: false,
|
|
147
|
+
critical: false,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const updateAvailable = compareVersions(latest, current) > 0;
|
|
152
|
+
if (updateAvailable && advisoryBody) {
|
|
153
|
+
advisoryData = extractAdvisory(advisoryBody, advisoryUrl);
|
|
154
|
+
}
|
|
155
|
+
else if (cached?.advisory && updateAvailable) {
|
|
156
|
+
advisoryData = cached.advisory;
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
latest,
|
|
160
|
+
current,
|
|
161
|
+
updateAvailable,
|
|
162
|
+
critical: updateAvailable && critical,
|
|
163
|
+
advisory: advisoryData,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function formatUpdateMessage(info) {
|
|
167
|
+
if (!info.updateAvailable) {
|
|
168
|
+
return `EnvCP is up to date (v${info.current})`;
|
|
169
|
+
}
|
|
170
|
+
const lines = [];
|
|
171
|
+
if (info.critical) {
|
|
172
|
+
lines.push(`🚨 Critical security update available: v${info.latest} (current: v${info.current})`);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
lines.push(`Update available: v${info.latest} (current: v${info.current})`);
|
|
176
|
+
}
|
|
177
|
+
if (info.advisory) {
|
|
178
|
+
lines.push(` Advisory: ${info.advisory.id} [${info.advisory.severity}]`);
|
|
179
|
+
lines.push(` ${info.advisory.summary}`);
|
|
180
|
+
if (info.advisory.url) {
|
|
181
|
+
lines.push(` ${info.advisory.url}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
lines.push('');
|
|
185
|
+
lines.push(' Run: npm update -g @fentz26/envcp');
|
|
186
|
+
return lines.join('\n');
|
|
187
|
+
}
|
|
188
|
+
export async function logUpdateCheck(projectPath, info) {
|
|
189
|
+
try {
|
|
190
|
+
const logDir = path.join(projectPath, '.envcp', 'logs');
|
|
191
|
+
if (!fs.existsSync(logDir)) {
|
|
192
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
193
|
+
}
|
|
194
|
+
const logPath = path.join(logDir, 'audit.log');
|
|
195
|
+
const line = `${new Date().toISOString()} UPDATE_CHECK current=${info.current} latest=${info.latest} available=${info.updateAvailable}\n`;
|
|
196
|
+
fs.appendFileSync(logPath, line, 'utf8');
|
|
197
|
+
}
|
|
198
|
+
catch { /* ignore */ }
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=update-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/utils/update-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EnvCPConfig } from '../types.js';
|
|
2
|
+
export declare function getGlobalVaultPath(config: EnvCPConfig): string;
|
|
3
|
+
export declare function getProjectVaultPath(projectPath: string, config: EnvCPConfig): string;
|
|
4
|
+
export declare function resolveVaultPath(projectPath: string, config: EnvCPConfig): Promise<string>;
|
|
5
|
+
export declare function getActiveVault(projectPath: string): Promise<string | null>;
|
|
6
|
+
export declare function setActiveVault(projectPath: string, vaultName: string): Promise<void>;
|
|
7
|
+
export declare function listVaults(projectPath: string, config: EnvCPConfig): Promise<{
|
|
8
|
+
name: string;
|
|
9
|
+
path: string;
|
|
10
|
+
active: boolean;
|
|
11
|
+
}[]>;
|
|
12
|
+
export declare function initNamedVault(projectPath: string, name: string): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vault/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAa,WAAW,EAAE,MAAM,aAAa,CAAC;AAKrD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAG9D;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAEpF;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBhG;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQhF;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1F;AAED,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,CAiCrI;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUvF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import { ensureDir, pathExists } from '../utils/fs.js';
|
|
5
|
+
const ACTIVE_VAULT_FILE = '.envcp/.active-vault';
|
|
6
|
+
const NAMED_VAULTS_DIR = '.envcp/vaults';
|
|
7
|
+
export function getGlobalVaultPath(config) {
|
|
8
|
+
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
9
|
+
return path.join(home, config.vault.global_path);
|
|
10
|
+
}
|
|
11
|
+
export function getProjectVaultPath(projectPath, config) {
|
|
12
|
+
return path.join(projectPath, config.storage.path);
|
|
13
|
+
}
|
|
14
|
+
export async function resolveVaultPath(projectPath, config) {
|
|
15
|
+
const activeVault = await getActiveVault(projectPath);
|
|
16
|
+
if (activeVault) {
|
|
17
|
+
if (activeVault === 'global') {
|
|
18
|
+
return getGlobalVaultPath(config);
|
|
19
|
+
}
|
|
20
|
+
if (activeVault === 'project') {
|
|
21
|
+
return getProjectVaultPath(projectPath, config);
|
|
22
|
+
}
|
|
23
|
+
const namedDir = path.join(projectPath, NAMED_VAULTS_DIR, activeVault);
|
|
24
|
+
if (await pathExists(namedDir)) {
|
|
25
|
+
return path.join(namedDir, 'store.enc');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const mode = config.vault.default;
|
|
29
|
+
if (mode === 'global') {
|
|
30
|
+
return getGlobalVaultPath(config);
|
|
31
|
+
}
|
|
32
|
+
return getProjectVaultPath(projectPath, config);
|
|
33
|
+
}
|
|
34
|
+
export async function getActiveVault(projectPath) {
|
|
35
|
+
const activeFile = path.join(projectPath, ACTIVE_VAULT_FILE);
|
|
36
|
+
try {
|
|
37
|
+
const content = await fs.readFile(activeFile, 'utf8');
|
|
38
|
+
return content.trim() || null;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function setActiveVault(projectPath, vaultName) {
|
|
45
|
+
const activeFile = path.join(projectPath, ACTIVE_VAULT_FILE);
|
|
46
|
+
await ensureDir(path.dirname(activeFile));
|
|
47
|
+
await fs.writeFile(activeFile, vaultName, 'utf8');
|
|
48
|
+
}
|
|
49
|
+
export async function listVaults(projectPath, config) {
|
|
50
|
+
const vaults = [];
|
|
51
|
+
const activeVault = await getActiveVault(projectPath);
|
|
52
|
+
const effectiveActive = activeVault || config.vault.default;
|
|
53
|
+
vaults.push({
|
|
54
|
+
name: 'project',
|
|
55
|
+
path: getProjectVaultPath(projectPath, config),
|
|
56
|
+
active: effectiveActive === 'project',
|
|
57
|
+
});
|
|
58
|
+
const globalPath = getGlobalVaultPath(config);
|
|
59
|
+
vaults.push({
|
|
60
|
+
name: 'global',
|
|
61
|
+
path: globalPath,
|
|
62
|
+
active: effectiveActive === 'global',
|
|
63
|
+
});
|
|
64
|
+
const namedDir = path.join(projectPath, NAMED_VAULTS_DIR);
|
|
65
|
+
if (await pathExists(namedDir)) {
|
|
66
|
+
const entries = await fs.readdir(namedDir, { withFileTypes: true });
|
|
67
|
+
for (const entry of entries) {
|
|
68
|
+
if (entry.isDirectory()) {
|
|
69
|
+
vaults.push({
|
|
70
|
+
name: entry.name,
|
|
71
|
+
path: path.join(namedDir, entry.name, 'store.enc'),
|
|
72
|
+
active: effectiveActive === entry.name,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return vaults;
|
|
78
|
+
}
|
|
79
|
+
export async function initNamedVault(projectPath, name) {
|
|
80
|
+
if (name === 'project' || name === 'global') {
|
|
81
|
+
throw new Error(`Vault name "${name}" is reserved`);
|
|
82
|
+
}
|
|
83
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
|
|
84
|
+
throw new Error('Vault name must contain only letters, numbers, hyphens, and underscores');
|
|
85
|
+
}
|
|
86
|
+
const vaultDir = path.join(projectPath, NAMED_VAULTS_DIR, name);
|
|
87
|
+
await ensureDir(vaultDir);
|
|
88
|
+
return path.join(vaultDir, 'store.enc');
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vault/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AACjD,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,MAAmB;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,MAAmB;IAC7E,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACvE,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAClC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,SAAiB;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB,EAAE,MAAmB;IACvE,MAAM,MAAM,GAAsD,EAAE,CAAC;IACrE,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAE5D,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC;QAC9C,MAAM,EAAE,eAAe,KAAK,SAAS;KACtC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,eAAe,KAAK,QAAQ;KACrC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC1D,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC;oBAClD,MAAM,EAAE,eAAe,KAAK,KAAK,CAAC,IAAI;iBACvC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,IAAY;IACpE,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,eAAe,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fentz26/envcp",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"mcpName": "dev.fentz.envcp/envcp",
|
|
5
5
|
"description": "MCP server for secure environment variable management - Keep your secrets safe from AI agents",
|
|
6
6
|
"homepage": "https://envcp.fentz.dev",
|
|
@@ -39,21 +39,16 @@
|
|
|
39
39
|
"argon2": "^0.44.0",
|
|
40
40
|
"chalk": "^4.1.2",
|
|
41
41
|
"commander": "^11.1.0",
|
|
42
|
-
"dotenv": "^17.4.1",
|
|
43
|
-
"fs-extra": "^11.2.0",
|
|
44
42
|
"inquirer": "^8.2.6",
|
|
45
43
|
"js-yaml": "^4.1.0",
|
|
46
|
-
"proper-lockfile": "^4.1.2",
|
|
47
44
|
"zod": "^3.22.4"
|
|
48
45
|
},
|
|
49
46
|
"devDependencies": {
|
|
50
47
|
"@types/argon2": "^0.14.1",
|
|
51
|
-
"@types/fs-extra": "^11.0.4",
|
|
52
48
|
"@types/inquirer": "^9.0.7",
|
|
53
49
|
"@types/jest": "^30.0.0",
|
|
54
50
|
"@types/js-yaml": "^4.0.9",
|
|
55
51
|
"@types/node": "^20.10.0",
|
|
56
|
-
"@types/proper-lockfile": "^4.1.4",
|
|
57
52
|
"jest": "^30.3.0",
|
|
58
53
|
"ts-jest": "^29.4.9",
|
|
59
54
|
"typescript": "^5.3.0"
|