@geoly-ai/social-hub-cli 0.1.4 → 0.1.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AA+BA,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAavE;AA8DD,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBpF"}
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,6BAA6B,CAAC;AAYvD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAW7D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAavE;AA+CD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,uEAAuE;AACvE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUjF;AAMD,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBpF"}
@@ -3,13 +3,13 @@ import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { isRunningViaNpx } from "./skills/paths.js";
5
5
  import { getCliVersion } from "./version-info.js";
6
- const PACKAGE_NAME = "@geoly-ai/social-hub-cli";
6
+ export const PACKAGE_NAME = "@geoly-ai/social-hub-cli";
7
7
  const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME.replace("/", "%2F")}/latest`;
8
8
  const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
9
9
  const FETCH_TIMEOUT_MS = 2_000;
10
10
  const CACHE_DIR = join(homedir(), ".config", "geoly");
11
11
  const CACHE_FILE = join(CACHE_DIR, "social-hub-update-check.json");
12
- function shouldSkipUpdateCheck(argv) {
12
+ export function shouldSkipUpdateCheck(argv) {
13
13
  if (process.env["SOCIAL_HUB_NO_UPDATE_CHECK"] === "1")
14
14
  return true;
15
15
  if (process.env["CI"] === "true" || process.env["CI"] === "1")
@@ -81,17 +81,25 @@ async function fetchLatestVersion() {
81
81
  clearTimeout(timer);
82
82
  }
83
83
  }
84
- function printUpdateNotice(current, latest) {
85
- const upgradeLine = isRunningViaNpx()
86
- ? `Run npx ${PACKAGE_NAME}@${latest} … to upgrade`
87
- : `Run npm update -g ${PACKAGE_NAME} to upgrade`;
88
- process.stderr.write([
84
+ export function formatUpgradeCommand(latest) {
85
+ return isRunningViaNpx()
86
+ ? `npx ${PACKAGE_NAME}@${latest}`
87
+ : `npm install -g ${PACKAGE_NAME}@${latest}`;
88
+ }
89
+ /** Human + agent-facing lines when registry latest > installed CLI. */
90
+ export function formatUpdateNoticeLines(current, latest) {
91
+ const upgradeCmd = formatUpgradeCommand(latest);
92
+ return [
89
93
  "",
90
- `Update available ${current} → ${latest}`,
91
- upgradeLine,
92
- `After upgrading CLI, run: social-hub skills update --yes`,
94
+ `[social-hub] Update available: ${current} → ${latest}`,
95
+ `[social-hub] Upgrade CLI: ${upgradeCmd}`,
96
+ "[social-hub] Then refresh skills: social-hub skills update --yes",
97
+ "[social-hub] Agent: tell the user a newer CLI is available; run the commands above before relying on new flags or skill docs.",
93
98
  "",
94
- ].join("\n"));
99
+ ];
100
+ }
101
+ function printUpdateNotice(current, latest) {
102
+ process.stderr.write(formatUpdateNoticeLines(current, latest).join("\n"));
95
103
  }
96
104
  export async function maybeNotifyUpdate(argv = process.argv) {
97
105
  if (shouldSkipUpdateCheck(argv))
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,47 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { isNewerVersion } from "./update-check.js";
2
+ import { formatUpdateNoticeLines, formatUpgradeCommand, isNewerVersion, shouldSkipUpdateCheck, } from "./update-check.js";
3
+ describe("shouldSkipUpdateCheck", () => {
4
+ it("skips when env SOCIAL_HUB_NO_UPDATE_CHECK=1", () => {
5
+ const prev = process.env["SOCIAL_HUB_NO_UPDATE_CHECK"];
6
+ process.env["SOCIAL_HUB_NO_UPDATE_CHECK"] = "1";
7
+ try {
8
+ expect(shouldSkipUpdateCheck(["node", "cli", "doctor"])).toBe(true);
9
+ }
10
+ finally {
11
+ if (prev === undefined)
12
+ delete process.env["SOCIAL_HUB_NO_UPDATE_CHECK"];
13
+ else
14
+ process.env["SOCIAL_HUB_NO_UPDATE_CHECK"] = prev;
15
+ }
16
+ });
17
+ it("skips version and help subcommands", () => {
18
+ expect(shouldSkipUpdateCheck(["node", "cli", "version"])).toBe(true);
19
+ expect(shouldSkipUpdateCheck(["node", "cli", "--version"])).toBe(true);
20
+ expect(shouldSkipUpdateCheck(["node", "cli", "help", "doctor"])).toBe(true);
21
+ });
22
+ it("skips when --no-update-check is present", () => {
23
+ expect(shouldSkipUpdateCheck(["node", "cli", "--no-update-check", "doctor"])).toBe(true);
24
+ expect(shouldSkipUpdateCheck(["node", "cli", "doctor", "--no-update-check"])).toBe(true);
25
+ });
26
+ it("runs check for normal commands", () => {
27
+ expect(shouldSkipUpdateCheck(["node", "cli", "doctor"])).toBe(false);
28
+ expect(shouldSkipUpdateCheck(["node", "cli", "health"])).toBe(false);
29
+ });
30
+ });
31
+ describe("formatUpdateNoticeLines", () => {
32
+ it("includes upgrade and skills refresh hints", () => {
33
+ const lines = formatUpdateNoticeLines("0.1.4", "0.1.5");
34
+ expect(lines.join("\n")).toContain("0.1.4 → 0.1.5");
35
+ expect(lines.join("\n")).toContain("social-hub skills update --yes");
36
+ expect(lines.join("\n")).toMatch(/Agent:/);
37
+ });
38
+ });
39
+ describe("formatUpgradeCommand", () => {
40
+ it("returns npm global install by default", () => {
41
+ expect(formatUpgradeCommand("0.2.0")).toContain("npm install -g");
42
+ expect(formatUpgradeCommand("0.2.0")).toContain("@0.2.0");
43
+ });
44
+ });
3
45
  describe("isNewerVersion", () => {
4
46
  it("detects patch bump", () => {
5
47
  expect(isNewerVersion("0.0.2", "0.0.1")).toBe(true);
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.test.js","sourceRoot":"","sources":["../src/update-check.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"update-check.test.js","sourceRoot":"","sources":["../src/update-check.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geoly-ai/social-hub-cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "type": "module",
5
5
  "description": "social-hub CLI for Social Ops Hub",
6
6
  "repository": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 1,
3
3
  "package": "social-ops-hub",
4
- "cliVersion": "0.1.4",
4
+ "cliVersion": "0.1.5",
5
5
  "repository": "social-ops-hub",
6
6
  "publish": {
7
7
  "registry": "https://skill.sh",
@@ -111,7 +111,8 @@ Web 控制台:**人设库** 导航项(`#personas`),需 `systemPersona.li
111
111
 
