@geoly-ai/social-hub-cli 0.3.17 → 0.3.19

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.
Files changed (66) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cmd-manifest.json +5 -2
  3. package/dist/cmd-manifest.test.js +3 -0
  4. package/dist/cmd-manifest.test.js.map +1 -1
  5. package/dist/index.d.ts +24 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +74 -9
  8. package/dist/index.js.map +1 -1
  9. package/dist/permissions-gates-admin.d.ts.map +1 -1
  10. package/dist/permissions-gates-admin.js +12 -0
  11. package/dist/permissions-gates-admin.js.map +1 -1
  12. package/dist/register-extensions.d.ts.map +1 -1
  13. package/dist/register-extensions.js +15 -1
  14. package/dist/register-extensions.js.map +1 -1
  15. package/dist/register-feishu-identities.d.ts +47 -0
  16. package/dist/register-feishu-identities.d.ts.map +1 -0
  17. package/dist/register-feishu-identities.js +346 -0
  18. package/dist/register-feishu-identities.js.map +1 -0
  19. package/dist/register-feishu-identities.test.d.ts +2 -0
  20. package/dist/register-feishu-identities.test.d.ts.map +1 -0
  21. package/dist/register-feishu-identities.test.js +124 -0
  22. package/dist/register-feishu-identities.test.js.map +1 -0
  23. package/dist/scrape-output.test.d.ts +2 -0
  24. package/dist/scrape-output.test.d.ts.map +1 -0
  25. package/dist/scrape-output.test.js +58 -0
  26. package/dist/scrape-output.test.js.map +1 -0
  27. package/package.json +3 -3
  28. package/skills/manifest.json +1 -1
  29. package/skills/reddit-content-writing/SKILL.md +1 -1
  30. package/skills/reddit-content-writing/references/phase4-execution-table.md +24 -3
  31. package/skills/reddit-content-writing/references/phase4-writing.md +123 -3
  32. package/skills/reddit-content-writing/references/post-writing-templates.md +14 -6
  33. package/skills/reddit-delivery-check/SKILL.md +1 -0
  34. package/skills/reddit-delivery-check/references/phase5-delivery.md +7 -1
  35. package/skills/reddit-matrix.lock.json +8 -8
  36. package/skills/reddit-phase-brief/SKILL.md +25 -9
  37. package/skills/reddit-phase-brief/references/brand-SKU-PGC-rules.md +223 -36
  38. package/skills/reddit-phase-brief/references/phase4-brief-workflow.md +364 -18
  39. package/skills/reddit-phase-planning/SKILL.md +13 -0
  40. package/skills/reddit-phase-planning/references/phase4-execution-table.md +16 -2
  41. package/skills/reddit-phase-planning/references/phase4-planning.md +74 -15
  42. package/skills/reddit-phase-planning/references/scheduling-decision-procedure.md +386 -0
  43. package/skills/reddit-phase-research/SKILL.md +7 -1
  44. package/skills/reddit-phase-research/references/phase01-research.md +93 -29
  45. package/skills/reddit-strategy-orchestrator/SKILL.md +120 -18
  46. package/skills/reddit-strategy-shared/SKILL.md +4 -2
  47. package/skills/reddit-strategy-shared/references/content-diversity-contract.md +19 -3
  48. package/skills/reddit-strategy-shared/references/context-contract.md +45 -11
  49. package/skills/reddit-strategy-shared/references/evidence-policy.md +139 -0
  50. package/skills/reddit-strategy-shared/references/handoff-schemas.md +16 -1
  51. package/skills/reddit-strategy-shared/references/path-conventions.md +26 -4
  52. package/skills/reddit-strategy-shared/references/prerequisites/README.md +57 -0
  53. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-master-canvas-agent-prompt-template.md → archive/reddit-master-canvas-agent-prompt-template.md} +7 -0
  54. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-sop-v2-universal.md → archive/reddit-sop-v2-universal.md} +7 -0
  55. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-prerequisites-read.md → archive/reddit-strategy-prerequisites-read.md} +7 -0
  56. package/skills/reddit-strategy-shared/references/prerequisites/{reddit-strategy-reuse-playbook.md → archive/reddit-strategy-reuse-playbook.md} +7 -0
  57. package/skills/reddit-strategy-shared/references/subreddit-research-profile.md +514 -0
  58. package/skills/reddit-strategy-shared/references/version-manifest.md +29 -2
  59. package/skills/reddit-voc-volume/SKILL.md +2 -7
  60. package/skills/reddit-voc-volume/matrix-contract.md +20 -4
  61. package/skills/reddit-voc-volume/references/arctic-shift.md +2 -1
  62. package/skills/reddit-voc-volume/scripts/reddit_voc_volume.py +157 -69
  63. package/skills/reddit-voc-volume/tests/test_archived_comments.py +104 -0
  64. package/skills/social-hub-admin/SKILL.md +47 -1
  65. package/skills/social-hub-cli/SKILL.md +1 -0
  66. package/skills/social-hub-posts/SKILL.md +14 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,31 @@ 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.19] - 2026-08-14
