@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.
Files changed (81) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/client.d.ts +21 -0
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +64 -1
  5. package/dist/client.js.map +1 -1
  6. package/dist/client.test.d.ts +2 -0
  7. package/dist/client.test.d.ts.map +1 -0
  8. package/dist/client.test.js +123 -0
  9. package/dist/client.test.js.map +1 -0
  10. package/dist/cmd-manifest.json +23 -2
  11. package/dist/cmd-manifest.test.js +4 -0
  12. package/dist/cmd-manifest.test.js.map +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +20 -2
  15. package/dist/index.js.map +1 -1
  16. package/dist/permission-runner.d.ts +21 -4
  17. package/dist/permission-runner.d.ts.map +1 -1
  18. package/dist/permission-runner.js +36 -9
  19. package/dist/permission-runner.js.map +1 -1
  20. package/dist/permission-runner.test.js +76 -0
  21. package/dist/permission-runner.test.js.map +1 -1
  22. package/dist/permissions-gates-content-classification.d.ts +8 -0
  23. package/dist/permissions-gates-content-classification.d.ts.map +1 -0
  24. package/dist/permissions-gates-content-classification.js +40 -0
  25. package/dist/permissions-gates-content-classification.js.map +1 -0
  26. package/dist/permissions-gates-subreddit-style.d.ts +10 -0
  27. package/dist/permissions-gates-subreddit-style.d.ts.map +1 -0
  28. package/dist/permissions-gates-subreddit-style.js +66 -0
  29. package/dist/permissions-gates-subreddit-style.js.map +1 -0
  30. package/dist/permissions-gates-subreddit-style.test.d.ts +2 -0
  31. package/dist/permissions-gates-subreddit-style.test.d.ts.map +1 -0
  32. package/dist/permissions-gates-subreddit-style.test.js +44 -0
  33. package/dist/permissions-gates-subreddit-style.test.js.map +1 -0
  34. package/dist/permissions.d.ts +10 -0
  35. package/dist/permissions.d.ts.map +1 -1
  36. package/dist/permissions.js +11 -2
  37. package/dist/permissions.js.map +1 -1
  38. package/dist/register-content-classification.d.ts +14 -0
  39. package/dist/register-content-classification.d.ts.map +1 -0
  40. package/dist/register-content-classification.js +181 -0
  41. package/dist/register-content-classification.js.map +1 -0
  42. package/dist/register-content-classification.test.d.ts +2 -0
  43. package/dist/register-content-classification.test.d.ts.map +1 -0
  44. package/dist/register-content-classification.test.js +43 -0
  45. package/dist/register-content-classification.test.js.map +1 -0
  46. package/dist/register-extensions.d.ts.map +1 -1
  47. package/dist/register-extensions.js +1 -0
  48. package/dist/register-extensions.js.map +1 -1
  49. package/dist/register-subreddit-post-style.d.ts +8 -0
  50. package/dist/register-subreddit-post-style.d.ts.map +1 -0
  51. package/dist/register-subreddit-post-style.js +161 -0
  52. package/dist/register-subreddit-post-style.js.map +1 -0
  53. package/dist/register-subreddit-style-actions.test.d.ts +2 -0
  54. package/dist/register-subreddit-style-actions.test.d.ts.map +1 -0
  55. package/dist/register-subreddit-style-actions.test.js +295 -0
  56. package/dist/register-subreddit-style-actions.test.js.map +1 -0
  57. package/dist/register-subreddit-style.d.ts +57 -0
  58. package/dist/register-subreddit-style.d.ts.map +1 -0
  59. package/dist/register-subreddit-style.js +418 -0
  60. package/dist/register-subreddit-style.js.map +1 -0
  61. package/dist/register-subreddit-style.test.d.ts +2 -0
  62. package/dist/register-subreddit-style.test.d.ts.map +1 -0
  63. package/dist/register-subreddit-style.test.js +183 -0
  64. package/dist/register-subreddit-style.test.js.map +1 -0
  65. package/dist/update-check.d.ts +15 -0
  66. package/dist/update-check.d.ts.map +1 -1
  67. package/dist/update-check.js +106 -3
  68. package/dist/update-check.js.map +1 -1
  69. package/dist/update-check.test.js +71 -2
  70. package/dist/update-check.test.js.map +1 -1
  71. package/package.json +3 -3
  72. package/skills/README.md +1 -0
  73. package/skills/manifest.json +6 -1
  74. package/skills/social-hub-accounts/SKILL.md +32 -0
  75. package/skills/social-hub-calendar-jobs/SKILL.md +1 -1
  76. package/skills/social-hub-cli/SKILL.md +1 -0
  77. package/skills/social-hub-content-classification/SKILL.md +92 -0
  78. package/skills/social-hub-content-review/SKILL.md +31 -4
  79. package/skills/social-hub-ops-runtime/SKILL.md +19 -1
  80. package/skills/social-hub-post-review/SKILL.md +38 -12
  81. package/skills/social-hub-style-profiles/SKILL.md +126 -0