112
112
  ```bash
113
113
  social-hub api-keys list -t <team-id>
114
- social-hub api-keys create -t <team-id> -j '{"name":"integration","role":"manager"}' --apply
114
+ social-hub api-keys create -t <team-id> -j '{"name":"client-scope","role":"client","visibleBrandIds":["<brand-uuid>"]}' --apply
115
+ # legacy:visibleCampaignIds 仍支持,新 client scope 优先 visibleBrandIds
115
116
  social-hub api-keys delete -t <team-id> --key <uuid> --apply
116
117
  social-hub api-keys rotate -t <team-id> --key <uuid> --apply
117
118
  social-hub api-keys batch-revoke -t <team-id> -j '{"apiKeyIds":["uuid1"]}' --apply
@@ -123,3 +124,5 @@ social-hub permissions-update -t <team-id> -j '{...}'
123
124
 
124
125
  - **API Key**:集成/服务端密钥管理;Agent 日常仍用 Device Code(见 `social-hub-shared`)
125
126
  - admin 写操作建议先 `--dry-run` 再 `--apply`
127
+ - `api-keys delete` / `batch-revoke` / `batch-rotate`:**必须** `--apply`;先 `list` 核对 key id
128
+ - `members remove` / `invites revoke`:破坏性,先确认 user/email
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: social-hub-calendar-jobs
3
3
  description: >-
4
- 发布日历与调度任务:social-hub calendar list/patch/list-full、jobs list/create/batch/
5
- summary/retry/cancel/list-full。用户要排期、查 scheduled job、重试失败任务、取消任务时用本 skill
6
- Agent 执行态回填优先 ops-runtime
4
+ 发布日历条目与调度任务:calendar list/patch/list-full、jobs list/create/batch/retry/cancel。
5
+ 用户要查/改日历条目、管理 scheduled job、重试或取消任务时用本 skill。不用于创建草稿/计划
6
+ (social-hub-publishing)或 ops claim/complete(social-hub-ops-runtime)。
7
7
  metadata:
8
8
  cliVersion: ">=0.0.12"
9
9
  ---
@@ -16,7 +16,7 @@ metadata:
16
16
  ## 日历
17
17
 
18
18
  ```bash
