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 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 → `postman login` / `postman --yes` → `mcp-tools --yes` → **`db:all:dev`** → `localhost --yes`. Ver **`ONBOARDING.md`**.
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 login`** / **`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.
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. **Una vez por máquina** (guarda la clave en `~/.komplian/postman-api-key`; no hace falta `export` después):
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.
@@ -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 login
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 o ~/.komplian/postman-api-key (npx komplian postman login)
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}Una vez por máquina:${c.reset}`);
233
- log(` ${c.cyan}npx komplian postman login${c.reset}`);
234
- log(` (pega la clave de Postman Settings → API keys → Generate)`);
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.dim}O en la sesión actual: export POSTMAN_API_KEY=…${c.reset}`);
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 manual: ${formatHomePath(defaultKeyPath())}${c.reset}`
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
- log(
628
- `${c.green}✓${c.reset} Postman: ${c.bold}${maskEmail(email)}${c.reset} (${c.dim}dominio permitido${c.reset})`
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 de Postman en ${c.dim}~/.komplian/postman-api-key${c.reset} (permiso 600).`);
775
- log(` Tras esto: ${c.cyan}npx komplian postman --yes${c.reset} sin exportar variables.`);
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 { key: apiKey, source } = resolveApiKey();
845
- if (!apiKey) {
846
- printMissingKeyHelp();
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
- * Misma verificación que `postman --yes`: GET /me y dominio @komplian.com.
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 } = resolveApiKey();
949
- if (!key) {
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "komplian",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Komplian CLI: onboard, Postman, localhost, mcp-tools, db (psql). Node 18+. Published tarball has no .env / secrets.",
5
5
  "type": "module",
6
6
  "engines": {