@geoly-ai/social-hub-cli 0.3.14 → 0.3.15

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 `@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.3.15] - 2026-08-09
8
+
9
+ 评论样本精确 count 读口:GET /v1/system/subreddit-intelligence/comments/count + SDK countRedditCommentSamples + CLI intel comments-count(不封顶、无分页、拒绝 keyword;行级授权语义与 comments 列表一致)
10
+
11
+ ### Added
12
+
13
+ - 评论样本精确 count 读口 —— GET comments/count + SDK/CLI comments-count(不封顶、拒绝 keyword、谓词与 list 单一真源)
14
+ - 板块新帖监听报告 MVP(迁移 0140)+ 审核通知/删除排程失败补消费者
15
+ - 七块并行收敛 —— 三条 P0 权限漏洞 + 帖子存活标注 + 交付页产品化 + 草稿字段结构化
16
+ - tier-rules 默认读系统级 —— 管理面此前与运行时口径相反
17
+
18
+ ### Changed
19
+
20
+ - 下线报告库页面与 agent-team markdown 面 —— 只删入口,不动数据
21
+
7
22
  ## [0.3.14] - 2026-08-05
8
23
 
9
24
  ### Added
@@ -6,7 +6,6 @@ const indexSrc = readFileSync(join(dirname(fileURLToPath(import.meta.url)), "ind
6
6
  /** Admin commands implemented in index.ts that must call withPermissionGate. */
7
7
  const INDEX_ADMIN_GATED_COMMANDS = [
8
8
  "agent-teams list",
9
- "agent-teams workspace-docs",
10
9
  "agent-teams create",
11
10
  "agent-teams update",
12
11
  "agent-teams add-member",
@@ -1 +1 @@
1
- {"version":3,"file":"admin-index-gates.test.js","sourceRoot":"","sources":["../src/admin-index-gates.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,MAAM,QAAQ,GAAG,YAAY,CAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,EACzD,MAAM,CACP,CAAC;AAEF,gFAAgF;AAChF,MAAM,0BAA0B,GAAG;IACjC,kBAAkB;IAClB,4BAA4B;IAC5B,oBAAoB;IACpB,oBAAoB;IACpB,wBAAwB;IACxB,2BAA2B;IAC3B,6BAA6B;IAC7B,6BAA6B;IAC7B,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,uBAAuB;IACvB,uBAAuB;CACf,CAAC;AAEX,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,KAAK,MAAM,OAAO,IAAI,0BAA0B,EAAE,CAAC;QACjD,EAAE,CAAC,iCAAiC,OAAO,EAAE,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"admin-index-gates.test.js","sourceRoot":"","sources":["../src/admin-index-gates.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,MAAM,QAAQ,GAAG,YAAY,CAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,EACzD,MAAM,CACP,CAAC;AAEF,gFAAgF;AAChF,MAAM,0BAA0B,GAAG;IACjC,kBAAkB;IAClB,oBAAoB;IACpB,oBAAoB;IACpB,wBAAwB;IACxB,2BAA2B;IAC3B,6BAA6B;IAC7B,6BAA6B;IAC7B,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,uBAAuB;IACvB,uBAAuB;CACf,CAAC;AAEX,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,KAAK,MAAM,OAAO,IAAI,0BAA0B,EAAE,CAAC;QACjD,EAAE,CAAC,iCAAiC,OAAO,EAAE,EAAE,GAAG,EAAE;YAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -53,7 +53,15 @@ afterEach(() => {
53
53
  // so a value from one parseAsync run does not leak into the next.
54
54
  for (const name of ["request-changes", "approve", "list-bundles"]) {
55
55
  const cmd = subCmd(name);
56
- for (const key of ["json", "jsonFile", "expectedHash", "note", "brand"]) {
56
+ for (const key of [
57
+ "json",
58
+ "jsonFile",
59
+ "expectedHash",
60
+ "note",
61
+ "brand",
62
+ "cursor",
63
+ "offset",
64
+ ]) {
57
65
  cmd?.setOptionValue(key, undefined);
58
66
  }
59
67
  }
@@ -197,5 +205,36 @@ describe("client-delivery list-bundles", () => {
197
205
  brandId: "brand-9",
198
206
  });
199
207
  });
208
+ it("forwards the keyset cursor as an opaque string", async () => {
209
+ await program.parseAsync([
210
+ "node",
211
+ "social-hub",
212
+ "client-delivery",
213
+ "list-bundles",
214
+ "--brand",
215
+ "brand-9",
216
+ "--cursor",
217
+ "CURSOR-P2",
218
+ ]);
219
+ expect(clientDeliveryListBundles).toHaveBeenCalledWith("team-1", {
220
+ brandId: "brand-9",
221
+ cursor: "CURSOR-P2",
222
+ });
223
+ });
224
+ it("🔴 rejects --cursor together with --offset before hitting the network", async () => {
225
+ await expect(program.parseAsync([
226
+ "node",
227
+ "social-hub",
228
+ "client-delivery",
229
+ "list-bundles",
230
+ "--brand",
231
+ "brand-9",
232
+ "--cursor",
233
+ "C",
234
+ "--offset",
235
+ "20",
236
+ ])).rejects.toThrow(/互斥/);
237
+ expect(clientDeliveryListBundles).not.toHaveBeenCalled();
238
+ });
200
239
  });
201
240
  //# sourceMappingURL=client-delivery.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client-delivery.test.js","sourceRoot":"","sources":["../src/client-delivery.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client-delivery.test.js","sourceRoot":"","sources":["../src/client-delivery.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
- "generatedAt": "2026-08-05T06:01:06.323Z",
3
- "cliVersion": "0.3.14",
2
+ "generatedAt": "2026-08-09T09:26:27.640Z",
3
+ "cliVersion": "0.3.15",
4
4
  "commands": [
5
5
  "accounts",
6
6
  "accounts brand-bindings",
@@ -42,7 +42,6 @@
42
42
  "agent-teams create",
43
43
  "agent-teams list",
44
44
  "agent-teams update",
45
- "agent-teams workspace-docs",
46
45
  "api-keys",
47
46
  "api-keys batch-revoke",
48
47
  "api-keys batch-rotate",
@@ -223,6 +222,7 @@
223
222
  "intelligence brand-mention-radar",
224
223
  "intelligence campaign-lift",
225
224
  "intelligence comments",
225
+ "intelligence comments-count",
226
226
  "intelligence comments-fetch",
227
227
  "intelligence comments-import",
228
228
  "intelligence coverage",
@@ -244,6 +244,11 @@
244
244
  "intelligence kol-intents-create",
245
245
  "intelligence kol-profiles-get",
246
246
  "intelligence kol-profiles-list",
247
+ "intelligence monitor-runs-list",
248
+ "intelligence monitors-disable",
249
+ "intelligence monitors-enable",
250
+ "intelligence monitors-list",
251
+ "intelligence monitors-run",
247
252
  "intelligence opportunity-map",
248
253
  "intelligence posts-import",
249
254
  "intelligence runs-list",
@@ -286,10 +291,6 @@
286
291
  "members teams-list",
287
292
  "members teams-remove",
288
293
  "members update-role",
289
- "migration",
290
- "migration workspace-docs",
291
- "migration workspace-docs list",
292
- "migration workspace-docs refs",
293
294
  "notification-channels",
294
295
  "notification-channels create",
295
296
  "notification-channels delete",
@@ -393,10 +394,6 @@
393
394
  "reddit stats",
394
395
  "reddit team-buckets",
395
396
  "reddit update",
396
- "reports",
397
- "reports create",
398
- "reports ingest",
399
- "reports list",
400
397
  "review-targets",
401
398
  "review-targets create",
402
399
  "review-targets get",
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA6+E9B,8DAA8D;AAC9D,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,GAAG,IAAI,CAOf;AAqgCD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE,CAAC;AAQF,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACN,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAkJnE;AA+1ED,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;AAsDpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA0+E9B,8DAA8D;AAC9D,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,GAAG,IAAI,CAOf;AAg+BD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE,CAAC;AAQF,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACN,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAkJnE;AA47ED,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -466,7 +466,7 @@ jobs
466
466
  const res = await requireClient().cancelScheduledJob(resolveTeamId(opts.team), opts.id);
467
467
  console.log(JSON.stringify(res, null, 2));
468
468
  });
469
- // --- drafts & reports ---
469
+ // --- drafts ---
470
470
  const content = program
471
471
  .command("content")
472
472
  .description("内容质量(发布前 LLM 复审)");
@@ -547,47 +547,20 @@ drafts
547
547
  .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
548
548
  .option("--brand <uuid>", "brandId 过滤(推荐)")
549
549
  .option("--campaign <uuid>", "campaignId 过滤(legacy)")
550
+ .option("--status <list>", "status 过滤(单值或逗号分隔)")
551
+ .option("--subreddit <list>", "目标板块过滤(单值或逗号分隔;大小写与 `r/` 前缀不敏感)")
552
+ .option("--search <text>", "标题/正文关键词过滤")
550
553
  .option("-n, --limit <n>", "limit", "50")
554
+ .option("--offset <n>", "offset")
551
555
  .action(async (opts) => {
552
556
  const res = await requireClient().listContentDrafts(resolveTeamId(opts.team), {
553
557
  limit: Number(opts.limit),
558
+ offset: opts.offset === undefined ? undefined : Number(opts.offset),
554
559
  brandId: opts.brand,
555
560
  campaignId: opts.campaign,
556
- });
557
- console.log(JSON.stringify(res, null, 2));
558
- });
559
- const reports = program.command("reports").description("报告库");
560
- reports
561
- .command("list")
562
- .description("GET /reports")
563
- .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
564
- .option("-n, --limit <n>", "limit", "50")
565
- .option("--type <t>", "reddit-post-snapshot | account-status-snapshot | campaign-digest | agent-run-summary | style-curation-report | quota-violation-report | content-weekly")
566
- .action(async (opts) => {
567
- const res = await requireClient().listReports(resolveTeamId(opts.team), {
568
- limit: Number(opts.limit),
569
- reportType: opts.type,
570
- });
571
- console.log(JSON.stringify(res, null, 2));
572
- });
573
- reports
574
- .command("ingest")
575
- .description("POST /reports/ingest")
576
- .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
577
- .requiredOption("-j, --json <json>", "{ reportType, source, traceId? }")
578
- .action(async (opts) => {
579
- let body;
580
- try {
581
- body = JSON.parse(opts.json);
582
- }
583
- catch {
584
- console.error("Invalid -j / --json");
585
- process.exit(1);
586
- }
587
- const res = await requireClient().ingestReport(resolveTeamId(opts.team), {
588
- reportType: body.reportType,
589
- source: body.source,
590
- traceId: body.traceId,
561
+ status: opts.status,
562
+ subreddit: opts.subreddit,
563
+ search: opts.search,
591
564
  });
592
565
  console.log(JSON.stringify(res, null, 2));
593
566
  });
@@ -1111,7 +1084,8 @@ drafts
1111
1084
  .command("create")
1112
1085
  .description("POST /content-drafts")
1113
1086
  .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
1114
- .requiredOption("-j, --json <json>", "{ brandId, title, body, campaignId? }")
1087
+ .requiredOption("-j, --json <json>", "{ brandId, title, body, campaignId?, subreddit?, referenceUrl? }" +
1088
+ "(referenceUrl = 写作参考/归因备注落地页,**不参与发布执行**,不会被发出去)")
1115
1089
  .action(async (opts) => {
1116
1090
  let body;
1117
1091
  try {
@@ -1424,15 +1398,30 @@ clientDelivery
1424
1398
  .requiredOption("--brand <uuid>", "brandId(服务端必填)")
1425
1399
  .option("--status <st>", "状态过滤:open | closed | cancelled")
1426
1400
  .option("-n, --limit <n>", "limit")
1427
- .option("--offset <n>", "offset")
1401
+ .option("--offset <n>", "offset(已废弃:并发写入下会重复/跳条,改用 --cursor)")
1402
+ .option("--cursor <c>", "keyset 游标:上次响应的 nextCursor 原样回传(与 --offset 互斥)")
1428
1403
  .action(async (opts) => {
1429
- const params = { brandId: opts.brand };
1430
- if (opts.status)
1431
- params.status = opts.status;
1432
- if (opts.limit !== undefined)
1433
- params.limit = Number(opts.limit);
1434
- if (opts.offset !== undefined)
1435
- params.offset = Number(opts.offset);
1404
+ // 服务端也会拒,但在 CLI 层先挡掉能给出更清楚的提示、少打一次网络。
1405
+ if (opts.cursor && opts.offset !== undefined) {
1406
+ throw new Error("--cursor 与 --offset 互斥,只能给其中一个");
1407
+ }
1408
+ // 一次性构造(而不是先建对象再逐字段赋值):SDK 的 params cursor/offset
1409
+ // 可辨识联合,分支写死在这里编译期就能保证两者不共存。
1410
+ const common = {
1411
+ brandId: opts.brand,
1412
+ ...(opts.status
1413
+ ? {
1414
+ status: opts.status,
1415
+ }
1416
+ : {}),
1417
+ ...(opts.limit !== undefined ? { limit: Number(opts.limit) } : {}),
1418
+ };
1419
+ const params = opts.cursor
1420
+ ? { ...common, cursor: String(opts.cursor) }
1421
+ : {
1422
+ ...common,
1423
+ ...(opts.offset !== undefined ? { offset: Number(opts.offset) } : {}),
1424
+ };
1436
1425
  const res = await requireClient().clientDeliveryListBundles(resolveTeamId(opts.team), params);
1437
1426
  console.log(JSON.stringify(res, null, 2));
1438
1427
  });
@@ -2077,7 +2066,9 @@ drafts
2077
2066
  .description("PATCH /content-drafts/:id")
2078
2067
  .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
2079
2068
  .requiredOption("--draft <uuid>", "Draft UUID")
2080
- .requiredOption("-j, --json <json>", "{ title?, body?, status?, expectedVersion? }(传 expectedVersion 开乐观并发,版本不匹配→409)")
2069
+ .requiredOption("-j, --json <json>", "{ title?, body?, status?, subreddit?, referenceUrl?, expectedVersion? }" +
2070
+ "(省略=不改、null=清空;传 expectedVersion 开乐观并发,版本不匹配→409;" +
2071
+ "改 subreddit 会 bump 内容 version(旧审核/客户批准失效),改 referenceUrl 不会)")
2081
2072
  .action(async (opts) => {
2082
2073
  const body = JSON.parse(opts.json);
2083
2074
  const res = await requireClient().updateContentDraft(resolveTeamId(opts.team), opts.draft, body);
@@ -2121,54 +2112,6 @@ agentTeams
2121
2112
  console.log(JSON.stringify(res, null, 2));
2122
2113
  });
2123
2114
  });
2124
- agentTeams
2125
- .command("workspace-docs")
2126
- .description("GET /v1/agent-teams/:teamId/workspace-documents")
2127
- .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
2128
- .option("--kind <kind>", "file|daily_report|weekly_report|ops_record")
2129
- .option("-n, --limit <n>", "limit", "50")
2130
- .action(async (opts) => {
2131
- await withPermissionGate({
2132
- command: "agent-teams workspace-docs",
2133
- resource: "agentTeam",
2134
- action: "read",
2135
- teamId: resolveTeamId(opts.team),
2136
- }, async () => {
2137
- const res = await requireClient().listWorkspaceDocuments(resolveTeamId(opts.team), {
2138
- kind: opts.kind,
2139
- limit: Number(opts.limit),
2140
- });
2141
- console.log(JSON.stringify(res, null, 2));
2142
- });
2143
- });
2144
- const migration = program
2145
- .command("migration")
2146
- .description("Hub migration helpers");
2147
- const migrationWorkspaceDocs = migration
2148
- .command("workspace-docs")
2149
- .description("Workspace document refs");
2150
- migrationWorkspaceDocs
2151
- .command("list")
2152
- .description("List workspace documents")
2153
- .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
2154
- .option("--kind <kind>", "document kind filter")
2155
- .option("-n, --limit <n>", "limit", "50")
2156
- .action(async (opts) => {
2157
- const res = await requireClient().listWorkspaceDocuments(resolveTeamId(opts.team), {
2158
- kind: opts.kind,
2159
- limit: Number(opts.limit),
2160
- });
2161
- console.log(JSON.stringify(res, null, 2));
2162
- });
2163
- migrationWorkspaceDocs
2164
- .command("refs")
2165
- .description("GET workspace document parsed refs")
2166
- .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
2167
- .requiredOption("--doc <documentId>", "Workspace document UUID")
2168
- .action(async (opts) => {
2169
- const res = await requireClient().listWorkspaceDocumentRefs(resolveTeamId(opts.team), opts.doc);
2170
- console.log(JSON.stringify(res, null, 2));
2171
- });
2172
2115
  agentTeams
2173
2116
  .command("create")
2174
2117
  .description("POST /v1/agent-teams — 新建团队(admin only)")
@@ -2359,11 +2302,11 @@ pools
2359
2302
  });
2360
2303
  pools
2361
2304
  .command("tier-rules-list")
2362
- .description("GET .../subreddit-pools/tier-rules")
2363
- .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
2305
+ .description("GET .../subreddit-pools/tier-rules(默认全库全量;响应 scope=system 时「查不到」才等于「没有规则」)")
2306
+ .option("-t, --team <teamId>", "Team UUID(缺省用当前 context;只用于鉴权)")
2364
2307
  .option("--tier <tier>", "S0|S1|S2|S3")
2365
- .option("--enabled <bool>", "true|false")
2366
- .option("--aggregate-visible-teams", "跨可见团队的归属署名视图(tier-rules 是系统级共享数据,subreddit 全局唯一);查重前必开")
2308
+ .option("--enabled <bool>", "true|false(不传=停用行也列出,带 enabled:false;「有行」≠「规则在生效」)")
2309
+ .option("--aggregate-visible-teams", "[已无效果] tier-rules 默认即全量,此 flag 现为兼容用 no-op")
2367
2310
  .option("-n, --limit <n>", "limit", "50")
2368
2311
  .option("--offset <n>", "offset", "0")
2369
2312
  .action(async (opts) => {
@@ -2478,6 +2421,24 @@ intel
2478
2421
  });
2479
2422
  console.log(JSON.stringify(res, null, 2));
2480
2423
  });
2424
+ intel
2425
+ .command("comments-count")
2426
+ .description("GET /v1/system/subreddit-intelligence/comments/count(评论样本精确总数:不封顶、无分页;不接受 keyword;昂贵读,禁止轮询)")
2427
+ .option("--post-id <id>", "t3_xxx")
2428
+ .option("--subreddit <name>", "板块名")
2429
+ .option("--intent <intent>", "意图标签")
2430
+ .option("--sentiment <s>", "情感标签")
2431
+ .option("--origin <o>", "hub_collector|import(首次入库来源筛选)")
2432
+ .action(async (opts) => {
2433
+ const res = await requireClient().countRedditCommentSamples({
2434
+ postId: opts.postId,
2435
+ subreddit: opts.subreddit,
2436
+ intent: opts.intent,
2437
+ sentiment: opts.sentiment,
2438
+ origin: opts.origin,
2439
+ });
2440
+ console.log(JSON.stringify(res, null, 2));
2441
+ });
2481
2442
  intel
2482
2443
  .command("account-summary <subreddit>")
2483
2444
  .description("GET .../subreddit-intelligence/subreddits/:subreddit/account-summary(板块运营数据 A1:热帖与采样评论中的高频作者薄读模型;30 天 captured-window;top-N + coverage 诊断;品牌关联只标 own/unknown)")
@@ -2955,6 +2916,82 @@ intel
2955
2916
  await requireClient().deleteSubredditWatchlist(opts.id);
2956
2917
  console.log("OK");
2957
2918
  });
2919
+ /* ── 板块新帖监听(系统级:无 -t/--team,与 watchlists-* 同源) ── */
2920
+ intel
2921
+ .command("monitors-list")
2922
+ .description("GET .../subreddit-intelligence/monitors —— 监听列表 + 各自积压水位与最近一轮 run")
2923
+ .option("--enabled <true|false>", "只看启用中/已停止的;缺省 = 全部")
2924
+ .option("-n, --limit <n>", "limit", "100")
2925
+ .option("--offset <n>", "offset", "0")
2926
+ .option("--watchlist <uuid>", "只看某个 watchlist 的监听配置")
2927
+ .action(async (opts) => {
2928
+ // 显式校验:不校验的话 `--enabled junk` 会被静默当成 false,悄悄筛到已停止项。
2929
+ if (opts.enabled !== undefined && !["true", "false"].includes(opts.enabled))
2930
+ throw new Error("--enabled must be true or false");
2931
+ const res = await requireClient().listSubredditMonitors({
2932
+ // 缺省不传,免得把「全部」误缩成「只看已停止」。
2933
+ ...(opts.enabled === undefined
2934
+ ? {}
2935
+ : { enabled: opts.enabled === "true" }),
2936
+ watchlistId: opts.watchlist,
2937
+ limit: Number(opts.limit),
2938
+ offset: Number(opts.offset),
2939
+ });
2940
+ console.log(JSON.stringify(res, null, 2));
2941
+ });
2942
+ intel
2943
+ .command("monitors-enable")
2944
+ .description("POST .../subreddit-intelligence/monitors —— 加入监听(幂等)。" +
2945
+ "停止监听是软停(enabled=false)、不删观察 ledger,所以重新启用后已报告过的帖子不会重复报告")
2946
+ .requiredOption("--watchlist <uuid>", "Watchlist UUID")
2947
+ .option("--fetch-limit <n>", "单页抓取条数上限 1–100(缺省 100)")
2948
+ .action(async (opts) => {
2949
+ const res = await requireClient().enableSubredditMonitor({
2950
+ watchlistId: opts.watchlist,
2951
+ ...(opts.fetchLimit === undefined
2952
+ ? {}
2953
+ : { fetchLimit: Number(opts.fetchLimit) }),
2954
+ });
2955
+ console.log(JSON.stringify(res, null, 2));
2956
+ });
2957
+ intel
2958
+ .command("monitors-disable")
2959
+ .description("DELETE .../subreddit-intelligence/monitors/:watchlistId —— 软停监听;" +
2960
+ "本来就没在监听时返回 updated:false 而非报错,调用方无需分支")
2961
+ .requiredOption("--watchlist <uuid>", "Watchlist UUID")
2962
+ .option("--purge", "连历史观察 ledger 一起硬删(不可恢复)。只有要删掉整个 watchlist 时才需要:" +
2963
+ "monitor 配置的外键是 RESTRICT,不先 purge 就删不掉 watchlist(服务端会 409)。" +
2964
+ "purge 后重新监听会把该板块的历史帖子当成新帖再报一遍")
2965
+ .action(async (opts) => {
2966
+ const res = await requireClient().disableSubredditMonitor(opts.watchlist, opts.purge ? { purge: true } : {});
2967
+ console.log(JSON.stringify(res, null, 2));
2968
+ });
2969
+ intel
2970
+ .command("monitors-run")
2971
+ .description("POST .../subreddit-intelligence/monitors/run —— 手工触发一轮(异步入队);" +
2972
+ "一个启用中的监听都没有时服务端 400,不制造空跑 run")
2973
+ .action(async () => {
2974
+ const res = await requireClient().runSubredditMonitors();
2975
+ console.log(JSON.stringify(res, null, 2));
2976
+ });
2977
+ intel
2978
+ .command("monitor-runs-list")
2979
+ .description("GET .../subreddit-intelligence/monitors/runs —— keyset 分页:" +
2980
+ "翻下一页把上一页最后一行的 windowStart/id 传进 --before-*,没有 offset")
2981
+ .option("-n, --limit <n>", "limit", "20")
2982
+ .option("--status <status>", "pending|claimed|collecting|reporting|completed|degraded|failed")
2983
+ .option("--before-window-start <iso>", "keyset 游标:上一页最后一行的 windowStart")
2984
+ .option("--before-id <uuid>", "keyset 游标:上一页最后一行的 id")
2985
+ .action(async (opts) => {
2986
+ const res = await requireClient().listSubredditMonitorRuns({
2987
+ limit: Number(opts.limit),
2988
+ // 枚举值交给服务端 schema 兜底拒收,CLI 不重复维护一份清单。
2989
+ status: opts.status,
2990
+ beforeWindowStart: opts.beforeWindowStart,
2991
+ beforeId: opts.beforeId,
2992
+ });
2993
+ console.log(JSON.stringify(res, null, 2));
2994
+ });
2958
2995
  intel
2959
2996
  .command("hot-posts")
2960
2997
  .description("GET .../subreddit-intelligence/hot-posts")
@@ -3675,16 +3712,6 @@ events
3675
3712
  });
3676
3713
  process.stdout.write(csv);
3677
3714
  });
3678
- reports
3679
- .command("create")
3680
- .description("POST /reports(直写入库,非队列 ingest)")
3681
- .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
3682
- .requiredOption("-j, --json <json>", "{ reportType, title, source, contentMarkdown, summary?, campaignId?, traceId? }")
3683
- .action(async (opts) => {
3684
- const body = JSON.parse(opts.json);
3685
- const res = await requireClient().createReport(resolveTeamId(opts.team), body);
3686
- console.log(JSON.stringify(res, null, 2));
3687
- });
3688
3715
  jobs
3689
3716
  .command("agent-status")
3690
3717
  .description("POST /scheduled-jobs/:id/agent-status(Agent 回写任务状态)")
@@ -3985,15 +4012,17 @@ session
3985
4012
  });
3986
4013
  session
3987
4014
  .command("set-password")
3988
- .description("POST /v1/session/set-password")
3989
- .requiredOption("--email <email>", "邮箱")
4015
+ .description("POST /v1/session/set-password(管理员替他人重置;自助改密请用 auth change-password)")
4016
+ .option("--user <userId>", "目标用户 UUID(与 --email 二选一,优先)")
4017
+ .option("--email <email>", "目标邮箱(与 --user 二选一)")
3990
4018
  .requiredOption("--password <password>", "新密码")
3991
- .option("--team <teamId>", "Team UUID(可选)")
3992
4019
  .action(async (opts) => {
4020
+ if (Boolean(opts.user) === Boolean(opts.email)) {
4021
+ throw new Error("--user 与 --email 必须且只能给一个");
4022
+ }
3993
4023
  const res = await requireClient().sessionSetPassword({
3994
- email: opts.email,
4024
+ ...(opts.user ? { userId: opts.user } : { email: opts.email }),
3995
4025
  password: opts.password,
3996
- teamId: resolveTeamId(opts.team),
3997
4026
  });
3998
4027
  console.log(JSON.stringify(res, null, 2));
3999
4028
  });