kubiy-paas-cli 0.1.2 → 0.1.6
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/.github/workflows/publish.yml +51 -0
- package/fix-link.js +72 -72
- package/index.js +54 -54
- package/package.json +1 -1
- package/src/api.js +79 -79
- package/src/commands/deploy.js +206 -206
- package/src/commands/git-connect.js +113 -113
- package/src/commands/login.js +16 -16
- package/src/commands/service-get.js +24 -24
- package/src/commands/version.js +17 -17
- package/src/commands/whoami.js +15 -15
- package/src/config.js +47 -47
- package/src/git.js +24 -24
- package/src/logger.js +30 -30
- package/src/ssh-config.js +51 -51
- package/src/ssh.js +40 -40
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Publish to npm
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
# Opción 1: manual desde GitHub
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
|
|
7
|
+
# Opción 2: cuando hagas push de un tag tipo v1.2.3
|
|
8
|
+
push:
|
|
9
|
+
tags:
|
|
10
|
+
- "v*"
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
id-token: write # Necesario para OIDC con npm
|
|
14
|
+
contents: read
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
publish:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- name: Checkout
|
|
22
|
+
uses: actions/checkout@v4
|
|
23
|
+
|
|
24
|
+
- name: Setup Node
|
|
25
|
+
uses: actions/setup-node@v4
|
|
26
|
+
with:
|
|
27
|
+
node-version: "20"
|
|
28
|
+
registry-url: "https://registry.npmjs.org"
|
|
29
|
+
|
|
30
|
+
# Asegúrate de tener npm reciente (npm 11+ soporta bien trusted publishing) :contentReference[oaicite:3]{index=3}
|
|
31
|
+
- name: Update npm
|
|
32
|
+
run: npm install -g npm@latest
|
|
33
|
+
|
|
34
|
+
- name: Install dependencies
|
|
35
|
+
run: |
|
|
36
|
+
if [ -f package-lock.json ] || [ -f npm-shrinkwrap.json ]; then
|
|
37
|
+
echo "Lockfile encontrado, usando npm ci"
|
|
38
|
+
npm ci
|
|
39
|
+
else
|
|
40
|
+
echo "Sin lockfile, usando npm install"
|
|
41
|
+
npm install
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
- name: Build
|
|
45
|
+
run: npm run build --if-present
|
|
46
|
+
|
|
47
|
+
- name: Test
|
|
48
|
+
run: npm test --if-present
|
|
49
|
+
|
|
50
|
+
- name: Publish to npm
|
|
51
|
+
run: npm publish --access public
|
package/fix-link.js
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const os = require('os');
|
|
6
|
-
|
|
7
|
-
const isWin = process.platform === 'win32';
|
|
8
|
-
|
|
9
|
-
if (isWin) {
|
|
10
|
-
// ==========================
|
|
11
|
-
// LADO WINDOWS (lo que ya tenías)
|
|
12
|
-
// ==========================
|
|
13
|
-
|
|
14
|
-
// Ruta donde npm instala los comandos globales (típico en Windows)
|
|
15
|
-
const npmBinPath = path.join(os.homedir(), 'AppData', 'Roaming', 'npm');
|
|
16
|
-
const kubiyCmdPath = path.join(npmBinPath, 'kubiy.cmd');
|
|
17
|
-
const kubiyPs1Path = path.join(npmBinPath, 'kubiy.ps1');
|
|
18
|
-
|
|
19
|
-
// Corregir kubiy.cmd
|
|
20
|
-
if (fs.existsSync(kubiyCmdPath)) {
|
|
21
|
-
let content = fs.readFileSync(kubiyCmdPath, 'utf8');
|
|
22
|
-
|
|
23
|
-
// Verificar si necesita corrección (no tiene 'node' explícito)
|
|
24
|
-
if (!content.includes('node "%dp0%')) {
|
|
25
|
-
// Reemplazar la línea que ejecuta el .js directamente
|
|
26
|
-
content = content.replace(
|
|
27
|
-
/"%dp0%\\node_modules\\kubiy-paas-cli\\index\.js"/g,
|
|
28
|
-
'node "%dp0%\\node_modules\\kubiy-paas-cli\\index.js"'
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
fs.writeFileSync(kubiyCmdPath, content, 'utf8');
|
|
32
|
-
console.log('✅ Archivo kubiy.cmd corregido');
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Corregir kubiy.ps1
|
|
37
|
-
if (fs.existsSync(kubiyPs1Path)) {
|
|
38
|
-
let content = fs.readFileSync(kubiyPs1Path, 'utf8');
|
|
39
|
-
|
|
40
|
-
// Verificar si necesita corrección (no tiene 'node' explícito)
|
|
41
|
-
if (!content.includes('node "$basedir')) {
|
|
42
|
-
// Reemplazar las líneas que ejecutan el .js directamente
|
|
43
|
-
content = content.replace(
|
|
44
|
-
/& "`\$basedir\/node_modules\/kubiy-paas-cli\/index\.js"/g,
|
|
45
|
-
'& node "$basedir/node_modules/kubiy-paas-cli/index.js"'
|
|
46
|
-
);
|
|
47
|
-
// También corregir la versión sin backticks (por si acaso)
|
|
48
|
-
content = content.replace(
|
|
49
|
-
/& "\$basedir\/node_modules\/kubiy-paas-cli\/index\.js"/g,
|
|
50
|
-
'& node "$basedir/node_modules/kubiy-paas-cli/index.js"'
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
fs.writeFileSync(kubiyPs1Path, content, 'utf8');
|
|
54
|
-
console.log('✅ Archivo kubiy.ps1 corregido');
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
} else {
|
|
59
|
-
// ==========================
|
|
60
|
-
// LADO UNIX / MAC
|
|
61
|
-
// ==========================
|
|
62
|
-
try {
|
|
63
|
-
const indexPath = path.join(__dirname, 'index.js');
|
|
64
|
-
|
|
65
|
-
if (fs.existsSync(indexPath)) {
|
|
66
|
-
fs.chmodSync(indexPath, 0o755);
|
|
67
|
-
console.log('✅ Unix: permisos ejecutables aplicados a index.js (chmod +x)');
|
|
68
|
-
}
|
|
69
|
-
} catch (e) {
|
|
70
|
-
console.log('⚠ No se pudo aplicar chmod a index.js en Unix:', e.message);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
|
|
7
|
+
const isWin = process.platform === 'win32';
|
|
8
|
+
|
|
9
|
+
if (isWin) {
|
|
10
|
+
// ==========================
|
|
11
|
+
// LADO WINDOWS (lo que ya tenías)
|
|
12
|
+
// ==========================
|
|
13
|
+
|
|
14
|
+
// Ruta donde npm instala los comandos globales (típico en Windows)
|
|
15
|
+
const npmBinPath = path.join(os.homedir(), 'AppData', 'Roaming', 'npm');
|
|
16
|
+
const kubiyCmdPath = path.join(npmBinPath, 'kubiy.cmd');
|
|
17
|
+
const kubiyPs1Path = path.join(npmBinPath, 'kubiy.ps1');
|
|
18
|
+
|
|
19
|
+
// Corregir kubiy.cmd
|
|
20
|
+
if (fs.existsSync(kubiyCmdPath)) {
|
|
21
|
+
let content = fs.readFileSync(kubiyCmdPath, 'utf8');
|
|
22
|
+
|
|
23
|
+
// Verificar si necesita corrección (no tiene 'node' explícito)
|
|
24
|
+
if (!content.includes('node "%dp0%')) {
|
|
25
|
+
// Reemplazar la línea que ejecuta el .js directamente
|
|
26
|
+
content = content.replace(
|
|
27
|
+
/"%dp0%\\node_modules\\kubiy-paas-cli\\index\.js"/g,
|
|
28
|
+
'node "%dp0%\\node_modules\\kubiy-paas-cli\\index.js"'
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
fs.writeFileSync(kubiyCmdPath, content, 'utf8');
|
|
32
|
+
console.log('✅ Archivo kubiy.cmd corregido');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Corregir kubiy.ps1
|
|
37
|
+
if (fs.existsSync(kubiyPs1Path)) {
|
|
38
|
+
let content = fs.readFileSync(kubiyPs1Path, 'utf8');
|
|
39
|
+
|
|
40
|
+
// Verificar si necesita corrección (no tiene 'node' explícito)
|
|
41
|
+
if (!content.includes('node "$basedir')) {
|
|
42
|
+
// Reemplazar las líneas que ejecutan el .js directamente
|
|
43
|
+
content = content.replace(
|
|
44
|
+
/& "`\$basedir\/node_modules\/kubiy-paas-cli\/index\.js"/g,
|
|
45
|
+
'& node "$basedir/node_modules/kubiy-paas-cli/index.js"'
|
|
46
|
+
);
|
|
47
|
+
// También corregir la versión sin backticks (por si acaso)
|
|
48
|
+
content = content.replace(
|
|
49
|
+
/& "\$basedir\/node_modules\/kubiy-paas-cli\/index\.js"/g,
|
|
50
|
+
'& node "$basedir/node_modules/kubiy-paas-cli/index.js"'
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
fs.writeFileSync(kubiyPs1Path, content, 'utf8');
|
|
54
|
+
console.log('✅ Archivo kubiy.ps1 corregido');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
} else {
|
|
59
|
+
// ==========================
|
|
60
|
+
// LADO UNIX / MAC
|
|
61
|
+
// ==========================
|
|
62
|
+
try {
|
|
63
|
+
const indexPath = path.join(__dirname, 'index.js');
|
|
64
|
+
|
|
65
|
+
if (fs.existsSync(indexPath)) {
|
|
66
|
+
fs.chmodSync(indexPath, 0o755);
|
|
67
|
+
console.log('✅ Unix: permisos ejecutables aplicados a index.js (chmod +x)');
|
|
68
|
+
}
|
|
69
|
+
} catch (e) {
|
|
70
|
+
console.log('⚠ No se pudo aplicar chmod a index.js en Unix:', e.message);
|
|
71
|
+
}
|
|
72
|
+
}
|
package/index.js
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const path = require("path");
|
|
4
|
-
const { logInfo, logError } = require("./src/logger");
|
|
5
|
-
|
|
6
|
-
const args = process.argv.slice(2);
|
|
7
|
-
const command = args[0];
|
|
8
|
-
|
|
9
|
-
async function main() {
|
|
10
|
-
try {
|
|
11
|
-
switch (command) {
|
|
12
|
-
case "login":
|
|
13
|
-
await require("./src/commands/login").run(args.slice(1));
|
|
14
|
-
break;
|
|
15
|
-
case "whoami":
|
|
16
|
-
await require("./src/commands/whoami").run(args.slice(1));
|
|
17
|
-
break;
|
|
18
|
-
case "service:get":
|
|
19
|
-
await require("./src/commands/service-get").run(args.slice(1));
|
|
20
|
-
break;
|
|
21
|
-
case "git:connect":
|
|
22
|
-
await require("./src/commands/git-connect").run(args.slice(1));
|
|
23
|
-
break;
|
|
24
|
-
case "deploy":
|
|
25
|
-
await require("./src/commands/deploy").run();
|
|
26
|
-
break;
|
|
27
|
-
case "version":
|
|
28
|
-
case "--version":
|
|
29
|
-
case "-v":
|
|
30
|
-
await require("./src/commands/version").run(args.slice(1));
|
|
31
|
-
break;
|
|
32
|
-
default:
|
|
33
|
-
printHelp();
|
|
34
|
-
process.exit(0);
|
|
35
|
-
}
|
|
36
|
-
} catch (err) {
|
|
37
|
-
logError("Error en CLI:", err.message || err);
|
|
38
|
-
process.exit(1);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function printHelp() {
|
|
43
|
-
logInfo("Kubiy PaaS CLI");
|
|
44
|
-
console.log("");
|
|
45
|
-
console.log("Uso:");
|
|
46
|
-
console.log(" kubiy login <cliToken>");
|
|
47
|
-
console.log(" kubiy whoami");
|
|
48
|
-
console.log(" kubiy service:get <serviceId>");
|
|
49
|
-
console.log(" kubiy git:connect <serviceId>");
|
|
50
|
-
console.log(" kubiy deploy");
|
|
51
|
-
console.log(" kubiy version");
|
|
52
|
-
console.log("");
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
main();
|
|
2
|
+
|
|
3
|
+
const path = require("path");
|
|
4
|
+
const { logInfo, logError } = require("./src/logger");
|
|
5
|
+
|
|
6
|
+
const args = process.argv.slice(2);
|
|
7
|
+
const command = args[0];
|
|
8
|
+
|
|
9
|
+
async function main() {
|
|
10
|
+
try {
|
|
11
|
+
switch (command) {
|
|
12
|
+
case "login":
|
|
13
|
+
await require("./src/commands/login").run(args.slice(1));
|
|
14
|
+
break;
|
|
15
|
+
case "whoami":
|
|
16
|
+
await require("./src/commands/whoami").run(args.slice(1));
|
|
17
|
+
break;
|
|
18
|
+
case "service:get":
|
|
19
|
+
await require("./src/commands/service-get").run(args.slice(1));
|
|
20
|
+
break;
|
|
21
|
+
case "git:connect":
|
|
22
|
+
await require("./src/commands/git-connect").run(args.slice(1));
|
|
23
|
+
break;
|
|
24
|
+
case "deploy":
|
|
25
|
+
await require("./src/commands/deploy").run();
|
|
26
|
+
break;
|
|
27
|
+
case "version":
|
|
28
|
+
case "--version":
|
|
29
|
+
case "-v":
|
|
30
|
+
await require("./src/commands/version").run(args.slice(1));
|
|
31
|
+
break;
|
|
32
|
+
default:
|
|
33
|
+
printHelp();
|
|
34
|
+
process.exit(0);
|
|
35
|
+
}
|
|
36
|
+
} catch (err) {
|
|
37
|
+
logError("Error en CLI:", err.message || err);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function printHelp() {
|
|
43
|
+
logInfo("Kubiy PaaS CLI");
|
|
44
|
+
console.log("");
|
|
45
|
+
console.log("Uso:");
|
|
46
|
+
console.log(" kubiy login <cliToken>");
|
|
47
|
+
console.log(" kubiy whoami");
|
|
48
|
+
console.log(" kubiy service:get <serviceId>");
|
|
49
|
+
console.log(" kubiy git:connect <serviceId>");
|
|
50
|
+
console.log(" kubiy deploy");
|
|
51
|
+
console.log(" kubiy version");
|
|
52
|
+
console.log("");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
main();
|
package/package.json
CHANGED
package/src/api.js
CHANGED
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
const https = require("https");
|
|
2
|
-
const { getCliToken } = require("./config");
|
|
3
|
-
const { logError } = require("./logger");
|
|
4
|
-
|
|
5
|
-
// Ajusta esta URL a tu API real
|
|
6
|
-
const API_BASE = process.env.KUBIY_API_BASE || "https://i5c812hwh2.execute-api.us-east-1.amazonaws.com";
|
|
7
|
-
|
|
8
|
-
function request(method, path, body, opts = {}) {
|
|
9
|
-
return new Promise((resolve, reject) => {
|
|
10
|
-
const token = opts.token || getCliToken();
|
|
11
|
-
const url = new URL(path, API_BASE);
|
|
12
|
-
|
|
13
|
-
const headers = {
|
|
14
|
-
"Accept": "application/json"
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
let payload = null;
|
|
18
|
-
if (body) {
|
|
19
|
-
payload = JSON.stringify(body);
|
|
20
|
-
headers["Content-Type"] = "application/json";
|
|
21
|
-
headers["Content-Length"] = Buffer.byteLength(payload);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
if (token) {
|
|
25
|
-
headers["Authorization"] = `Bearer ${token}`;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const options = {
|
|
29
|
-
method,
|
|
30
|
-
headers
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const req = https.request(url, options, (res) => {
|
|
34
|
-
let data = "";
|
|
35
|
-
|
|
36
|
-
res.on("data", (chunk) => (data += chunk));
|
|
37
|
-
res.on("end", () => {
|
|
38
|
-
if (!data) {
|
|
39
|
-
return resolve(null);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
43
|
-
try {
|
|
44
|
-
resolve(JSON.parse(data));
|
|
45
|
-
} catch (e) {
|
|
46
|
-
resolve(data);
|
|
47
|
-
}
|
|
48
|
-
} else {
|
|
49
|
-
reject(
|
|
50
|
-
new Error(
|
|
51
|
-
`API ${res.statusCode}: ${data || res.statusMessage || "Error"}`
|
|
52
|
-
)
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
req.on("error", reject);
|
|
59
|
-
|
|
60
|
-
if (payload) {
|
|
61
|
-
req.write(payload);
|
|
62
|
-
}
|
|
63
|
-
req.end();
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function apiGet(path, opts) {
|
|
68
|
-
return request("GET", path, null, opts);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function apiPost(path, body, opts) {
|
|
72
|
-
return request("POST", path, body, opts);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
module.exports = {
|
|
76
|
-
apiGet,
|
|
77
|
-
apiPost,
|
|
78
|
-
API_BASE
|
|
79
|
-
};
|
|
1
|
+
const https = require("https");
|
|
2
|
+
const { getCliToken } = require("./config");
|
|
3
|
+
const { logError } = require("./logger");
|
|
4
|
+
|
|
5
|
+
// Ajusta esta URL a tu API real
|
|
6
|
+
const API_BASE = process.env.KUBIY_API_BASE || "https://i5c812hwh2.execute-api.us-east-1.amazonaws.com";
|
|
7
|
+
|
|
8
|
+
function request(method, path, body, opts = {}) {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const token = opts.token || getCliToken();
|
|
11
|
+
const url = new URL(path, API_BASE);
|
|
12
|
+
|
|
13
|
+
const headers = {
|
|
14
|
+
"Accept": "application/json"
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
let payload = null;
|
|
18
|
+
if (body) {
|
|
19
|
+
payload = JSON.stringify(body);
|
|
20
|
+
headers["Content-Type"] = "application/json";
|
|
21
|
+
headers["Content-Length"] = Buffer.byteLength(payload);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (token) {
|
|
25
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const options = {
|
|
29
|
+
method,
|
|
30
|
+
headers
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const req = https.request(url, options, (res) => {
|
|
34
|
+
let data = "";
|
|
35
|
+
|
|
36
|
+
res.on("data", (chunk) => (data += chunk));
|
|
37
|
+
res.on("end", () => {
|
|
38
|
+
if (!data) {
|
|
39
|
+
return resolve(null);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
43
|
+
try {
|
|
44
|
+
resolve(JSON.parse(data));
|
|
45
|
+
} catch (e) {
|
|
46
|
+
resolve(data);
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
reject(
|
|
50
|
+
new Error(
|
|
51
|
+
`API ${res.statusCode}: ${data || res.statusMessage || "Error"}`
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
req.on("error", reject);
|
|
59
|
+
|
|
60
|
+
if (payload) {
|
|
61
|
+
req.write(payload);
|
|
62
|
+
}
|
|
63
|
+
req.end();
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function apiGet(path, opts) {
|
|
68
|
+
return request("GET", path, null, opts);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function apiPost(path, body, opts) {
|
|
72
|
+
return request("POST", path, body, opts);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
module.exports = {
|
|
76
|
+
apiGet,
|
|
77
|
+
apiPost,
|
|
78
|
+
API_BASE
|
|
79
|
+
};
|