@audienti/cli 0.1.75 → 0.1.77

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/CHANGELOG.md CHANGED
@@ -4,6 +4,21 @@ All notable changes to the Audienti CLI are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.1.77] - 2026-09-27
8
+
9
+ ### Added
10
+
11
+ - Add `audienti start`, a friendly first run: it opens the browser so you can sign in or create an account, picks your account and account user (automatically when there is only one), and offers to run setup. Running `audienti` with no saved login now starts it; `audienti --help` is unchanged.
12
+ - Add `audienti setup`, a guided wizard that asks for your company website, who you sell to, and what you want prospects to say yes to, drafts your first motion, shows the draft, and asks before creating it. Scripts and agents can pass `--url`, `--sell-to`, `--ask`, `--yes`, and `--json`; without a terminal it never prompts. `setup play preflight` is unchanged.
13
+ - The install script now runs `audienti start` for new users at a terminal, only reports the new version when you are already signed in, and prints next steps when there is no terminal.
14
+ - `motions quick-start --json` includes a `preview` summary of a ready draft.
15
+
16
+ ## [0.1.76] - 2026-09-27
17
+
18
+ ### Added
19
+
20
+ - Add `lists bulk-add-tag|merge|export`, `lists routing-rules <list> toggle`, `icps bulk-add-tag|clone|delete|prospects`, `offers regenerate-research|update-writeup|add-artifacts|remove-artifact`, `tasks update|bulk-update`, and `tools linkedin-strategy-review delete` so list, ICP, offer, task, and strategy review catalog actions are reachable from the CLI. `offers show` now lists attached artifacts.
21
+
7
22
  ## [0.1.75] - 2026-09-27
8
23
 
9
24
  ### Added
package/README.md CHANGED
@@ -17,18 +17,45 @@ Requires Node.js 20 or newer.
17
17
 
18
18
  ```bash
19
19
  curl -fsSL https://cli.audienti.com/install | bash
20
- audienti --help
21
20
  ```
22
21
 
23
- Or install directly through npm:
22
+ At a terminal, the installer runs `audienti start` for you. Or install directly
23
+ through npm, then start:
24
24
 
25
25
  ```bash
26
26
  npm install --global @audienti/cli
27
- audienti --help
27
+ audienti start
28
28
  ```
29
29
 
30
30
  For one-off use, run `npx @audienti/cli --help`.
31
31
 
32
+ ## First run
33
+
34
+ ```bash
35
+ audienti start
36
+ audienti setup
37
+ ```
38
+
39
+ `audienti start` opens Audienti in your browser so you can sign in or create an
40
+ account, then picks your account and account user (automatically when there is
41
+ only one) and offers to run setup.
42
+
43
+ `audienti setup` asks for your company website, who you sell to, and what you
44
+ want prospects to say yes to. It drafts your first motion, shows the draft, and
45
+ asks `Create this?` before saving anything. Next, connect LinkedIn. Nothing is
46
+ sent without your approval.
47
+
48
+ Without a terminal, `audienti start` never prompts and reports what to do next,
49
+ and `setup` takes flags:
50
+
51
+ ```bash
52
+ audienti setup --url https://acme.com --sell-to "<who you sell to>" --ask "<what they say yes to>" --yes --json
53
+ ```
54
+
55
+ Without `--yes`, a non-interactive setup drafts but creates nothing. Running
56
+ `audienti` with no saved login starts `audienti start`; `audienti --help` still
57
+ prints help.
58
+
32
59
  ## Authenticate
33
60
 
34
61
  Authenticate through the browser, then configure the default account context:
package/install CHANGED
@@ -52,11 +52,32 @@ fi
52
52
 
53
53
  "$binary" --help >/dev/null
54
54
 
