@geoly-ai/social-hub-cli 0.2.24 → 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.
Files changed (38) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cmd-manifest.json +11 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +18 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/permissions-gates-content-classification.d.ts +8 -0
  7. package/dist/permissions-gates-content-classification.d.ts.map +1 -0
  8. package/dist/permissions-gates-content-classification.js +40 -0
  9. package/dist/permissions-gates-content-classification.js.map +1 -0
  10. package/dist/permissions.d.ts.map +1 -1
  11. package/dist/permissions.js +2 -0
  12. package/dist/permissions.js.map +1 -1
  13. package/dist/register-content-classification.d.ts +14 -0
  14. package/dist/register-content-classification.d.ts.map +1 -0
  15. package/dist/register-content-classification.js +181 -0
  16. package/dist/register-content-classification.js.map +1 -0
  17. package/dist/register-content-classification.test.d.ts +2 -0
  18. package/dist/register-content-classification.test.d.ts.map +1 -0
  19. package/dist/register-content-classification.test.js +43 -0
  20. package/dist/register-content-classification.test.js.map +1 -0
  21. package/dist/register-subreddit-post-style.d.ts +8 -0
  22. package/dist/register-subreddit-post-style.d.ts.map +1 -0
  23. package/dist/register-subreddit-post-style.js +161 -0
  24. package/dist/register-subreddit-post-style.js.map +1 -0
  25. package/dist/update-check.d.ts +15 -0
  26. package/dist/update-check.d.ts.map +1 -1
  27. package/dist/update-check.js +106 -3
  28. package/dist/update-check.js.map +1 -1
  29. package/dist/update-check.test.js +71 -2
  30. package/dist/update-check.test.js.map +1 -1
  31. package/package.json +3 -3
  32. package/skills/manifest.json +1 -1
  33. package/skills/social-hub-accounts/SKILL.md +32 -0
  34. package/skills/social-hub-calendar-jobs/SKILL.md +1 -1
  35. package/skills/social-hub-content-classification/SKILL.md +92 -0
  36. package/skills/social-hub-content-review/SKILL.md +31 -4
  37. package/skills/social-hub-ops-runtime/SKILL.md +19 -1
  38. 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;AAIpC,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,EA4GnD,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"}
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"}
@@ -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 });
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
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,CA8L5E"}
@@ -0,0 +1,181 @@
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
+ // ── 读:presentation ─────────────────────────────────────────────────────────
80
+ cc.command("presentation")
81
+ .description("GET .../presentation — content_classification.presentation.v1(缺则契约默认;source 标注来源)")
82
+ .action(async () => {
83
+ await withCliErrorBoundary(async () => {
84
+ await withPermissionGates({
85
+ command: "content-classification presentation",
86
+ gates: [{ resource: "contentClassification", action: "read" }],
87
+ }, async () => {
88
+ printResult(await hubRequest(`${CC_BASE}/presentation`));
89
+ });
90
+ });
91
+ });
92
+ // ── spec 子命令组 ────────────────────────────────────────────────────────────
93
+ const spec = cc
94
+ .command("spec")
95
+ .description("classifier spec 管理(list/get 只读;create/activate 仅 admin)");
96
+ spec
97
+ .command("list")
98
+ .description("GET .../specs — 该 purpose 当前 active spec(activeSpec:null=尚未激活;完整历史枚举留 Phase 2)")
99
+ .option("--purpose <p>", "classifier purpose(缺省用 canonical 默认)")
100
+ .action(async (opts) => {
101
+ await withCliErrorBoundary(async () => {
102
+ await withPermissionGates({
103
+ command: "content-classification spec list",
104
+ gates: [{ resource: "contentClassification", action: "list" }],
105
+ }, async () => {
106
+ const params = new URLSearchParams();
107
+ if (opts.purpose)
108
+ params.set("purpose", opts.purpose);
109
+ const qs = params.toString();
110
+ printResult(await hubRequest(`${CC_BASE}/specs${qs ? `?${qs}` : ""}`));
111
+ });
112
+ });
113
+ });
114
+ spec
115
+ .command("get")
116
+ .description("GET .../specs/:id — 按 id 查任意 spec(含 draft / retired)")
117
+ .requiredOption("--id <specId>", "classifier spec UUID")
118
+ .action(async (opts) => {
119
+ await withCliErrorBoundary(async () => {
120
+ await withPermissionGates({
121
+ command: "content-classification spec get",
122
+ gates: [{ resource: "contentClassification", action: "read" }],
123
+ }, async () => {
124
+ printResult(await hubRequest(`${CC_BASE}/specs/${encodeURIComponent(opts.id)}`));
125
+ });
126
+ });
127
+ });
128
+ spec
129
+ .command("create")
130
+ .description("POST .../specs — 建 draft spec(admin only;同 fingerprint 已存在则幂等返回 created=false)")
131
+ .requiredOption("-j, --json <json>", '{ "purpose","taxonomyVersion","taxonomySchemaVersion","promptVersion","modelPolicy":{...}, 可选 inputFingerprintVersion/truncationPolicyVersion/formatDetectorVersion }')
132
+ .option("--dry-run", "预览", false)
133
+ .option("--apply", "执行写入", false)
134
+ .action(async (opts) => {
135
+ await withCliErrorBoundary(async () => {
136
+ await withPermissionGates({
137
+ command: "content-classification spec create",
138
+ gates: [{ resource: "contentClassification", action: "create" }],
139
+ userOnly: true,
140
+ }, async () => {
141
+ const body = buildCreateSpecBody(parseJsonOption(opts.json));
142
+ if (!assertApplyOrDryRun(opts, {
143
+ command: "content-classification spec create",
144
+ danger: "write",
145
+ summary: body,
146
+ })) {
147
+ return;
148
+ }
149
+ printResult(await hubRequest(`${CC_BASE}/specs`, { method: "POST", body }));
150
+ });
151
+ });
152
+ });
153
+ spec
154
+ .command("activate")
155
+ .description("POST .../specs/:id/activate — 激活 spec(admin only;同 purpose 至多一 active;已 active 幂等)")
156
+ .requiredOption("--id <specId>", "classifier spec UUID")
157
+ .option("--dry-run", "预览", false)
158
+ .option("--apply", "执行写入", false)
159
+ .action(async (opts) => {
160
+ await withCliErrorBoundary(async () => {
161
+ await withPermissionGates({
162
+ command: "content-classification spec activate",
163
+ gates: [{ resource: "contentClassification", action: "update" }],
164
+ userOnly: true,
165
+ }, async () => {
166
+ if (!assertApplyOrDryRun(opts, {
167
+ command: "content-classification spec activate",
168
+ danger: "admin",
169
+ summary: {
170
+ id: opts.id,
171
+ effect: "退役同 purpose 现 active(若有)并激活本 spec;worker 下轮按新 active spec 重分类",
172
+ },
173
+ })) {
174
+ return;
175
+ }
176
+ printResult(await hubRequest(`${CC_BASE}/specs/${encodeURIComponent(opts.id)}/activate`, { method: "POST" }));
177
+ });
178
+ });
179
+ });
180
+ }
181
+ //# 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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register-content-classification.test.d.ts.map
@@ -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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"}
@@ -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":"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;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;AAMD,wBAAsB,iBAAiB,CACrC,IAAI,GAAE,MAAM,EAAiB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqBf"}
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"}