@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 +15 -0
- package/dist/admin-index-gates.test.js +0 -1
- package/dist/admin-index-gates.test.js.map +1 -1
- package/dist/client-delivery.test.js +40 -1
- package/dist/client-delivery.test.js.map +1 -1
- package/dist/cmd-manifest.json +8 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +142 -113
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +1 -18
- package/dist/index.test.js.map +1 -1
- package/dist/permissions-gates-admin.d.ts.map +1 -1
- package/dist/permissions-gates-admin.js +0 -5
- package/dist/permissions-gates-admin.js.map +1 -1
- package/package.json +2 -2
- package/skills/manifest.json +1 -1
- package/skills/social-hub-admin/SKILL.md +0 -1
- package/skills/social-hub-cli/SKILL.md +2 -2
- package/skills/social-hub-events-observability/SKILL.md +2 -11
- package/skills/social-hub-intelligence/SKILL.md +5 -0
- package/skills/social-hub-migration/SKILL.md +0 -9
- package/skills/social-hub-publishing/SKILL.md +1 -2
- package/skills/social-hub-subreddit-pools/SKILL.md +34 -13
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,
|
|
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 [
|
|
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":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,4BAA4B,GAAG,EAAE;KACpC,EAAE,EAAE;KACJ,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACvC,MAAM,6BAA6B,GAAG,EAAE;KACrC,EAAE,EAAE;KACJ,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACvC,MAAM,yBAAyB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AAE3E,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;IACxB,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC5B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;QACpB,4BAA4B;QAC5B,6BAA6B;QAC7B,yBAAyB;KAC1B,CAAC;IACF,aAAa,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,IAAI,QAAQ;IAC5C,UAAU,EAAE,GAAG,EAAE,CAAC,kBAAkB;CACrC,CAAC,CAAC,CAAC;AAEJ,IAAI,OAAwD,CAAC;AAE7D,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/C,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACxD,CAAC,EAAE,KAAK,CAAC,CAAC;AAEV,SAAS,KAAK;IACZ,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,iBAAiB,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,KAAK,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,KAAK,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,4BAA4B,CAAC,SAAS,EAAE,CAAC;IACzC,6BAA6B,CAAC,SAAS,EAAE,CAAC;IAC1C,yBAAyB,CAAC,SAAS,EAAE,CAAC;IACtC,6EAA6E;IAC7E,kEAAkE;IAClE,KAAK,MAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"client-delivery.test.js","sourceRoot":"","sources":["../src/client-delivery.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cmd-manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-08-
|
|
3
|
-
"cliVersion": "0.3.
|
|
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",
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,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
|
|
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
|
-
|
|
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
|
-
|
|
1430
|
-
if (opts.
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
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? }
|
|
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", "
|
|
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
|
-
.
|
|
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
|
});
|