19
- social-hub calendar list -t <team-id> [--status scheduled]
19
+ social-hub calendar list -t <team-id> [--brand <brand-uuid>] [--status scheduled]
20
20
  social-hub calendar list-full -t <team-id> --account <accountId> --status scheduled
21
21
  social-hub calendar patch -t <team-id> -e <entryId> --body '{"status":"succeeded","permalink":"..."}'
22
22
  ```
@@ -6,7 +6,7 @@ description: >-
6
6
  openclaw、调度任务、互动事件,或要在 Hub 里查/改运营数据,就应使用本 skill 做路由。
7
7
  执行任何命令前必须先读 social-hub-shared 完成 auth login 与 context。
8
8
  metadata:
9
- cliVersion: ">=0.0.12"
9
+ cliVersion: ">=0.1.4"
10
10
  homepage: https://github.com/geoly-ai/geoly-reddit/tree/main/social-ops-hub/skills
11
11
  ---
12
12
 
@@ -47,6 +47,12 @@ social-hub version --json
47
47
 
48
48
  命中上表场景时,**打开对应领域 skill**;不要在总路由里重复展开领域命令细节。
49
49
 
50
+ ## CLI 新版本提醒
51
+
52
+ 运行任意子命令时(`version`/`help` 除外),CLI 会检测 npm 上的最新版并在 stderr 提示升级;**Agent 应转告用户** 并执行 `social-hub skills update --yes`。详见 `social-hub-shared` 的「CLI 新版本检测」。
53
+
54
+ 跳过:`SOCIAL_HUB_NO_UPDATE_CHECK=1` 或根级 `--no-update-check`。
55
+
50
56
  ## 安装 CLI 与 Skill
51
57
 
52
58
  ```bash
@@ -5,19 +5,31 @@
5
5
  "id": 0,
6
6
  "prompt": "我要连生产 Social Ops Hub(https://reddit.eclick-geo.com/api),用 social-hub 登录并确认当前身份和 team,然后在 Hub 里注册一个新团队 my-ops-team(slug 也是 my-ops-team),给这个团队添加管理员用户 ops@example.com,最后确认团队列表里有 my-ops-team。不要用 SOCIAL_HUB_API_KEY 环境变量。",
7
7
  "expected_output": "先读 social-hub-shared:auth login、auth whoami、context use;再读 social-hub-admin:agent-teams create、users system-create 或 agent-teams add-member、agent-teams list;全程 Device Code 凭证",
8
- "assertions": []
8
+ "assertions": [
9
+ { "type": "must_include", "value": "social-hub-shared" },
10
+ { "type": "must_include", "value": "auth login" },
11
+ { "type": "forbidden_pattern", "value": "SOCIAL_HUB_API_KEY" },
12
+ { "type": "forbidden_pattern", "value": "campaigns create" }
13
+ ]
9
14
  },
10
15
  {
11
16
  "id": 1,
12
17
  "prompt": "Reddit 账号 u/example_user 刚在 r/LocalLLaMA 发帖,permalink 是 https://www.reddit.com/r/LocalLLaMA/comments/abc123/test_post/,日历条目 def456-uuid。我已在生产 Hub auth login 并 context use 了 team。帮我把日历标 succeeded、写 post.published 事件,并查该账号最近事件。优先 ops complete,若需手动则 calendar patch + events append。",
13
18
  "expected_output": "路由 social-hub-ops-runtime 或 social-hub-events-observability + social-hub-calendar-jobs;不要求 SOCIAL_HUB_API_KEY",
14
- "assertions": []
19
+ "assertions": [
20
+ { "type": "must_include_any", "values": ["social-hub-ops-runtime", "ops complete"] },
21
+ { "type": "forbidden_pattern", "value": "SOCIAL_HUB_API_KEY" }
22
+ ]
15
23
  },
