@audienti/cli 0.1.97 → 0.1.98
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 +6 -0
- package/README.md +3 -0
- package/package.json +1 -1
- package/src/api-client.js +12 -0
- package/src/cli.js +56 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,12 @@ All notable changes to the Audienti CLI are documented here.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.1.98] - 2026-10-04
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `content track <url>` submits an owned LinkedIn post for tracking. `content posts` lists tracked posts, and `content engagement <cpwi_id>` reads collected comments and reactions.
|
|
12
|
+
|
|
7
13
|
## [0.1.97] - 2026-10-04
|
|
8
14
|
|
|
9
15
|
### Added
|
package/README.md
CHANGED
|
@@ -185,6 +185,9 @@ audienti motions update <motn_id> --payload motion-signals.json
|
|
|
185
185
|
audienti motions activate <motn_id>
|
|
186
186
|
audienti motions delete <motn_id> --confirm yes
|
|
187
187
|
audienti content programs
|
|
188
|
+
audienti content track <linkedin_post_url>
|
|
189
|
+
audienti content posts
|
|
190
|
+
audienti content engagement <cpwi_id> --json
|
|
188
191
|
audienti content plan <cprg_id>
|
|
189
192
|
audienti content approve <cpwi_id>
|
|
190
193
|
audienti content comments
|
package/package.json
CHANGED
package/src/api-client.js
CHANGED
|
@@ -699,6 +699,18 @@ export class AudientiClient {
|
|
|
699
699
|
return this.requestJson(accountPath(accountId, ["content_ops", "work_items", workItemId]));
|
|
700
700
|
}
|
|
701
701
|
|
|
702
|
+
contentTrackedPosts(accountId, query = {}) {
|
|
703
|
+
return this.requestJson(accountPath(accountId, ["content_ops", "tracked_posts"], query));
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
contentTrackPost(accountId, body) {
|
|
707
|
+
return this.requestJson(accountPath(accountId, ["content_ops", "tracked_posts"]), { method: "POST", body });
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
contentTrackedPost(accountId, workItemId) {
|
|
711
|
+
return this.requestJson(accountPath(accountId, ["content_ops", "tracked_posts", workItemId]));
|
|
712
|
+
}
|
|
713
|
+
|
|
702
714
|
contentFeedback(accountId, workItemId, body) {
|
|
703
715
|
return this.requestJson(accountPath(accountId, ["content_ops", "work_items", workItemId, "feedback"]), { method: "POST", body });
|
|
704
716
|
}
|
package/src/cli.js
CHANGED
|
@@ -168,6 +168,9 @@ const MOTIONS_UPDATE_USAGE = "Usage: audienti motions update <motn_id> ([--statu
|
|
|
168
168
|
const CONTENT_PROGRAMS_USAGE = "Usage: audienti content programs [--user <account_user_id|email|name|me>] [--json] [--account <acct_id>]";
|
|
169
169
|
const CONTENT_PLAN_USAGE = "Usage: audienti content plan <cprg_id> [--week <n>] [--due] [--json] [--account <acct_id>]";
|
|
170
170
|
const CONTENT_SHOW_USAGE = "Usage: audienti content show <cpwi_id> [--json] [--account <acct_id>]";
|
|
171
|
+
const CONTENT_POSTS_USAGE = "Usage: audienti content posts [--user <account_user_id|email|name|me>] [--page <n>] [--json] [--account <acct_id>]";
|
|
172
|
+
const CONTENT_TRACK_USAGE = "Usage: audienti content track <linkedin_post_url> [--user <account_user_id|email|name|me>] [--json] [--account <acct_id>]";
|
|
173
|
+
const CONTENT_ENGAGEMENT_USAGE = "Usage: audienti content engagement <cpwi_id> [--json] [--account <acct_id>]";
|
|
171
174
|
const CONTENT_FEEDBACK_USAGE = "Usage: audienti content feedback <cpwi_id> (--message <text> | --payload <file.json>) [--json] [--account <acct_id>]";
|
|
172
175
|
const CONTENT_APPROVE_USAGE = "Usage: audienti content approve <cpwi_id> [--json] [--account <acct_id>]";
|
|
173
176
|
const CONTENT_SCHEDULE_USAGE = "Usage: audienti content schedule <cpwi_id> --at <time> [--json] [--account <acct_id>]";
|
|
@@ -450,6 +453,9 @@ async function dispatch(argv, context) {
|
|
|
450
453
|
if (normalizedResource === "content" && action === "programs") return contentPrograms(rest, context, { accountOverride });
|
|
451
454
|
if (normalizedResource === "content" && action === "plan") return contentPlan(rest, context, { accountOverride });
|
|
452
455
|
if (normalizedResource === "content" && action === "show") return contentShow(rest, context, { accountOverride });
|
|
456
|
+
if (normalizedResource === "content" && action === "posts") return contentPosts(rest, context, { accountOverride });
|
|
457
|
+
if (normalizedResource === "content" && action === "track") return contentTrack(rest, context, { accountOverride });
|
|
458
|
+
if (normalizedResource === "content" && action === "engagement") return contentEngagement(rest, context, { accountOverride });
|
|
453
459
|
if (normalizedResource === "content" && action === "feedback") return contentFeedback(rest, context, { accountOverride });
|
|
454
460
|
if (normalizedResource === "content" && action === "approve") return contentApprove(rest, context, { accountOverride });
|
|
455
461
|
if (normalizedResource === "content" && action === "schedule") return contentSchedule(rest, context, { accountOverride });
|
|
@@ -3877,6 +3883,47 @@ async function contentShow(args, context, { accountOverride } = {}) {
|
|
|
3877
3883
|
renderContentWorkItem(item, context);
|
|
3878
3884
|
}
|
|
3879
3885
|
|
|
3886
|
+
async function contentPosts(args, context, { accountOverride } = {}) {
|
|
3887
|
+
const { values, positionals } = parseCommandArgs(args, { ...jsonOptions(), user: { type: "string" }, page: { type: "string" } });
|
|
3888
|
+
if (positionals.length) throw new CommandError(CONTENT_POSTS_USAGE);
|
|
3889
|
+
const { client, accountId } = await requireAccountContext(context, { accountOverride });
|
|
3890
|
+
const payload = await client.contentTrackedPosts(accountId, { ...(values.user ? { user: values.user } : {}), ...(values.page ? { page: values.page } : {}) });
|
|
3891
|
+
if (values.json) return writeJson(context.stdout, payload);
|
|
3892
|
+
for (const post of payload.posts || []) context.stdout.write(`${post.prefix_id} ${post.status} ${post.published_at || "Publication time unavailable"} ${post.url}\n`);
|
|
3893
|
+
if (payload.next_page) context.stdout.write(`More posts: content posts --page ${payload.next_page}\n`);
|
|
3894
|
+
}
|
|
3895
|
+
|
|
3896
|
+
async function contentTrack(args, context, { accountOverride } = {}) {
|
|
3897
|
+
const { values, positionals } = parseCommandArgs(args, { ...jsonOptions(), user: { type: "string" } });
|
|
3898
|
+
if (positionals.length !== 1) throw new CommandError(CONTENT_TRACK_USAGE);
|
|
3899
|
+
const { client, accountId } = await requireAccountContext(context, { accountOverride });
|
|
3900
|
+
const post = await client.contentTrackPost(accountId, { url: positionals[0], ...(values.user ? { user: values.user } : {}) });
|
|
3901
|
+
if (values.json) return writeJson(context.stdout, post);
|
|
3902
|
+
context.stdout.write(`Tracking ${post.prefix_id}: ${post.status}\n${post.url}\n`);
|
|
3903
|
+
}
|
|
3904
|
+
|
|
3905
|
+
async function contentEngagement(args, context, { accountOverride } = {}) {
|
|
3906
|
+
const { values, positionals } = parseCommandArgs(args, jsonOptions());
|
|
3907
|
+
if (positionals.length !== 1) throw new CommandError(CONTENT_ENGAGEMENT_USAGE);
|
|
3908
|
+
const { client, accountId } = await requireAccountContext(context, { accountOverride });
|
|
3909
|
+
const post = await client.contentTrackedPost(accountId, positionals[0]);
|
|
3910
|
+
if (values.json) return writeJson(context.stdout, post);
|
|
3911
|
+
context.stdout.write(`${post.title || "LinkedIn post"}: ${post.status}\n${post.url}\n`);
|
|
3912
|
+
if (post.error) context.stdout.write(`Tracking error: ${post.error}\n`);
|
|
3913
|
+
context.stdout.write(`Reposts reported: ${post.repost_count ?? "unavailable"}; reposter identities unavailable\n`);
|
|
3914
|
+
for (const category of ["comments", "reactions"]) {
|
|
3915
|
+
const state = post.categories?.[category] || {};
|
|
3916
|
+
context.stdout.write(`${category}: ${state.status || "pending"}, ${state.collected_count ?? 0} collected\n`);
|
|
3917
|
+
if (state.error) context.stdout.write(` ${state.error}\n`);
|
|
3918
|
+
for (const engagement of post[category] || []) {
|
|
3919
|
+
const person = engagement.profile || {};
|
|
3920
|
+
context.stdout.write(` ${person.name || "Unknown person"} | ${person.title || "Title unavailable"} | ${person.company || "Company unavailable"} | ${person.url || "Profile unavailable"}\n`);
|
|
3921
|
+
if (engagement.text) context.stdout.write(` ${engagement.commented_at || "Time unavailable"}: ${engagement.text}\n`);
|
|
3922
|
+
if (engagement.task?.id) context.stdout.write(` Reply task: ${engagement.task.id} (${engagement.task.delivery_state || engagement.task.status})\n`);
|
|
3923
|
+
}
|
|
3924
|
+
}
|
|
3925
|
+
}
|
|
3926
|
+
|
|
3880
3927
|
async function contentFeedback(args, context, { accountOverride } = {}) {
|
|
3881
3928
|
const { values, positionals } = parseCommandArgs(args, {
|
|
3882
3929
|
...jsonOptions(),
|
|
@@ -10216,6 +10263,9 @@ const HELP_TOPICS = new Map([
|
|
|
10216
10263
|
" audienti content programs",
|
|
10217
10264
|
" audienti content plan <cprg_id>",
|
|
10218
10265
|
" audienti content show <cpwi_id>",
|
|
10266
|
+
" audienti content track <linkedin_post_url>",
|
|
10267
|
+
" audienti content posts",
|
|
10268
|
+
" audienti content engagement <cpwi_id>",
|
|
10219
10269
|
" audienti content feedback <cpwi_id> --message <text>",
|
|
10220
10270
|
" audienti content approve <cpwi_id>",
|
|
10221
10271
|
" audienti content publish <cpwi_id> --url <permalink>",
|
|
@@ -12558,6 +12608,9 @@ const HELP_TOPICS = new Map([
|
|
|
12558
12608
|
" audienti content programs [--user <account_user_id|email|name|me>] [--json]",
|
|
12559
12609
|
" audienti content plan <cprg_id> [--week <n>] [--due] [--json]",
|
|
12560
12610
|
" audienti content show <cpwi_id> [--json]",
|
|
12611
|
+
" audienti content track <linkedin_post_url> [--user <account_user_id|email|name|me>] [--json]",
|
|
12612
|
+
" audienti content posts [--user <account_user_id|email|name|me>] [--json]",
|
|
12613
|
+
" audienti content engagement <cpwi_id> [--json]",
|
|
12561
12614
|
" audienti content feedback <cpwi_id> --message <text> [--json]",
|
|
12562
12615
|
" audienti content approve <cpwi_id> [--json]",
|
|
12563
12616
|
" audienti content schedule <cpwi_id> --at <time> [--json]",
|
|
@@ -12573,6 +12626,9 @@ const HELP_TOPICS = new Map([
|
|
|
12573
12626
|
["content programs", [CONTENT_PROGRAMS_USAGE].join("\n")],
|
|
12574
12627
|
["content plan", [CONTENT_PLAN_USAGE].join("\n")],
|
|
12575
12628
|
["content show", [CONTENT_SHOW_USAGE].join("\n")],
|
|
12629
|
+
["content posts", [CONTENT_POSTS_USAGE].join("\n")],
|
|
12630
|
+
["content track", [CONTENT_TRACK_USAGE].join("\n")],
|
|
12631
|
+
["content engagement", [CONTENT_ENGAGEMENT_USAGE].join("\n")],
|
|
12576
12632
|
["content feedback", [CONTENT_FEEDBACK_USAGE].join("\n")],
|
|
12577
12633
|
["content approve", [CONTENT_APPROVE_USAGE].join("\n")],
|
|
12578
12634
|
["content schedule", [CONTENT_SCHEDULE_USAGE].join("\n")],
|