55
+ installed_version="$(node -e 'try { process.stdout.write(require(process.argv[1]).version || "") } catch {}' "$(npm root --global 2>/dev/null || true)/${package}/package.json" 2>/dev/null || true)"
56
+
57
+ # A saved login means this is an upgrade: stay quiet.
58
+ if "$binary" config list --json 2>/dev/null | node -e 'let s="";process.stdin.on("data",(c)=>s+=c).on("end",()=>{try{process.exit(JSON.parse(s).token?0:1)}catch{process.exit(1)}})'; then
59
+ say "Audienti CLI updated to ${installed_version:-the latest version}."
60
+ exit 0
61
+ fi
62
+
63
+ # `curl ... | bash` feeds this script on stdin, so the guided start must read
64
+ # the keyboard from the terminal device instead.
65
+ tty_device="${AUDIENTI_INSTALL_TTY:-/dev/tty}"
66
+ if (: <"$tty_device") 2>/dev/null; then
67
+ say "Audienti CLI${installed_version:+ ${installed_version}} installed."
68
+ say ""
69
+ "$binary" start <"$tty_device" || say "You can pick up where you left off with: audienti start"
70
+ exit 0
71
+ fi
72
+
55
73
  cat <<'NEXT'
56
74
  Audienti CLI installed.
57
75
 
58
76
  Next:
77
+ audienti start Sign in or create an account (run it in a terminal)
78
+
79
+ Without a terminal (CI or a coding agent):
59
80
  audienti auth token <token>
60
- audienti accounts list --json
61
81
  audienti accounts select <acct_id>
82
+ audienti setup --url <company_url> --yes
62
83
  NEXT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@audienti/cli",
3
- "version": "0.1.75",
3
+ "version": "0.1.77",
4
4
  "description": "Agent-first command-line client for Audienti.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,13 +31,26 @@ curl -fsSL https://cli.audienti.com/install | bash
31
31
  ```
32
32
 
33
33
  3. Authentication is explicit and per machine. Do not ask a user to paste a
34
- production token into chat, a repository file, an issue, or a CI secret. Prefer
35
- browser login:
34
+ production token into chat, a repository file, an issue, or a CI secret. For a
35
+ person at a terminal, the friendly first run is:
36
+
37
+ ```bash
38
+ audienti start
39
+ audienti setup
40
+ ```
41
+
42
+ `audienti start` signs in through the browser (or creates an account) and picks
43
+ the account. `audienti start --json` never prompts; it reports
44
+ `sign_in_required` or `ready`. Browser login alone is:
36
45
 
37
46
  ```bash
38
47
  audienti auth login
39
48
  ```
40
49
 
50
+ `audienti setup --url <company_url> --sell-to "<who they sell to>" --ask "<what
51
+ prospects say yes to>" --json` drafts a first motion without creating it. Show
52
+ the draft to the user and add `--yes` only after they approve creating it.
53
+
41
54
  Use `audienti auth token` only after the user supplies a token through an
42
55
  approved secure channel.
43
56
 
package/src/api-client.js CHANGED
@@ -113,6 +113,33 @@ export class AudientiClient {
113
113
  });
114
114
  }
115
115
 
116
+ regenerateOfferResearch(accountId, offerId, body = {}) {
117
+ return this.requestJson(accountPath(accountId, ["offers", offerId, "regenerate_research"]), {
118
+ method: "POST",
119
+ body
120
+ });
121
+ }
122
+
123
+ updateOfferWriteup(accountId, offerId, body) {
124
+ return this.requestJson(accountPath(accountId, ["offers", offerId, "writeup"]), {
125
+ method: "PATCH",
126
+ body
127
+ });
128
+ }
129
+
130
+ addOfferArtifacts(accountId, offerId, body) {
131
+ return this.requestJson(accountPath(accountId, ["offers", offerId, "artifacts"]), {
132
+ method: "POST",
133
+ body
134
+ });
135
+ }
136
+
137
+ removeOfferArtifact(accountId, offerId, artifactId) {
138
+ return this.requestJson(accountPath(accountId, ["offers", offerId, "artifacts", artifactId]), {
139
+ method: "DELETE"
140
+ });
141
+ }
142
+
116
143
  icps(accountId, query = {}) {
117
144
  return this.requestJson(accountPath(accountId, ["icps"], query));
118
145
  }