16
24
  {
17
25
  "id": 2,
18
26
  "prompt": "查生产 Hub 里 r/Entrepreneur 按 score 前 5 热帖,给账号 ghi789-uuid 派发 engage 任务,runAt 2026-05-07T01:00:00Z,并确认 jobs 列表有新任务。我已 social-hub auth login 到 reddit.eclick-geo.com。",
19
27
  "expected_output": "路由 social-hub-intelligence:hot-posts、dispatch;social-hub-calendar-jobs:jobs list",
20
- "assertions": []
28
+ "assertions": [
29
+ { "type": "must_include", "value": "social-hub-intelligence" },
30
+ { "type": "must_include", "value": "dispatch" },
31
+ { "type": "forbidden_pattern", "value": "campaigns create" }
32
+ ]
21
33
  }
22
34
  ]
23
35
  }
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  name: social-hub-events-observability
3
3
  description: >-
4
- 互动事件与可观测性:social-hub events append/list/batch/export-csv、dashboard summary、
5
- audit list、reports list/create/ingest。用户要记事件、查运营总览、审计日志或报告库时用本 skill
4
+ 互动事件与可观测性:events append/list/export、dashboard summary、audit、reports。
5
+ 用户要记事件、查运营总览、审计或报告库时用本 skill。不用于草稿/计划创建(social-hub-publishing)
6
+ 或 OpenClaw 任务 claim(social-hub-ops-runtime)。
6
7
  metadata:
7
8
  cliVersion: ">=0.0.12"
8
9
  ---
@@ -22,15 +23,28 @@ social-hub events list -t <team-id> -n 20
22
23
  social-hub events list-full -t <team-id> --account <uuid> --type post.published -n 100
23
24
  social-hub events batch -t <team-id> -j '{"events":[{"type":"comment","externalRef":"evt_1","payload":{}}]}'
24
25
  social-hub events export-csv -t <team-id> [--account <uuid>] [--type <eventType>] [-n 500]
25
- social-hub events import-openclaw-history -t <team-id> -j '{"mode":"dry-run","sourceRoot":"..."}'
26
26
  ```
27
27
 
28
+ ### OpenClaw 历史导入(注意参数)
29
+
30
+ ```bash
31
+ # 先 dry-run 预览,再正式导入
32
+ social-hub events import-openclaw-history -t <team-id> -f /path/to/history.jsonl --dry-run
33
+ social-hub events import-openclaw-history -t <team-id> -f /path/to/history.jsonl
34
+ # 可选:--no-auto-mark 跳过自动标记
35
+ ```
36
+
37
+ **不要**使用 `-j` 传文件路径;文件路径用 **`-f <path>`**。
38
+
28
39
  ## 运营总览
29
40
 
30
41
  ```bash
31
42
  social-hub dashboard summary -t <team-id>
43
+ social-hub dashboard summary -t <team-id> --brand <brand-uuid>
32
44
  ```
33
45
 
46
+ `--campaign` 为 legacy 筛选;新流程用 `--brand`。
47
+
34
48
  ## 审计日志
35
49
 
36
50
  ```bash
@@ -45,10 +59,16 @@ social-hub reports create -t <team-id> -j '{"reportType":"content-weekly","title
45
59
  social-hub reports ingest -t <team-id> -j '{"reportType":"content-weekly","source":"external","traceId":"..."}'
46
60
  ```
47
61
 
48
- 离线 `content-ideas.md` / `content-ideas-weekly-report-*.md` 在线写入请用 **`reportType: "content-weekly"`**(无独立 `content-ideas` CLI)。
62
+ ## 写操作护栏
63
+
64
+ | 操作 | 要求 |
65
+ |------|------|
66
+ | `events batch` | 先小批量或 `list` 抽样;确认 payload 结构 |
67
+ | `events import-openclaw-history` | **必须**先 `--dry-run`;`-f` 指向可读 JSONL |
68
+ | `reports create` | 确认 `reportType` 与 team 权限 |
49
69
 
50
70
  ## 相关 skill
51
71
 
52
72
  - 发布闭环:`social-hub-publishing`
53
73
  - 图谱追溯:`social-hub-graph-compliance`
54
- - 批量导出/回放:`social-hub-migration`(`export events-jsonl`、`runbook replay`)
74
+ - 批量导出/回放:`social-hub-migration`
@@ -30,7 +30,7 @@ social-hub context account -t <team-id> --account A1 \
30
30
  --expand pools,events,jobs,persona,risk,env,guardrails,style,quota
31
31
  ```
