@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.
- package/CHANGELOG.md +19 -0
- package/dist/cmd-manifest.json +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -12
- package/dist/index.js.map +1 -1
- package/dist/update-check.d.ts +5 -0
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +19 -11
- package/dist/update-check.js.map +1 -1
- package/dist/update-check.test.js +43 -1
- package/dist/update-check.test.js.map +1 -1
- package/package.json +1 -1
- package/skills/manifest.json +1 -1
- package/skills/social-hub-admin/SKILL.md +4 -1
- package/skills/social-hub-calendar-jobs/SKILL.md +4 -4
- package/skills/social-hub-cli/SKILL.md +7 -1
- package/skills/social-hub-cli/evals/evals.json +15 -3
- package/skills/social-hub-events-observability/SKILL.md +25 -5
- package/skills/social-hub-openclaw-context/SKILL.md +12 -6
- package/skills/social-hub-ops-runtime/SKILL.md +10 -0
- package/skills/social-hub-posts/SKILL.md +4 -0
- package/skills/social-hub-posts/evals/evals.json +7 -15
- package/skills/social-hub-publishing/SKILL.md +41 -55
- package/skills/social-hub-publishing/evals/evals.json +16 -0
- package/skills/social-hub-shared/SKILL.md +37 -1
- package/skills/social-hub-shared/evals/evals.json +15 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/update-check.js
CHANGED
|
@@ -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
|
|
85
|
-
|
|
86
|
-
? `
|
|
87
|
-
: `
|
|
88
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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
|
-
]
|
|
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))
|
package/dist/update-check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,YAAY,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,0BAA0B,CAAC;AACvD,MAAM,YAAY,GAAG,8BAA8B,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC;AAC7F,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACzC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACtD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAC;AAOnE,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACnE,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC3E,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAe;IAC5D,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAC9B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3E,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAgB,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,CAAC;QACH,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,aAAa,CACX,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EACxE,MAAM,CACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAkB;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,YAAY,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACpC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QACxD,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,eAAe,EAAE;QACtB,CAAC,CAAC,OAAO,YAAY,IAAI,MAAM,EAAE;QACjC,CAAC,CAAC,kBAAkB,YAAY,IAAI,MAAM,EAAE,CAAC;AACjD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,MAAc;IACrE,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO;QACL,EAAE;QACF,kCAAkC,OAAO,MAAM,MAAM,EAAE;QACvD,6BAA6B,UAAU,EAAE;QACzC,kEAAkE;QAClE,+HAA+H;QAC/H,EAAE;KACH,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,MAAc;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAiB,OAAO,CAAC,IAAI;IACnE,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAAE,OAAO;IAExC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAElC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC3C,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QACpC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -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,
|
|
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,EACL,uBAAuB,EACvB,oBAAoB,EACpB,cAAc,EACd,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,GAAG,GAAG,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;;gBACpE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,GAAG,IAAI,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAChF,IAAI,CACL,CAAC;QACF,MAAM,CACJ,qBAAqB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CACtE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAClE,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,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"}
|
package/package.json
CHANGED
package/skills/manifest.json
CHANGED
|
@@ -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":"
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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.
|
|
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
|
-
互动事件与可观测性:
|
|
5
|
-
|
|
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
|
-
|
|
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
|
|
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` / `
|
|
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` / `
|
|
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.
|
|
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.
|
|
83
|
-
3.
|
|
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": "
|
|
7
|
-
"expected_output": "social-hub
|
|
8
|
-
"assertions": [
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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 '{"
|
|
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 '{"
|
|
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
|
-
见
|
|
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
|
-
优先
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
##
|
|
81
|
+
## 写操作护栏
|
|
105
82
|
|
|
106
|
-
|
|
|
83
|
+
| 操作 | 要求 |
|
|
107
84
|
|------|------|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
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
|
+
}
|