@geoly-ai/social-hub-cli 0.1.8 → 0.1.10

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,36 @@ All notable changes to `@geoly-ai/social-hub-cli` are documented in this file.
4
4
 
5
5
  Release workflow: `pnpm release:cli` → `pnpm publish:cli`.
6
6
 
7
+ ## [0.1.10] - 2026-06-09
8
+
9
+ Normalize reddit post opsStatus filters; align stats filters; update social-hub-posts skill and reddit stats CLI options.
10
+
11
+ ### Added
12
+ - improve refresh fallback routing and post performance UX
13
+
14
+ ### Fixed
15
+ - normalize opsStatus filters and align stats query scope
16
+ ## [0.1.9] - 2026-06-08
17
+
18
+ ### Added
19
+ - systematize hub ingest and runtime gates
20
+ - add persona pool alias seeding
21
+ - Hub-first ops runtime, style-curator skill, and post list UX
22
+ - complete repost link support
23
+ - brand-first publishing scope, persona-aware pools, cli update check
24
+ - persona-aware subreddit candidates and diversity selection
25
+ - extend system library fields and import dataset
26
+ - server-side filters, refresh run logs, CLI/SDK sync
27
+ - sanctions update/delete and blocklist UI on RiskCenter
28
+ - move subreddit blocklists to system level
29
+ - status-snapshot externalRef idempotency and CLI cmd manifest
30
+ - add system persona library and account personaId linking
31
+
32
+ ### Fixed
33
+ - auto-detect managed dirs for skills update/remove
34
+
35
+ ### Changed
36
+ - close admin gap with db/api/e2e coverage
7
37
  ## [0.1.8] - 2026-06-05
8
38
 
9
39
  Bundle updated Social Hub subreddit pool skills and persona pool alias guidance.
@@ -1,6 +1,6 @@
1
1
  {
2
- "generatedAt": "2026-06-05T01:51:36.942Z",
3
- "cliVersion": "0.1.8",
2
+ "generatedAt": "2026-06-09T10:02:44.163Z",
3
+ "cliVersion": "0.1.10",
4
4
  "commands": [
5
5
  "accounts",
6
6
  "accounts brand-bindings",
@@ -11,6 +11,9 @@
11
11
  "accounts browser-envs create",
12
12
  "accounts browser-envs list",
13
13
  "accounts browser-envs list-team",
14
+ "accounts browser-envs telemetry",
15
+ "accounts browser-envs telemetry append",
16
+ "accounts browser-envs telemetry list",
14
17
  "accounts browser-envs update",
15
18
  "accounts create",
16
19
  "accounts delete",
@@ -24,6 +27,10 @@
24
27
  "accounts status-snapshots list",
25
28
  "accounts style-guide",
26
29
  "accounts style-guide get",
30
+ "accounts subreddit-affinities",
31
+ "accounts subreddit-affinities list",
32
+ "accounts subreddit-affinities recompute",
33
+ "accounts subreddit-affinities upsert",
27
34
  "accounts update",
28
35
  "agent-teams",
29
36
  "agent-teams add-member",
@@ -181,6 +188,10 @@
181
188
  "members teams-list",
182
189
  "members teams-remove",
183
190
  "members update-role",
191
+ "migration",
192
+ "migration workspace-docs",
193
+ "migration workspace-docs list",
194
+ "migration workspace-docs refs",
184
195
  "notification-channels",
185
196
  "notification-channels create",
186
197
  "notification-channels delete",
@@ -188,6 +199,7 @@
188
199
  "notification-channels test",
189
200
  "notification-channels update",
190
201
  "openclaw-ingest",
202
+ "openclaw-ingest status",
191
203
  "ops",
192
204
  "ops claim",
193
205
  "ops claim-next",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAw5F9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA2lG9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -303,7 +303,7 @@ reddit
303
303
  .requiredOption("-t, --team <teamId>", "Team UUID")
304
304
  .option("--brand <uuid>", "system-level brandId")
305
305
  .option("--entry <uuid>", "calendarEntryId")
306
- .option("--ops-status <st>", "opsStatus filter")
306
+ .option("--ops-status <st>", "opsStatus filter (normal|risk|deleted|abnormal|unknown)")
307
307
  .option("--post-type <t>", "postType filter")
308
308
  .option("--contains-brand-keyword <v>", "true | false | unset")
309
309
  .option("--primary-product <text>", "primary product contains match")
@@ -951,27 +951,81 @@ compliance
951
951
  console.log(JSON.stringify(res, null, 2));
952
952
  });
953
953
  // --- openclaw ---
954
- program
954
+ const openclawIngest = program
955
955
  .command("openclaw-ingest")
