conduyt 1.4.0 → 1.5.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 CHANGED
@@ -37,6 +37,8 @@ conduyt deals list --pipeline <id> # list deals
37
37
  conduyt pipelines # list pipelines and stages
38
38
  conduyt search "acme corp" # search across the CRM
39
39
  conduyt insights summary # run an AI insight query
40
+ conduyt privacy export <id> # GDPR data-portability export (owner/admin)
41
+ conduyt privacy forget <id> --confirm FORGET # GDPR erasure — IRREVERSIBLE, owner only
40
42
  conduyt api GET /api/v1/companies # raw authenticated request (escape hatch)
41
43
  conduyt config show # show resolved config (key masked)
42
44
  ```
package/dist/index.js CHANGED
@@ -1480,6 +1480,36 @@ dnc
1480
1480
  assertUuid(id, "dnc id");
1481
1481
  return client.del(`/api/v1/dnc/${encodeURIComponent(id)}`);
1482
1482
  }));
1483
+ // ---- privacy (GDPR) ----
1484
+ const privacy = program
1485
+ .command("privacy")
1486
+ .description("GDPR data export and right-to-be-forgotten erasure");
1487
+ privacy
1488
+ .command("export <id>")
1489
+ .description("Export a contact's full portable data as JSON (GDPR data portability). Owner/admin key.")
1490
+ .action(run(async (client, id) => {
1491
+ assertUuid(id, "contact id");
1492
+ return client.get(`/api/v1/contacts/${encodeURIComponent(id)}/gdpr-export`);
1493
+ }));
1494
+ privacy
1495
+ .command("forget <id>")
1496
+ .description("IRREVERSIBLE GDPR right-to-be-forgotten erasure — permanently anonymizes the contact and erases their personal data everywhere it appears (messages, notes, deals, files, automations, exports) across the whole account. Suppression tombstones are kept. THERE IS NO UNDO. Owner key. Requires --confirm FORGET.")
1497
+ // Require an explicit VALUE (--confirm FORGET), not a bare boolean flag: a
1498
+ // boolean --confirm would treat `--confirm false` as true (leaving "false" as
1499
+ // an ignored extra arg) and erase anyway — a real automation footgun for an
1500
+ // irreversible command. Reject excess args so that stray token can't slip by.
1501
+ .allowExcessArguments(false)
1502
+ .option("--confirm <word>", "required — pass exactly FORGET to authorize the irreversible erasure")
1503
+ .action(run(async (client, id, opts) => {
1504
+ assertUuid(id, "contact id");
1505
+ if (opts.confirm !== "FORGET") {
1506
+ fail("Refusing to erase: pass --confirm FORGET to authorize this irreversible erasure. It permanently anonymizes the contact and erases their personal data everywhere — there is no undo.");
1507
+ }
1508
+ // The API demands { confirm: "FORGET" }; the CLI mirrors that literal so
1509
+ // the destructive intent is explicit at both layers. A 409 is retryable
1510
+ // (concurrent merge / in-flight automation).
1511
+ return client.post(`/api/v1/contacts/${encodeURIComponent(id)}/gdpr-forget`, { confirm: "FORGET" });
1512
+ }));
1483
1513
  // ---- ai ----
1484
1514
  const ai = program.command("ai").description("AI assistant and insight endpoints");
1485
1515
  ai
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "conduyt",
3
- "version": "1.4.0",
4
- "description": "Command-line interface for Conduyt CRM manage contacts, deals, pipelines, and run insight queries from your terminal.",
3
+ "version": "1.5.0",
4
+ "description": "Command-line interface for Conduyt CRM \u2014 manage contacts, deals, pipelines, and run insight queries from your terminal.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {
@@ -18,7 +18,8 @@
18
18
  "build": "tsc",
19
19
  "typecheck": "tsc --noEmit",
20
20
  "start": "tsx src/index.ts",
21
- "prepublishOnly": "npm run build"
21
+ "prepublishOnly": "npm run build",
22
+ "test": "node --import tsx --test src/*.test.ts"
22
23
  },
23
24
  "keywords": [
24
25
  "conduyt",