@geoly-ai/social-hub-cli 0.3.42 → 0.3.43

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 `@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.43] - 2026-09-10
8
+
9
+ ### Added
10
+
11
+ - 板块新帖监听 P3 —— 排除词 + 回放 + 通知聚合 + 正文补抓
12
+
7
13
  ## [0.3.42] - 2026-09-10
8
14
 
9
15
  ### Added
@@ -1,6 +1,6 @@
1
1
  {
2
- "generatedAt": "2026-09-10T02:54:19.672Z",
3
- "cliVersion": "0.3.42",
2
+ "generatedAt": "2026-09-10T07:24:06.541Z",
3
+ "cliVersion": "0.3.43",
4
4
  "commands": [
5
5
  "accounts",
6
6
  "accounts brand-bindings",
@@ -262,6 +262,9 @@
262
262
  "intelligence monitor-label-spec-delete",
263
263
  "intelligence monitor-label-spec-retire",
264
264
  "intelligence monitor-label-specs-list",
265
+ "intelligence monitor-replay-get",
266
+ "intelligence monitor-replay-run",
267
+ "intelligence monitor-replays-list",
265
268
  "intelligence monitor-ruleset-activate",
266
269
  "intelligence monitor-ruleset-apply-expansions",
267
270
  "intelligence monitor-ruleset-create",
@@ -29,6 +29,16 @@ describe("cmd-manifest", () => {
29
29
  expect(paths).toContain("style-profiles active");
30
30
  expect(paths).toContain("style-profiles approve");
31
31
  expect(paths).toContain("subreddit-annotations upsert");
32
+ /*
33
+ * 板块新帖监听 P3(0171)的三条回放命令。
34
+ * ⚠️ 钉在这里的理由:五层同步(API → SDK → CLI → skills → 页面)里,CLI 这一层
35
+ * 最容易「写了但没接上」—— 而症状是用户反馈「不支持」,实际是层级缺口。
36
+ * 🔴 回放**不发通知**:它算的是「如果当时用这套规则会怎样」这个假设,
37
+ * 命中账本与投递水位一个字都不碰。
38
+ */
39
+ expect(paths).toContain("intelligence monitor-replay-run");
40
+ expect(paths).toContain("intelligence monitor-replays-list");
41
+ expect(paths).toContain("intelligence monitor-replay-get");
32
42
  // 事件订阅通知:agent 的消费面(pull/ack 是两条独立命令 —— 本期不提供 --auto-ack)。
33
43
  expect(paths).toContain("notify subscriptions create");
34
44
  expect(paths).toContain("notify subscriptions list");
@@ -1 +1 @@
1
- {"version":3,"file":"cmd-manifest.test.js","sourceRoot":"","sources":["../src/cmd-manifest.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cmd-manifest.test.js","sourceRoot":"","sources":["../src/cmd-manifest.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+DpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAunF9B,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;AA0qCD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE,GAAG,MAAM,CAiBT;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAyCpD;AAqzDD,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;AA+DpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAunF9B,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;AAsxCD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE,GAAG,MAAM,CAiBT;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAyCpD;AAqzDD,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -3132,9 +3132,20 @@ intel
3132
3132
  *
3133
3133
  * 🔴 版本语义:draft 可反复改 → activate 之后**不可原地修改,只能新建版本**。
3134
3134
  * 🔴 激活/停用**不会重发历史命中** —— 观察的水位在被评估的那一轮就推进了(无论命中与否)。
3135
- * 这是刻意的:否则调一次关键词,负责人就被历史帖子刷一次屏。追溯需显式 replay(P3)。
3135
+ * 这是刻意的:否则调一次关键词,负责人就被历史帖子刷一次屏。
3136
+ * 要看「新规则放回历史窗口会怎样」,用 `monitor-replay-run`(0171)——
3137
+ * 它**同样不发通知**,只是把结果落库供对照。
3136
3138
  * ⚠️ 停用当前版本 = 回到「不设关键词门」,报告**恢复全量新帖**,不是一条都不报。
3137
- * ⚠️ 本期只有 include(排除词是 P2,契约层就表达不出来)。
3139
+ *
3140
+ * 🔴 **排除词(0171)**:规则 JSON 支持 `"polarity": "exclude"`。
3141
+ * - exclude 命中时**撤销**同等或更低来源优先级的 include 命中
3142
+ * (优先级 manual > brand_keyword > expansion —— 模型扩出来的否定词不该把运营
3143
+ * 亲手填的 include 词否掉);
3144
+ * - exclude **自己不产生命中**,所以一条 include 都没有的规则集会被拒绝激活(409);
3145
+ * - 同一个 (term, scope, matchMode) 上可以同时有 include 与 exclude 两条
3146
+ * (`espresso` 收进来、`espresso martini` 排出去)。
3147
+ * ⚠️ 加了排除词一定先 `monitor-ruleset-dry-run` 看一眼:一条配宽的排除词能把
3148
+ * 整个板块吃掉,而卡片上看起来只是「今天没有相关新帖」。
3138
3149
  * ────────────────────────────────────────────────────────────────────────── */
3139
3150
  intel
3140
3151
  .command("monitor-rulesets-list")
@@ -3161,7 +3172,9 @@ intel
3161
3172
  intel
3162
3173
  .command("monitor-ruleset-create")
3163
3174
  .description("POST .../monitors/:monitorId/rule-sets —— 新建 **draft** 版本(不会自动激活)。" +
3164
- "规则形状:[{term,scope?,matchMode?,weight?}];scope=title|body|both,matchMode=word|substring|phrase")
3175
+ "规则形状:[{term,scope?,matchMode?,polarity?,weight?}];scope=title|body|both," +
3176
+ "matchMode=word|substring|phrase,polarity=include|exclude(默认 include)。" +
3177
+ "⚠️ 全是 exclude 的规则集不许激活 —— 那等于把整个板块静音")
3165
3178
  .requiredOption("--monitor <uuid>", "Monitor UUID")
3166
3179
  .option("--lookback <minutes>", "回看窗口,只允许 720(12h)或 1440(24h);run 窗口取所有启用监听里最长的一档")
3167
3180
  .option("--note <text>", "本版说明(会随版本链留痕,作为审计的一部分)")
@@ -3179,7 +3192,8 @@ intel
3179
3192
  intel
3180
3193
  .command("monitor-ruleset-rules-set")
3181
3194
  .description("PUT .../rule-sets/:ruleSetId/rules —— **整批替换** draft 的规则(传什么就是最终全量)。" +
3182
- "已激活的版本会被服务端 409 拒绝:改规则必须新建版本")
3195
+ "已激活的版本会被服务端 409 拒绝:改规则必须新建版本。" +
3196
+ '排除词:在规则对象里加 "polarity":"exclude"(默认 include)')
3183
3197
  .requiredOption("--monitor <uuid>", "Monitor UUID")
3184
3198
  .requiredOption("--rule-set <uuid>", "Rule set UUID(必须是 draft)")
3185
3199
  .requiredOption("-j, --json <json>", "规则数组 JSON(全量)")
@@ -3227,7 +3241,10 @@ intel
3227
3241
  .description("POST .../rule-sets/:ruleSetId/dry-run —— 🔴 **试跑**:拿过去 12h/24h 的历史帖子跑一遍," +
3228
3242
  "看会命中什么。**只读:不写命中账本、不推进水位、不发任何通知**。" +
3229
3243
  "先看 sampled:它是 0 时「0 命中」说明的是没有样本,不是规则太窄。" +
3230
- "termHitCounts 看哪个词过宽,unusedTerms 看哪个词拼错了")
3244
+ "termHitCounts 看哪个词过宽,exclusionHitCounts 看哪条排除词吃掉了多少," +
3245
+ "unusedTerms 看哪个词拼错了(include 与 exclude 分别按各自的命中表判断)。" +
3246
+ "⚠️ excluded 与 screenedOut 是**两个数**:前者命中了但被排除词否掉(去看排除词)," +
3247
+ "后者一个 include 都没命中(去看 include 词)")
3231
3248
  .requiredOption("--monitor <uuid>", "Monitor UUID")
3232
3249
  .requiredOption("--rule-set <uuid>", "Rule set UUID(draft 或 active 都可以)")
3233
3250
  .option("--lookback <minutes>", "720|1440;缺省用规则集自己的 lookback")
@@ -3243,6 +3260,71 @@ intel
3243
3260
  });
3244
3261
  console.log(JSON.stringify(res, null, 2));
3245
3262
  });
3263
+ /* ── 回放(0171)· 板块新帖监听 P3 ────────────────────────────────────────────
3264
+ *
3265
+ * 🔴 **回放不写命中账本、不推进投递水位、不发任何通知。**
3266
+ * 它回答的是「把这版规则放回那段历史窗口会命中什么 / 比当初多报少报了哪些」——
3267
+ * 是**假设**不是事实,所以结果落在独立的回放表上,原始命中账本一个字都不会被改。
3268
+ *
3269
+ * ⚠️ 与 dry-run 的分工:
3270
+ * - `monitor-ruleset-dry-run`:**不落库**的即时预览,窗口只能取 720/1440;
3271
+ * - `monitor-replay-run`:**落库**、窗口任意(最长 30 天),并给出与真实账本的差分。
3272
+ * 要拿去做上线决策、要能事后复看的,用这个。
3273
+ * ────────────────────────────────────────────────────────────────────────── */
3274
+ intel
3275
+ .command("monitor-replay-run")
3276
+ .description("POST .../monitors/:monitorId/replays —— 🔴 **回放**:把某版规则放回指定历史窗口重判。" +
3277
+ "**不写命中账本、不推进水位、不发任何通知**(响应里的 sideEffects 显式声明了这三条)。" +
3278
+ "diff.wouldStopReporting = 当初报过、新规则下不再报;" +
3279
+ "diff.wouldNewlyReport = 当初被筛掉、新规则下会报;" +
3280
+ "diff.neverObserved = 当时**根本没被观察到**(监听还没开 / VOC 回灌进来的)——" +
3281
+ "⛔ 这一项不是「规则漏了」,别读成收益")
3282
+ .requiredOption("--monitor <uuid>", "Monitor UUID")
3283
+ .option("--rule-set <uuid>", "用哪一版规则;缺省用当前 active。可以传 draft —— 「新写的这版放到上周会命中什么」是主要用法")
3284
+ .requiredOption("--from <iso>", "窗口起点(ISO 时间串),按帖子 postedAt 取,左闭")
3285
+ .requiredOption("--to <iso>", "窗口终点(ISO 时间串),右开;跨度最长 30 天")
3286
+ .option("-n, --limit <n>", "硬顶(最大 2000);撞顶时结果 truncated=true", "500")
3287
+ .option("--note <text>", "本次回放的说明(随记录留痕)")
3288
+ .action(async (opts) => {
3289
+ const res = await requireClient().runSubredditMonitorReplay(opts.monitor, {
3290
+ ...(opts.ruleSet === undefined ? {} : { ruleSetId: opts.ruleSet }),
3291
+ windowStart: opts.from,
3292
+ windowEnd: opts.to,
3293
+ limit: Number(opts.limit),
3294
+ ...(opts.note === undefined ? {} : { note: opts.note }),
3295
+ });
3296
+ console.log(JSON.stringify(res, null, 2));
3297
+ });
3298
+ intel
3299
+ .command("monitor-replays-list")
3300
+ .description("GET .../monitors/:monitorId/replays —— 该监听的回放记录(created_at DESC)")
3301
+ .requiredOption("--monitor <uuid>", "Monitor UUID")
3302
+ .option("-n, --limit <n>", "limit", "20")
3303
+ .action(async (opts) => {
3304
+ const res = await requireClient().listSubredditMonitorReplays(opts.monitor, { limit: Number(opts.limit) });
3305
+ console.log(JSON.stringify(res, null, 2));
3306
+ });
3307
+ intel
3308
+ .command("monitor-replay-get")
3309
+ .description("GET .../monitors/:monitorId/replays/:replayRunId —— 含逐帖明细。" +
3310
+ "⚠️ decision 有四值:matched / indeterminate(正文拿不到判不了) / " +
3311
+ "**excluded**(命中了但被排除词否掉) / no_match(一个 include 都没命中)。" +
3312
+ "⛔ excluded 与 no_match 别合并看 —— 处置方向相反")
3313
+ .requiredOption("--monitor <uuid>", "Monitor UUID")
3314
+ .requiredOption("--replay <uuid>", "Replay run UUID")
3315
+ .option("--decision <d>", "matched|indeterminate|excluded|no_match;缺省回全部(要判断词配窄没配窄,必须看到没命中的长什么样)")
3316
+ .option("-n, --limit <n>", "明细上限", "200")
3317
+ .action(async (opts) => {
3318
+ // ⚠️ 枚举透传、由服务端 zod 400 —— 与 hot-posts / voc 的 --sort-by 同一惯例。
3319
+ // 只有**会被静默强转**的选项才在本地拦(如 Boolean() 强转的开关),decision 不是。
3320
+ const res = await requireClient().getSubredditMonitorReplay(opts.monitor, opts.replay, {
3321
+ ...(opts.decision === undefined
3322
+ ? {}
3323
+ : { decision: opts.decision }),
3324
+ limit: Number(opts.limit),
3325
+ });
3326
+ console.log(JSON.stringify(res, null, 2));
3327
+ });
3246
3328
  intel
3247
3329
  .command("monitor-brand-keyword-candidates")
3248
3330
  .description("GET .../monitors/:monitorId/brand-keyword-candidates —— 从品牌词取导入候选(只读)。" +