@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 +15 -0
- package/README.md +30 -3
- package/install +22 -1
- package/package.json +1 -1
- package/skills/audienti/SKILL.md +15 -2
- package/src/api-client.js +95 -0
- package/src/cli.js +1128 -39
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
|
|
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
|
|
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
package/skills/audienti/SKILL.md
CHANGED
|
@@ -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.
|
|
35
|
-
|
|
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",
|