@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@audienti/cli",
3
- "version": "0.1.97",
3
+ "version": "0.1.98",
4
4
  "description": "Agent-first command-line client for Audienti.",
5
5
  "type": "module",
6
6
  "bin": {
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")],