komplian 0.6.0 → 0.6.1
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 +5 -9
- package/komplian-postman.mjs +79 -26
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,26 +6,22 @@
|
|
|
6
6
|
2. Browser login: `gh auth login -h github.com -s repo -s read:org -w`
|
|
7
7
|
3. `npx komplian onboard --yes` (sin `@versión`: usa `latest` del registry público).
|
|
8
8
|
|
|
9
|
-
**Orden típico del equipo:** onboard →
|
|
9
|
+
**Orden típico del equipo:** onboard → **`postman --yes`** (pide la clave la primera vez en TTY) → `mcp-tools --yes` → **`db:all:dev`** → `localhost --yes`. Ver **`ONBOARDING.md`**.
|
|
10
10
|
|
|
11
|
-
**`npm ERR! ETARGET` / “No matching version”** (también si falló **`postman`**, no solo `onboard`): es el mismo paquete npm. Usa **`npx komplian postman
|
|
11
|
+
**`npm ERR! ETARGET` / “No matching version”** (también si falló **`postman`**, no solo `onboard`): es el mismo paquete npm. Usa **`npx komplian postman --yes`** **sin** `@0.4.x`; comprueba `npm config get registry` → `https://registry.npmjs.org/`; `npm cache clean --force`. Detalle: `ONBOARDING.md` en el monorepo.
|
|
12
12
|
|
|
13
13
|
### Postman (colección + entornos)
|
|
14
14
|
|
|
15
15
|
1. En [Postman](https://postman.com) usa una cuenta con email **`@komplian.com`** (o añade ese email a tu perfil).
|
|
16
16
|
2. Crea una **API key**: Settings → **API keys** → Generate.
|
|
17
|
-
3. **
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
npx komplian postman login
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
4. Cuando quieras sincronizar la colección:
|
|
17
|
+
3. **Sincronizar** (la primera vez en terminal interactiva **te pide** la API key y la guarda en `~/.komplian/postman-api-key`; no hace falta `export` después):
|
|
24
18
|
|
|
25
19
|
```bash
|
|
26
20
|
npx komplian postman --yes
|
|
27
21
|
```
|
|
28
22
|
|
|
23
|
+
Opcional: **`npx komplian postman login`** solo para guardar o rotar la clave sin ejecutar el sync.
|
|
24
|
+
|
|
29
25
|
Opcional: `export POSTMAN_API_KEY=…` solo para la sesión actual (tiene prioridad sobre el archivo).
|
|
30
26
|
|
|
31
27
|
El comando llama a `GET https://api.getpostman.com/me` y **solo continúa** si el email de la cuenta es `@komplian.com`. **Si ya existen** la colección **Komplian API** y los entornos con el mismo nombre en ese workspace, se **actualizan**; si no, se crean.
|
package/komplian-postman.mjs
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Komplian Postman — API key + email @komplian.com (Postman /me), luego colección + entornos.
|
|
4
4
|
*
|
|
5
|
-
* Requisitos: Node 18+. Primera vez: npx komplian postman
|
|
5
|
+
* Requisitos: Node 18+. Primera vez: ejecuta `npx komplian postman --yes` (o `postman` sin clave):
|
|
6
|
+
* en terminal interactiva te pide la API key una vez y la guarda; o `npx komplian postman login`.
|
|
6
7
|
*
|
|
7
|
-
* Clave: POSTMAN_API_KEY
|
|
8
|
+
* Clave: POSTMAN_API_KEY, ~/.komplian/postman-api-key, o prompt la primera vez (TTY).
|
|
8
9
|
* Seguridad: no registrar secretos; errores API redactados; login sin eco (TTY); ~/.komplian 700 + key 600.
|
|
9
10
|
* Opcional: POSTMAN_WORKSPACE_ID, KOMPLIAN_EMAIL_DOMAIN, KOMPLIAN_POSTMAN_KEY_FILE, KOMPLIAN_DEBUG
|
|
10
11
|
*/
|
|
@@ -229,17 +230,72 @@ function resolveApiKey() {
|
|
|
229
230
|
function printMissingKeyHelp() {
|
|
230
231
|
log(`${c.red}✗${c.reset} No hay API key de Postman.`);
|
|
231
232
|
log(``);
|
|
232
|
-
log(` ${c.bold}
|
|
233
|
-
log(
|
|
234
|
-
|
|
233
|
+
log(` ${c.bold}Terminal interactiva (primera vez):${c.reset}`);
|
|
234
|
+
log(
|
|
235
|
+
` ${c.cyan}npx komplian postman --yes${c.reset} (pide la clave y sigue con el sync)`
|
|
236
|
+
);
|
|
237
|
+
log(
|
|
238
|
+
` ${c.cyan}npx komplian postman login${c.reset} (solo guardar clave; luego postman --yes)`
|
|
239
|
+
);
|
|
235
240
|
log(``);
|
|
236
|
-
log(` ${c.
|
|
241
|
+
log(` ${c.bold}Sin TTY (CI, pipes):${c.reset}`);
|
|
242
|
+
log(` ${c.dim}export POSTMAN_API_KEY=…${c.reset}`);
|
|
237
243
|
log(
|
|
238
|
-
`${c.dim} Archivo
|
|
244
|
+
`${c.dim} Archivo: ${formatHomePath(defaultKeyPath())} (permiso 600)${c.reset}`
|
|
239
245
|
);
|
|
240
246
|
process.exit(1);
|
|
241
247
|
}
|
|
242
248
|
|
|
249
|
+
/**
|
|
250
|
+
* POSTMAN_API_KEY o ~/.komplian/postman-api-key. Si falta y hay TTY, pide la clave
|
|
251
|
+
* (misma validación que `postman login`), guarda y devuelve la resolución.
|
|
252
|
+
*/
|
|
253
|
+
async function resolveApiKeyWithOptionalInteractiveSetup(domain) {
|
|
254
|
+
let r = resolveApiKey();
|
|
255
|
+
if (r.key) return r;
|
|
256
|
+
if (!input.isTTY) {
|
|
257
|
+
printMissingKeyHelp();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
log(`${c.cyan}━━ Primera vez: Postman API key ━━${c.reset}`);
|
|
261
|
+
log(
|
|
262
|
+
`${c.dim}Cuenta @${domain}. Postman → Settings → API keys → Generate. Se guarda en ${formatHomePath(defaultKeyPath())}.${c.reset}`
|
|
263
|
+
);
|
|
264
|
+
log("");
|
|
265
|
+
|
|
266
|
+
const raw = await readPasswordLine(
|
|
267
|
+
"Postman API key (no se muestra al escribir; Settings → API keys): "
|
|
268
|
+
);
|
|
269
|
+
const k = (raw || "").trim();
|
|
270
|
+
if (!k) {
|
|
271
|
+
log(`${c.red}✗${c.reset} Clave vacía.`);
|
|
272
|
+
process.exit(1);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
await verifyKomplianEmail(k, domain, { quietSuccess: true });
|
|
276
|
+
|
|
277
|
+
const keyPath = defaultKeyPath();
|
|
278
|
+
ensureSecureKomplianDir();
|
|
279
|
+
writeFileSync(keyPath, `${k}\n`, { encoding: "utf8", mode: 0o600 });
|
|
280
|
+
try {
|
|
281
|
+
chmodSync(keyPath, 0o600);
|
|
282
|
+
} catch {
|
|
283
|
+
/* Windows u otros */
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
log("");
|
|
287
|
+
log(
|
|
288
|
+
`${c.green}✓${c.reset} Guardada en ${c.bold}${formatHomePath(keyPath)}${c.reset} — continuando…`
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
r = resolveApiKey();
|
|
292
|
+
if (!r.key) {
|
|
293
|
+
log(`${c.red}✗${c.reset} No se pudo leer la clave guardada.`);
|
|
294
|
+
process.exit(1);
|
|
295
|
+
}
|
|
296
|
+
return r;
|
|
297
|
+
}
|
|
298
|
+
|
|
243
299
|
/** Parseo mínimo .env (sin dependencia dotenv). */
|
|
244
300
|
function parseEnvFile(text) {
|
|
245
301
|
const out = {};
|
|
@@ -600,7 +656,8 @@ async function pickWorkspaceId(apiKey, explicit) {
|
|
|
600
656
|
return w.id;
|
|
601
657
|
}
|
|
602
658
|
|
|
603
|
-
async function verifyKomplianEmail(apiKey, domain) {
|
|
659
|
+
async function verifyKomplianEmail(apiKey, domain, opts = {}) {
|
|
660
|
+
const quietOk = opts.quietSuccess === true;
|
|
604
661
|
const { ok, status, body } = await pmFetch(apiKey, "/me");
|
|
605
662
|
if (!ok) {
|
|
606
663
|
log(
|
|
@@ -624,9 +681,11 @@ async function verifyKomplianEmail(apiKey, domain) {
|
|
|
624
681
|
);
|
|
625
682
|
process.exit(1);
|
|
626
683
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
684
|
+
if (!quietOk) {
|
|
685
|
+
log(
|
|
686
|
+
`${c.green}✓${c.reset} Postman: ${c.bold}${maskEmail(email)}${c.reset} (${c.dim}dominio permitido${c.reset})`
|
|
687
|
+
);
|
|
688
|
+
}
|
|
630
689
|
return email;
|
|
631
690
|
}
|
|
632
691
|
|
|
@@ -759,7 +818,7 @@ function usage() {
|
|
|
759
818
|
log(` Clave: ${c.dim}POSTMAN_API_KEY${c.reset} o archivo ${c.dim}~/.komplian/postman-api-key${c.reset} (véase ${c.cyan}postman login${c.reset})`);
|
|
760
819
|
log(` Dominio email: solo @komplian.com (GET /me)`);
|
|
761
820
|
log(``);
|
|
762
|
-
log(` -y, --yes Sin prompts extra`);
|
|
821
|
+
log(` -y, --yes Sin prompts extra (si falta API key y hay TTY, pide la clave una vez y guarda)`);
|
|
763
822
|
log(` --export-only Solo escribe JSON en disco (no llama a la API de Postman)`);
|
|
764
823
|
log(` --out <dir> Carpeta para export (por defecto: ./komplian-postman)`);
|
|
765
824
|
log(` --dotenv <ruta> .env extra (además de api/.env, .env, KOMPLIAN_DOTENV)`);
|
|
@@ -771,8 +830,8 @@ function usage() {
|
|
|
771
830
|
|
|
772
831
|
function usageLogin() {
|
|
773
832
|
log(`Uso: komplian postman login`);
|
|
774
|
-
log(` Guarda la API key
|
|
775
|
-
log(`
|
|
833
|
+
log(` Guarda o sustituye la API key en ${c.dim}~/.komplian/postman-api-key${c.reset} (permiso 600).`);
|
|
834
|
+
log(` Opcional: ${c.cyan}npx komplian postman --yes${c.reset} ya pide la clave la primera vez si falta.`);
|
|
776
835
|
log(``);
|
|
777
836
|
log(` Postman → Settings (avatar) → API keys → Generate`);
|
|
778
837
|
}
|
|
@@ -841,15 +900,13 @@ export async function runPostman(argv) {
|
|
|
841
900
|
return;
|
|
842
901
|
}
|
|
843
902
|
|
|
844
|
-
const
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
}
|
|
903
|
+
const domain = (process.env.KOMPLIAN_EMAIL_DOMAIN || "komplian.com").trim();
|
|
904
|
+
const { key: apiKey, source } =
|
|
905
|
+
await resolveApiKeyWithOptionalInteractiveSetup(domain);
|
|
848
906
|
if (source && source !== "POSTMAN_API_KEY") {
|
|
849
907
|
log(`${c.dim}→ API key Postman desde: ${formatHomePath(source)}${c.reset}`);
|
|
850
908
|
}
|
|
851
909
|
|
|
852
|
-
const domain = (process.env.KOMPLIAN_EMAIL_DOMAIN || "komplian.com").trim();
|
|
853
910
|
await verifyKomplianEmail(apiKey, domain);
|
|
854
911
|
|
|
855
912
|
const collection = buildCollection();
|
|
@@ -940,16 +997,12 @@ export async function runPostman(argv) {
|
|
|
940
997
|
}
|
|
941
998
|
|
|
942
999
|
/**
|
|
943
|
-
*
|
|
944
|
-
* Requiere `npx komplian postman login` (o POSTMAN_API_KEY en la sesión).
|
|
1000
|
+
* GET /me y dominio @komplian.com. Si no hay clave y hay TTY, pide guardarla (como `postman --yes`).
|
|
945
1001
|
*/
|
|
946
1002
|
export async function assertKomplianEmployeePostman() {
|
|
947
1003
|
const domain = (process.env.KOMPLIAN_EMAIL_DOMAIN || "komplian.com").trim();
|
|
948
|
-
const { key, source } =
|
|
949
|
-
|
|
950
|
-
printMissingKeyHelp();
|
|
951
|
-
process.exit(1);
|
|
952
|
-
}
|
|
1004
|
+
const { key, source } =
|
|
1005
|
+
await resolveApiKeyWithOptionalInteractiveSetup(domain);
|
|
953
1006
|
if (source && source !== "POSTMAN_API_KEY") {
|
|
954
1007
|
log(`${c.dim}→ Postman API key desde: ${formatHomePath(source)}${c.reset}`);
|
|
955
1008
|
}
|