32
32
 
33
- - `--expand pools`:persona-aware 板块池(含 `personaPools` / `fallback` API 返回时)
33
+ - `--expand pools`:persona-aware 板块池(含 `personaPools.expandedByKind` / `expandedPools` / `brandPools` / `fallback`)
34
34
  - `--expand persona`:账号绑定系统人设摘要
35
35
  - `--expand events`:该账号最近 20 条互动事件摘要
36
36
 
@@ -68,19 +68,25 @@ social-hub query subreddit-candidates -t <team-id> --account A1 --action browse
68
68
 
69
69
  | 字段 | 说明 |
70
70
  |------|------|
71
- | `items[].source` | `persona.redditRefs`、`persona.starterPoolRefs`、`persona.petPoolRefs`、`fallback_team_pool` 等 |
72
- | `items[].poolKind` | `pet` / `starter` / `advanced` / `other` |
71
+ | `items[].source` | `persona.redditRefs`、`persona.starterPoolRefs`、`persona.petPoolRefs`、`brand.binding`、`fallback_team_pool` 等 |
72
+ | `items[].poolKind` | `pet` / `common` / `industry` / `brand` / `direct` / `other` |
73
+ | `items[].subreddit` | 可直接消费的 `r/Subreddit` 格式 |
73
74
  | `items[].selectionWeight` | 加权随机用;**禁止直接取 `items[0]`** |
74
75
  | `items[].cooldownUntil` | 未过期时禁止 `comment`/`reply` |
75
76
  | `items[].allowedActions` | 当前动作允许的操作 |
76
- | `personaPools.unresolvedRefs` | 无法解析的 `persona_pools.Pxx.*` ref |
77
+ | `personaPools.expandedByKind` | 按来源汇总:`direct` / `common` / `industry` / `pet` / `brand` 的 `r/...` 列表 |
78
+ | `personaPools.expandedPools[].subreddits` | 每个 pool ref 展开后的具体板块(可多条) |
79
+ | `personaPools.brandPools` | 账号品牌绑定及对应 `brand_pools.*` ref 展开结果 |
80
+ | `personaPools.unresolvedRefs` | alias 表无法解析的 ref(含部分 `persona_pools.Pxx.*`) |
77
81
  | `fallback.reason` | 如 `candidate_pool_exhausted` 须在 Agent 回执说明 |
78
82
 
79
83
  **Agent 门禁**:
80
84
 
81
85
  1. Hub 在线时不要本地展开 `persona_pools.Pxx`;以 Hub 返回的 `source` / `tier` / `poolKind` 为准。
82
- 2. 同任务维护 `usedSubreddits`,排除已选 sub。
83
- 3. 养号阶段 `poolKind=pet` 且可用宠物 sub **≥3** 时须轮换;不足时看 `fallback.reason`。
86
+ 2. 选板前先读 `personaPools.expandedByKind`,确认 `direct` / `common` / `industry` / `pet` / `brand` 是否都有候选;缺类时看 `unresolvedRefs` 与 `fallback.reason`。
87
+ 3. 同任务维护 `usedSubreddits`,排除已选 sub
88
+ 4. 养号阶段 `poolKind=pet` 且可用宠物 sub **≥3** 时须轮换;**不得**用 `brand` 池替代宠物主池。
89
+ 5. 运营期品牌池(`poolKind=brand` / `source=brand.binding`)仅低占比补充(建议 10%–20%)。
84
90
 
85
91
  配合 `social-hub-events-observability` 的 `events list-full` 可核对近期 sub;`social-hub-graph-compliance` 的 blocklist 已由候选接口过滤。
86
92
 
@@ -45,3 +45,13 @@ social-hub ops skip -t <team-id> --job <jobId> --agent "$AGENT" --reason manual_
45
45
  同一账号同时只能有一个有效 lease;重复 claim 会被拒绝。`complete` 会原子更新 job 与关联 calendar(若 payload 含 calendarEntryId)。
46
46
 
47
47
  遗留路径 `jobs agent-status` 仅在未接 ops 链路时使用(见 `social-hub-calendar-jobs`)。