@@ -1,11 +1,28 @@
1
1
  import type { Action, Resource, Role } from "@geoly-ai/social-hub-authz";
2
+ export type PermissionGateCtx = {
3
+ role: Role;
4
+ teamId?: string;
5
+ /** auth context 身份类型:api_key | session | cli_token。 */
6
+ kind?: string;
7
+ };
8
+ /**
9
+ * 多 gate 版权限预检(Block 8b 起 API 有 create+update 双 gate / global 另加系统
10
+ * 治理 gate 的端点;Codex 计划轮 P1):一次 auth context 拉取,逐个本地断言。
11
+ * userOnly=true 时本地先拒 api_key(API 侧同样拒,提前报避免带着成功假象打到 403)。
12
+ */
13
+ export declare function withPermissionGates(input: {
14
+ command: string;
15
+ gates: {
16
+ resource: Resource;
17
+ action: Action;
18
+ }[];
19
+ teamId?: string;
20
+ userOnly?: boolean;
21
+ }, run: (ctx: PermissionGateCtx) => Promise<void>): Promise<void>;
2
22
  export declare function withPermissionGate(input: {
3
23
  command: string;
4
24
  resource: Resource;
5
25
  action: Action;
6
26
  teamId?: string;
7
- }, run: (ctx: {
8
- role: Role;
9
- teamId?: string;
10
- }) => Promise<void>): Promise<void>;
27
+ }, run: (ctx: PermissionGateCtx) => Promise<void>): Promise<void>;
11
28
  //# sourceMappingURL=permission-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"permission-runner.d.ts","sourceRoot":"","sources":["../src/permission-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAIzE,wBAAsB,kBAAkB,CACtC,KAAK,EAAE;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,EACD,GAAG,EAAE,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAC3D,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
