@geoly-ai/social-hub-cli 0.2.23 → 0.2.25
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 +23 -0
- package/dist/client.d.ts +21 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +64 -1
- package/dist/client.js.map +1 -1
- package/dist/client.test.d.ts +2 -0
- package/dist/client.test.d.ts.map +1 -0
- package/dist/client.test.js +123 -0
- package/dist/client.test.js.map +1 -0
- package/dist/cmd-manifest.json +23 -2
- package/dist/cmd-manifest.test.js +4 -0
- package/dist/cmd-manifest.test.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -2
- package/dist/index.js.map +1 -1
- package/dist/permission-runner.d.ts +21 -4
- package/dist/permission-runner.d.ts.map +1 -1
- package/dist/permission-runner.js +36 -9
- package/dist/permission-runner.js.map +1 -1
- package/dist/permission-runner.test.js +76 -0
- package/dist/permission-runner.test.js.map +1 -1
- package/dist/permissions-gates-content-classification.d.ts +8 -0
- package/dist/permissions-gates-content-classification.d.ts.map +1 -0
- package/dist/permissions-gates-content-classification.js +40 -0
- package/dist/permissions-gates-content-classification.js.map +1 -0
- package/dist/permissions-gates-subreddit-style.d.ts +10 -0
- package/dist/permissions-gates-subreddit-style.d.ts.map +1 -0
- package/dist/permissions-gates-subreddit-style.js +66 -0
- package/dist/permissions-gates-subreddit-style.js.map +1 -0
- package/dist/permissions-gates-subreddit-style.test.d.ts +2 -0
- package/dist/permissions-gates-subreddit-style.test.d.ts.map +1 -0
- package/dist/permissions-gates-subreddit-style.test.js +44 -0
- package/dist/permissions-gates-subreddit-style.test.js.map +1 -0
- package/dist/permissions.d.ts +10 -0
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +11 -2
- package/dist/permissions.js.map +1 -1
- package/dist/register-content-classification.d.ts +14 -0
- package/dist/register-content-classification.d.ts.map +1 -0
- package/dist/register-content-classification.js +181 -0
- package/dist/register-content-classification.js.map +1 -0
- package/dist/register-content-classification.test.d.ts +2 -0
- package/dist/register-content-classification.test.d.ts.map +1 -0
- package/dist/register-content-classification.test.js +43 -0
- package/dist/register-content-classification.test.js.map +1 -0
- package/dist/register-extensions.d.ts.map +1 -1
- package/dist/register-extensions.js +1 -0
- package/dist/register-extensions.js.map +1 -1
- package/dist/register-subreddit-post-style.d.ts +8 -0
- package/dist/register-subreddit-post-style.d.ts.map +1 -0
- package/dist/register-subreddit-post-style.js +161 -0
- package/dist/register-subreddit-post-style.js.map +1 -0
- package/dist/register-subreddit-style-actions.test.d.ts +2 -0
- package/dist/register-subreddit-style-actions.test.d.ts.map +1 -0
- package/dist/register-subreddit-style-actions.test.js +295 -0
- package/dist/register-subreddit-style-actions.test.js.map +1 -0
- package/dist/register-subreddit-style.d.ts +57 -0
- package/dist/register-subreddit-style.d.ts.map +1 -0
- package/dist/register-subreddit-style.js +418 -0
- package/dist/register-subreddit-style.js.map +1 -0
- package/dist/register-subreddit-style.test.d.ts +2 -0
- package/dist/register-subreddit-style.test.d.ts.map +1 -0
- package/dist/register-subreddit-style.test.js +183 -0
- package/dist/register-subreddit-style.test.js.map +1 -0
- package/dist/update-check.d.ts +15 -0
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +106 -3
- package/dist/update-check.js.map +1 -1
- package/dist/update-check.test.js +71 -2
- package/dist/update-check.test.js.map +1 -1
- package/package.json +3 -3
- package/skills/README.md +1 -0
- package/skills/manifest.json +6 -1
- package/skills/social-hub-accounts/SKILL.md +32 -0
- package/skills/social-hub-calendar-jobs/SKILL.md +1 -1
- package/skills/social-hub-cli/SKILL.md +1 -0
- package/skills/social-hub-content-classification/SKILL.md +92 -0
- package/skills/social-hub-content-review/SKILL.md +31 -4
- package/skills/social-hub-ops-runtime/SKILL.md +19 -1
- package/skills/social-hub-post-review/SKILL.md +38 -12
- package/skills/social-hub-style-profiles/SKILL.md +126 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,29 @@ 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.2.25] - 2026-07-30
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- 后台自动更新 —— 检测到 npm 新版即静默 npm i -g,下次调用自动生效(不重启/不 re-exec)
|
|
12
|
+
- Phase B1a Block3+4 —— content_classification worker sweep + 控制面
|
|
13
|
+
- 板块运营数据 Phase A1 —— 账号汇总薄读模型 MVP
|
|
14
|
+
- 审核 brandContext 账号路径支持 brandId + brandId/constitution 文档同步
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- 去 AI 审核门收尾 P0-② —— agent-status 堵死帖子发布审核门绕过
|
|
19
|
+
|
|
20
|
+
### Documentation
|
|
21
|
+
|
|
22
|
+
- 去 AI 审核门 P0-B Commit9 —— execution fencing 契约边界(skills/OpenClaw)
|
|
23
|
+
|
|
24
|
+
## [0.2.24] - 2026-07-26
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- Block 8b CLI 管理面 —— style-profiles 画像四眼 + subreddit-annotations 标注命令
|
|
29
|
+
|
|
7
30
|
## [0.2.23] - 2026-07-24
|
|
8
31
|
|
|
9
32
|
审核门 v1.5 文档面:content/post review accountId 可选(ContentOnly/AccountBound 双模式)+审核 skill 文档更新
|
package/dist/client.d.ts
CHANGED
|
@@ -2,4 +2,25 @@ import { SocialHubClient } from "@geoly-ai/social-hub-sdk";
|
|
|
2
2
|
export declare function requireClient(): SocialHubClient;
|
|
3
3
|
export declare function resolveTeamId(explicit?: string): string;
|
|
4
4
|
export declare function getBaseUrl(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Hub API 结构化错误(SDK 尚未覆盖的端点走 hubRequest):携带 HTTP status 与
|
|
7
|
+
* 服务端稳定 code(如 PROFILE_STALE / SELF_APPROVE),命令层据此给针对性提示。
|
|
8
|
+
*/
|
|
9
|
+
export declare class HubHttpError extends Error {
|
|
10
|
+
readonly status: number;
|
|
11
|
+
readonly code?: string;
|
|
12
|
+
constructor(status: number, code: string | undefined, message: string);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* SDK 尚未覆盖的 Hub 端点的直连传输(Block 8b 画像/标注;SDK 不加方法时保持
|
|
16
|
+
* 本封装与 SDK fetchJson 行为一致):baseUrl 尾斜杠归一、Bearer 头、调用方
|
|
17
|
+
* headers 最后合并(可追加 If-Match 等,不会意外丢 Authorization)、先读
|
|
18
|
+
* text 再判 ok、错误抽 {error.message|code}、空响应体回 {}。
|
|
19
|
+
*/
|
|
20
|
+
export declare function hubRequest<T = unknown>(path: string, init?: {
|
|
21
|
+
method?: string;
|
|
22
|
+
body?: unknown;
|
|
23
|
+
headers?: Record<string, string>;
|
|
24
|
+
parseJson?: boolean;
|
|
25
|
+
}): Promise<T>;
|
|
5
26
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAe3D,wBAAgB,aAAa,IAAI,eAAe,CAG/C;AAOD,wBAAgB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAavD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBACX,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM;CAMtE;AAwBD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1C,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IACL,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,OAAO,CAAC,CAAC,CAAC,CAsBZ"}
|
package/dist/client.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { SocialHubClient } from "@geoly-ai/social-hub-sdk";
|
|
2
2
|
import { resolveCliConfig } from "./config.js";
|
|
3
3
|
import { resolveEffectiveTeamId } from "./context-state.js";
|
|
4
|
-
|
|
4
|
+
function requireCredentials() {
|
|
5
5
|
const { apiUrl, apiKey } = resolveCliConfig();
|
|
6
6
|
if (!apiKey) {
|
|
7
7
|
console.error("Missing credentials. Run `social-hub auth login` or set SOCIAL_HUB_API_KEY.");
|
|
8
8
|
process.exit(1);
|
|
9
9
|
}
|
|
10
|
+
return { apiUrl, apiKey };
|
|
11
|
+
}
|
|
12
|
+
export function requireClient() {
|
|
13
|
+
const { apiUrl, apiKey } = requireCredentials();
|
|
10
14
|
return new SocialHubClient({ baseUrl: apiUrl, apiKey });
|
|
11
15
|
}
|
|
12
16
|
// 进程内缓存默认 team(Codex P1):同一 action 多次调用不重读可变的
|
|
@@ -30,4 +34,63 @@ export function resolveTeamId(explicit) {
|
|
|
30
34
|
export function getBaseUrl() {
|
|
31
35
|
return resolveCliConfig().apiUrl;
|
|
32
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Hub API 结构化错误(SDK 尚未覆盖的端点走 hubRequest):携带 HTTP status 与
|
|
39
|
+
* 服务端稳定 code(如 PROFILE_STALE / SELF_APPROVE),命令层据此给针对性提示。
|
|
40
|
+
*/
|
|
41
|
+
export class HubHttpError extends Error {
|
|
42
|
+
status;
|
|
43
|
+
code;
|
|
44
|
+
constructor(status, code, message) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.name = "HubHttpError";
|
|
47
|
+
this.status = status;
|
|
48
|
+
this.code = code;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** 与 SDK parseErrorMessage 同则:优先 {error.message},退 {message},再退原文。 */
|
|
52
|
+
function parseErrorMessage(text) {
|
|
53
|
+
try {
|
|
54
|
+
const j = JSON.parse(text);
|
|
55
|
+
return j.error?.message ?? j.message ?? text;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return text;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function parseErrorCode(text) {
|
|
62
|
+
try {
|
|
63
|
+
const j = JSON.parse(text);
|
|
64
|
+
return j.error?.code ?? j.code;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* SDK 尚未覆盖的 Hub 端点的直连传输(Block 8b 画像/标注;SDK 不加方法时保持
|
|
72
|
+
* 本封装与 SDK fetchJson 行为一致):baseUrl 尾斜杠归一、Bearer 头、调用方
|
|
73
|
+
* headers 最后合并(可追加 If-Match 等,不会意外丢 Authorization)、先读
|
|
74
|
+
* text 再判 ok、错误抽 {error.message|code}、空响应体回 {}。
|
|
75
|
+
*/
|
|
76
|
+
export async function hubRequest(path, init) {
|
|
77
|
+
const { apiUrl, apiKey } = requireCredentials();
|
|
78
|
+
const url = `${apiUrl.replace(/\/$/, "")}${path}`;
|
|
79
|
+
const res = await fetch(url, {
|
|
80
|
+
method: init?.method ?? "GET",
|
|
81
|
+
headers: {
|
|
82
|
+
Authorization: `Bearer ${apiKey}`,
|
|
83
|
+
"Content-Type": "application/json",
|
|
84
|
+
...init?.headers,
|
|
85
|
+
},
|
|
86
|
+
body: init?.body === undefined ? undefined : JSON.stringify(init.body),
|
|
87
|
+
});
|
|
88
|
+
const text = await res.text();
|
|
89
|
+
if (!res.ok) {
|
|
90
|
+
throw new HubHttpError(res.status, parseErrorCode(text), `HTTP ${res.status}: ${parseErrorMessage(text)}`);
|
|
91
|
+
}
|
|
92
|
+
if (init?.parseJson === false)
|
|
93
|
+
return undefined;
|
|
94
|
+
return (text ? JSON.parse(text) : {});
|
|
95
|
+
}
|
|
33
96
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
vi.mock("@geoly-ai/social-hub-sdk", () => ({
|
|
3
|
+
SocialHubClient: vi.fn().mockImplementation(() => ({})),
|
|
4
|
+
getSocialHubHealth: vi.fn(),
|
|
5
|
+
}));
|
|
6
|
+
const mockConfig = {
|
|
7
|
+
apiUrl: "https://api.example.com/",
|
|
8
|
+
apiKey: "sk_test",
|
|
9
|
+
};
|
|
10
|
+
vi.mock("./config.js", () => ({
|
|
11
|
+
resolveCliConfig: () => mockConfig,
|
|
12
|
+
}));
|
|
13
|
+
vi.mock("./context-state.js", () => ({
|
|
14
|
+
resolveEffectiveTeamId: () => undefined,
|
|
15
|
+
}));
|
|
16
|
+
let hubRequest;
|
|
17
|
+
let HubHttpError;
|
|
18
|
+
const fetchMock = vi.fn();
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
mockConfig.apiUrl = "https://api.example.com/";
|
|
21
|
+
mockConfig.apiKey = "sk_test";
|
|
22
|
+
fetchMock.mockReset();
|
|
23
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
24
|
+
vi.spyOn(process, "exit").mockImplementation((() => {
|
|
25
|
+
throw new Error("process.exit");
|
|
26
|
+
}));
|
|
27
|
+
vi.spyOn(console, "error").mockImplementation(() => { });
|
|
28
|
+
const mod = await import("./client.js");
|
|
29
|
+
hubRequest = mod.hubRequest;
|
|
30
|
+
HubHttpError = mod.HubHttpError;
|
|
31
|
+
});
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
vi.unstubAllGlobals();
|
|
34
|
+
vi.restoreAllMocks();
|
|
35
|
+
});
|
|
36
|
+
function jsonResponse(status, body) {
|
|
37
|
+
return {
|
|
38
|
+
ok: status >= 200 && status < 300,
|
|
39
|
+
status,
|
|
40
|
+
text: async () => (body === undefined ? "" : JSON.stringify(body)),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
describe("hubRequest", () => {
|
|
44
|
+
it("GET:baseUrl 尾斜杠归一并带 Bearer/Content-Type 头", async () => {
|
|
45
|
+
fetchMock.mockResolvedValue(jsonResponse(200, { items: [], total: 0 }));
|
|
46
|
+
const res = await hubRequest("/v1/system/subreddit-style-profiles?limit=50");
|
|
47
|
+
expect(res).toEqual({ items: [], total: 0 });
|
|
48
|
+
const [url, init] = fetchMock.mock.calls[0];
|
|
49
|
+
expect(url).toBe("https://api.example.com/v1/system/subreddit-style-profiles?limit=50");
|
|
50
|
+
expect(init.method).toBe("GET");
|
|
51
|
+
expect(init.headers.Authorization).toBe("Bearer sk_test");
|
|
52
|
+
expect(init.body).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
it("POST:body JSON 序列化;自定义 If-Match 与 Authorization 并存", async () => {
|
|
55
|
+
fetchMock.mockResolvedValue(jsonResponse(200, { profile: { id: "p1" } }));
|
|
56
|
+
await hubRequest("/v1/system/subreddit-style-profiles/p1/approve", {
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: { "If-Match": "ssp:p1:proposed:2026-07-26T00:00:00.000Z" },
|
|
59
|
+
});
|
|
60
|
+
const [, init] = fetchMock.mock.calls[0];
|
|
61
|
+
const headers = init.headers;
|
|
62
|
+
expect(headers.Authorization).toBe("Bearer sk_test");
|
|
63
|
+
expect(headers["If-Match"]).toBe("ssp:p1:proposed:2026-07-26T00:00:00.000Z");
|
|
64
|
+
expect(init.body).toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
it("调用方 headers 最后合并:显式 Authorization/Content-Type 可覆盖默认值(与 SDK 同则)", async () => {
|
|
67
|
+
fetchMock.mockResolvedValue(jsonResponse(200, {}));
|
|
68
|
+
await hubRequest("/x", {
|
|
69
|
+
headers: {
|
|
70
|
+
Authorization: "Bearer custom",
|
|
71
|
+
"Content-Type": "text/plain",
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
const [, init] = fetchMock.mock.calls[0];
|
|
75
|
+
const headers = init.headers;
|
|
76
|
+
expect(headers.Authorization).toBe("Bearer custom");
|
|
77
|
+
expect(headers["Content-Type"]).toBe("text/plain");
|
|
78
|
+
});
|
|
79
|
+
it("POST 带 body 时序列化为 JSON", async () => {
|
|
80
|
+
fetchMock.mockResolvedValue(jsonResponse(200, { annotation: { id: "a" } }));
|
|
81
|
+
await hubRequest("/v1/teams/t1/subreddit-post-annotations/upsert", {
|
|
82
|
+
method: "POST",
|
|
83
|
+
body: { subreddit: "sports", score: 4 },
|
|
84
|
+
});
|
|
85
|
+
const [, init] = fetchMock.mock.calls[0];
|
|
86
|
+
expect(init.body).toBe(JSON.stringify({ subreddit: "sports", score: 4 }));
|
|
87
|
+
});
|
|
88
|
+
it("错误:{error:{code,message}} → HubHttpError 带 status/code/HTTP 前缀消息", async () => {
|
|
89
|
+
fetchMock.mockResolvedValue(jsonResponse(409, {
|
|
90
|
+
error: { code: "PROFILE_STALE", message: "rowVersion 不匹配" },
|
|
91
|
+
}));
|
|
92
|
+
const err = await hubRequest("/x", { method: "POST" }).catch((e) => e);
|
|
93
|
+
expect(err).toBeInstanceOf(HubHttpError);
|
|
94
|
+
expect(err.status).toBe(409);
|
|
95
|
+
expect(err.code).toBe("PROFILE_STALE");
|
|
96
|
+
expect(err.message).toBe("HTTP 409: rowVersion 不匹配");
|
|
97
|
+
});
|
|
98
|
+
it("错误:{message} 与纯文本 body 的兜底提取", async () => {
|
|
99
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(422, { message: "subreddit 格式非法" }));
|
|
100
|
+
await expect(hubRequest("/x")).rejects.toThrow("HTTP 422: subreddit 格式非法");
|
|
101
|
+
fetchMock.mockResolvedValueOnce({
|
|
102
|
+
ok: false,
|
|
103
|
+
status: 502,
|
|
104
|
+
text: async () => "bad gateway",
|
|
105
|
+
});
|
|
106
|
+
const err = await hubRequest("/x").catch((e) => e);
|
|
107
|
+
expect(err).toBeInstanceOf(HubHttpError);
|
|
108
|
+
expect(err.message).toBe("HTTP 502: bad gateway");
|
|
109
|
+
expect(err.code).toBeUndefined();
|
|
110
|
+
});
|
|
111
|
+
it("空成功响应体回 {};parseJson:false 回 undefined", async () => {
|
|
112
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(200, undefined));
|
|
113
|
+
await expect(hubRequest("/x")).resolves.toEqual({});
|
|
114
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(204, undefined));
|
|
115
|
+
await expect(hubRequest("/x", { parseJson: false })).resolves.toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
it("缺凭证时退出(与 requireClient 同则)", async () => {
|
|
118
|
+
mockConfig.apiKey = undefined;
|
|
119
|
+
await expect(hubRequest("/x")).rejects.toThrow("process.exit");
|
|
120
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cmd-manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-07-
|
|
3
|
-
"cliVersion": "0.2.
|
|
2
|
+
"generatedAt": "2026-07-30T01:52:31.243Z",
|
|
3
|
+
"cliVersion": "0.2.25",
|
|
4
4
|
"commands": [
|
|
5
5
|
"accounts",
|
|
6
6
|
"accounts brand-bindings",
|
|
@@ -141,6 +141,14 @@
|
|
|
141
141
|
"content",
|
|
142
142
|
"content post-review",
|
|
143
143
|
"content review",
|
|
144
|
+
"content-classification",
|
|
145
|
+
"content-classification get-subject",
|
|
146
|
+
"content-classification presentation",
|
|
147
|
+
"content-classification spec",
|
|
148
|
+
"content-classification spec activate",
|
|
149
|
+
"content-classification spec create",
|
|
150
|
+
"content-classification spec get",
|
|
151
|
+
"content-classification spec list",
|
|
144
152
|
"context",
|
|
145
153
|
"context account",
|
|
146
154
|
"context current",
|
|
@@ -180,6 +188,7 @@
|
|
|
180
188
|
"graph v2-timeline",
|
|
181
189
|
"health",
|
|
182
190
|
"intelligence",
|
|
191
|
+
"intelligence account-summary",
|
|
183
192
|
"intelligence brand-mention-radar",
|
|
184
193
|
"intelligence campaign-lift",
|
|
185
194
|
"intelligence comments",
|
|
@@ -356,6 +365,18 @@
|
|
|
356
365
|
"style-marks list",
|
|
357
366
|
"style-marks reject",
|
|
358
367
|
"style-marks set",
|
|
368
|
+
"style-profiles",
|
|
369
|
+
"style-profiles active",
|
|
370
|
+
"style-profiles approve",
|
|
371
|
+
"style-profiles cancel",
|
|
372
|
+
"style-profiles get",
|
|
373
|
+
"style-profiles list",
|
|
374
|
+
"style-profiles propose",
|
|
375
|
+
"style-profiles reject",
|
|
376
|
+
"style-profiles retire",
|
|
377
|
+
"subreddit-annotations",
|
|
378
|
+
"subreddit-annotations list",
|
|
379
|
+
"subreddit-annotations upsert",
|
|
359
380
|
"users",
|
|
360
381
|
"users create",
|
|
361
382
|
"users list",
|
|
@@ -23,6 +23,10 @@ describe("cmd-manifest", () => {
|
|
|
23
23
|
expect(paths).toContain("compliance sanctions-delete");
|
|
24
24
|
expect(paths).toContain("pools catalog-list");
|
|
25
25
|
expect(paths).toContain("query account-pool-context");
|
|
26
|
+
expect(paths).toContain("style-profiles list");
|
|
27
|
+
expect(paths).toContain("style-profiles active");
|
|
28
|
+
expect(paths).toContain("style-profiles approve");
|
|
29
|
+
expect(paths).toContain("subreddit-annotations upsert");
|
|
26
30
|
});
|
|
27
31
|
it("buildCmdManifest includes all registered leaf paths", () => {
|
|
28
32
|
const manifest = buildCmdManifest(program);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cmd-manifest.test.js","sourceRoot":"","sources":["../src/cmd-manifest.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACvD,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC5B,CAAC,CAAC,CAAC;AAEJ,IAAI,OAAwD,CAAC;AAE7D,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;
|
|
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.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;AA6BpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAwqD9B,8DAA8D;AAC9D,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,GAAG,IAAI,CAOf;AA2/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;AA+1ED,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,8 @@ import { getSocialHubHealth, } from "@geoly-ai/social-hub-sdk";
|
|
|
4
4
|
import { getBaseUrl, requireClient, resolveTeamId } from "./client.js";
|
|
5
5
|
import { registerAccountsExtensions, registerAuthAndConfig, registerAuthzEvaluate, registerPermissionsExplain, registerRedditExtensions, listRedditSnapshotsPaginated, redditAggregateQueryParams, } from "./register-extensions.js";
|
|
6
6
|
import { registerAdminCommands } from "./register-admin.js";
|
|
7
|
+
import { registerSubredditStyleCommands } from "./register-subreddit-style.js";
|
|
8
|
+
import { registerContentClassificationCommands } from "./register-content-classification.js";
|
|
7
9
|
import { assertApplyOrDryRun } from "./dry-run.js";
|
|
8
10
|
import { withPermissionGate } from "./permission-runner.js";
|
|
9
11
|
import { registerBatchAndExport } from "./register-batch.js";
|
|
@@ -28,6 +30,8 @@ registerSkillsCommands(program);
|
|
|
28
30
|
registerOpsRuntime(program);
|
|
29
31
|
registerAgentContext(program);
|
|
30
32
|
registerAdminCommands(program);
|
|
33
|
+
registerSubredditStyleCommands(program);
|
|
34
|
+
registerContentClassificationCommands(program);
|
|
31
35
|
registerBatchAndExport(program);
|
|
32
36
|
program
|
|
33
37
|
.command("health")
|
|
@@ -804,9 +808,9 @@ personas
|
|
|
804
808
|
});
|
|
805
809
|
personas
|
|
806
810
|
.command("style-guide-set")
|
|
807
|
-
.description("PUT /system/personas/:id/style-guide")
|
|
811
|
+
.description("PUT /system/personas/:id/style-guide(defaultStyleGuide 可含 constitution 六维行为字段,值为行为规则短句、非文案模板)")
|
|
808
812
|
.requiredOption("--id <personaId>", "Persona UUID")
|
|
809
|
-
.option("-j, --json <json>", "defaultStyleGuide 对象 JSON")
|
|
813
|
+
.option("-j, --json <json>", "defaultStyleGuide 对象 JSON(可含 constitution: {attentionPriority/stanceOnUncertainty/disagreementStyle/closingBehavior/detailDepth/topicReflex},写行为短句,全空/模板/成品文案会 400)")
|
|
810
814
|
.option("--clear", "清空默认风格指南(写 null)")
|
|
811
815
|
.action(async (opts) => {
|
|
812
816
|
if (opts.clear) {
|
|
@@ -1931,6 +1935,20 @@ intel
|
|
|
1931
1935
|
});
|
|
1932
1936
|
console.log(JSON.stringify(res, null, 2));
|
|
1933
1937
|
});
|
|
1938
|
+
intel
|
|
1939
|
+
.command("account-summary <subreddit>")
|
|
1940
|
+
.description("GET .../subreddit-intelligence/subreddits/:subreddit/account-summary(板块运营数据 A1:热帖与采样评论中的高频作者薄读模型;30 天 captured-window;top-N + coverage 诊断;品牌关联只标 own/unknown)")
|
|
1941
|
+
.option("--sort-by <f>", "captured_hot_posts|sampled_comments|post_score_sum|comment_score_sum|last_activity", "captured_hot_posts")
|
|
1942
|
+
.option("-n, --limit <n>", "limit(≤100)", "25")
|
|
1943
|
+
.option("--offset <n>", "offset(≤10000)", "0")
|
|
1944
|
+
.action(async (subreddit, opts) => {
|
|
1945
|
+
const res = await requireClient().getSubredditAccountSummary(subreddit, {
|
|
1946
|
+
sortBy: opts.sortBy,
|
|
1947
|
+
limit: Number(opts.limit),
|
|
1948
|
+
offset: Number(opts.offset),
|
|
1949
|
+
});
|
|
1950
|
+
console.log(JSON.stringify(res, null, 2));
|
|
1951
|
+
});
|
|
1934
1952
|
intel
|
|
1935
1953
|
.command("comments-fetch")
|
|
1936
1954
|
.description("POST /v1/system/subreddit-intelligence/comments/fetch(逐帖评论采样派发;同批帖活跃 run 复用)")
|