@fentz26/envcp 1.0.6 → 1.0.8
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/LICENSE +28 -17
- package/README.md +25 -5
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +23 -2
- package/dist/adapters/base.js.map +1 -1
- package/dist/cli/index.js +103 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/config/manager.d.ts +15 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +22 -6
- package/dist/config/manager.js.map +1 -1
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +32 -10
- package/dist/storage/index.js.map +1 -1
- package/dist/types.d.ts +1 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -3
- package/dist/types.js.map +1 -1
- package/dist/utils/crypto.d.ts +25 -0
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +35 -5
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +25 -15
- package/dist/utils/session.js.map +1 -1
- package/package.json +6 -3
- package/scripts/convert-wiki.sh +91 -0
- package/scripts/install.sh +54 -0
- package/scripts/postinstall.js +39 -0
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/crypto.d.ts
CHANGED
|
@@ -1,8 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derives a 256-bit key from a password and salt using PBKDF2-SHA512.
|
|
3
|
+
* @param password - User password
|
|
4
|
+
* @param salt - Random salt (64 bytes recommended)
|
|
5
|
+
*/
|
|
1
6
|
export declare function deriveKey(password: string, salt: Buffer): Buffer;
|
|
7
|
+
/**
|
|
8
|
+
* Encrypts plaintext using AES-256-GCM with a derived key.
|
|
9
|
+
* Output format: `v1:<salt_hex><iv_hex><authTag_hex><ciphertext_hex>`
|
|
10
|
+
* @param text - Plaintext to encrypt
|
|
11
|
+
* @param password - Password used to derive the encryption key
|
|
12
|
+
* @returns Version-prefixed hex-encoded encrypted string
|
|
13
|
+
*/
|
|
2
14
|
export declare function encrypt(text: string, password: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Decrypts a value produced by {@link encrypt}.
|
|
17
|
+
* Backwards-compatible: accepts both prefixed (`v1:...`) and unprefixed legacy data.
|
|
18
|
+
* @param encryptedData - Hex-encoded encrypted string (with or without version prefix)
|
|
19
|
+
* @param password - Password used during encryption
|
|
20
|
+
* @throws If the password is wrong or the data is corrupted (GCM auth tag mismatch)
|
|
21
|
+
*/
|
|
3
22
|
export declare function decrypt(encryptedData: string, password: string): string;
|
|
4
23
|
export declare function generateId(): string;
|
|
5
24
|
export declare function generateSessionToken(): string;
|
|
25
|
+
/**
|
|
26
|
+
* Masks a secret value for display, revealing only the first and last `showLength` characters.
|
|
27
|
+
* Short values are fully masked.
|
|
28
|
+
* @param value - The secret to mask
|
|
29
|
+
* @param showLength - Characters to reveal at each end (default 4)
|
|
30
|
+
*/
|
|
6
31
|
export declare function maskValue(value: string, showLength?: number): string;
|
|
7
32
|
export declare function validatePassword(password: string, config: {
|
|
8
33
|
min_length?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY9D;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBvE;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,GAAG,MAAM,CAKvE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgCrC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAGD,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAGD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhF;AAGD,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjF"}
|
package/dist/utils/crypto.js
CHANGED
|
@@ -4,9 +4,22 @@ const IV_LENGTH = 16;
|
|
|
4
4
|
const AUTH_TAG_LENGTH = 16;
|
|
5
5
|
const SALT_LENGTH = 64;
|
|
6
6
|
const ITERATIONS = 100000;
|
|
7
|
+
const VERSION_PREFIX = 'v1:';
|
|
8
|
+
/**
|
|
9
|
+
* Derives a 256-bit key from a password and salt using PBKDF2-SHA512.
|
|
10
|
+
* @param password - User password
|
|
11
|
+
* @param salt - Random salt (64 bytes recommended)
|
|
12
|
+
*/
|
|
7
13
|
export function deriveKey(password, salt) {
|
|
8
14
|
return crypto.pbkdf2Sync(password, salt, ITERATIONS, 32, 'sha512');
|
|
9
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Encrypts plaintext using AES-256-GCM with a derived key.
|
|
18
|
+
* Output format: `v1:<salt_hex><iv_hex><authTag_hex><ciphertext_hex>`
|
|
19
|
+
* @param text - Plaintext to encrypt
|
|
20
|
+
* @param password - Password used to derive the encryption key
|
|
21
|
+
* @returns Version-prefixed hex-encoded encrypted string
|
|
22
|
+
*/
|
|
10
23
|
export function encrypt(text, password) {
|
|
11
24
|
const salt = crypto.randomBytes(SALT_LENGTH);
|
|
12
25
|
const key = deriveKey(password, salt);
|
|
@@ -15,13 +28,24 @@ export function encrypt(text, password) {
|
|
|
15
28
|
let encrypted = cipher.update(text, 'utf8', 'hex');
|
|
16
29
|
encrypted += cipher.final('hex');
|
|
17
30
|
const authTag = cipher.getAuthTag();
|
|
18
|
-
return salt.toString('hex') + iv.toString('hex') + authTag.toString('hex') + encrypted;
|
|
31
|
+
return VERSION_PREFIX + salt.toString('hex') + iv.toString('hex') + authTag.toString('hex') + encrypted;
|
|
19
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Decrypts a value produced by {@link encrypt}.
|
|
35
|
+
* Backwards-compatible: accepts both prefixed (`v1:...`) and unprefixed legacy data.
|
|
36
|
+
* @param encryptedData - Hex-encoded encrypted string (with or without version prefix)
|
|
37
|
+
* @param password - Password used during encryption
|
|
38
|
+
* @throws If the password is wrong or the data is corrupted (GCM auth tag mismatch)
|
|
39
|
+
*/
|
|
20
40
|
export function decrypt(encryptedData, password) {
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
41
|
+
// Strip version prefix if present (backwards-compatible: no prefix = v1)
|
|
42
|
+
const data = encryptedData.startsWith(VERSION_PREFIX)
|
|
43
|
+
? encryptedData.slice(VERSION_PREFIX.length)
|
|
44
|
+
: encryptedData;
|
|
45
|
+
const salt = Buffer.from(data.slice(0, SALT_LENGTH * 2), 'hex');
|
|
46
|
+
const iv = Buffer.from(data.slice(SALT_LENGTH * 2, SALT_LENGTH * 2 + IV_LENGTH * 2), 'hex');
|
|
47
|
+
const authTag = Buffer.from(data.slice(SALT_LENGTH * 2 + IV_LENGTH * 2, SALT_LENGTH * 2 + IV_LENGTH * 2 + AUTH_TAG_LENGTH * 2), 'hex');
|
|
48
|
+
const encrypted = data.slice(SALT_LENGTH * 2 + IV_LENGTH * 2 + AUTH_TAG_LENGTH * 2);
|
|
25
49
|
const key = deriveKey(password, salt);
|
|
26
50
|
const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
|
|
27
51
|
decipher.setAuthTag(authTag);
|
|
@@ -35,6 +59,12 @@ export function generateId() {
|
|
|
35
59
|
export function generateSessionToken() {
|
|
36
60
|
return crypto.randomBytes(32).toString('hex');
|
|
37
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Masks a secret value for display, revealing only the first and last `showLength` characters.
|
|
64
|
+
* Short values are fully masked.
|
|
65
|
+
* @param value - The secret to mask
|
|
66
|
+
* @param showLength - Characters to reveal at each end (default 4)
|
|
67
|
+
*/
|
|
38
68
|
export function maskValue(value, showLength = 4) {
|
|
39
69
|
if (value.length <= showLength * 2) {
|
|
40
70
|
return '*'.repeat(value.length);
|
package/dist/utils/crypto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,UAAU,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAGA,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;IAgC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAmChD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ3B,MAAM,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAsCjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,UAAU,IAAI,OAAO,GAAG,IAAI;IAI5B,gBAAgB,IAAI,MAAM;CAQ3B"}
|
package/dist/utils/session.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import fs from 'fs-extra';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
+
import lockfile from 'proper-lockfile';
|
|
3
4
|
import { SessionSchema } from '../types.js';
|
|
4
5
|
import { generateId, encrypt, decrypt } from './crypto.js';
|
|
5
|
-
import * as crypto from 'crypto';
|
|
6
|
-
const PBKDF2_ITERATIONS = 100000;
|
|
7
|
-
function hashPassword(password, salt) {
|
|
8
|
-
return crypto.pbkdf2Sync(password, salt, PBKDF2_ITERATIONS, 32, 'sha512');
|
|
9
|
-
}
|
|
10
6
|
export class SessionManager {
|
|
11
7
|
sessionPath;
|
|
12
8
|
session = null;
|
|
@@ -32,15 +28,20 @@ export class SessionManager {
|
|
|
32
28
|
last_access: now.toISOString(),
|
|
33
29
|
};
|
|
34
30
|
this.password = password;
|
|
35
|
-
const salt = crypto.randomBytes(32);
|
|
36
|
-
const passwordHash = hashPassword(password, salt);
|
|
37
31
|
const sessionData = JSON.stringify({
|
|
38
32
|
session: this.session,
|
|
39
|
-
passwordHash: passwordHash.toString('hex'),
|
|
40
|
-
salt: salt.toString('hex'),
|
|
41
33
|
});
|
|
42
34
|
const encrypted = encrypt(sessionData, password);
|
|
43
|
-
await fs.
|
|
35
|
+
if (!await fs.pathExists(this.sessionPath)) {
|
|
36
|
+
await fs.writeFile(this.sessionPath, '', 'utf8');
|
|
37
|
+
}
|
|
38
|
+
const releaseCreate = await lockfile.lock(this.sessionPath, { retries: { retries: 3, minTimeout: 50 } });
|
|
39
|
+
try {
|
|
40
|
+
await fs.writeFile(this.sessionPath, encrypted, 'utf8');
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
await releaseCreate();
|
|
44
|
+
}
|
|
44
45
|
return this.session;
|
|
45
46
|
}
|
|
46
47
|
async load(password) {
|
|
@@ -48,6 +49,10 @@ export class SessionManager {
|
|
|
48
49
|
return null;
|
|
49
50
|
}
|
|
50
51
|
try {
|
|
52
|
+
const stat = await fs.lstat(this.sessionPath);
|
|
53
|
+
if (!stat.isFile()) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
51
56
|
const encrypted = await fs.readFile(this.sessionPath, 'utf8');
|
|
52
57
|
const pwd = password || this.password;
|
|
53
58
|
if (!pwd) {
|
|
@@ -89,15 +94,20 @@ export class SessionManager {
|
|
|
89
94
|
this.session.expires = expires.toISOString();
|
|
90
95
|
this.session.extensions += 1;
|
|
91
96
|
this.session.last_access = now.toISOString();
|
|
92
|
-
const salt = crypto.randomBytes(32);
|
|
93
|
-
const passwordHash = hashPassword(this.password, salt);
|
|
94
97
|
const sessionData = JSON.stringify({
|
|
95
98
|
session: this.session,
|
|
96
|
-
passwordHash: passwordHash.toString('hex'),
|
|
97
|
-
salt: salt.toString('hex'),
|
|
98
99
|
});
|
|
99
100
|
const encrypted = encrypt(sessionData, this.password);
|
|
100
|
-
await fs.
|
|
101
|
+
if (!await fs.pathExists(this.sessionPath)) {
|
|
102
|
+
await fs.writeFile(this.sessionPath, '', 'utf8');
|
|
103
|
+
}
|
|
104
|
+
const releaseExtend = await lockfile.lock(this.sessionPath, { retries: { retries: 3, minTimeout: 50 } });
|
|
105
|
+
try {
|
|
106
|
+
await fs.writeFile(this.sessionPath, encrypted, 'utf8');
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
await releaseExtend();
|
|
110
|
+
}
|
|
101
111
|
return this.session;
|
|
102
112
|
}
|
|
103
113
|
async destroy() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fentz26/envcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "MCP server for secure environment variable management - Keep your secrets safe from AI agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"build": "tsc",
|
|
13
13
|
"start": "node dist/index.js",
|
|
14
14
|
"dev": "ts-node src/index.ts",
|
|
15
|
-
"test": "jest"
|
|
15
|
+
"test": "NODE_OPTIONS='--experimental-vm-modules' jest"
|
|
16
16
|
},
|
|
17
17
|
"keywords": [
|
|
18
18
|
"mcp",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"model-context-protocol"
|
|
25
25
|
],
|
|
26
26
|
"author": "fentz26",
|
|
27
|
-
"license": "
|
|
27
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
30
30
|
"chalk": "^4.1.2",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"fs-extra": "^11.2.0",
|
|
34
34
|
"inquirer": "^8.2.6",
|
|
35
35
|
"js-yaml": "^4.1.0",
|
|
36
|
+
"proper-lockfile": "^4.1.2",
|
|
36
37
|
"zod": "^3.22.4"
|
|
37
38
|
},
|
|
38
39
|
"devDependencies": {
|
|
@@ -41,12 +42,14 @@
|
|
|
41
42
|
"@types/jest": "^30.0.0",
|
|
42
43
|
"@types/js-yaml": "^4.0.9",
|
|
43
44
|
"@types/node": "^20.10.0",
|
|
45
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
44
46
|
"jest": "^30.3.0",
|
|
45
47
|
"ts-jest": "^29.4.9",
|
|
46
48
|
"typescript": "^5.3.0"
|
|
47
49
|
},
|
|
48
50
|
"files": [
|
|
49
51
|
"dist",
|
|
52
|
+
"scripts",
|
|
50
53
|
"README.md",
|
|
51
54
|
"LICENSE"
|
|
52
55
|
],
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Wiki to MDX conversion script
|
|
4
|
+
# Converts wiki markdown files to Mintlify MDX format
|
|
5
|
+
|
|
6
|
+
WIKI_DIR="/home/fentz/EnvCP/wiki-content"
|
|
7
|
+
DOCS_DIR="/home/fentz/EnvCP/docs"
|
|
8
|
+
|
|
9
|
+
# Mapping of wiki files to docs locations
|
|
10
|
+
declare -A file_map=(
|
|
11
|
+
["Home.md"]="index.mdx"
|
|
12
|
+
["Installation.md"]="installation.mdx"
|
|
13
|
+
["Quick-Start-Guide.md"]="quick-start.mdx"
|
|
14
|
+
["CLI-Reference.md"]="cli-reference/commands.mdx"
|
|
15
|
+
["Configuration-Reference.md"]="configuration/reference.mdx"
|
|
16
|
+
["MCP-Integration.md"]="integrations/mcp.mdx"
|
|
17
|
+
["OpenAI-Integration.md"]="integrations/openai.mdx"
|
|
18
|
+
["Gemini-Integration.md"]="integrations/gemini.mdx"
|
|
19
|
+
["Local-LLM-Integration.md"]="integrations/local-llm.mdx"
|
|
20
|
+
["API-Reference.md"]="api-reference/endpoints.mdx"
|
|
21
|
+
["Security-Best-Practices.md"]="security/best-practices.mdx"
|
|
22
|
+
["Session-Management.md"]="advanced/session-management.mdx"
|
|
23
|
+
["Troubleshooting.md"]="advanced/troubleshooting.mdx"
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
convert_file() {
|
|
27
|
+
local input_file="$1"
|
|
28
|
+
local output_file="$2"
|
|
29
|
+
local filename=$(basename "$input_file")
|
|
30
|
+
|
|
31
|
+
# Add frontmatter based on file
|
|
32
|
+
local title="${filename%.md}"
|
|
33
|
+
title="${title//-/ }"
|
|
34
|
+
title="${title//_/ }"
|
|
35
|
+
|
|
36
|
+
# Extract first heading as title
|
|
37
|
+
local first_heading=$(grep -m 1 "^# " "$input_file" | sed 's/^# //')
|
|
38
|
+
if [ -n "$first_heading" ]; then
|
|
39
|
+
title="$first_heading"
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# Create temp file with frontmatter
|
|
43
|
+
echo "---" > /tmp/temp_mdx.mdx
|
|
44
|
+
echo "title: $title" >> /tmp/temp_mdx.mdx
|
|
45
|
+
echo "---" >> /tmp/temp_mdx.mdx
|
|
46
|
+
echo "" >> /tmp/temp_mdx.mdx
|
|
47
|
+
|
|
48
|
+
# Convert wiki-specific markdown to MDX
|
|
49
|
+
cat "$input_file" | \
|
|
50
|
+
# Convert wiki links to docs links
|
|
51
|
+
sed 's/\[Installation\](Installation)/[Installation](\/installation)/g' | \
|
|
52
|
+
sed 's/\[Quick Start Guide\](Quick-Start-Guide)/[Quick Start Guide](\/quick-start)/g' | \
|
|
53
|
+
sed 's/\[Configuration\](Configuration)/[Configuration](\/configuration\/reference)/g' | \
|
|
54
|
+
sed 's/\[MCP Integration\](MCP-Integration)/[MCP Integration](\/integrations\/mcp)/g' | \
|
|
55
|
+
sed 's/\[OpenAI Integration\](OpenAI-Integration)/[OpenAI Integration](\/integrations\/openai)/g' | \
|
|
56
|
+
sed 's/\[Gemini Integration\](Gemini-Integration)/[Gemini Integration](\/integrations\/gemini)/g' | \
|
|
57
|
+
sed 's/\[Local LLM Integration\](Local-LLM-Integration)/[Local LLM Integration](\/integrations\/local-llm)/g' | \
|
|
58
|
+
sed 's/\[Security Best Practices\](Security-Best-Practices)/[Security Best Practices](\/security\/best-practices)/g' | \
|
|
59
|
+
sed 's/\[Session Management\](Session-Management)/[Session Management](\/advanced\/session-management)/g' | \
|
|
60
|
+
sed 's/\[Troubleshooting\](Troubleshooting)/[Troubleshooting](\/advanced\/troubleshooting)/g' | \
|
|
61
|
+
sed 's/\[CLI Reference\](CLI-Reference)/[CLI Reference](\/cli-reference\/commands)/g' | \
|
|
62
|
+
sed 's/\[Configuration Reference\](Configuration-Reference)/[Configuration Reference](\/configuration\/reference)/g' | \
|
|
63
|
+
sed 's/\[API Reference\](API-Reference)/[API Reference](\/api-reference\/endpoints)/g' \
|
|
64
|
+
>> /tmp/temp_mdx.mdx
|
|
65
|
+
|
|
66
|
+
# Remove first heading if it matches title (to avoid duplication)
|
|
67
|
+
if [ "$(head -n 4 /tmp/temp_mdx.mdx | tail -n 1 | sed 's/^# //')" = "$title" ]; then
|
|
68
|
+
# Remove the duplicate heading
|
|
69
|
+
sed -i '4d' /tmp/temp_mdx.mdx
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
# Move to final location
|
|
73
|
+
mkdir -p "$(dirname "$output_file")"
|
|
74
|
+
cp /tmp/temp_mdx.mdx "$output_file"
|
|
75
|
+
|
|
76
|
+
echo "Converted: $input_file → $output_file"
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
# Convert all files
|
|
80
|
+
for wiki_file in "${!file_map[@]}"; do
|
|
81
|
+
input_path="$WIKI_DIR/$wiki_file"
|
|
82
|
+
output_path="$DOCS_DIR/${file_map[$wiki_file]}"
|
|
83
|
+
|
|
84
|
+
if [ -f "$input_path" ]; then
|
|
85
|
+
convert_file "$input_path" "$output_path"
|
|
86
|
+
else
|
|
87
|
+
echo "Warning: $input_path not found"
|
|
88
|
+
fi
|
|
89
|
+
done
|
|
90
|
+
|
|
91
|
+
echo "✓ Conversion complete!"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
RED='\033[0;31m'
|
|
6
|
+
GREEN='\033[0;32m'
|
|
7
|
+
BLUE='\033[0;34m'
|
|
8
|
+
BOLD='\033[1m'
|
|
9
|
+
NC='\033[0m'
|
|
10
|
+
|
|
11
|
+
echo -e "${BOLD}${BLUE}"
|
|
12
|
+
cat << "EOF"
|
|
13
|
+
███████╗███╗ ██╗██╗ ██╗ ██████╗██████╗
|
|
14
|
+
██╔════╝████╗ ██║██║ ██║██╔════╝██╔══██╗
|
|
15
|
+
█████╗ ██╔██╗ ██║██║ ██║██║ ██████╔╝
|
|
16
|
+
██╔══╝ ██║╚██╗██║╚██╗ ██╔╝██║ ██╔═══╝
|
|
17
|
+
███████╗██║ ╚████║ ╚████╔╝ ╚██████╗██║
|
|
18
|
+
╚══════╝╚═╝ ╚═══╝ ╚═══╝ ╚═════╝╚═╝
|
|
19
|
+
EOF
|
|
20
|
+
echo -e "${NC}"
|
|
21
|
+
|
|
22
|
+
echo -e "${BLUE}Installing EnvCP...${NC}"
|
|
23
|
+
echo ""
|
|
24
|
+
|
|
25
|
+
if ! command -v npm &> /dev/null; then
|
|
26
|
+
echo -e "${RED}Error: npm is not installed.${NC}"
|
|
27
|
+
echo "Please install Node.js first: https://nodejs.org/"
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
NODE_VERSION=$(node -e "console.log(process.version.slice(1).split('.')[0])")
|
|
32
|
+
if [ "$NODE_VERSION" -lt 18 ]; then
|
|
33
|
+
echo -e "${RED}Error: Node.js 18 or higher is required (you have $NODE_VERSION).${NC}"
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
echo -e "${BLUE}Installing @fentz26/envcp globally...${NC}"
|
|
38
|
+
|
|
39
|
+
if npm install -g @fentz26/envcp; then
|
|
40
|
+
echo ""
|
|
41
|
+
echo -e "${GREEN}${BOLD}Successfully installed EnvCP!${NC}"
|
|
42
|
+
echo ""
|
|
43
|
+
echo -e "${BOLD}Get started:${NC}"
|
|
44
|
+
echo " envcp init # Initialize configuration"
|
|
45
|
+
echo " envcp add KEY # Add a secret"
|
|
46
|
+
echo " envcp --help # See all commands"
|
|
47
|
+
echo ""
|
|
48
|
+
echo -e "${BOLD}Docs:${NC} https://envcp.fentz.dev"
|
|
49
|
+
else
|
|
50
|
+
echo ""
|
|
51
|
+
echo -e "${RED}Installation failed. Try with sudo:${NC}"
|
|
52
|
+
echo " curl -fsSL https://raw.githubusercontent.com/fentz26/EnvCP/main/scripts/install.sh | sudo bash"
|
|
53
|
+
exit 1
|
|
54
|
+
fi
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const message = `
|
|
4
|
+
███████╗███╗ ██╗██╗ ██╗ ██████╗██████╗
|
|
5
|
+
██╔════╝████╗ ██║██║ ██║██╔════╝██╔══██╗
|
|
6
|
+
█████╗ ██╔██╗ ██║██║ ██║██║ ██████╔╝
|
|
7
|
+
██╔══╝ ██║╚██╗██║╚██╗ ██╔╝██║ ██╔═══╝
|
|
8
|
+
███████╗██║ ╚████║ ╚████╔╝ ╚██████╗██║
|
|
9
|
+
╚══════╝╚═╝ ╚═══╝ ╚═══╝ ╚═════╝╚═╝
|
|
10
|
+
|
|
11
|
+
Thanks for installing EnvCP!
|
|
12
|
+
Keep your secrets safe from AI agents.
|
|
13
|
+
|
|
14
|
+
─────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
Vault location:
|
|
17
|
+
|
|
18
|
+
~/ or / -> Global vault (shared across all projects)
|
|
19
|
+
any folder -> Project vault (named after the folder)
|
|
20
|
+
You can rename it anytime with: envcp vault rename [name]
|
|
21
|
+
|
|
22
|
+
─────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
Get started:
|
|
25
|
+
|
|
26
|
+
Simple (one-time setup):
|
|
27
|
+
$ envcp init # Interactive guided setup
|
|
28
|
+
|
|
29
|
+
Advanced (manual config):
|
|
30
|
+
$ envcp init --advanced # Full config options
|
|
31
|
+
$ envcp add [NAME] [VALUE] # Add a secret manually
|
|
32
|
+
|
|
33
|
+
Explore:
|
|
34
|
+
$ envcp --help # See all commands
|
|
35
|
+
|
|
36
|
+
Docs: https://github.com/fentz26/EnvCP
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
console.log(message);
|