1
+ {"version":3,"file":"permission-runner.d.ts","sourceRoot":"","sources":["../src/permission-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAIzE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAmCF;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,EACD,GAAG,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,EACD,GAAG,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC,CASf"}
@@ -1,12 +1,13 @@
1
1
  import { requireClient, resolveTeamId } from "./client.js";
2
2
  import { assertCliPermission } from "./permissions.js";
3
- export async function withPermissionGate(input, run) {
4
- const client = requireClient();
5
- const teamId = input.teamId ? resolveTeamId(input.teamId) : undefined;
3
+ const USER_ONLY_HINT = "Fix: 该命令为 user-only(API 拒绝 API Key)——用 `social-hub auth login` 的 CLI token 执行,且账号角色需满足上述资源动作。";
4
+ async function loadAuthContext(client, teamId) {
6
5
  let role = "manager";
6
+ let kind;
7
7
  try {
8
8
  const authCtx = await client.getAuthContext();
9
9
  role = authCtx.role ?? "manager";
10
+ kind = authCtx.kind;
10
11
  if (teamId &&
11
12
  authCtx.kind === "api_key" &&
12
13
  authCtx.teamId &&
@@ -19,12 +20,38 @@ export async function withPermissionGate(input, run) {
19
20
  console.error(e instanceof Error ? e.message : "Failed to load auth context");
20
21
  process.exit(1);
21
22
  }
22
- assertCliPermission({
23
- role,
24
- resource: input.resource,
25
- action: input.action,
23
+ return { role, teamId, kind };
24
+ }
25
+ /**
26
+ * 多 gate 版权限预检(Block 8b 起 API 有 create+update 双 gate / global 另加系统
27
+ * 治理 gate 的端点;Codex 计划轮 P1):一次 auth context 拉取,逐个本地断言。
28
+ * userOnly=true 时本地先拒 api_key(API 侧同样拒,提前报避免带着成功假象打到 403)。
29
+ */
30
+ export async function withPermissionGates(input, run) {
31
+ const client = requireClient();
32
+ const teamId = input.teamId ? resolveTeamId(input.teamId) : undefined;
33
+ const ctx = await loadAuthContext(client, teamId);
34
+ if (input.userOnly && ctx.kind === "api_key") {
35
+ console.error(`Refusing to run \`${input.command}\` with an API Key:该写操作要求 user 身份。` +
36
+ "请用 `social-hub auth login` 登录(CLI token)后重试。");
37
+ process.exit(1);
38
+ }
39
+ for (const gate of input.gates) {
40
+ assertCliPermission({
41
+ role: ctx.role,
42
+ resource: gate.resource,
43
+ action: gate.action,
44
+ command: input.command,
45
+ authNote: input.userOnly ? USER_ONLY_HINT : undefined,
46
+ });
47
+ }
48
+ await run(ctx);
49
+ }
50
+ export async function withPermissionGate(input, run) {
51
+ await withPermissionGates({
26
52
  command: input.command,
27
- });
28
- await run({ role, teamId });
53
+ gates: [{ resource: input.resource, action: input.action }],
54
+ teamId: input.teamId,
55
+ }, run);
29
56
  }
30
57
  //# sourceMappingURL=permission-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permission-runner.js","sourceRoot":"","sources":["../src/permission-runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAKC,EACD,GAA4D;IAE5D,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,IAAI,IAAI,GAAS,SAAS,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAC9C,IAAI,GAAI,OAAO,CAAC,IAAa,IAAI,SAAS,CAAC;QAC3C,IACE,MAAM;YACN,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,MAAM;YACd,OAAO,CAAC,MAAM,KAAK,MAAM,EACzB,CAAC;YACD,OAAO,CAAC,KAAK,CACX,4BAA4B,OAAO,CAAC,MAAM,yBAAyB,MAAM,GAAG,CAC7E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAC/D,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,mBAAmB,CAAC;QAClB,IAAI;QACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"permission-runner.js","sourceRoot":"","sources":["../src/permission-runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AASvD,MAAM,cAAc,GAClB,+FAA+F,CAAC;AAElG,KAAK,UAAU,eAAe,CAC5B,MAAwC,EACxC,MAA0B;IAE1B,IAAI,IAAI,GAAS,SAAS,CAAC;IAC3B,IAAI,IAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAC9C,IAAI,GAAI,OAAO,CAAC,IAAa,IAAI,SAAS,CAAC;QAC3C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACpB,IACE,MAAM;YACN,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,MAAM;YACd,OAAO,CAAC,MAAM,KAAK,MAAM,EACzB,CAAC;YACD,OAAO,CAAC,KAAK,CACX,4BAA4B,OAAO,CAAC,MAAM,yBAAyB,MAAM,GAAG,CAC7E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAC/D,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAKC,EACD,GAA8C;IAE9C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,IAAI,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CACX,qBAAqB,KAAK,CAAC,OAAO,oCAAoC;YACpE,8CAA8C,CACjD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,mBAAmB,CAAC;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;SACtD,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAKC,EACD,GAA8C;IAE9C,MAAM,mBAAmB,CACvB;QACE,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3D,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,EACD,GAAG,CACJ,CAAC;AACJ,CAAC"}
@@ -66,4 +66,80 @@ describe("withPermissionGate", () => {
66
66
  expect(mockListApiKeys).not.toHaveBeenCalled();
67
67
  });
68
68
  });
69
+ describe("withPermissionGates", () => {
70
+ beforeEach(() => {
71
+ mockGetAuthContext.mockReset();
72
+ vi.spyOn(process, "exit").mockImplementation((() => {
73
+ throw new Error("process.exit");
74
+ }));
75
+ vi.spyOn(console, "error").mockImplementation(() => { });
76
+ });
77
+ afterEach(() => {
78
+ vi.restoreAllMocks();
79
+ });
80
+ it("userOnly:api_key 本地先拒(不等业务 403)", async () => {
81
+ mockGetAuthContext.mockResolvedValue({ role: "admin", kind: "api_key" });
82
+ const { withPermissionGates } = await import("./permission-runner.js");
83
+ const run = vi.fn();
84
+ await expect(withPermissionGates({
85
+ command: "style-profiles approve",
86
+ gates: [{ resource: "subredditStyleProfile", action: "update" }],
87
+ userOnly: true,
88
+ }, run)).rejects.toThrow("process.exit");
89
+ expect(run).not.toHaveBeenCalled();
90
+ });
91
+ it("userOnly:cli_token 放行", async () => {
92
+ mockGetAuthContext.mockResolvedValue({
93
+ role: "manager",
94
+ kind: "cli_token",
95
+ });
96
+ const { withPermissionGates } = await import("./permission-runner.js");
97
+ const run = vi.fn();
98
+ await withPermissionGates({
99
+ command: "style-profiles approve",
100
+ gates: [{ resource: "subredditStyleProfile", action: "update" }],
101
+ userOnly: true,
102
+ }, run);
103
+ expect(run).toHaveBeenCalledOnce();
104
+ });
105
+ it("多 gate 逐个断言:第一 gate 过、第二 gate 拒则整体拒", async () => {
106
+ // supervisor 可写 subredditPostAnnotation(create/update),但不可写
107
+ // subredditStyleProfile(manager/admin)——模拟 global 标注的第三道 gate。
108
+ mockGetAuthContext.mockResolvedValue({
109
+ role: "supervisor",
110
+ kind: "cli_token",
111
+ });
112
+ const { withPermissionGates } = await import("./permission-runner.js");
113
+ const run = vi.fn();
114
+ await expect(withPermissionGates({
115
+ command: "subreddit-annotations upsert",
116
+ gates: [
117
+ { resource: "subredditPostAnnotation", action: "create" },
118
+ { resource: "subredditPostAnnotation", action: "update" },
119
+ { resource: "subredditStyleProfile", action: "update" },
120
+ ],
121
+ teamId: "team-ctx",
122
+ userOnly: true,
123
+ }, run)).rejects.toThrow("process.exit");
124
+ expect(run).not.toHaveBeenCalled();
125
+ });
126
+ it("多 gate 全过则执行(team 标注的 create+update)", async () => {
127
+ mockGetAuthContext.mockResolvedValue({
128
+ role: "supervisor",
129
+ kind: "cli_token",
130
+ });
131
+ const { withPermissionGates } = await import("./permission-runner.js");
132
+ const run = vi.fn();
133
+ await withPermissionGates({
134
+ command: "subreddit-annotations upsert",
135
+ gates: [
136
+ { resource: "subredditPostAnnotation", action: "create" },
137
+ { resource: "subredditPostAnnotation", action: "update" },
138
+ ],
139
+ teamId: "team-ctx",
140
+ userOnly: true,
141
+ }, run);
142
+ expect(run).toHaveBeenCalledOnce();
143
+ });
144
+ });
69
145
  //# sourceMappingURL=permission-runner.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permission-runner.test.js","sourceRoot":"","sources":["../src/permission-runner.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permission-runner.test.js","sourceRoot":"","sources":["../src/permission-runner.test.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -0,0 +1,10 @@
1
+ import type { CliPermissionGate } from "./permissions.js";
2
+ /**
3
+ * Block 8b 板块画像/标注域 CLI gates(skill social-hub-style-profiles)。
4
+ * 角色梯度同 authz:画像写只 manager/admin;标注 manager 全动作、supervisor
5
+ * 读+写、senior/internal 只读、client 恒拒。upsert 在 API 侧需 create+update
6
+ * 双 gate(scope=global 另需 subredditStyleProfile:update),运行时由
7
+ * withPermissionGates 逐个断言;此处登记主 gate 供 auth explain 展示。
8
+ */
9
+ export declare const SUBREDDIT_STYLE_PERMISSION_GATES: CliPermissionGate[];
10
+ //# sourceMappingURL=permissions-gates-subreddit-style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-gates-subreddit-style.d.ts","sourceRoot":"","sources":["../src/permissions-gates-subreddit-style.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,EAAE,iBAAiB,EAyD/D,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Block 8b 板块画像/标注域 CLI gates(skill social-hub-style-profiles)。
3
+ * 角色梯度同 authz:画像写只 manager/admin;标注 manager 全动作、supervisor
4
+ * 读+写、senior/internal 只读、client 恒拒。upsert 在 API 侧需 create+update
5
+ * 双 gate(scope=global 另需 subredditStyleProfile:update),运行时由
6
+ * withPermissionGates 逐个断言;此处登记主 gate 供 auth explain 展示。
7
+ */
8
+ export const SUBREDDIT_STYLE_PERMISSION_GATES = [
9
+ {
10
+ command: "style-profiles list",
11
+ resource: "subredditStyleProfile",
12
+ action: "read",
13
+ },
14
+ {
15
+ command: "style-profiles get",
16
+ resource: "subredditStyleProfile",
17
+ action: "read",
18
+ },
19
+ {
20
+ command: "style-profiles active",
21
+ resource: "subredditStyleProfile",
22
+ action: "read",
23
+ },
24
+ {
25
+ command: "style-profiles propose",
26
+ resource: "subredditStyleProfile",
27
+ action: "create",
28
+ note: "user only",
29
+ },
30
+ {
31
+ command: "style-profiles approve",
32
+ resource: "subredditStyleProfile",
33
+ action: "update",
34
+ note: "user only; 四眼(提案人不可批)",
35
+ },
36
+ {
37
+ command: "style-profiles reject",
38
+ resource: "subredditStyleProfile",
39
+ action: "update",
40
+ note: "user only",
41
+ },
42
+ {
43
+ command: "style-profiles cancel",
44
+ resource: "subredditStyleProfile",
45
+ action: "delete",
46
+ note: "user only; 仅提案人本人",
47
+ },
48
+ {
49
+ command: "style-profiles retire",
50
+ resource: "subredditStyleProfile",
51
+ action: "update",
52
+ note: "user only",
53
+ },
54
+ {
55
+ command: "subreddit-annotations list",
56
+ resource: "subredditPostAnnotation",
57
+ action: "read",
58
+ },
59
+ {
60
+ command: "subreddit-annotations upsert",
61
+ resource: "subredditPostAnnotation",
62
+ action: "create",
63
+ note: "user only; API 另需 update;scope=global 另需 subredditStyleProfile:update",
64
+ },
65
+ ];
66
+ //# sourceMappingURL=permissions-gates-subreddit-style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-gates-subreddit-style.js","sourceRoot":"","sources":["../src/permissions-gates-subreddit-style.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAwB;IACnE;QACE,OAAO,EAAE,qBAAqB;QAC9B,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,wBAAwB;QACjC,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,WAAW;KAClB;IACD;QACE,OAAO,EAAE,wBAAwB;QACjC,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,uBAAuB;KAC9B;IACD;QACE,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,WAAW;KAClB;IACD;QACE,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,mBAAmB;KAC1B;IACD;QACE,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,WAAW;KAClB;IACD;QACE,OAAO,EAAE,4BAA4B;QACrC,QAAQ,EAAE,yBAAyB;QACnC,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,yBAAyB;QACnC,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,uEAAuE;KAC9E;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permissions-gates-subreddit-style.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-gates-subreddit-style.test.d.ts","sourceRoot":"","sources":["../src/permissions-gates-subreddit-style.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { SUBREDDIT_STYLE_PERMISSION_GATES } from "./permissions-gates-subreddit-style.js";
3
+ import { CLI_PERMISSION_GATES, findGateForCommand } from "./permissions.js";
4
+ describe("subreddit style permission gates", () => {
5
+ it("画像写操作映射到 subredditStyleProfile 对应动作", () => {
6
+ expect(findGateForCommand("style-profiles propose")).toEqual(expect.objectContaining({
7
+ resource: "subredditStyleProfile",
8
+ action: "create",
9
+ }));
10
+ expect(findGateForCommand("style-profiles approve")).toEqual(expect.objectContaining({
11
+ resource: "subredditStyleProfile",
12
+ action: "update",
13
+ }));
14
+ expect(findGateForCommand("style-profiles cancel")).toEqual(expect.objectContaining({
15
+ resource: "subredditStyleProfile",
16
+ action: "delete",
17
+ }));
18
+ });
19
+ it("读面与标注命令映射正确(list 对齐服务端断言 read)", () => {
20
+ expect(findGateForCommand("style-profiles list")).toEqual(expect.objectContaining({
21
+ resource: "subredditStyleProfile",
22
+ action: "read",
23
+ }));
24
+ expect(findGateForCommand("style-profiles active")).toEqual(expect.objectContaining({
25
+ resource: "subredditStyleProfile",
26
+ action: "read",
27
+ }));
28
+ expect(findGateForCommand("subreddit-annotations list")).toEqual(expect.objectContaining({
29
+ resource: "subredditPostAnnotation",
30
+ action: "read",
31
+ }));
32
+ expect(findGateForCommand("subreddit-annotations upsert")).toEqual(expect.objectContaining({
33
+ resource: "subredditPostAnnotation",
34
+ action: "create",
35
+ }));
36
+ });
37
+ it("合入 CLI_PERMISSION_GATES 且无重复登记", () => {
38
+ const commands = CLI_PERMISSION_GATES.map((g) => g.command);
39
+ for (const gate of SUBREDDIT_STYLE_PERMISSION_GATES) {
40
+ expect(commands.filter((c) => c === gate.command), gate.command).toHaveLength(1);
41
+ }
42
+ });
43
+ });
44
+ //# sourceMappingURL=permissions-gates-subreddit-style.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-gates-subreddit-style.test.js","sourceRoot":"","sources":["../src/permissions-gates-subreddit-style.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAC1D,MAAM,CAAC,gBAAgB,CAAC;YACtB,QAAQ,EAAE,uBAAuB;YACjC,MAAM,EAAE,QAAQ;SACjB,CAAC,CACH,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAC1D,MAAM,CAAC,gBAAgB,CAAC;YACtB,QAAQ,EAAE,uBAAuB;YACjC,MAAM,EAAE,QAAQ;SACjB,CAAC,CACH,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CACzD,MAAM,CAAC,gBAAgB,CAAC;YACtB,QAAQ,EAAE,uBAAuB;YACjC,MAAM,EAAE,QAAQ;SACjB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CACvD,MAAM,CAAC,gBAAgB,CAAC;YACtB,QAAQ,EAAE,uBAAuB;YACjC,MAAM,EAAE,MAAM;SACf,CAAC,CACH,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CACzD,MAAM,CAAC,gBAAgB,CAAC;YACtB,QAAQ,EAAE,uBAAuB;YACjC,MAAM,EAAE,MAAM;SACf,CAAC,CACH,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,4BAA4B,CAAC,CAAC,CAAC,OAAO,CAC9D,MAAM,CAAC,gBAAgB,CAAC;YACtB,QAAQ,EAAE,yBAAyB;YACnC,MAAM,EAAE,MAAM;SACf,CAAC,CACH,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,CAAC,CAAC,OAAO,CAChE,MAAM,CAAC,gBAAgB,CAAC;YACtB,QAAQ,EAAE,yBAAyB;YACnC,MAAM,EAAE,QAAQ;SACjB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5D,KAAK,MAAM,IAAI,IAAI,gCAAgC,EAAE,CAAC;YACpD,MAAM,CACJ,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,EAC1C,IAAI,CAAC,OAAO,CACb,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -15,18 +15,28 @@ export declare function formatPermissionDenied(input: {
15
15
  resource: Resource;
16
16
  action: Action;
17
17
  command: string;
18
+ /** user-only 命令的修复提示(存在时**替换**通用"升角色 API Key"文案——
19
+ * 该类命令 API 拒 api_key,升角色无用;Codex diff 轮 P2)。 */
20
+ authNote?: string;
18
21
  }): string;