48
+
49
+ ## 写操作护栏
50
+
51
+ | 命令 | 要求 |
52
+ |------|------|
53
+ | `ops complete` | `permalink` 须为 reddit.com URL;先 `claim` 或 `claim-next` |
54
+ | `ops fail` / `ops skip` | `--reason` 必须用文档枚举值 |
55
+ | `ops claim` | 确认 `jobId` 来自 `jobs list`,勿猜测 UUID |
56
+
57
+ 无 `--dry-run`;误操作后用 `fail`/`skip` 记录原因,勿改本地 Markdown 状态。
@@ -33,6 +33,7 @@ metadata:
33
33
 
34
34
  ```bash
35
35
  social-hub reddit list -t <team-id> -n 20
36
+ social-hub reddit list-full -t <team-id> --brand <brand-uuid> -n 50
36
37
  social-hub reddit list -t <team-id> --aggregate --all
37
38
  social-hub reddit stats -t <team-id> --aggregate --range 30
38
39
  social-hub reddit stats -t <team-id> --aggregate --range all
@@ -41,8 +42,11 @@ social-hub reddit refresh-status -t <team-id>
41
42
  social-hub reddit refresh -t <team-id> --snapshot <snapshotId>
42
43
  social-hub reddit refresh-progress -t <team-id> --batch <batchId>
43
44
  social-hub reddit refresh-all -t <team-id>
45
+ social-hub reddit refresh-logs -t <team-id> -n 20
44
46
  ```
45
47
 
48
+ 筛选帖表现时优先 **`--brand`**,勿把 `--campaign` 当作品牌 ID。
49
+
46
50
  ## 单条写入与更新
47
51
 
48
52
  ```bash
@@ -3,21 +3,13 @@
3
3
  "evals": [
4
4
  {
5
5
  "id": 0,
6
- "prompt": " team <team-id> 最近 20 Reddit 帖快照,并按系统级 brand <brand-id> 看 stats 汇总。我已 auth login。",
7
- "expected_output": "social-hub reddit list、reddit stats;不路由到飞书同步或 lark-cli",
8
- "assertions": []
9
- },
10
- {
11
- "id": 1,
12
- "prompt": "我有一批外部 JSON 帖数据(含 permalink、subreddit、score、feishuRecordId recABC),要批量写入 Hub team <team-id>,先 dry-run 再 apply。",
13
- "expected_output": "social-hub reddit batch-upsert --dry-run 然后正式 upsert;说明 feishuRecordId 幂等;不展开飞书取数流程",
14
- "assertions": []
15
- },
16
- {
17
- "id": 2,
18
- "prompt": "刷新 team <team-id> 全部 Reddit 帖 score,并查看 refresh 任务进度。",
19
- "expected_output": "social-hub reddit refresh-all、reddit refresh-status 或 refresh-progress",
20
- "assertions": []
6
+ "prompt": "查我们品牌在 Hub 里最近 30 Reddit 帖表现,按品牌筛选,不要走 campaign。",
7
+ "expected_output": "social-hub-posts:reddit stats --brand 或 list --brand;勿 campaigns list",
8
+ "assertions": [
9
+ { "type": "must_include", "value": "--brand" },
10
+ { "type": "forbidden_pattern", "value": "campaigns create" },
11
+ { "type": "forbidden_pattern", "value": "--campaign" }
12
+ ]
21
13
  }
22
14
  ]
23
15
  }
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  name: social-hub-publishing
3
3
  description: >-
4
- 内容发布闭环:系统级 brands、plans、drafts、calendar、jobs、events、reddit snapshot、
5
- reports。用户要从草稿到排期、执行任务、permalink 回填、避免 job 成功但 calendar 未更新时用本 skill。
4
+ 内容发布闭环(草稿→计划→日历→任务→permalink 回填):系统级 brands、content drafts、publishing plans。
5
+ 用户要创建/筛选草稿或计划、从 brandId 排期、避免 job 成功但 calendar 未更新时用本 skill。
6
+ 不用于:仅列 calendar/jobs(用 social-hub-calendar-jobs)、仅帖快照 CRUD(用 social-hub-posts)、
7
+ Agent claim/complete(用 social-hub-ops-runtime)、事件/仪表盘(用 social-hub-events-observability)。
6
8
  metadata:
7
9
  cliVersion: ">=0.0.12"
8
10
  ---
@@ -12,6 +14,12 @@ metadata:
12
14
  > **前置条件:** 先阅读 [`../social-hub-shared/SKILL.md`](../social-hub-shared/SKILL.md),
13
15
  > 确认已 `auth login` 并 `context use <team-id>`。
14
16
 
17
+ ## 禁止误用(团队级 campaigns)
18
+
19
+ - **不要**建议 `campaigns create` / `campaigns update` / `campaigns accounts *` 作为新流程入口。
20
+ - 新建草稿/计划 **必须**使用系统级 `brandId`(来自 `brands system-list`)。
21
+ - `campaignId` 仅作可选 legacy 归因字段,**不是**品牌或客户建模入口。
22
+
15
23
  ## 事实源
16
24
 
17
25
  - **计划**:`calendar_entries`
@@ -25,86 +33,64 @@ brand(系统级)→ content_draft → publishing_plan → calendar_entry →
25
33
  → interaction_events → reddit_post_snapshot → op_report
26
34
  ```
