@geoly-ai/social-hub-cli 0.3.24 → 0.3.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/dist/output.d.ts CHANGED
@@ -5,5 +5,37 @@ export declare function resolveOutputFormat(opts: {
5
5
  export declare function printResult(data: unknown, format?: OutputFormat): void;
6
6
  export declare function parseJsonOption(raw: string | undefined): Record<string, unknown>;
7
7
  export declare function formatCliError(e: unknown): string;
8
+ /**
9
+ * per-command 错误边界(历史产物,392 处 `.action(` 里只有 72 处包了它)。
10
+ *
11
+ * ⚠️ 这里刻意**保留** `console.error` 而不是换成 `writeStderrSync`:多个存量测试
12
+ * 靠 `vi.spyOn(console, "error")` 捕获它的输出,直写 fd 2 会让那些断言全部瞎掉。
13
+ * 超长消息的截断风险在这条路径上仍在,但那是既有行为、不属于 D-06 的范围;
14
+ * D-06 关心的 320 条裸奔命令全部走下面的 `runCliProgram`,那条已经用同步写。
15
+ */
8
16
  export declare function withCliErrorBoundary(run: () => Promise<void>): Promise<void>;
17
+ /**
18
+ * CLI 进程唯一入口的**默认**错误边界(D-06)。
19
+ *
20
+ * 为什么必须在这里而不是每条命令自己包:全 CLI 有 392 处 `.action(`,历史上只有
21
+ * 72 处记得包 `withCliErrorBoundary`,剩下 320 条裸奔。裸奔 + commander 的同步
22
+ * `program.parse()`(**不** await async action handler 的 promise)=
23
+ * handler 抛出后变成 Node 原生 unhandled rejection:**stdout 一个字节都没有**,
24
+ * stderr 是原始堆栈。运营侧据此拿到过一次假的「全队 0 个受标账号」结论。
25
+ *
26
+ * 修法是入口这一层同时改两处:调用方改用 `program.parseAsync()`(commander 会把
27
+ * action handler 的 promise 串回来),再由这里统一 catch —— 于是**全部命令**默认
28
+ * 都有边界,新增命令不需要记得加。已有的 72 处 per-command boundary 保持不动
29
+ * (它们自己 `process.exit(1)`,先命中先生效,与本边界不冲突)。
30
+ *
31
+ * 三个输出通道的纪律,任何改动都不得破坏:
32
+ * - 错误只走 **stderr**;stdout 留给 `jq` 之类消费,失败时必须**零字节**。
33
+ * - 退出码 **非 0**。
34
+ * - 文案走 `formatCliError`,不是 Node 原生堆栈。
35
+ *
36
+ * ⚠️ 这里不做任何「降级/截断/兜底成空结果」:比如 `accounts list -n 300` 超出
37
+ * 服务端上限 200 时必须报错退出,绝不能悄悄按 200 返回 —— 那只会把一种静默失败
38
+ * 换成另一种假数据。
39
+ */
40
+ export declare function runCliProgram(parseArgv: () => Promise<unknown>): Promise<void>;
9
41
  //# sourceMappingURL=output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAM/D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAI3E;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,MAAM,GAAE,YAAqB,GAC5B,IAAI,CA0BN;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzB;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CA0CjD;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACvB,OAAO,CAAC,IAAI,CAAC,CAOf"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAM/D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAI3E;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,OAAO,EACb,MAAM,GAAE,YAAqB,GAC5B,IAAI,CA0BN;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzB;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CA0CjD;AAwCD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACvB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAqBf"}
package/dist/output.js CHANGED
@@ -1,4 +1,7 @@
1
+ import { writeSync } from "node:fs";
1
2
  import { resolveCliConfig } from "./config.js";
3
+ /** stderr 的文件描述符 —— 绕开 console.error 的异步缓冲直接同步写(见 writeStderrSync)。 */
4
+ const STDERR_FD = 2;
2
5
  /** 连接/DNS 类错误 —— 通常意味着 API 地址不对或服务不可达(如域名已变更)。 */
3
6
  const CONNECTION_ERROR_RE = /fetch failed|ECONNREFUSED|ENOTFOUND|ETIMEDOUT|EAI_AGAIN|getaddrinfo|socket hang up|network|certificate/i;
4
7
  export function resolveOutputFormat(opts) {
@@ -80,6 +83,52 @@ export function formatCliError(e) {
80
83
  }
81
84
  return String(e);
82
85
  }
86
+ /**
87
+ * 把一行文本**同步**写进 stderr,写完再返回(D-06)。
88
+ *
89
+ * 不能用 `console.error` + `process.exit()`:Node 对管道的写在 **macOS 上是异步的**
90
+ * (Windows/Linux 同步),`process.exit()` 会把还没刷出去的尾巴截掉。错误消息一长
91
+ * (服务端返回超长 message 时)就会丢尾,于是「报错了但看不全」——这正是 D-06
92
+ * 那种「输出通道不可信」的同一类毛病。`fs.writeSync` 循环写到写完为止,既不截断,
93
+ * 也不需要为了等 flush 而放弃 `process.exit`(留句柄的 handler 会让进程挂死)。
94
+ */
95
+ function writeStderrSync(text) {
96
+ const bytes = Buffer.from(`${text}\n`, "utf8");
97
+ let offset = 0;
98
+ while (offset < bytes.length) {
99
+ try {
100
+ const written = writeSync(STDERR_FD, bytes, offset);
101
+ if (written <= 0)
102
+ break;
103
+ offset += written;
104
+ }
105
+ catch (err) {
106
+ const code = err.code;
107
+ if (code === "EAGAIN") {
108
+ // 管道满且对端还没读走 —— Node 把 stderr 设成非阻塞,writeSync 会抛
109
+ // EAGAIN 而不是阻塞。这里**必须重试**:直接放弃就等于截断,而这条函数
110
+ // 存在的全部意义就是不截断(实测 300KB 的错误消息会命中这条分支)。
111
+ sleepSync(1);
112
+ continue;
113
+ }
114
+ // EPIPE 等:stderr 已被关闭(如下游 `| head` 提前退出)。
115
+ // 放弃写入,但仍要保证退出码。
116
+ break;
117
+ }
118
+ }
119
+ }
120
+ /** 同步睡眠(不引入事件循环):writeStderrSync 的 EAGAIN 退避用。 */
121
+ function sleepSync(ms) {
122
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
123
+ }
124
+ /**
125
+ * per-command 错误边界(历史产物,392 处 `.action(` 里只有 72 处包了它)。
126
+ *
127
+ * ⚠️ 这里刻意**保留** `console.error` 而不是换成 `writeStderrSync`:多个存量测试
128
+ * 靠 `vi.spyOn(console, "error")` 捕获它的输出,直写 fd 2 会让那些断言全部瞎掉。
129
+ * 超长消息的截断风险在这条路径上仍在,但那是既有行为、不属于 D-06 的范围;
130
+ * D-06 关心的 320 条裸奔命令全部走下面的 `runCliProgram`,那条已经用同步写。
131
+ */
83
132
  export async function withCliErrorBoundary(run) {
84
133
  try {
85
134
  await run();
@@ -89,4 +138,77 @@ export async function withCliErrorBoundary(run) {
89
138
  process.exit(1);
90
139
  }
91
140
  }
141
+ /**
142
+ * CLI 进程唯一入口的**默认**错误边界(D-06)。
143
+ *
144
+ * 为什么必须在这里而不是每条命令自己包:全 CLI 有 392 处 `.action(`,历史上只有
145
+ * 72 处记得包 `withCliErrorBoundary`,剩下 320 条裸奔。裸奔 + commander 的同步
146
+ * `program.parse()`(**不** await async action handler 的 promise)=
147
+ * handler 抛出后变成 Node 原生 unhandled rejection:**stdout 一个字节都没有**,
148
+ * stderr 是原始堆栈。运营侧据此拿到过一次假的「全队 0 个受标账号」结论。
149
+ *
150
+ * 修法是入口这一层同时改两处:调用方改用 `program.parseAsync()`(commander 会把
151
+ * action handler 的 promise 串回来),再由这里统一 catch —— 于是**全部命令**默认
152
+ * 都有边界,新增命令不需要记得加。已有的 72 处 per-command boundary 保持不动
153
+ * (它们自己 `process.exit(1)`,先命中先生效,与本边界不冲突)。
154
+ *
155
+ * 三个输出通道的纪律,任何改动都不得破坏:
156
+ * - 错误只走 **stderr**;stdout 留给 `jq` 之类消费,失败时必须**零字节**。
157
+ * - 退出码 **非 0**。
158
+ * - 文案走 `formatCliError`,不是 Node 原生堆栈。
159
+ *
160
+ * ⚠️ 这里不做任何「降级/截断/兜底成空结果」:比如 `accounts list -n 300` 超出
161
+ * 服务端上限 200 时必须报错退出,绝不能悄悄按 200 返回 —— 那只会把一种静默失败
162
+ * 换成另一种假数据。
163
+ */
164
+ export async function runCliProgram(parseArgv) {
165
+ try {
166
+ await parseArgv();
167
+ }
168
+ catch (e) {
169
+ // commander 自身的出口(--help / --version / 未知命令 / 缺 requiredOption)
170
+ // 目前直接走 process.exit,到不了这里。但只要将来有人加了 `exitOverride()`,
171
+ // 它们就会以 CommanderError reject 过来 —— 那时把 `commander.helpDisplayed`
172
+ // 当成真错误打一遍 stderr 再 exit 1 是错的(帮助是成功路径),而其它
173
+ // commander 错误 commander 已经自己写过 stderr 了,再格式化一遍就是重复输出。
174
+ // 这里按它自带的 exitCode 原样放行,不重复打印。(Codex 评审提出)
175
+ const commanderExitCode = commanderErrorExitCode(e);
176
+ if (commanderExitCode !== undefined) {
177
+ process.exit(commanderExitCode);
178
+ }
179
+ // 同步写完再退,不用 console.error(见 writeStderrSync:macOS 管道是异步写,
180
+ // process.exit 会截断长消息)。用 process.exit 而不是只设 process.exitCode:
181
+ // action handler 可能留下未清理的句柄(定时器/keep-alive 连接),只设 exitCode
182
+ // 会让进程挂住 —— 挂死比丢消息更难排查,而截断已由同步写解决。
183
+ writeStderrSync(formatCliError(e));
184
+ process.exit(1);
185
+ }
186
+ }
187
+ /**
188
+ * 识别 commander 自己的 CommanderError,返回它自带的退出码;不是则 undefined。
189
+ *
190
+ * 🔴 判定必须同时看 `name === "CommanderError"` **和**合法整数 `exitCode`,
191
+ * 不能只看 `code` 前缀 —— `SocialHubHttpError.code` / `HubHttpError.code` 来自
192
+ * **服务端响应体**,是外部可控字符串。只按 `code.startsWith("commander.")` 放行的话,
193
+ * 服务端返回 `{"error":{"code":"commander.x"}}` 就能让 CLI **一个字节都不打印**
194
+ * 地退出 —— 那等于把 D-06 这个静默失败换个入口重新造一遍。(Codex 评审发现)
195
+ *
196
+ * 不用 `instanceof CommanderError`:monorepo 里可能存在多份 commander 安装,
197
+ * 跨副本的 instanceof 会假阴性。而 `name` + `exitCode` + `code` 三者齐备的结构
198
+ * 服务端伪造不出来(它只能控制 `code` 这一项)。
199
+ */
200
+ function commanderErrorExitCode(e) {
201
+ if (!(e instanceof Error) || e.name !== "CommanderError")
202
+ return undefined;
203
+ const { code, exitCode } = e;
204
+ if (typeof code !== "string" || !code.startsWith("commander.")) {
205
+ return undefined;
206
+ }
207
+ if (!Number.isInteger(exitCode))
208
+ return undefined;
209
+ const numeric = exitCode;
210
+ if (numeric < 0 || numeric > 255)
211
+ return undefined;
212
+ return numeric;
213
+ }
92
214
  //# sourceMappingURL=output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from "commander";
2
+ /** 逗号分隔的权限位 → 数组。空串/未给 → undefined(= 不声明,不是"声明为空")。 */
3
+ export declare function parseDeclaredPermissions(raw: string | undefined): string[] | undefined;
4
+ export declare function registerSubredditAssetCommands(program: Command): void;
5
+ //# sourceMappingURL=register-subreddit-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-subreddit-assets.d.ts","sourceRoot":"","sources":["../src/register-subreddit-assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BzC,uDAAuD;AACvD,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,MAAM,EAAE,GAAG,SAAS,CAOtB;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+arE"}
@@ -0,0 +1,347 @@
1
+ import { hubRequest } 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
+ * 自建板块资产与版主绑定(P1A)—— `social-hub subreddit-asset ...`。
7
+ *
8
+ * ## 为什么必须有这层
9
+ * 需求明确「存量 20 板块 + 20 条版主绑定靠这组接口人工录入,**不做飞书导入代码**」。
10
+ * 没有 CLI,那 20 条就只能靠手写 curl —— 而其中每一条都要带 `rowVersion` 做 CAS、
11
+ * 要能当场看出「这个版主号是不是已经被封了」。
12
+ *
13
+ * ## 三个必须知道的语义
14
+ * 1. **写端点在 API 侧另有 `isUnrestrictedAdminSubject` 硬门**:连 role=admin 的
15
+ * API key 都会被拒。所以这里所有写命令都带 `userOnly: true`,本地先拒掉 api_key,
16
+ * 省掉一次必然 403 的往返。
17
+ * 2. **建一条绑定 = 把一个账号的全部自动化永久停掉**(enforce 档下,无个体 override)。
18
+ * 因此写命令一律走 `--dry-run` / `--apply` 双闸。
19
+ * 3. `protection set --mode enforce` 是**全局**动作,一次影响全部 20 个账号。
20
+ */
21
+ const BASE = "/v1/system/subreddit-assets";
22
+ const PROTECTION = "/v1/system/moderator-protection";
23
+ /** 逗号分隔的权限位 → 数组。空串/未给 → undefined(= 不声明,不是"声明为空")。 */
24
+ export function parseDeclaredPermissions(raw) {
25
+ if (raw === undefined)
26
+ return undefined;
27
+ const parts = raw
28
+ .split(",")
29
+ .map((part) => part.trim())
30
+ .filter((part) => part.length > 0);
31
+ return parts.length > 0 ? parts : [];
32
+ }
33
+ export function registerSubredditAssetCommands(program) {
34
+ const asset = program
35
+ .command("subreddit-asset")
36
+ .description("自建板块资产与版主绑定(系统级;读非 client 可用,写仅真实登录 admin 且拒 API Key)");
37
+ /* ── 读 ──────────────────────────────────────────────────────────────── */
38
+ asset
39
+ .command("list")
40
+ .description("GET /v1/system/subreddit-assets — 列出自建板块(含版主绑定与只读风险投影)")
41
+ .option("--asset-status <s>", "active | archived | lost")
42
+ .option("--moderator-risk <r>", "zero | single | redundant —— 零/单版主的发现入口(只发现,不做写入硬拒绝)")
43
+ .option("--brand-id <uuid>", "只看挂在该品牌下的资产")
44
+ .option("--limit <n>", "最多返回条数(1-200)")
45
+ .option("--offset <n>", "偏移")
46
+ .action(async (opts) => {
47
+ await withCliErrorBoundary(async () => {
48
+ await withPermissionGates({
49
+ command: "subreddit-asset list",
50
+ gates: [{ resource: "subredditAsset", action: "list" }],
51
+ }, async () => {
52
+ const params = new URLSearchParams();
53
+ if (opts.assetStatus)
54
+ params.set("assetStatus", opts.assetStatus);
55
+ if (opts.moderatorRisk)
56
+ params.set("moderatorRisk", opts.moderatorRisk);
57
+ if (opts.brandId)
58
+ params.set("brandId", opts.brandId);
59
+ if (opts.limit)
60
+ params.set("limit", opts.limit);
61
+ if (opts.offset)
62
+ params.set("offset", opts.offset);
63
+ const qs = params.toString();
64
+ printResult(await hubRequest(`${BASE}${qs ? `?${qs}` : ""}`));
65
+ });
66
+ });
67
+ });
68
+ asset
69
+ .command("get")
70
+ .description("GET /v1/system/subreddit-assets/:id — 单条资产详情")
71
+ .requiredOption("--id <uuid>", "owned_subreddits.id")
72
+ .action(async (opts) => {
73
+ await withCliErrorBoundary(async () => {
74
+ await withPermissionGates({
75
+ command: "subreddit-asset get",
76
+ gates: [{ resource: "subredditAsset", action: "read" }],
77
+ }, async () => {
78
+ printResult(await hubRequest(`${BASE}/${encodeURIComponent(opts.id)}`));
79
+ });
80
+ });
81
+ });
82
+ /* ── 写:板块身份 ────────────────────────────────────────────────────── */
83
+ asset
84
+ .command("register-subreddit")
85
+ .description("POST .../subreddits — 只登记 canonical 板块身份,**不建资产**(幂等)。先录名字核对拼写,再逐个确认所有权")
86
+ .requiredOption("--name <subreddit>", "板块名(带不带 r/ 都行,服务端归一)")
87
+ .option("--display-name <s>", "展示用原样名")
88
+ .option("--dry-run", "预览", false)
89
+ .option("--apply", "执行写入", false)
90
+ .action(async (opts) => {
91
+ await withCliErrorBoundary(async () => {
92
+ await withPermissionGates({
93
+ command: "subreddit-asset register-subreddit",
94
+ gates: [{ resource: "subredditAsset", action: "create" }],
95
+ userOnly: true,
96
+ }, async () => {
97
+ const body = { name: opts.name };
98
+ if (opts.displayName)
99
+ body.displayName = opts.displayName;
100
+ if (!assertApplyOrDryRun(opts, {
101
+ command: "subreddit-asset register-subreddit",
102
+ danger: "write",
103
+ summary: body,
104
+ })) {
105
+ return;
106
+ }
107
+ printResult(await hubRequest(`${BASE}/subreddits`, { method: "POST", body }));
108
+ });
109
+ });
110
+ });
111
+ /* ── 写:资产 ────────────────────────────────────────────────────────── */
112
+ asset
113
+ .command("register")
114
+ .description("POST /v1/system/subreddit-assets — 登记一条自建板块资产(幂等;已存在返回 created=false)")
115
+ .requiredOption("--name <subreddit>", "板块名(带不带 r/ 都行,服务端归一)")
116
+ .option("--display-name <s>", "展示用原样名")
117
+ .option("--brand-id <uuid>", "可选:板块是公司资产,不挂品牌也行(不挂则品牌受限主体看不到它)")
118
+ .option("--asset-status <s>", "active(默认)| archived | lost")
119
+ .option("--notes <s>", "备注")
120
+ .option("--dry-run", "预览", false)
121
+ .option("--apply", "执行写入", false)
122
+ .action(async (opts) => {
123
+ await withCliErrorBoundary(async () => {
124
+ await withPermissionGates({
125
+ command: "subreddit-asset register",
126
+ gates: [{ resource: "subredditAsset", action: "create" }],
127
+ userOnly: true,
128
+ }, async () => {
129
+ const body = { name: opts.name };
130
+ if (opts.displayName)
131
+ body.displayName = opts.displayName;
132
+ if (opts.brandId)
133
+ body.brandId = opts.brandId;
134
+ if (opts.assetStatus)
135
+ body.assetStatus = opts.assetStatus;
136
+ if (opts.notes)
137
+ body.notes = opts.notes;
138
+ if (!assertApplyOrDryRun(opts, {
139
+ command: "subreddit-asset register",
140
+ danger: "write",
141
+ summary: body,
142
+ })) {
143
+ return;
144
+ }
145
+ printResult(await hubRequest(BASE, { method: "POST", body }));
146
+ });
147
+ });
148
+ });
149
+ asset
150
+ .command("set-status")
151
+ .description("PATCH .../:id/status — 改资产状态(CAS)。⚠️ lost 解除该板块所有绑定账号的阻断并停止核验;archived 保留阻断")
152
+ .requiredOption("--id <uuid>", "owned_subreddits.id")
153
+ .requiredOption("--asset-status <s>", "active | archived | lost")
154
+ .requiredOption("--row-version <n>", "乐观锁;漂移返 409")
155
+ .option("--reason <s>", "变更原因(进审计)")
156
+ .option("--dry-run", "预览", false)
157
+ .option("--apply", "执行写入", false)
158
+ .action(async (opts) => {
159
+ await withCliErrorBoundary(async () => {
160
+ await withPermissionGates({
161
+ command: "subreddit-asset set-status",
162
+ gates: [{ resource: "subredditAsset", action: "update" }],
163
+ userOnly: true,
164
+ }, async () => {
165
+ const body = {
166
+ assetStatus: opts.assetStatus,
167
+ rowVersion: Number(opts.rowVersion),
168
+ };
169
+ if (opts.reason)
170
+ body.reason = opts.reason;
171
+ if (!assertApplyOrDryRun(opts, {
172
+ command: "subreddit-asset set-status",
173
+ danger: "write",
174
+ summary: body,
175
+ })) {
176
+ return;
177
+ }
178
+ printResult(await hubRequest(`${BASE}/${encodeURIComponent(opts.id)}/status`, { method: "PATCH", body }));
179
+ });
180
+ });
181
+ });
182
+ /* ── 写:版主绑定 ────────────────────────────────────────────────────── */
183
+ const mod = asset
184
+ .command("moderator")
185
+ .description("版主绑定:加 / 撤销 / 更替(更替 = 关旧建新,不就地改账号)");
186
+ mod
187
+ .command("add")
188
+ .description("POST .../:id/moderators — 加一条版主绑定。⚠️ 返回 accountAtRisk=true 表示该账号已 banned/restricted")
189
+ .requiredOption("--owned-subreddit-id <uuid>", "owned_subreddits.id")
190
+ .requiredOption("--social-account-id <uuid>", "我方账号 id(可跨 team)")
191
+ .option("--not-primary", "不作为该板块的责任主号", false)
192
+ .option("--declared-permissions <list>", "人工声明的权限位,逗号分隔(如 all,posts,flair)")
193
+ .option("--notes <s>", "备注")
194
+ .option("--dry-run", "预览", false)
195
+ .option("--apply", "执行写入", false)
196
+ .action(async (opts) => {
197
+ await withCliErrorBoundary(async () => {
198
+ await withPermissionGates({
199
+ command: "subreddit-asset moderator add",
200
+ gates: [{ resource: "subredditAsset", action: "update" }],
201
+ userOnly: true,
202
+ }, async () => {
203
+ const body = {
204
+ socialAccountId: opts.socialAccountId,
205
+ };
206
+ if (opts.notPrimary)
207
+ body.isPrimary = false;
208
+ const perms = parseDeclaredPermissions(opts.declaredPermissions);
209
+ if (perms !== undefined)
210
+ body.declaredPermissions = perms;
211
+ if (opts.notes)
212
+ body.notes = opts.notes;
213
+ if (!assertApplyOrDryRun(opts, {
214
+ command: "subreddit-asset moderator add",
215
+ danger: "write",
216
+ summary: body,
217
+ })) {
218
+ return;
219
+ }
220
+ printResult(await hubRequest(`${BASE}/${encodeURIComponent(opts.ownedSubredditId)}/moderators`, { method: "POST", body }));
221
+ });
222
+ });
223
+ });
224
+ mod
225
+ .command("revoke")
226
+ .description("POST .../moderators/:bindingId/revoke — 撤销绑定(CAS)。行永久保留,历史不可抹")
227
+ .requiredOption("--binding-id <uuid>", "subreddit_moderator_bindings.id")
228
+ .requiredOption("--row-version <n>", "乐观锁;漂移返 409")
229
+ .option("--reason <s>", "撤销原因(进审计)")
230
+ .option("--dry-run", "预览", false)
231
+ .option("--apply", "执行写入", false)
232
+ .action(async (opts) => {
233
+ await withCliErrorBoundary(async () => {
234
+ await withPermissionGates({
235
+ command: "subreddit-asset moderator revoke",
236
+ gates: [{ resource: "subredditAsset", action: "update" }],
237
+ userOnly: true,
238
+ }, async () => {
239
+ const body = {
240
+ rowVersion: Number(opts.rowVersion),
241
+ };
242
+ if (opts.reason)
243
+ body.reason = opts.reason;
244
+ if (!assertApplyOrDryRun(opts, {
245
+ command: "subreddit-asset moderator revoke",
246
+ danger: "write",
247
+ summary: body,
248
+ })) {
249
+ return;
250
+ }
251
+ printResult(await hubRequest(`${BASE}/moderators/${encodeURIComponent(opts.bindingId)}/revoke`, { method: "POST", body }));
252
+ });
253
+ });
254
+ });
255
+ mod
256
+ .command("replace")
257
+ .description("POST .../moderators/replace — 更替版主(关旧建新;就地改 accountId 会永久丢失「历史上是谁」)")
258
+ .requiredOption("--binding-id <uuid>", "被替换的绑定(必须仍 active)")
259
+ .requiredOption("--row-version <n>", "乐观锁;漂移返 409")
260
+ .requiredOption("--next-social-account-id <uuid>", "接任的账号 id")
261
+ .option("--declared-permissions <list>", "新绑定的权限位,逗号分隔")
262
+ .option("--reason <s>", "更替原因(进审计)")
263
+ .option("--dry-run", "预览", false)
264
+ .option("--apply", "执行写入", false)
265
+ .action(async (opts) => {
266
+ await withCliErrorBoundary(async () => {
267
+ await withPermissionGates({
268
+ command: "subreddit-asset moderator replace",
269
+ gates: [{ resource: "subredditAsset", action: "update" }],
270
+ userOnly: true,
271
+ }, async () => {
272
+ const body = {
273
+ bindingId: opts.bindingId,
274
+ rowVersion: Number(opts.rowVersion),
275
+ nextSocialAccountId: opts.nextSocialAccountId,
276
+ };
277
+ const perms = parseDeclaredPermissions(opts.declaredPermissions);
278
+ if (perms !== undefined)
279
+ body.declaredPermissions = perms;
280
+ if (opts.reason)
281
+ body.reason = opts.reason;
282
+ if (!assertApplyOrDryRun(opts, {
283
+ command: "subreddit-asset moderator replace",
284
+ danger: "write",
285
+ summary: body,
286
+ })) {
287
+ return;
288
+ }
289
+ printResult(await hubRequest(`${BASE}/moderators/replace`, {
290
+ method: "POST",
291
+ body,
292
+ }));
293
+ });
294
+ });
295
+ });
296
+ /* ── rollout 档位 ────────────────────────────────────────────────────── */
297
+ const protection = asset
298
+ .command("protection")
299
+ .description("全局版主保护档位(off → shadow → enforce)。无个体 override,只保留受审计的全局回退");
300
+ protection
301
+ .command("get")
302
+ .description("GET /v1/system/moderator-protection — 读当前档位与 rowVersion")
303
+ .action(async () => {
304
+ await withCliErrorBoundary(async () => {
305
+ await withPermissionGates({
306
+ command: "subreddit-asset protection get",
307
+ gates: [{ resource: "subredditAsset", action: "read" }],
308
+ }, async () => {
309
+ printResult(await hubRequest(PROTECTION));
310
+ });
311
+ });
312
+ });
313
+ protection
314
+ .command("set")
315
+ .description("PATCH /v1/system/moderator-protection — 改全局档位(CAS + 审计)。⚠️ enforce 一次影响全部持有绑定的账号")
316
+ .requiredOption("--mode <m>", "off | shadow | enforce")
317
+ .requiredOption("--row-version <n>", "乐观锁;漂移返 409(不接受 last-writer-wins)")
318
+ .option("--note <s>", "变更说明(进审计)")
319
+ .option("--dry-run", "预览", false)
320
+ .option("--apply", "执行写入", false)
321
+ .action(async (opts) => {
322
+ await withCliErrorBoundary(async () => {
323
+ await withPermissionGates({
324
+ command: "subreddit-asset protection set",
325
+ gates: [{ resource: "subredditAsset", action: "update" }],
326
+ userOnly: true,
327
+ }, async () => {
328
+ const body = {
329
+ mode: opts.mode,
330
+ rowVersion: Number(opts.rowVersion),
331
+ };
332
+ if (opts.note)
333
+ body.note = opts.note;
334
+ if (!assertApplyOrDryRun(opts, {
335
+ command: "subreddit-asset protection set",
336
+ // 全局阻断开关:切 enforce 会一次停掉全部版主账号的自动化。
337
+ danger: "write",
338
+ summary: body,
339
+ })) {
340
+ return;
341
+ }
342
+ printResult(await hubRequest(PROTECTION, { method: "PATCH", body }));
343
+ });
344
+ });
345
+ });
346
+ }
347
+ //# sourceMappingURL=register-subreddit-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-subreddit-assets.js","sourceRoot":"","sources":["../src/register-subreddit-assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register-subreddit-assets.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-subreddit-assets.test.d.ts","sourceRoot":"","sources":["../src/register-subreddit-assets.test.ts"],"names":[],"mappings":""}