19
22
  export declare function explainCliPermissions(role: Role): {
20
23
  role: Role;
21
24
  matrix: ReturnType<typeof buildPermissionMatrix>;
22
25
  allowedCommands: string[];
23
26
  deniedCommands: string[];
27
+ /** 带附加约束的命令(user-only / 四眼 / 双 gate 等;role 放行≠身份满足,
28
+ * explain 输出须一并展示,Codex diff 轮 P2)。 */
29
+ commandNotes: {
30
+ command: string;
31
+ note: string;
32
+ }[];
24
33
  };
25
34
  export declare function assertCliPermission(input: {
26
35
  role: Role;
27
36
  resource: Resource;
28
37
  action: Action;
29
38
  command: string;
39
+ authNote?: string;
30
40
  }): void;
31
41
  export declare function findGateForCommand(commandPath: string): CliPermissionGate | undefined;
32
42
  //# sourceMappingURL=permissions.d.ts.map
@@ -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;AAGpC,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,EA2GnD,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;CACjB,GAAG,MAAM,CAQT;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;CAC1B,CAYA;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;CACjB,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,5 +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
+ import { SUBREDDIT_STYLE_PERMISSION_GATES } from "./permissions-gates-subreddit-style.js";
4
+ import { CONTENT_CLASSIFICATION_PERMISSION_GATES } from "./permissions-gates-content-classification.js";
3
5
  /** Representative write/high-risk commands mapped to authz resources. */