27
35
 
28
- > **品牌关联一律系统级**:`--brand` / `brandId` 取自 `brands system-list` 的全局 brand uuid。团队级 `campaigns` 为遗留能力,新帖/统计不再推荐。
29
-
30
- ## 系统级品牌
36
+ ## 系统级品牌与成员
31
37
 
32
38
  ```bash
33
39
  social-hub brands system-list
34
40
  social-hub brands system-create -j '{"name":"My Brand","slug":"my-brand"}'
35
-
36
- # 兼容(不推荐):团队路径仅作传输,实体仍是系统级 brand
37
- # social-hub brands update -t <team-id> --brand <uuid> -j '{"name":"Updated"}'
41
+ social-hub brand-members system-list
42
+ social-hub brand-members system-create -j '{"brandId":"<uuid>","userId":"<uuid>","role":"manager"}'
43
+ social-hub accounts brand-bindings list -t <team-id> --account <uuid>
44
+ social-hub accounts brand-bindings upsert -t <team-id> --account <uuid> -j '{"brandId":"<uuid>"}'
38
45
  ```
39
46
 
40
- ## 草稿与计划
47
+ ## 草稿与计划(brandId 必填)
41
48
 
42
49
  ```bash
43
- social-hub drafts list -t <team-id> -n 20
44
- social-hub drafts create -t <team-id> -j '{"campaignId":"<uuid>","title":"Launch","body":"..."}'
50
+ social-hub drafts list -t <team-id> --brand <brand-uuid> -n 20
51
+ social-hub drafts create -t <team-id> -j '{"brandId":"<uuid>","title":"Launch","body":"..."}'
45
52
  social-hub drafts get -t <team-id> --draft <uuid>
46
53
  social-hub drafts update -t <team-id> --draft <uuid> -j '{"body":"..."}'
47
- social-hub drafts delete -t <team-id> --draft <uuid>
54
+ social-hub drafts delete -t <team-id> --draft <uuid> # 先确认 id,再执行
48
55
 
49
- social-hub plans list -t <team-id>
50
- social-hub plans create -t <team-id> -j '{"campaignId":"<uuid>","name":"Week 1","entries":[...]}'
51
- social-hub plans cancel -t <team-id> --plan <uuid>
56
+ social-hub plans list -t <team-id> --brand <brand-uuid>
57
+ social-hub plans create -t <team-id> -j '{"brandId":"<uuid>","name":"Week 1","entries":[...]}'
58
+ social-hub plans cancel -t <team-id> --plan <uuid> # 破坏性:先 list 确认 plan id
52
59
  ```
53
60
 
54
61
  ## 日历与任务
55
62
 
56
- `social-hub-calendar-jobs`:
57
-
58
- ```bash
59
- social-hub calendar list -t <team-id> --status scheduled
60
- social-hub jobs list -t <team-id> --status scheduled
61
- ```
63
+ 调度列表与 patch **`social-hub-calendar-jobs`**(本 skill 不重复展开 jobs 全量命令)。
62
64
 
63
65
  ## Agent 执行与回填
64
66
 