956
- .description("POST /openclaw-ingest")
957
- .requiredOption("-t, --team <teamId>", "Team UUID")
958
- .option("-j, --json <json>", '默认 {"mode":"dry-run"}')
959
- .action(async (opts) => {
956
+ .description("POST /openclaw-ingest — import OpenClaw shared state into Hub");
957
+ openclawIngest
958
+ .command("status")
959
+ .description("GET /openclaw-ingest/runs/:runId")
960
+ .requiredOption("-t, --team <teamId>", "Team UUID")
961
+ .requiredOption("--run <runId>", "Ingest run UUID")
962
+ .action(async (opts) => {
963
+ const res = await requireClient().getOpenClawIngestRun(opts.team, opts.run);
964
+ console.log(JSON.stringify(res, null, 2));
965
+ });
966
+ openclawIngest
967
+ .option("-t, --team <teamId>", "Team UUID")
968
+ .option("--dry-run", "mode=dry-run (default)")
969
+ .option("--apply", "mode=apply")
970
+ .option("--wait", "block until run completes")
971
+ .option("--idempotency-key <key>", "dedupe key for repeated ingest")
972
+ .option("--source-root <path>", "OpenClaw workspace root")
973
+ .option("--account-status <path>", "account status markdown path")
974
+ .option("--interaction-history <path>", "interaction history JSON path")
975
+ .option("--post-performance-log <path>", "post performance log path")
976
+ .option("--campaigns-dir <path>", "campaigns directory")
977
+ .option("--op-reports-dir <path>", "op reports directory (repeatable)", collect, [])
978
+ .option("--op-report-file <path>", "op report file (repeatable)", collect, [])
979
+ .option("-j, --json <json>", "advanced body override JSON")
980
+ .action(async (opts) => {
981
+ if (!opts.team) {
982
+ console.error("Missing required option -t / --team (or use: openclaw-ingest status)");
983
+ process.exit(1);
984
+ }
960
985
  let body = {
961
- mode: "dry-run",
986
+ mode: opts.apply ? "apply" : "dry-run",
962
987
  };
963
988
  if (opts.json) {
964
989
  try {
965
- body = JSON.parse(opts.json);
990
+ body = { ...body, ...JSON.parse(opts.json) };
966
991
  }
967
992
  catch {
968
993
  console.error("Invalid -j / --json");
969
994
  process.exit(1);
970
995
  }
971
996
  }
997
+ if (opts.sourceRoot)
998
+ body.sourceRoot = opts.sourceRoot;
999
+ if (opts.idempotencyKey)
1000
+ body.idempotencyKey = opts.idempotencyKey;
1001
+ if (opts.wait)
1002
+ body.wait = true;
1003
+ const sourcePaths = {
1004
+ ...(body.sourcePaths ?? {}),
1005
+ };
1006
+ if (opts.accountStatus)
1007
+ sourcePaths.accountStatus = opts.accountStatus;
1008
+ if (opts.interactionHistory) {
1009
+ sourcePaths.interactionHistoryFile = opts.interactionHistory;
1010
+ }
1011
+ if (opts.postPerformanceLog) {
1012
+ sourcePaths.postPerformanceLog = opts.postPerformanceLog;
1013
+ }
1014
+ if (opts.campaignsDir)
1015
+ sourcePaths.campaignsDir = opts.campaignsDir;
1016
+ if (opts.opReportsDir?.length)
1017
+ sourcePaths.opReportsDirs = opts.opReportsDir;
1018
+ if (opts.opReportFile?.length)
1019
+ sourcePaths.opReportFiles = opts.opReportFile;
1020
+ if (Object.keys(sourcePaths).length > 0) {
1021
+ body.sourcePaths = sourcePaths;
1022
+ }
972
1023
  const res = await requireClient().triggerOpenClawIngest(opts.team, body);
973
1024
  console.log(JSON.stringify(res, null, 2));
974
1025
  });
1026
+ function collect(value, previous) {
1027
+ return previous.concat([value]);
1028
+ }
975
1029
  // ═══════════════════════════════════════════════════════════════════════════
976
1030
  // Group A: single-resource CRUD additions to existing command groups
977
1031
  // ═══════════════════════════════════════════════════════════════════════════
@@ -1091,6 +1145,32 @@ agentTeams
1091
1145
  console.log(JSON.stringify(res, null, 2));
1092
1146
  });
1093
1147
  });
1148
+ const migration = program.command("migration").description("Hub migration helpers");
1149
+ const migrationWorkspaceDocs = migration
1150
+ .command("workspace-docs")
1151
+ .description("Workspace document refs");
1152
+ migrationWorkspaceDocs
1153
+ .command("list")
1154
+ .description("List workspace documents")
1155
+ .requiredOption("-t, --team <teamId>", "Team UUID")
1156
+ .option("--kind <kind>", "document kind filter")
1157
+ .option("-n, --limit <n>", "limit", "50")
1158
+ .action(async (opts) => {
1159
+ const res = await requireClient().listWorkspaceDocuments(opts.team, {
1160
+ kind: opts.kind,
1161
+ limit: Number(opts.limit),
1162
+ });
1163
+ console.log(JSON.stringify(res, null, 2));
1164
+ });
1165
+ migrationWorkspaceDocs
1166
+ .command("refs")
1167
+ .description("GET workspace document parsed refs")
1168
+ .requiredOption("-t, --team <teamId>", "Team UUID")
1169
+ .requiredOption("--doc <documentId>", "Workspace document UUID")
1170
+ .action(async (opts) => {
1171
+ const res = await requireClient().listWorkspaceDocumentRefs(opts.team, opts.doc);
1172
+ console.log(JSON.stringify(res, null, 2));
1173
+ });
1094
1174
  agentTeams