4
6
  export const CLI_PERMISSION_GATES = [
5
7
  { command: "accounts list", resource: "socialAccount", action: "list" },
@@ -108,6 +110,8 @@ export const CLI_PERMISSION_GATES = [
108
110
  { command: "jobs create", resource: "task", action: "create" },
109
111
  { command: "permissions", resource: "apiKey", action: "list" },
110
112
  ...ADMIN_PERMISSION_GATES,
113
+ ...SUBREDDIT_STYLE_PERMISSION_GATES,
114
+ ...CONTENT_CLASSIFICATION_PERMISSION_GATES,
111
115
  ];
112
116
  export function roleAllows(role, resource, action) {
113
117
  return canPerformAction({ role, resource, action });
@@ -116,7 +120,8 @@ export function formatPermissionDenied(input) {
116
120
  const lines = [
117
121
  `Permission denied for \`${input.command}\`.`,
118
122
  `Current role \`${input.role}\` cannot perform ${input.resource}:${input.action}.`,
119
- "Fix: use an API Key with a higher role (manager/supervisor/admin), or ask a team admin to create one.",
123
+ input.authNote ??
124
+ "Fix: use an API Key with a higher role (manager/supervisor/admin), or ask a team admin to create one.",
120
125
  "Run `social-hub auth explain` to see allowed commands for your role.",
121
126
  ];
122
127
  return lines.join("\n");
@@ -133,7 +138,11 @@ export function explainCliPermissions(role) {
133
138
  deniedCommands.push(gate.command);
134
139
  }
135
140
  }
136
- return { role, matrix, allowedCommands, deniedCommands };
141
+ const commandNotes = CLI_PERMISSION_GATES.filter((g) => g.note).map((g) => ({
142
+ command: g.command,
143
+ note: g.note,
144
+ }));
145
+ return { role, matrix, allowedCommands, deniedCommands, commandNotes };
137
146
  }
138
147
  export function assertCliPermission(input) {
139
148
  if (roleAllows(input.role, input.resource, input.action))
@@ -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;AAWtE,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAwB;IACvD,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE;IACvE,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE;IACtE,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC3E,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC3E,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC3E,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC7E;QACE,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,OAAO,EAAE,gCAAgC;QACzC,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,OAAO,EAAE,gCAAgC;QACzC,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,kCAAkC;QAC3C,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,oBAAoB;QAC9B,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,oBAAoB;QAC9B,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,OAAO,EAAE,4BAA4B;QACrC,QAAQ,EAAE,oBAAoB;QAC9B,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,0BAA0B;QACnC,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,QAAQ;KACjB;IACD,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IACjE,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC5D,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IAChE,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC/D,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC3D,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC3D,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;IAC/D,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE;IACpE;QACE,OAAO,EAAE,wBAAwB;QACjC,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,QAAQ;KACjB;IACD,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE;IACxE,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE;IACxE,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE;IAC1E;QACE,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,mBAAmB;QAC7B,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,qBAAqB;QAC9B,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,qBAAqB;QAC/B,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,qBAAqB;QAC/B,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,qBAAqB;QAC/B,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,mBAAmB;QAC7B,MAAM,EAAE,MAAM;KACf;IACD;QACE,OAAO,EAAE,qBAAqB;QAC9B,QAAQ,EAAE,oBAAoB;QAC9B,MAAM,EAAE,QAAQ;KACjB;IACD,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IAChE,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC9D,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;IAC9D,GAAG,sBAAsB;CAC1B,CAAC;AAEF,MAAM,UAAU,UAAU,CACxB,IAAU,EACV,QAAkB,EAClB,MAAc;IAEd,OAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAKtC;IACC,MAAM,KAAK,GAAG;QACZ,2BAA2B,KAAK,CAAC,OAAO,KAAK;QAC7C,kBAAkB,KAAK,CAAC,IAAI,qBAAqB,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG;QAClF,uGAAuG;QACvG,sEAAsE;KACvE,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAU;IAM9C,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE,CAAC;QACxC,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAKnC;IACC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO;IACjE,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,WAAmB;IAEnB,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;AACrE,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,CA8L5E"}