8
+
9
+ ### Added
10
+
11
+ - classify outcomes instead of reporting 2xx login pages as success
12
+
13
+ ### Fixed
14
+
15
+ - align AUTHZ_POLICY_VERSION with package version
16
+
17
+ ### Changed
18
+
19
+ - rebuild reddit matrix SOP around evidence and decision gates
20
+
21
+ ## [0.3.18] - 2026-08-13
22
+
23
+ ### Added
24
+
25
+ - require a repost decision when a post is deleted or banned
26
+ - deliver feishu identity mapping across api, cli and console
27
+
28
+ ### Changed
29
+
30
+ - refresh reddit-voc-volume archived comment handling
31
+
7
32
  ## [0.3.17] - 2026-08-11
8
33
 
9
34
  ### Added
@@ -1,6 +1,6 @@
1
1
  {
2
- "generatedAt": "2026-08-11T07:54:36.983Z",
3
- "cliVersion": "0.3.17",
2
+ "generatedAt": "2026-08-14T09:17:16.590Z",
3
+ "cliVersion": "0.3.19",
4
4
  "commands": [
5
5
  "accounts",
6
6
  "accounts brand-bindings",
@@ -206,6 +206,9 @@
206
206
  "export",
207
207
  "export agent-context",
208
208
  "export events-jsonl",
209
+ "feishu-identities",
210
+ "feishu-identities list",
211
+ "feishu-identities sync",
209
212
  "graph",
210
213
  "graph drilldown",
211
214
  "graph list",
@@ -47,6 +47,9 @@ describe("cmd-manifest", () => {
47
47
  expect(paths).toContain("notify source-configs activate");
48
48
  expect(paths).toContain("notify source-configs narrow-history");
49
49
  expect(paths).toContain("notify source-configs set-enabled");
50
+ // 飞书身份映射运维面:替代要求生产 DATABASE_URL 的 scripts/sync-feishu-identities.mjs。
51
+ expect(paths).toContain("feishu-identities list");
52
+ expect(paths).toContain("feishu-identities sync");
50
53
  });
51
54
  it("does not expose --auto-ack on notify pull (Phase 1 安全约定)", () => {
52
55
  const notify = program.commands.find((c) => c.name() === "notify");
@@ -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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"}
package/dist/index.d.ts CHANGED
@@ -22,5 +22,29 @@ export declare function orchestrateVocAcquire(client: VocAcquireClient, params:
22
22
  exitCode: 0 | 1 | 2;
23
23
  output: Record<string, unknown>;
24
24
  }>;
25
+ /**
26
+ * 业务失败(HTTP 200 + ok:false)的人类可读摘要:抓到了页面,但**不是正文**。
27
+ * 结论(outcome) + 阶段 + provider request id 全部打出来,别再让人对着通用错误猜。
28
+ */
29
+ export declare function formatScrapeFailure(res: {
30
+ outcome: string;
31
+ finalUrl?: string;
32
+ targetStatusCode?: number | null;
33
+ failureStage?: string | null;
34
+ providerRequestId?: string | null;
35
+ requestId?: string | null;
36
+ attempts?: number;
37
+ retryAfterMs?: number | null;
38
+ classifierVersion?: string;
39
+ classificationEvidence?: Array<{
40
+ ruleId: string;
41
+ signal: string;
42
+ }>;
43
+ }): string;
44
+ /**
45
+ * 技术层失败(429/502/504 等)的摘要:把 provider typed code / 失败阶段 /
46
+ * request id 从 `details` 里挖出来,取代以前的「Scrape service returned HTTP 500」。
47
+ */
48
+ export declare function formatScrapeError(e: unknown): string;
25
49
  export { program };
26
50
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
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"}
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;AA8+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;AAyqBD;;;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;AAgyDD,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import { registerAdminCommands } from "./register-admin.js";
7
7
  import { registerSubredditStyleCommands } from "./register-subreddit-style.js";
8
8
  import { registerContentClassificationCommands } from "./register-content-classification.js";
9
9
  import { registerNotifyCommands } from "./register-notify.js";
10
+ import { registerFeishuIdentityCommands } from "./register-feishu-identities.js";
10
11
  import { assertApplyOrDryRun } from "./dry-run.js";
11
12
  import { withPermissionGate } from "./permission-runner.js";
12
13
  import { registerBatchAndExport } from "./register-batch.js";
@@ -37,6 +38,7 @@ registerAdminCommands(program);
37
38
  registerSubredditStyleCommands(program);
38
39
  registerContentClassificationCommands(program);
39
40
  registerNotifyCommands(program);
41
+ registerFeishuIdentityCommands(program);
40
42
  registerBatchAndExport(program);
41
43
  program
42
44
  .command("health")
@@ -384,9 +386,10 @@ reddit
384
386
  });
385
387
  reddit
386
388
  .command("create-snapshot")
387
- .description("POST /reddit-post-snapshots(手工补录)")
389
+ .description("POST /reddit-post-snapshots(手工补录)。opsStatus 补录成 deleted/banned 时 " +
390
+ "repostRequired 必填(原帖已是补发二次除外)—— 服务端 fail-closed,不默认成不需补发")
388
391
  .option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
389
- .option("-j, --json <json>", '{"permalink":"...","subreddit":"...","score":0,"commentsCount":0,"brandNote":null,"negativeFeedback":null,"repostType":"none","firstRepostLink":null,"secondRepostLink":null}。也可 -j @<path> 读文件 / -j - 读 stdin')
392
+ .option("-j, --json <json>", '{"permalink":"...","subreddit":"...","score":0,"commentsCount":0,"brandNote":null,"negativeFeedback":null,"repostType":"none","firstRepostLink":null,"secondRepostLink":null,"repostRequired":true}。也可 -j @<path> 读文件 / -j - 读 stdin')
390
393
  .option("--json-file <path>", "从文件读 body JSON(路径,或 - 表示 stdin);与 -j 二选一。Windows 建议用此绕开 shell 引号问题")
391
394
  .action(async (opts) => {
392
395
  const body = readJsonArgOrExit({
@@ -3269,6 +3272,56 @@ intel
3269
3272
  const scrapeCmd = program
3270
3273
  .command("scrape")
3271
3274
  .description("通用网页抓取(Reddit .json 直连 / HTML 经 Firecrawl)");
3275
+ /**
3276
+ * 业务失败(HTTP 200 + ok:false)的人类可读摘要:抓到了页面,但**不是正文**。
3277
+ * 结论(outcome) + 阶段 + provider request id 全部打出来,别再让人对着通用错误猜。
3278
+ */
3279
+ export function formatScrapeFailure(res) {
3280
+ const evidence = (res.classificationEvidence ?? [])
3281
+ .map((e) => `${e.ruleId}(${e.signal})`)
3282
+ .join(", ");
3283
+ const parts = [
3284
+ `scrape 未取得正文:outcome=${res.outcome}`,
3285
+ `targetStatus=${res.targetStatusCode ?? "null"}`,
3286
+ `finalUrl=${res.finalUrl ?? "null"}`,
3287
+ `stage=${res.failureStage ?? "null"}`,
3288
+ `attempts=${res.attempts ?? 1}`,
3289
+ ];
3290
+ if (res.retryAfterMs != null)
3291
+ parts.push(`retryAfterMs=${res.retryAfterMs}`);
3292
+ parts.push(`requestId=${res.requestId ?? "null"}`);
3293
+ parts.push(`providerRequestId=${res.providerRequestId ?? "null"}`);
3294
+ if (res.classifierVersion)
3295
+ parts.push(`classifier=${res.classifierVersion}`);
3296
+ if (evidence)
3297
+ parts.push(`evidence=[${evidence}]`);
3298
+ return parts.join(" ");
3299
+ }
3300
+ /**
3301
+ * 技术层失败(429/502/504 等)的摘要:把 provider typed code / 失败阶段 /
3302
+ * request id 从 `details` 里挖出来,取代以前的「Scrape service returned HTTP 500」。
3303
+ */
3304
+ export function formatScrapeError(e) {
3305
+ const err = e;
3306
+ const base = err?.message ?? String(e);
3307
+ const d = err?.details;
3308
+ if (!d?.outcome)
3309
+ return base;
3310
+ const p = d.diagnostics?.provider ?? {};
3311
+ const x = d.diagnostics?.execution ?? {};
3312
+ return [
3313
+ base,
3314
+ `code=${err.code ?? "null"}`,
3315
+ `outcome=${d.outcome}`,
3316
+ `stage=${x.failureStage ?? "null"}`,
3317
+ `providerStatus=${p.providerStatusCode ?? "null"}`,
3318
+ `providerErrorCode=${p.providerErrorCode ?? "null"}`,
3319
+ `providerRequestId=${p.providerRequestId ?? "null"}`,
3320
+ `providerScrapeId=${p.providerScrapeId ?? "null"}`,
3321
+ `attempts=${x.attemptCount ?? 1}`,
3322
+ ...(x.retryAfterMs != null ? [`retryAfterMs=${x.retryAfterMs}`] : []),
3323
+ ].join(" ");
3324
+ }
3272
3325
  scrapeCmd
3273
3326
  .command("url <url>")
3274
3327
  .description("POST /v1/system/scrape —— 抓取任意网页(Reddit .json 或 HTML)")
@@ -3282,13 +3335,25 @@ scrapeCmd
3282
3335
  .map((s) => s.trim())
3283
3336
  .filter(Boolean)
3284
3337
  : undefined;
3285
- const res = await requireClient().scrapeUrl({
3286
- url,
3287
- formats,
3288
- mode: opts.redditJson ? "reddit-json" : undefined,
3289
- timeoutMs: opts.timeout ? Number(opts.timeout) : undefined,
3290
- });
3291
- console.log(JSON.stringify(res, null, 2));
3338
+ try {
3339
+ const res = await requireClient().scrapeUrl({
3340
+ url,
3341
+ formats,
3342
+ mode: opts.redditJson ? "reddit-json" : undefined,
3343
+ timeoutMs: opts.timeout ? Number(opts.timeout) : undefined,
3344
+ });
3345
+ console.log(JSON.stringify(res, null, 2));
3346
+ if (!res.ok) {
3347
+ // 业务失败(2xx 登录墙/验证码/空正文/目标站限流…):HTTP 是 200,但**不是正文**。
3348
+ // 退出码必须非零,否则 shell/agent 会把「抓到登录页」当成抓取成功。
3349
+ console.error(formatScrapeFailure(res));
3350
+ process.exit(2);
3351
+ }
3352
+ }
3353
+ catch (e) {
3354
+ console.error(formatScrapeError(e));
3355
+ process.exit(1);
3356
+ }
3292
3357
  });
3293
3358
  scrapeCmd
3294
3359
  .command("status")