1095
1175
  .command("create")
1096
1176
  .description("POST /v1/agent-teams — 新建团队(admin only)")
@@ -2295,7 +2375,7 @@ reddit
2295
2375
  .option("--brand <uuid>", "system-level brandId")
2296
2376
  .option("--entry <uuid>", "calendarEntryId")
2297
2377
  .option("--account <uuid>", "socialAccountId")
2298
- .option("--ops-status <st>", "opsStatus filter")
2378
+ .option("--ops-status <st>", "opsStatus filter (normal|risk|deleted|abnormal|unknown)")
2299
2379
  .option("--post-type <t>", "postType filter")
2300
2380
  .option("--contains-brand-keyword <v>", "true | false | unset")
2301
2381
  .option("--primary-product <text>", "primary product contains match")
@@ -2432,6 +2512,68 @@ browserEnvs
2432
2512
  console.log(JSON.stringify(res, null, 2));
2433
2513
  });
2434
2514
  });
2515
+ const browserEnvTelemetry = browserEnvs
2516
+ .command("telemetry")
2517
+ .description("Browser environment telemetry events");
2518
+ browserEnvTelemetry
2519
+ .command("append")
2520
+ .description("POST /browser-environments/:envId/telemetry-events")
2521
+ .requiredOption("-t, --team <teamId>", "Team UUID")
2522
+ .requiredOption("-e, --env <envId>", "Browser environment UUID")
2523
+ .requiredOption("-j, --json <json>", "telemetry event body JSON")
2524
+ .action(async (opts) => {
2525
+ const body = JSON.parse(opts.json);
2526
+ const res = await requireClient().appendBrowserEnvironmentTelemetryEvent(opts.team, opts.env, body);
2527
+ console.log(JSON.stringify(res, null, 2));
2528
+ });
2529
+ browserEnvTelemetry
2530
+ .command("list")
2531
+ .description("GET /browser-environments/:envId/telemetry-events")
2532
+ .requiredOption("-t, --team <teamId>", "Team UUID")
2533
+ .requiredOption("-e, --env <envId>", "Browser environment UUID")
2534
+ .option("-n, --limit <n>", "limit", "100")
2535
+ .action(async (opts) => {
2536
+ const res = await requireClient().listBrowserEnvironmentTelemetryEvents(opts.team, opts.env, { limit: Number(opts.limit) });
2537
+ console.log(JSON.stringify(res, null, 2));
2538
+ });
2539
+ const accountAffinities = accounts
2540
+ .command("subreddit-affinities")
2541
+ .description("Account-subreddit affinity/cooldown/risk overrides");
2542
+ accountAffinities
2543
+ .command("list")
2544
+ .description("GET /accounts/:accountId/subreddit-affinities")
2545
+ .requiredOption("-t, --team <teamId>", "Team UUID")
2546
+ .requiredOption("-a, --account <ref>", "Account UUID or slot")
2547
+ .action(async (opts) => {
2548
+ const res = await requireClient().listAccountSubredditAffinities(opts.team, opts.account);
2549
+ console.log(JSON.stringify(res, null, 2));
2550
+ });
2551
+ accountAffinities
2552
+ .command("upsert")
2553
+ .description("PUT /accounts/:accountId/subreddit-affinities/:subreddit")
2554
+ .requiredOption("-t, --team <teamId>", "Team UUID")
2555
+ .requiredOption("-a, --account <ref>", "Account UUID or slot")
2556
+ .requiredOption("--subreddit <name>", "Subreddit name")
2557
+ .requiredOption("-j, --json <json>", "affinity body JSON")
2558
+ .action(async (opts) => {
2559
+ const body = JSON.parse(opts.json);
2560
+ const res = await requireClient().upsertAccountSubredditAffinity(opts.team, opts.account, opts.subreddit, body);
2561
+ console.log(JSON.stringify(res, null, 2));
2562
+ });
2563
+ accountAffinities
2564
+ .command("recompute")
2565
+ .description("Enqueue affinity recompute worker job")
2566
+ .requiredOption("-t, --team <teamId>", "Team UUID")
2567
+ .requiredOption("-a, --account <uuid>", "Account UUID")
2568
+ .option("--dry-run", "dry run only", false)
2569
+ .action(async (opts) => {
2570
+ const res = await requireClient().triggerOpenClawRuntimeMaintenance(opts.team, {
2571
+ jobType: "affinity-recompute",
2572
+ socialAccountId: opts.account,
2573
+ dryRun: Boolean(opts.dryRun),
2574
+ });
2575
+ console.log(JSON.stringify(res, null, 2));
2576
+ });
2435
2577
  // --- accounts personas ---
2436
2578
  const accountPersonas = accounts.command("personas").description("账号人设");
2437
2579
  accountPersonas