@@ -163,6 +190,30 @@ export class AudientiClient {
163
190
  });
164
191
  }
165
192
 
193
+ bulkAddIcpTag(accountId, body) {
194
+ return this.requestJson(accountPath(accountId, ["icps", "bulk_add_tag"]), {
195
+ method: "POST",
196
+ body
197
+ });
198
+ }
199
+
200
+ cloneIcp(accountId, icpId) {
201
+ return this.requestJson(accountPath(accountId, ["icps", icpId, "clone"]), {
202
+ method: "POST",
203
+ body: {}
204
+ });
205
+ }
206
+
207
+ deleteIcp(accountId, icpId) {
208
+ return this.requestJson(accountPath(accountId, ["icps", icpId]), {
209
+ method: "DELETE"
210
+ });
211
+ }
212
+
213
+ icpProspects(accountId, icpId, query = {}) {
214
+ return this.requestJson(accountPath(accountId, ["icps", icpId, "prospects"], query));
215
+ }
216
+
166
217
  companies(accountId, query = {}) {
167
218
  return this.requestJson(accountPath(accountId, ["companies"], query));
168
219
  }
@@ -360,6 +411,20 @@ export class AudientiClient {
360
411
  });
361
412
  }
362
413
 
414
+ updateTask(accountId, taskId, body) {
415
+ return this.requestJson(accountPath(accountId, ["tasks", taskId]), {
416
+ method: "PATCH",
417
+ body
418
+ });
419
+ }
420
+
421
+ bulkUpdateTasks(accountId, body) {
422
+ return this.requestJson(accountPath(accountId, ["tasks", "bulk_update"]), {
423
+ method: "PATCH",
424
+ body
425
+ });
426
+ }
427
+
363
428
  lists(accountId) {
364
429
  return this.requestJson(accountPath(accountId, ["lists"]));
365
430
  }
@@ -402,6 +467,24 @@ export class AudientiClient {
402
467
  });
403
468
  }
404
469
 
470
+ bulkAddListTag(accountId, body) {
471
+ return this.requestJson(accountPath(accountId, ["lists", "bulk_add_tag"]), {
472
+ method: "POST",
473
+ body
474
+ });
475
+ }
476
+
477
+ mergeLists(accountId, body) {
478
+ return this.requestJson(accountPath(accountId, ["lists", "merge_selected"]), {
479
+ method: "POST",
480
+ body
481
+ });
482
+ }
483
+
484
+ exportList(accountId, listId, query = {}) {
485
+ return this.requestJson(accountPath(accountId, ["lists", listId, "export"], query));
486
+ }
487
+
405
488
  listProspects(accountId, listId, query = {}) {
406
489
  return this.requestJson(accountPath(accountId, ["lists", listId, "prospects"], query));
407
490
  }
@@ -451,6 +534,12 @@ export class AudientiClient {
451
534
  });
452
535
  }
453
536
 
537
+ toggleListRoutingRule(accountId, listId, ruleId) {
538
+ return this.requestJson(accountPath(accountId, ["lists", listId, "routing_rules", ruleId, "toggle"]), {
539
+ method: "PATCH"
540
+ });
541
+ }
542
+
454
543
  applyListRoutingRules(accountId, listId) {
455
544
  return this.requestJson(accountPath(accountId, ["lists", listId, "routing_rules", "apply"]), {
456
545
  method: "POST",
@@ -777,6 +866,12 @@ export class AudientiClient {
777
866
  return this.requestJson(accountPath(accountId, ["tools", "linkedin-review", "reports", reportId]));
778
867
  }
779
868
 
869
+ deleteLinkedinStrategyReview(accountId, reportId) {
870
+ return this.requestJson(accountPath(accountId, ["tools", "linkedin-strategy-review", "reports", reportId]), {
871
+ method: "DELETE"
872
+ });
873
+ }
874
+
780
875
  humanizeText(accountId, body) {
781
876
  return this.requestJson(accountPath(accountId, ["tools", "humanize"]), {
782
877
  method: "POST",