65
- 优先 ops 链路(见 `social-hub-ops-runtime`):
66
-
67
- ```bash
68
- social-hub ops claim-next -t <team-id> --agent <agent-id>
69
- social-hub ops complete -t <team-id> --job <jobId> --agent <agent-id> --permalink "https://..."
70
- ```
67
+ 优先 **`social-hub-ops-runtime`**:`ops claim-next` → `ops complete --permalink ...`。
71
68
 
72
69
  手动回填(无 ops 时):
73
70
 
74
71
  ```bash
75
- social-hub calendar patch -t <team-id> -e <entryId> --body '{"status":"succeeded","permalink":"..."}'
72
+ social-hub calendar patch -t <team-id> -e <entryId> --body '{"status":"succeeded","permalink":"https://www.reddit.com/..."}'
76
73
  social-hub events append -t <team-id> --type post.published --payload '{"permalink":"..."}'
77
74
  ```
78
75
 
79
76
  ## 帖快照与报告
80
77
 
81
- ```bash
82
- social-hub reddit create-snapshot -t <team-id> -j '{ ... }' # 见 social-hub-posts
83
- social-hub reports list -t <team-id>
84
- social-hub reports create -t <team-id> -j '{"reportType":"content-weekly","title":"Weekly","source":"openclaw","contentMarkdown":"..."}'
85
- ```
86
-
87
- `content-ideas` 周报/创意库无独立 CLI:使用 `reports create/ingest`,`reportType: "content-weekly"`。
88
-
89
- ## 风格标记与 Curator
90
-
91
- ```bash
92
- social-hub style-marks list -t <team-id> --account <uuid> --extract-status pending --approved true
93
- social-hub style-marks approve -t <team-id> --id <styleMarkId>
94
- social-hub style-marks reject -t <team-id> --id <styleMarkId>
95
- social-hub style-marks extract -t <team-id> --id <styleMarkId> [--dry-run]
96
- social-hub style-marks set -t <team-id> --event-ref <externalRef> -j '{
97
- "styleTags": ["concise"],
98
- "markExternalRef": "mark_1",
99
- "onConflict": "update"
100
- }'
101
- social-hub curator run -t <team-id> --account <slot> [--dry-run] [-n 50]
102
- ```
78
+ - 帖快照 CRUD / `--brand` 统计:见 **`social-hub-posts`**
79
+ - 报告库:`reports list` / `reports ingest`(`reportType: "content-weekly"`)
103
80
 
104
- ## 决策:ops complete vs 手动 patch
81
+ ## 写操作护栏
105
82
 
106
- | 场景 | 推荐 |
83
+ | 操作 | 要求 |
107
84
  |------|------|
108
- | OpenClaw/Agent 刚执行完 scheduled job | `ops complete` |
109
- | job、仅补 calendar 状态 | `calendar patch` + `events append` |
110
- | 外部已发帖、补 Hub 快照 | `reddit create-snapshot` `batch-upsert` |
85
+ | `drafts delete` / `plans cancel` | `list`/`get` 核对 id;无 `--dry-run` |
86
+ | `plans create` | JSON `brandId` + `entries`;guardrail 失败会 400 |
87
+ | `events append` | `--external-ref` 幂等 |
88
+
89
+ ## 决策表
90
+
91
+ | 场景 | 推荐 skill |
92
+ |------|------------|
93
+ | 只查/改 calendar 或 jobs | `social-hub-calendar-jobs` |
94
+ | OpenClaw 领任务/回填 | `social-hub-ops-runtime` |
95
+ | Reddit 帖表现/刷新 | `social-hub-posts` |
96
+ | 仪表盘/审计/批量事件 | `social-hub-events-observability` |
@@ -0,0 +1,16 @@
1
+ {
2
+ "skill_name": "social-hub-publishing",
3
+ "evals": [
4
+ {
5
+ "id": 0,
6
+ "prompt": "为系统品牌 acme-brand-uuid 创建一篇 Launch 草稿并建 Week1 发布计划,team 已 context use。",
7
+ "expected_output": "drafts create/plans create JSON 含 brandId;brands system-list 取 uuid;勿 campaigns create",
8
+ "assertions": [
9
+ { "type": "must_include", "value": "brandId" },
10
+ { "type": "must_include", "value": "drafts create" },
11
+ { "type": "forbidden_pattern", "value": "campaigns create" },
12
+ { "type": "forbidden_pattern", "value": "campaigns update" }
13
+ ]
14
+ }
15
+ ]
16
+ }