@geoly-ai/social-hub-cli 0.2.24 → 0.2.26
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/cmd-manifest.json +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.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.d.ts.map +1 -1
- package/dist/permissions.js +2 -0
- 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 +205 -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-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/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/manifest.json +1 -1
- package/skills/social-hub-accounts/SKILL.md +32 -0
- package/skills/social-hub-calendar-jobs/SKILL.md +1 -1
- 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
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CliPermissionGate } from "./permissions.js";
|
|
2
|
+
/**
|
|
3
|
+
* Phase B1a content_classification 控制面 CLI gates(skill social-hub-content-classification)。
|
|
4
|
+
* 角色梯度同 authz `contentClassification`:读(subjects/specs/presentation)非 client 内部角色可用;
|
|
5
|
+
* spec 写(create=建 draft、activate→update)**仅 admin**,且 user-only(API 拒 api_key / 服务 token)。
|
|
6
|
+
*/
|
|
7
|
+
export declare const CONTENT_CLASSIFICATION_PERMISSION_GATES: CliPermissionGate[];
|
|
8
|
+
//# sourceMappingURL=permissions-gates-content-classification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions-gates-content-classification.d.ts","sourceRoot":"","sources":["../src/permissions-gates-content-classification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,uCAAuC,EAAE,iBAAiB,EAiCtE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase B1a content_classification 控制面 CLI gates(skill social-hub-content-classification)。
|
|
3
|
+
* 角色梯度同 authz `contentClassification`:读(subjects/specs/presentation)非 client 内部角色可用;
|
|
4
|
+
* spec 写(create=建 draft、activate→update)**仅 admin**,且 user-only(API 拒 api_key / 服务 token)。
|
|
5
|
+
*/
|
|
6
|
+
export const CONTENT_CLASSIFICATION_PERMISSION_GATES = [
|
|
7
|
+
{
|
|
8
|
+
command: "content-classification get-subject",
|
|
9
|
+
resource: "contentClassification",
|
|
10
|
+
action: "read",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
command: "content-classification spec list",
|
|
14
|
+
resource: "contentClassification",
|
|
15
|
+
action: "list",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
command: "content-classification spec get",
|
|
19
|
+
resource: "contentClassification",
|
|
20
|
+
action: "read",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
command: "content-classification spec create",
|
|
24
|
+
resource: "contentClassification",
|
|
25
|
+
action: "create",
|
|
26
|
+
note: "admin only; user only(API 拒 API Key / 服务 token)",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
command: "content-classification spec activate",
|
|
30
|
+
resource: "contentClassification",
|
|
31
|
+
action: "update",
|
|
32
|
+
note: "admin only; user only(API 拒 API Key / 服务 token)",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
command: "content-classification presentation",
|
|
36
|
+
resource: "contentClassification",
|
|
37
|
+
action: "read",
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
//# sourceMappingURL=permissions-gates-content-classification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions-gates-content-classification.js","sourceRoot":"","sources":["../src/permissions-gates-content-classification.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,uCAAuC,GAAwB;IAC1E;QACE,OAAO,EAAE,oCAAoC;QAC7C,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,kCAAkC;QAC3C,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,iCAAiC;QAC1C,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,oCAAoC;QAC7C,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,iDAAiD;KACxD;IACD;QACE,OAAO,EAAE,sCAAsC;QAC/C,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,iDAAiD;KACxD;IACD;QACE,OAAO,EAAE,qCAAqC;QAC9C,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,MAAM;KACf;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,qBAAqB,EAEtB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,qBAAqB,EAEtB,MAAM,4BAA4B,CAAC;AAKpC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EA6GnD,CAAC;AAEF,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAET;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB;oDACgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAST;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG;IACjD,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;IACjD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;2CACuC;IACvC,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACnD,CAgBA;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAIP;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,GAClB,iBAAiB,GAAG,SAAS,CAE/B"}
|
package/dist/permissions.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { buildPermissionMatrix, canPerformAction, } from "@geoly-ai/social-hub-authz";
|
|
2
2
|
import { ADMIN_PERMISSION_GATES } from "./permissions-gates-admin.js";
|
|
3
3
|
import { SUBREDDIT_STYLE_PERMISSION_GATES } from "./permissions-gates-subreddit-style.js";
|
|
4
|
+
import { CONTENT_CLASSIFICATION_PERMISSION_GATES } from "./permissions-gates-content-classification.js";
|
|
4
5
|
/** Representative write/high-risk commands mapped to authz resources. */
|
|
5
6
|
export const CLI_PERMISSION_GATES = [
|
|
6
7
|
{ command: "accounts list", resource: "socialAccount", action: "list" },
|
|
@@ -110,6 +111,7 @@ export const CLI_PERMISSION_GATES = [
|
|
|
110
111
|
{ command: "permissions", resource: "apiKey", action: "list" },
|
|
111
112
|
...ADMIN_PERMISSION_GATES,
|
|
112
113
|
...SUBREDDIT_STYLE_PERMISSION_GATES,
|
|
114
|
+
...CONTENT_CLASSIFICATION_PERMISSION_GATES,
|
|
113
115
|
];
|
|
114
116
|
export function roleAllows(role, resource, action) {
|
|
115
117
|
return canPerformAction({ role, resource, action });
|
package/dist/permissions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/** spec create 请求体的本地形状校验(契约 createClassifierSpecBodySchema 高频子集;非法输入 dry-run 前即拒)。 */
|
|
3
|
+
export declare function buildCreateSpecBody(raw: Record<string, unknown>): {
|
|
4
|
+
purpose: string;
|
|
5
|
+
taxonomyVersion: string;
|
|
6
|
+
taxonomySchemaVersion: string;
|
|
7
|
+
promptVersion: string;
|
|
8
|
+
modelPolicy: Record<string, unknown>;
|
|
9
|
+
inputFingerprintVersion?: string;
|
|
10
|
+
truncationPolicyVersion?: string;
|
|
11
|
+
formatDetectorVersion?: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function registerContentClassificationCommands(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=register-content-classification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-content-classification.d.ts","sourceRoot":"","sources":["../src/register-content-classification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBzC,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAyCA;AAED,wBAAgB,qCAAqC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+N5E"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { hubRequest } from "./client.js";
|
|
2
|
+
import { assertApplyOrDryRun } from "./dry-run.js";
|
|
3
|
+
import { parseJsonOption, printResult, withCliErrorBoundary, } from "./output.js";
|
|
4
|
+
import { withPermissionGates } from "./permission-runner.js";
|
|
5
|
+
/**
|
|
6
|
+
* Phase B1a Block 4 —— content_classification 控制面 CLI(social-hub content-classification ...)。
|
|
7
|
+
* system 级端点(/v1/system/content-classifications/*),SDK 尚未打进 CLI 依赖,HTTP 走 hubRequest。
|
|
8
|
+
*
|
|
9
|
+
* 读:get-subject / spec list / spec get / presentation(非 client 内部角色)。
|
|
10
|
+
* 写:spec create(建 draft)/ spec activate(激活)—— **仅 admin**,user-only(withPermissionGates
|
|
11
|
+
* 的 userOnly=true 本地先拒 api_key;API 侧另拒服务 token 并要求 admin 角色 + userId)。
|
|
12
|
+
*/
|
|
13
|
+
const CC_BASE = "/v1/system/content-classifications";
|
|
14
|
+
/** spec create 请求体的本地形状校验(契约 createClassifierSpecBodySchema 高频子集;非法输入 dry-run 前即拒)。 */
|
|
15
|
+
export function buildCreateSpecBody(raw) {
|
|
16
|
+
const fail = (msg) => {
|
|
17
|
+
console.error(msg);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
};
|
|
20
|
+
const str = (k, required) => {
|
|
21
|
+
const v = raw[k];
|
|
22
|
+
if (v === undefined || v === null) {
|
|
23
|
+
if (required)
|
|
24
|
+
return fail(`--json 缺少必填字段 ${k}(string)`);
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
if (typeof v !== "string" || v.trim() === "") {
|
|
28
|
+
return fail(`--json 字段 ${k} 须为非空 string`);
|
|
29
|
+
}
|
|
30
|
+
return v;
|
|
31
|
+
};
|
|
32
|
+
const purpose = str("purpose", true);
|
|
33
|
+
const taxonomyVersion = str("taxonomyVersion", true);
|
|
34
|
+
const taxonomySchemaVersion = str("taxonomySchemaVersion", true);
|
|
35
|
+
const promptVersion = str("promptVersion", true);
|
|
36
|
+
const modelPolicy = raw.modelPolicy;
|
|
37
|
+
if (typeof modelPolicy !== "object" ||
|
|
38
|
+
modelPolicy === null ||
|
|
39
|
+
Array.isArray(modelPolicy)) {
|
|
40
|
+
return fail("--json 字段 modelPolicy 须为对象(Record<string, unknown>)");
|
|
41
|
+
}
|
|
42
|
+
const inputFingerprintVersion = str("inputFingerprintVersion", false);
|
|
43
|
+
const truncationPolicyVersion = str("truncationPolicyVersion", false);
|
|
44
|
+
const formatDetectorVersion = str("formatDetectorVersion", false);
|
|
45
|
+
return {
|
|
46
|
+
purpose,
|
|
47
|
+
taxonomyVersion,
|
|
48
|
+
taxonomySchemaVersion,
|
|
49
|
+
promptVersion,
|
|
50
|
+
modelPolicy: modelPolicy,
|
|
51
|
+
...(inputFingerprintVersion ? { inputFingerprintVersion } : {}),
|
|
52
|
+
...(truncationPolicyVersion ? { truncationPolicyVersion } : {}),
|
|
53
|
+
...(formatDetectorVersion ? { formatDetectorVersion } : {}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function registerContentClassificationCommands(program) {
|
|
57
|
+
const cc = program
|
|
58
|
+
.command("content-classification")
|
|
59
|
+
.description("内容四轴分类控制面(系统级;读非 client 可用,spec 写仅 admin 且拒 API Key)");
|
|
60
|
+
// ── 读:某 hot_post 的 current proposed 分类 ─────────────────────────────────
|
|
61
|
+
cc.command("get-subject")
|
|
62
|
+
.description("GET .../subjects/:hotPostId — active spec 下该 hot_post 的 current proposed 分类(proposed|missing)")
|
|
63
|
+
.requiredOption("--hot-post-id <uuid>", "subreddit_hot_post_snapshots.id")
|
|
64
|
+
.option("--purpose <p>", "classifier purpose(缺省用 canonical 默认)")
|
|
65
|
+
.action(async (opts) => {
|
|
66
|
+
await withCliErrorBoundary(async () => {
|
|
67
|
+
await withPermissionGates({
|
|
68
|
+
command: "content-classification get-subject",
|
|
69
|
+
gates: [{ resource: "contentClassification", action: "read" }],
|
|
70
|
+
}, async () => {
|
|
71
|
+
const params = new URLSearchParams();
|
|
72
|
+
if (opts.purpose)
|
|
73
|
+
params.set("purpose", opts.purpose);
|
|
74
|
+
const qs = params.toString();
|
|
75
|
+
printResult(await hubRequest(`${CC_BASE}/subjects/${encodeURIComponent(opts.hotPostId)}${qs ? `?${qs}` : ""}`));
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
// ── 读:最近成功 run(shadow 观测/评估;非权威 current)──────────────────────
|
|
80
|
+
cc.command("recent")
|
|
81
|
+
.description("GET .../runs/recent — active spec 最近成功 run + 帖子上下文(shadow 观测;可按 content_form 过滤)")
|
|
82
|
+
.option("--purpose <p>", "classifier purpose(缺省用 canonical 默认)")
|
|
83
|
+
.option("--content-form <form>", "只看含该 content_form 的 run(comparison|review|tutorial|showcase|news|deal)")
|
|
84
|
+
.option("--limit <n>", "最多返回条数(1-200,默认 20)")
|
|
85
|
+
.action(async (opts) => {
|
|
86
|
+
await withCliErrorBoundary(async () => {
|
|
87
|
+
await withPermissionGates({
|
|
88
|
+
command: "content-classification recent",
|
|
89
|
+
gates: [{ resource: "contentClassification", action: "list" }],
|
|
90
|
+
}, async () => {
|
|
91
|
+
const params = new URLSearchParams();
|
|
92
|
+
if (opts.purpose)
|
|
93
|
+
params.set("purpose", opts.purpose);
|
|
94
|
+
if (opts.contentForm)
|
|
95
|
+
params.set("contentForm", opts.contentForm);
|
|
96
|
+
if (opts.limit)
|
|
97
|
+
params.set("limit", opts.limit);
|
|
98
|
+
const qs = params.toString();
|
|
99
|
+
printResult(await hubRequest(`${CC_BASE}/runs/recent${qs ? `?${qs}` : ""}`));
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
// ── 读:presentation ─────────────────────────────────────────────────────────
|
|
104
|
+
cc.command("presentation")
|
|
105
|
+
.description("GET .../presentation — content_classification.presentation.v1(缺则契约默认;source 标注来源)")
|
|
106
|
+
.action(async () => {
|
|
107
|
+
await withCliErrorBoundary(async () => {
|
|
108
|
+
await withPermissionGates({
|
|
109
|
+
command: "content-classification presentation",
|
|
110
|
+
gates: [{ resource: "contentClassification", action: "read" }],
|
|
111
|
+
}, async () => {
|
|
112
|
+
printResult(await hubRequest(`${CC_BASE}/presentation`));
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
// ── spec 子命令组 ────────────────────────────────────────────────────────────
|
|
117
|
+
const spec = cc
|
|
118
|
+
.command("spec")
|
|
119
|
+
.description("classifier spec 管理(list/get 只读;create/activate 仅 admin)");
|
|
120
|
+
spec
|
|
121
|
+
.command("list")
|
|
122
|
+
.description("GET .../specs — 该 purpose 当前 active spec(activeSpec:null=尚未激活;完整历史枚举留 Phase 2)")
|
|
123
|
+
.option("--purpose <p>", "classifier purpose(缺省用 canonical 默认)")
|
|
124
|
+
.action(async (opts) => {
|
|
125
|
+
await withCliErrorBoundary(async () => {
|
|
126
|
+
await withPermissionGates({
|
|
127
|
+
command: "content-classification spec list",
|
|
128
|
+
gates: [{ resource: "contentClassification", action: "list" }],
|
|
129
|
+
}, async () => {
|
|
130
|
+
const params = new URLSearchParams();
|
|
131
|
+
if (opts.purpose)
|
|
132
|
+
params.set("purpose", opts.purpose);
|
|
133
|
+
const qs = params.toString();
|
|
134
|
+
printResult(await hubRequest(`${CC_BASE}/specs${qs ? `?${qs}` : ""}`));
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
spec
|
|
139
|
+
.command("get")
|
|
140
|
+
.description("GET .../specs/:id — 按 id 查任意 spec(含 draft / retired)")
|
|
141
|
+
.requiredOption("--id <specId>", "classifier spec UUID")
|
|
142
|
+
.action(async (opts) => {
|
|
143
|
+
await withCliErrorBoundary(async () => {
|
|
144
|
+
await withPermissionGates({
|
|
145
|
+
command: "content-classification spec get",
|
|
146
|
+
gates: [{ resource: "contentClassification", action: "read" }],
|
|
147
|
+
}, async () => {
|
|
148
|
+
printResult(await hubRequest(`${CC_BASE}/specs/${encodeURIComponent(opts.id)}`));
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
spec
|
|
153
|
+
.command("create")
|
|
154
|
+
.description("POST .../specs — 建 draft spec(admin only;同 fingerprint 已存在则幂等返回 created=false)")
|
|
155
|
+
.requiredOption("-j, --json <json>", '{ "purpose","taxonomyVersion","taxonomySchemaVersion","promptVersion","modelPolicy":{...}, 可选 inputFingerprintVersion/truncationPolicyVersion/formatDetectorVersion }')
|
|
156
|
+
.option("--dry-run", "预览", false)
|
|
157
|
+
.option("--apply", "执行写入", false)
|
|
158
|
+
.action(async (opts) => {
|
|
159
|
+
await withCliErrorBoundary(async () => {
|
|
160
|
+
await withPermissionGates({
|
|
161
|
+
command: "content-classification spec create",
|
|
162
|
+
gates: [{ resource: "contentClassification", action: "create" }],
|
|
163
|
+
userOnly: true,
|
|
164
|
+
}, async () => {
|
|
165
|
+
const body = buildCreateSpecBody(parseJsonOption(opts.json));
|
|
166
|
+
if (!assertApplyOrDryRun(opts, {
|
|
167
|
+
command: "content-classification spec create",
|
|
168
|
+
danger: "write",
|
|
169
|
+
summary: body,
|
|
170
|
+
})) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
printResult(await hubRequest(`${CC_BASE}/specs`, { method: "POST", body }));
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
spec
|
|
178
|
+
.command("activate")
|
|
179
|
+
.description("POST .../specs/:id/activate — 激活 spec(admin only;同 purpose 至多一 active;已 active 幂等)")
|
|
180
|
+
.requiredOption("--id <specId>", "classifier spec UUID")
|
|
181
|
+
.option("--dry-run", "预览", false)
|
|
182
|
+
.option("--apply", "执行写入", false)
|
|
183
|
+
.action(async (opts) => {
|
|
184
|
+
await withCliErrorBoundary(async () => {
|
|
185
|
+
await withPermissionGates({
|
|
186
|
+
command: "content-classification spec activate",
|
|
187
|
+
gates: [{ resource: "contentClassification", action: "update" }],
|
|
188
|
+
userOnly: true,
|
|
189
|
+
}, async () => {
|
|
190
|
+
if (!assertApplyOrDryRun(opts, {
|
|
191
|
+
command: "content-classification spec activate",
|
|
192
|
+
danger: "admin",
|
|
193
|
+
summary: {
|
|
194
|
+
id: opts.id,
|
|
195
|
+
effect: "退役同 purpose 现 active(若有)并激活本 spec;worker 下轮按新 active spec 重分类",
|
|
196
|
+
},
|
|
197
|
+
})) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
printResult(await hubRequest(`${CC_BASE}/specs/${encodeURIComponent(opts.id)}/activate`, { method: "POST" }));
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=register-content-classification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-content-classification.js","sourceRoot":"","sources":["../src/register-content-classification.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,eAAe,EACf,WAAW,EACX,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;;;;;;GAOG;AAEH,MAAM,OAAO,GAAG,oCAAoC,CAAC;AAErD,uFAAuF;AACvF,MAAM,UAAU,mBAAmB,CAAC,GAA4B;IAU9D,MAAM,IAAI,GAAG,CAAC,GAAW,EAAS,EAAE;QAClC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,QAAiB,EAAsB,EAAE;QAC/D,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAClC,IAAI,QAAQ;gBAAE,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACxD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,EAAE,IAAI,CAAW,CAAC;IAC/C,MAAM,eAAe,GAAG,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAW,CAAC;IAC/D,MAAM,qBAAqB,GAAG,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAW,CAAC;IAC3E,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,CAAW,CAAC;IAC3D,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;IACpC,IACE,OAAO,WAAW,KAAK,QAAQ;QAC/B,WAAW,KAAK,IAAI;QACpB,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC1B,CAAC;QACD,OAAO,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,uBAAuB,GAAG,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IACtE,MAAM,uBAAuB,GAAG,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IACtE,MAAM,qBAAqB,GAAG,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAClE,OAAO;QACL,OAAO;QACP,eAAe;QACf,qBAAqB;QACrB,aAAa;QACb,WAAW,EAAE,WAAsC;QACnD,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qCAAqC,CAAC,OAAgB;IACpE,MAAM,EAAE,GAAG,OAAO;SACf,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CACV,sDAAsD,CACvD,CAAC;IAEJ,0EAA0E;IAC1E,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CACV,+FAA+F,CAChG;SACA,cAAc,CAAC,sBAAsB,EAAE,iCAAiC,CAAC;SACzE,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,oBAAoB,CAAC,KAAK,IAAI,EAAE;YACpC,MAAM,mBAAmB,CACvB;gBACE,OAAO,EAAE,oCAAoC;gBAC7C,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;aAC/D,EACD,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,OAAO;oBAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAiB,CAAC,CAAC;gBAChE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC7B,WAAW,CACT,MAAM,UAAU,CACd,GAAG,OAAO,aAAa,kBAAkB,CACvC,IAAI,CAAC,SAAmB,CACzB,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACzB,CACF,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,gEAAgE;IAChE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,kFAAkF,CACnF;SACA,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CACL,uBAAuB,EACvB,wEAAwE,CACzE;SACA,MAAM,CAAC,aAAa,EAAE,qBAAqB,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,oBAAoB,CAAC,KAAK,IAAI,EAAE;YACpC,MAAM,mBAAmB,CACvB;gBACE,OAAO,EAAE,+BAA+B;gBACxC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;aAC/D,EACD,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,OAAO;oBAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAiB,CAAC,CAAC;gBAChE,IAAI,IAAI,CAAC,WAAW;oBAClB,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,WAAqB,CAAC,CAAC;gBACxD,IAAI,IAAI,CAAC,KAAK;oBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAe,CAAC,CAAC;gBAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC7B,WAAW,CACT,MAAM,UAAU,CAAC,GAAG,OAAO,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChE,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,8EAA8E;IAC9E,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CACV,mFAAmF,CACpF;SACA,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,oBAAoB,CAAC,KAAK,IAAI,EAAE;YACpC,MAAM,mBAAmB,CACvB;gBACE,OAAO,EAAE,qCAAqC;gBAC9C,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;aAC/D,EACD,KAAK,IAAI,EAAE;gBACT,WAAW,CAAC,MAAM,UAAU,CAAC,GAAG,OAAO,eAAe,CAAC,CAAC,CAAC;YAC3D,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,4EAA4E;IAC5E,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,yDAAyD,CAC1D,CAAC;IAEJ,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,gFAAgF,CACjF;SACA,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,oBAAoB,CAAC,KAAK,IAAI,EAAE;YACpC,MAAM,mBAAmB,CACvB;gBACE,OAAO,EAAE,kCAAkC;gBAC3C,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;aAC/D,EACD,KAAK,IAAI,EAAE;gBACT,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,OAAO;oBAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAiB,CAAC,CAAC;gBAChE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC7B,WAAW,CACT,MAAM,UAAU,CAAC,GAAG,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC1D,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,sDAAsD,CAAC;SACnE,cAAc,CAAC,eAAe,EAAE,sBAAsB,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,oBAAoB,CAAC,KAAK,IAAI,EAAE;YACpC,MAAM,mBAAmB,CACvB;gBACE,OAAO,EAAE,iCAAiC;gBAC1C,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;aAC/D,EACD,KAAK,IAAI,EAAE;gBACT,WAAW,CACT,MAAM,UAAU,CACd,GAAG,OAAO,UAAU,kBAAkB,CAAC,IAAI,CAAC,EAAY,CAAC,EAAE,CAC5D,CACF,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,gFAAgF,CACjF;SACA,cAAc,CACb,mBAAmB,EACnB,uKAAuK,CACxK;SACA,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC;SAChC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,oBAAoB,CAAC,KAAK,IAAI,EAAE;YACpC,MAAM,mBAAmB,CACvB;gBACE,OAAO,EAAE,oCAAoC;gBAC7C,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;gBAChE,QAAQ,EAAE,IAAI;aACf,EACD,KAAK,IAAI,EAAE;gBACT,MAAM,IAAI,GAAG,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7D,IACE,CAAC,mBAAmB,CAAC,IAAI,EAAE;oBACzB,OAAO,EAAE,oCAAoC;oBAC7C,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE,IAAI;iBACd,CAAC,EACF,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,WAAW,CACT,MAAM,UAAU,CAAC,GAAG,OAAO,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAC/D,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CACV,oFAAoF,CACrF;SACA,cAAc,CAAC,eAAe,EAAE,sBAAsB,CAAC;SACvD,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC;SAChC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,oBAAoB,CAAC,KAAK,IAAI,EAAE;YACpC,MAAM,mBAAmB,CACvB;gBACE,OAAO,EAAE,sCAAsC;gBAC/C,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;gBAChE,QAAQ,EAAE,IAAI;aACf,EACD,KAAK,IAAI,EAAE;gBACT,IACE,CAAC,mBAAmB,CAAC,IAAI,EAAE;oBACzB,OAAO,EAAE,sCAAsC;oBAC/C,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE;wBACP,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,MAAM,EACJ,+DAA+D;qBAClE;iBACF,CAAC,EACF,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,WAAW,CACT,MAAM,UAAU,CACd,GAAG,OAAO,UAAU,kBAAkB,CACpC,IAAI,CAAC,EAAY,CAClB,WAAW,EACZ,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CACF,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-content-classification.test.d.ts","sourceRoot":"","sources":["../src/register-content-classification.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { buildCreateSpecBody } from "./register-content-classification.js";
|
|
3
|
+
describe("buildCreateSpecBody", () => {
|
|
4
|
+
const valid = {
|
|
5
|
+
purpose: "hot_post_content_classification_v1",
|
|
6
|
+
taxonomyVersion: "b0-taxonomy-v1",
|
|
7
|
+
taxonomySchemaVersion: "v1",
|
|
8
|
+
promptVersion: "cc-prompt-v1",
|
|
9
|
+
modelPolicy: { provider: "openai", model: "gpt-5.6-terra" },
|
|
10
|
+
};
|
|
11
|
+
it("passes a valid body through, dropping omitted optionals", () => {
|
|
12
|
+
const out = buildCreateSpecBody({ ...valid });
|
|
13
|
+
expect(out.purpose).toBe("hot_post_content_classification_v1");
|
|
14
|
+
expect(out.modelPolicy).toEqual({
|
|
15
|
+
provider: "openai",
|
|
16
|
+
model: "gpt-5.6-terra",
|
|
17
|
+
});
|
|
18
|
+
expect(out).not.toHaveProperty("inputFingerprintVersion");
|
|
19
|
+
});
|
|
20
|
+
it("keeps provided optional version overrides", () => {
|
|
21
|
+
const out = buildCreateSpecBody({
|
|
22
|
+
...valid,
|
|
23
|
+
inputFingerprintVersion: "cc-input-v2",
|
|
24
|
+
});
|
|
25
|
+
expect(out.inputFingerprintVersion).toBe("cc-input-v2");
|
|
26
|
+
});
|
|
27
|
+
it.each([
|
|
28
|
+
["purpose", { ...valid, purpose: undefined }],
|
|
29
|
+
["taxonomyVersion", { ...valid, taxonomyVersion: "" }],
|
|
30
|
+
["modelPolicy(array)", { ...valid, modelPolicy: [] }],
|
|
31
|
+
["modelPolicy(missing)", { ...valid, modelPolicy: undefined }],
|
|
32
|
+
])("exits on invalid input: %s", (_label, raw) => {
|
|
33
|
+
const errSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
34
|
+
const exitSpy = vi.spyOn(process, "exit").mockImplementation((() => {
|
|
35
|
+
throw new Error("exit");
|
|
36
|
+
}));
|
|
37
|
+
expect(() => buildCreateSpecBody(raw)).toThrow("exit");
|
|
38
|
+
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
39
|
+
errSpy.mockRestore();
|
|
40
|
+
exitSpy.mockRestore();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=register-content-classification.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-content-classification.test.js","sourceRoot":"","sources":["../src/register-content-classification.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,KAAK,GAAG;QACZ,OAAO,EAAE,oCAAoC;QAC7C,eAAe,EAAE,gBAAgB;QACjC,qBAAqB,EAAE,IAAI;QAC3B,aAAa,EAAE,cAAc;QAC7B,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE;KAC5D,CAAC;IAEF,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;YAC9B,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,yBAAyB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,GAAG,GAAG,mBAAmB,CAAC;YAC9B,GAAG,KAAK;YACR,uBAAuB,EAAE,aAAa;SACvC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAC7C,CAAC,iBAAiB,EAAE,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QACtD,CAAC,oBAAoB,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACrD,CAAC,sBAAsB,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;KAC/D,CAAC,CAAC,4BAA4B,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE;YACjE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAU,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAA8B,CAAC,CAAC,CAAC,OAAO,CACvE,MAAM,CACP,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* 板块运营数据 Phase 1 —— 热帖风格标注(subreddit_post_style_labels)CLI 读 + 单人复核。
|
|
4
|
+
* SDK 未覆盖(同 subreddit-style/annotations 域约定,HTTP 走 hubRequest)。复核 user-only、
|
|
5
|
+
* 单人(非四眼);accept 可修正 primary/secondary/other,写一条 team 级 human 行(不改 LLM 行)。
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerSubredditPostStyleCommands(program: Command): void;
|
|
8
|
+
//# sourceMappingURL=register-subreddit-post-style.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-subreddit-post-style.d.ts","sourceRoot":"","sources":["../src/register-subreddit-post-style.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2LzE"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { hubRequest, resolveTeamId } from "./client.js";
|
|
2
|
+
import { assertApplyOrDryRun } from "./dry-run.js";
|
|
3
|
+
import { printResult, withCliErrorBoundary } from "./output.js";
|
|
4
|
+
import { withPermissionGates } from "./permission-runner.js";
|
|
5
|
+
/**
|
|
6
|
+
* 板块运营数据 Phase 1 —— 热帖风格标注(subreddit_post_style_labels)CLI 读 + 单人复核。
|
|
7
|
+
* SDK 未覆盖(同 subreddit-style/annotations 域约定,HTTP 走 hubRequest)。复核 user-only、
|
|
8
|
+
* 单人(非四眼);accept 可修正 primary/secondary/other,写一条 team 级 human 行(不改 LLM 行)。
|
|
9
|
+
*/
|
|
10
|
+
export function registerSubredditPostStyleCommands(program) {
|
|
11
|
+
const group = program
|
|
12
|
+
.command("subreddit-post-styles")
|
|
13
|
+
.description("Reddit 热帖风格标注(风格标签底座 Phase 1;分析数据,非发布 gate)");
|
|
14
|
+
group
|
|
15
|
+
.command("list")
|
|
16
|
+
.description("GET /v1/teams/:teamId/subreddit-post-styles(本团队行+全局行;teamId=null 为全局)")
|
|
17
|
+
.requiredOption("--subreddit <name>", "板块名")
|
|
18
|
+
.option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
|
|
19
|
+
.option("--taxonomy <v>", "taxonomyVersion 过滤")
|
|
20
|
+
.option("--source <s>", "llm | human")
|
|
21
|
+
.option("--review-status <s>", "proposed | accepted | rejected")
|
|
22
|
+
.option("--no-global", "只看本团队行(排除全局)")
|
|
23
|
+
.option("-n, --limit <n>", "limit", "50")
|
|
24
|
+
.option("--offset <n>", "offset", "0")
|
|
25
|
+
.action(async (opts) => {
|
|
26
|
+
await withCliErrorBoundary(async () => {
|
|
27
|
+
const teamId = resolveTeamId(opts.team);
|
|
28
|
+
await withPermissionGates({
|
|
29
|
+
command: "subreddit-post-styles list",
|
|
30
|
+
gates: [{ resource: "subredditPostAnnotation", action: "read" }],
|
|
31
|
+
teamId,
|
|
32
|
+
}, async () => {
|
|
33
|
+
const params = new URLSearchParams();
|
|
34
|
+
params.set("subreddit", opts.subreddit);
|
|
35
|
+
if (opts.taxonomy)
|
|
36
|
+
params.set("taxonomyVersion", opts.taxonomy);
|
|
37
|
+
if (opts.source)
|
|
38
|
+
params.set("source", opts.source);
|
|
39
|
+
if (opts.reviewStatus)
|
|
40
|
+
params.set("reviewStatus", opts.reviewStatus);
|
|
41
|
+
if (opts.global === false)
|
|
42
|
+
params.set("includeGlobal", "false");
|
|
43
|
+
params.set("limit", String(opts.limit));
|
|
44
|
+
params.set("offset", String(opts.offset));
|
|
45
|
+
printResult(await hubRequest(`/v1/teams/${encodeURIComponent(teamId)}/subreddit-post-styles?${params.toString()}`));
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
group
|
|
50
|
+
.command("summary")
|
|
51
|
+
.description("GET .../subreddit-post-styles/summary — 风格分布 + 覆盖率 + 表现关联(posted_at 窗口;human>llm、team>global)")
|
|
52
|
+
.requiredOption("--subreddit <name>", "板块名")
|
|
53
|
+
.option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
|
|
54
|
+
.option("--taxonomy <v>", "taxonomyVersion 过滤")
|
|
55
|
+
.option("--since <iso>", "posted_at 窗口起(ISO)")
|
|
56
|
+
.option("--until <iso>", "posted_at 窗口止(ISO)")
|
|
57
|
+
.option("--no-global", "只看本团队行(排除全局)")
|
|
58
|
+
.action(async (opts) => {
|
|
59
|
+
await withCliErrorBoundary(async () => {
|
|
60
|
+
const teamId = resolveTeamId(opts.team);
|
|
61
|
+
await withPermissionGates({
|
|
62
|
+
command: "subreddit-post-styles summary",
|
|
63
|
+
gates: [{ resource: "subredditPostAnnotation", action: "read" }],
|
|
64
|
+
teamId,
|
|
65
|
+
}, async () => {
|
|
66
|
+
const params = new URLSearchParams();
|
|
67
|
+
params.set("subreddit", opts.subreddit);
|
|
68
|
+
if (opts.taxonomy)
|
|
69
|
+
params.set("taxonomyVersion", opts.taxonomy);
|
|
70
|
+
if (opts.since)
|
|
71
|
+
params.set("since", opts.since);
|
|
72
|
+
if (opts.until)
|
|
73
|
+
params.set("until", opts.until);
|
|
74
|
+
if (opts.global === false)
|
|
75
|
+
params.set("includeGlobal", "false");
|
|
76
|
+
printResult(await hubRequest(`/v1/teams/${encodeURIComponent(teamId)}/subreddit-post-styles/summary?${params.toString()}`));
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
group
|
|
81
|
+
.command("accept")
|
|
82
|
+
.description("POST .../subreddit-post-styles/accept — 单人接受一条 LLM proposed 标签(写 team 级 human accepted 行;可修正)")
|
|
83
|
+
.requiredOption("--label-id <uuid>", "被接受的 LLM proposed 标签 id")
|
|
84
|
+
.option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
|
|
85
|
+
.option("--primary-style <s>", "修正主风格(省略则原样采纳)")
|
|
86
|
+
.option("--secondary-styles <csv>", "修正副风格(逗号分隔,≤3)")
|
|
87
|
+
.option("--other-label <text>", "primary=other 时的自由标签")
|
|
88
|
+
.option("--note <text>", "备注(≤2000)")
|
|
89
|
+
.option("--dry-run", "预览", false)
|
|
90
|
+
.option("--apply", "执行写入", false)
|
|
91
|
+
.action(async (opts) => {
|
|
92
|
+
await withCliErrorBoundary(async () => {
|
|
93
|
+
const teamId = resolveTeamId(opts.team);
|
|
94
|
+
const body = { labelId: opts.labelId };
|
|
95
|
+
if (opts.primaryStyle)
|
|
96
|
+
body.primaryStyle = opts.primaryStyle;
|
|
97
|
+
if (opts.secondaryStyles)
|
|
98
|
+
body.secondaryStyles = String(opts.secondaryStyles)
|
|
99
|
+
.split(",")
|
|
100
|
+
.map((s) => s.trim())
|
|
101
|
+
.filter(Boolean);
|
|
102
|
+
if (opts.otherLabel !== undefined)
|
|
103
|
+
body.otherLabel = opts.otherLabel;
|
|
104
|
+
if (opts.note)
|
|
105
|
+
body.note = opts.note;
|
|
106
|
+
await withPermissionGates({
|
|
107
|
+
command: "subreddit-post-styles accept",
|
|
108
|
+
gates: [
|
|
109
|
+
{ resource: "subredditPostAnnotation", action: "create" },
|
|
110
|
+
{ resource: "subredditPostAnnotation", action: "update" },
|
|
111
|
+
],
|
|
112
|
+
teamId,
|
|
113
|
+
userOnly: true,
|
|
114
|
+
}, async () => {
|
|
115
|
+
if (!assertApplyOrDryRun(opts, {
|
|
116
|
+
command: "subreddit-post-styles accept",
|
|
117
|
+
danger: "write",
|
|
118
|
+
summary: { teamId, ...body },
|
|
119
|
+
})) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
printResult(await hubRequest(`/v1/teams/${encodeURIComponent(teamId)}/subreddit-post-styles/accept`, { method: "POST", body }));
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
group
|
|
127
|
+
.command("reject")
|
|
128
|
+
.description("POST .../subreddit-post-styles/reject — 单人拒绝一条 LLM proposed 标签(写 team 级 human rejected 行)")
|
|
129
|
+
.requiredOption("--label-id <uuid>", "被拒绝的 LLM proposed 标签 id")
|
|
130
|
+
.option("-t, --team <teamId>", "Team UUID(缺省用当前 context)")
|
|
131
|
+
.option("--note <text>", "备注(≤2000)")
|
|
132
|
+
.option("--dry-run", "预览", false)
|
|
133
|
+
.option("--apply", "执行写入", false)
|
|
134
|
+
.action(async (opts) => {
|
|
135
|
+
await withCliErrorBoundary(async () => {
|
|
136
|
+
const teamId = resolveTeamId(opts.team);
|
|
137
|
+
const body = { labelId: opts.labelId };
|
|
138
|
+
if (opts.note)
|
|
139
|
+
body.note = opts.note;
|
|
140
|
+
await withPermissionGates({
|
|
141
|
+
command: "subreddit-post-styles reject",
|
|
142
|
+
gates: [
|
|
143
|
+
{ resource: "subredditPostAnnotation", action: "create" },
|
|
144
|
+
{ resource: "subredditPostAnnotation", action: "update" },
|
|
145
|
+
],
|
|
146
|
+
teamId,
|
|
147
|
+
userOnly: true,
|
|
148
|
+
}, async () => {
|
|
149
|
+
if (!assertApplyOrDryRun(opts, {
|
|
150
|
+
command: "subreddit-post-styles reject",
|
|
151
|
+
danger: "write",
|
|
152
|
+
summary: { teamId, ...body },
|
|
153
|
+
})) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
printResult(await hubRequest(`/v1/teams/${encodeURIComponent(teamId)}/subreddit-post-styles/reject`, { method: "POST", body }));
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=register-subreddit-post-style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-subreddit-post-style.js","sourceRoot":"","sources":["../src/register-subreddit-post-style.ts"],"names":[],"mappings":"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"}
|
package/dist/update-check.d.ts
CHANGED
|
@@ -17,5 +17,20 @@ export declare function buildSelfUpdateSteps(latest: string, opts: {
|
|
|
17
17
|
export declare function formatUpgradeCommand(latest: string): string;
|
|
18
18
|
/** Human + agent-facing lines when registry latest > installed CLI. */
|
|
19
19
|
export declare function formatUpdateNoticeLines(current: string, latest: string): string[];
|
|
20
|
+
export declare function shouldSkipAutoUpdate(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* 原子拿后台更新锁(writeFile wx;已存在则看 TTL,过期回收重试)。拿到返回 true,
|
|
23
|
+
* 「有一次更新在途且未过期」返回 false。防 agent 一秒内多次调用触发一批 npm install。
|
|
24
|
+
*/
|
|
25
|
+
export declare function acquireAutoUpdateLock(lockFile?: string): boolean;
|
|
26
|
+
export declare function releaseAutoUpdateLock(lockFile?: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* 后台(detached、静默、非阻塞)启动 `npm install -g @latest`。当前进程立即返回。
|
|
29
|
+
* 成功启动返回 true;锁在途/启动失败返回 false。锁在成功装完后不主动释放(detached 无法感知
|
|
30
|
+
* 完成),靠 TTL 过期——届时 current 已=latest 不再触发;若装失败,锁到期后下次调用重试。
|
|
31
|
+
*/
|
|
32
|
+
export declare function spawnBackgroundUpdate(latest: string, lockFile?: string): boolean;
|
|
33
|
+
/** 后台更新已启动时给人/agent 的一行提示(stderr;不污染 stdout/JSON)。 */
|
|
34
|
+
export declare function formatAutoUpdateLines(current: string, latest: string): string[];
|
|
20
35
|
export declare function maybeNotifyUpdate(argv?: string[]): Promise<void>;
|
|
21
36
|
//# sourceMappingURL=update-check.d.ts.map
|
|
@@ -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":"AAOA,eAAO,MAAM,YAAY,6BAA6B,CAAC;AAevD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAW7D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAavE;AA6BD,mEAAmE;AACnE,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE/D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,GAC5B,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBvD;AAoBD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,uEAAuE;AACvE,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,EAAE,CAUV;AAaD,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,GAAE,MAA8B,GACvC,OAAO,CA4BT;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,GAAE,MAA8B,GACvC,IAAI,CAMN;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAA8B,GACvC,OAAO,CAcT;AAED,sDAAsD;AACtD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,EAAE,CAQV;AAoBD,wBAAsB,iBAAiB,CACrC,IAAI,GAAE,MAAM,EAAiB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqBf"}
|