@quantacenter/quanta-problem-cli 0.0.0-stage → 1.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/exit-codes.ts","../src/core/errors.ts","../src/utils/fs.ts","../../shared/service/backend-service-image.ts","../src/domain/cover.ts","../src/domain/problem-config-schema.ts","../src/domain/problem-config.ts","../src/utils/paths.ts","../src/domain/judge-script.ts","../src/domain/snapshot.ts","../src/domain/validate.ts","../src/services/admin-api.ts","../src/ui/report.ts","../src/commands/check.ts","../src/domain/config-writer.ts","../src/domain/cover-palette.ts","../src/services/cover-image.ts","../src/utils/terminal.ts","../src/commands/support.ts","../src/commands/cover.ts","../src/utils/jwt.ts","../src/commands/doctor.ts","../src/templates/problem-scaffold.ts","../src/commands/init.ts","../src/services/credentials.ts","../../shared/service/oauth/device-flow.ts","../src/utils/async.ts","../src/version.ts","../src/services/device-flow.ts","../src/utils/browser.ts","../src/commands/login.ts","../src/commands/status.ts","../src/commands/publish.ts","../src/commands/tag.ts","../src/commands/upload.ts","../src/commands/index.ts","../src/services/http.ts","../src/core/env.ts","../src/core/logger.ts","../src/core/context.ts","../src/core/runtime.ts","../src/cli.ts","../src/index.ts"],"names":["readFile","i","join","relative","resolve","sep","clackSelect","clackMultiselect","basename","existsSync","stat","fileURLToPath","z","rm","error","api","value","runtime","controller"],"mappings":"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","file":"index.js","sourcesContent":["/** 退出码是 CLI 的对外契约(CI、脚本靠它判断结果),集中定义、禁止硬编码数字。 */\nexport const EXIT = {\n /** 全部成功 */\n OK: 0,\n /** 未分类的运行时错误 */\n FAILURE: 1,\n /** 参数/配置用法错误(用户输入问题,不是 bug) */\n USAGE: 2,\n /** 预检或审计未通过(题目本身不合格,需要改题目而不是改脚本) */\n PRECHECK_FAILED: 3,\n /** 网络或服务端 5xx */\n NETWORK: 4,\n /** 未登录 / 令牌失效 / 权限不足 */\n AUTH: 5,\n} as const;\n\nexport type ExitCode = (typeof EXIT)[keyof typeof EXIT];\n","import { EXIT, type ExitCode } from './exit-codes';\n\nexport interface CliErrorOptions {\n /** 给用户的下一步动作建议,打印在错误下方 */\n hint?: string;\n /** 结构化上下文(HTTP 状态码、响应片段、文件路径……),--json 时原样输出 */\n details?: Record<string, unknown>;\n exitCode?: ExitCode;\n cause?: unknown;\n}\n\n/** 所有\"可以预期\"的错误都继承自 CliError:顶层按 exitCode 退出,其它异常视为 bug 打印堆栈。 */\nexport class CliError extends Error {\n readonly hint: string | undefined;\n readonly details: Record<string, unknown> | undefined;\n readonly exitCode: ExitCode;\n\n constructor(message: string, options: CliErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.hint = options.hint;\n this.details = options.details;\n this.exitCode = options.exitCode ?? EXIT.FAILURE;\n }\n}\n\n/** 参数缺失、配置字段非法等\"用户用法\"问题 */\nexport class UsageError extends CliError {\n constructor(\n message: string,\n options: Omit<CliErrorOptions, 'exitCode'> = {},\n ) {\n super(message, { ...options, exitCode: EXIT.USAGE });\n }\n}\n\n/** 配置文件缺失 / 无法解析 / 校验失败 */\nexport class ConfigError extends CliError {\n constructor(\n message: string,\n options: Omit<CliErrorOptions, 'exitCode'> = {},\n ) {\n super(message, { ...options, exitCode: EXIT.USAGE });\n }\n}\n\n/** 预检或服务端审计未通过 */\nexport class PrecheckError extends CliError {\n constructor(\n message: string,\n options: Omit<CliErrorOptions, 'exitCode'> = {},\n ) {\n super(message, { ...options, exitCode: EXIT.PRECHECK_FAILED });\n }\n}\n\n/** 未登录、令牌过期、无管理员权限 */\nexport class AuthError extends CliError {\n constructor(\n message: string,\n options: Omit<CliErrorOptions, 'exitCode'> = {},\n ) {\n super(message, { ...options, exitCode: EXIT.AUTH });\n }\n}\n\n/** 网络失败、超时、服务端 5xx */\nexport class NetworkError extends CliError {\n constructor(\n message: string,\n options: Omit<CliErrorOptions, 'exitCode'> = {},\n ) {\n super(message, { ...options, exitCode: EXIT.NETWORK });\n }\n}\n\n/** 服务端 4xx:请求本身被拒绝,通常是参数或权限问题 */\nexport class ApiError extends CliError {\n readonly status: number;\n readonly path: string;\n\n constructor(\n message: string,\n options: Omit<CliErrorOptions, 'exitCode'> & {\n status: number;\n path: string;\n },\n ) {\n const { status, path, ...rest } = options;\n super(message, {\n ...rest,\n exitCode: status === 401 || status === 403 ? EXIT.AUTH : EXIT.FAILURE,\n details: { ...rest.details, status, path },\n });\n this.status = status;\n this.path = path;\n }\n}\n\n/** 取消(Ctrl-C / 外部 abort)单独建模:既非成功也非失败,按 130 退出(shell 通行约定)。 */\nexport class CanceledError extends CliError {\n constructor(message = '已取消') {\n super(message, { exitCode: EXIT.FAILURE });\n }\n}\n\nexport const isAbortError = (error: unknown): boolean =>\n error instanceof Error &&\n (error.name === 'AbortError' || error.name === 'TimeoutError');\n\n/** 把任意 catch 值收敛成 CliError,便于统一展示 */\nexport const toCliError = (error: unknown): CliError => {\n if (error instanceof CliError) return error;\n if (isAbortError(error)) {\n return new CliError('请求已取消或超时', {\n cause: error,\n hint: '网络较慢时可调大 QUANTA_HTTP_TIMEOUT,或检查 API 地址是否可达。',\n });\n }\n if (error instanceof Error) {\n return new CliError(error.message, { cause: error });\n }\n return new CliError(String(error));\n};\n","import { constants } from 'node:fs';\nimport {\n access,\n chmod,\n mkdir,\n readdir,\n readFile,\n rename,\n rm,\n stat,\n writeFile,\n} from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\n\nimport { CliError } from '../core/errors';\n\nexport const pathExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const ensureDir = async (dir: string): Promise<void> => {\n await mkdir(dir, { recursive: true });\n};\n\nexport const readText = async (path: string): Promise<string> => {\n try {\n return await readFile(path, 'utf8');\n } catch (error) {\n throw new CliError(`无法读取文件:${path}`, {\n cause: error,\n details: { path },\n });\n }\n};\n\n/** 目录不存在时自动创建父目录 */\nexport const writeText = async (\n path: string,\n content: string,\n): Promise<void> => {\n await ensureDir(dirname(path));\n await writeFile(path, content, 'utf8');\n};\n\n/** 原子写文本:先写临时文件再 rename,中断时原文件保持完整。 */\nexport const writeTextAtomic = async (\n path: string,\n content: string,\n): Promise<void> => {\n const dir = dirname(path);\n await ensureDir(dir);\n const temp = join(dir, `.${basename(path)}.${process.pid}.tmp`);\n const mode = await stat(path)\n .then((info) => info.mode)\n .catch(() => undefined);\n try {\n await writeFile(temp, content, 'utf8');\n if (mode !== undefined) await chmod(temp, mode);\n await rename(temp, path);\n } catch (error) {\n await rm(temp, { force: true }).catch(() => {});\n throw error;\n }\n};\n\n/** 与 `writeTextExclusive` 相对:存在则覆盖,用于 --force */\nexport const writeTextWithMode = async (\n path: string,\n content: string,\n mode?: number,\n): Promise<void> => {\n await writeText(path, content);\n if (mode !== undefined) await chmod(path, mode);\n};\n\n/** 二进制写盘(封面 PNG)。与 writeText 一样自动建父目录。 */\nexport const writeBinary = async (\n path: string,\n content: Uint8Array,\n): Promise<void> => {\n await ensureDir(dirname(path));\n await writeFile(path, content);\n};\n\nexport const listDir = async (dir: string): Promise<string[]> => {\n try {\n return await readdir(dir);\n } catch {\n return [];\n }\n};\n\nexport interface WalkOptions {\n /** 返回 true 表示跳过该条目;入参为条目名与相对 root 的 posix 路径,支持按名字或路径跳过。 */\n ignore?: (name: string, relativePath: string) => boolean;\n}\n\n/** 递归列出文件(不含目录与符号链接),结果按字典序排序(保证哈希稳定);符号链接一律跳过。 */\nexport const walkFiles = async (\n root: string,\n options: WalkOptions = {},\n): Promise<string[]> => {\n const results: string[] = [];\n\n const walk = async (dir: string, prefix: string): Promise<void> => {\n const entries = await readdir(dir, { withFileTypes: true }).catch(\n () => [],\n );\n for (const entry of entries.sort((a, b) =>\n a.name.localeCompare(b.name),\n )) {\n if (entry.isSymbolicLink()) continue;\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (options.ignore?.(entry.name, relativePath)) continue;\n const absolutePath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(absolutePath, relativePath);\n continue;\n }\n if (entry.isFile()) results.push(relativePath);\n }\n };\n\n await walk(root, '');\n return results.sort();\n};\n","export interface BackendServiceImage {\n /** 存进数据库的稳定 id,也是下拉选项的 value(不要改,改了要写数据迁移) */\n id: string;\n /** 展示名,带版本号 */\n label: string;\n /** 真正拉起容器的 docker 镜像名 */\n image: string;\n /** 编辑器(WebContainer)里的一次性准备步骤,`mountPath` = 题目的 judgeUploadPath */\n editorBootCommand: (mountPath: string) => string;\n /** 服务启动命令,编辑器与判题容器共用 */\n initCommand: (mountPath: string) => string;\n defaultPort: number;\n}\n\nconst PNPM_VERSION = '9.15.9';\n\nexport const BACKEND_SERVICE_IMAGES = {\n 'node-24': {\n id: 'node-24',\n label: 'Node.js 24',\n image: 'challenge-backend-service-agent',\n editorBootCommand: (mountPath: string) =>\n [\n `[install-pnpm] npm install --global pnpm@${PNPM_VERSION}`,\n `[install] pnpm --dir ./${mountPath} install`,\n ].join('\\n'),\n // 入口由题目的 package.json 决定;npm 在没有 scripts.start 时回退到 node server.js。\n initCommand: (mountPath: string) =>\n `[dev-server] cd ./${mountPath} && npm start`,\n defaultPort: 3000,\n },\n} as const satisfies Record<string, BackendServiceImage>;\n\nexport type BackendServiceImageId = keyof typeof BACKEND_SERVICE_IMAGES;\n\nexport const BACKEND_SERVICE_IMAGE_IDS = Object.keys(\n BACKEND_SERVICE_IMAGES\n) as BackendServiceImageId[];\n\nexport const DEFAULT_BACKEND_SERVICE_IMAGE_ID: BackendServiceImageId =\n 'node-24';\n\nconst isBackendServiceImageId = (\n value: unknown\n): value is BackendServiceImageId =>\n typeof value === 'string' &&\n Object.prototype.hasOwnProperty.call(BACKEND_SERVICE_IMAGES, value);\n\n/** 只认注册表 id:空值 / 未知值一律收敛成默认镜像。 */\nexport const normalizeBackendServiceImageId = (\n id?: string | null\n): BackendServiceImageId =>\n isBackendServiceImageId(id) ? id : DEFAULT_BACKEND_SERVICE_IMAGE_ID;\n\nconst getBackendServiceImage = (\n id?: string | null\n): BackendServiceImage =>\n BACKEND_SERVICE_IMAGES[normalizeBackendServiceImageId(id)];\n\n/** 库里的 id → 真正拉起的 docker 镜像名。 */\nexport const resolveBackendServiceImageName = (id?: string | null): string =>\n getBackendServiceImage(id).image;\n\nexport const buildBackendBootCommand = (\n id: string | null | undefined,\n mountPath: string\n): string => getBackendServiceImage(id).editorBootCommand(mountPath);\n\nexport const buildBackendInitCommand = (\n id: string | null | undefined,\n mountPath: string\n): string => getBackendServiceImage(id).initCommand(mountPath);\n\nexport const getBackendServiceDefaultPort = (id?: string | null): number =>\n getBackendServiceImage(id).defaultPort;\n\n/** 所有后端题容器镜像(调度器清扫器用来回收泄漏容器)。 */\nexport const BACKEND_SERVICE_CONTAINER_IMAGES = Object.values(\n BACKEND_SERVICE_IMAGES\n).map((item) => item.image);\n","import { UsageError } from '../core/errors';\n\nexport interface CoverSpec {\n /** 主标题(必填)。过长会自动换行并缩小字号 */\n title: string;\n /** 强调色副标题,例如接口清单或一句话简介 */\n subtitle?: string;\n /** 左下角页脚,默认 \"Quanta Challenge\" */\n footer?: string;\n /** 背景色(`#rgb` / `#rrggbb`) */\n bg: string;\n /** 渐变终止色;给了就画对角线渐变,否则纯色 */\n bgTo?: string;\n /** 强调色:竖条 + 副标题 */\n accent: string;\n /** 主标题颜色 */\n text: string;\n /** 画布宽高(像素) */\n width: number;\n height: number;\n}\n\nexport const COVER_DEFAULTS = {\n bg: '#0F172A',\n accent: '#A6FB1D',\n text: '#F8FAFC',\n footer: 'Quanta Challenge',\n width: 1200,\n height: 675,\n} as const;\n\n/** 手写那版封面的渐变终止色,作为 `--bg-to` 的推荐值写进文档 */\nexport const COVER_SUGGESTED_BG_TO = '#14432A';\n\nconst HEX_COLOR = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\n\nexport const isHexColor = (value: string): boolean => HEX_COLOR.test(value);\n\nexport const assertHexColor = (value: string, field: string): string => {\n if (!isHexColor(value)) {\n throw new UsageError(\n `${field} 必须是十六进制颜色(#rgb / #rrggbb),当前为 \"${value}\"`,\n { hint: '例如 --bg \"#0F172A\" --accent \"#A6FB1D\"。' },\n );\n }\n return value;\n};\n\nconst XML_ESCAPES: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&apos;',\n};\n\nexport const escapeXml = (value: string): string =>\n value.replace(/[&<>\"']/g, (char) => XML_ESCAPES[char] ?? char);\n\n/** 全角/宽字符判定(与 logger 的显示宽度判定同源,用于估算排版宽度) */\nconst isWideChar = (code: number): boolean =>\n (code >= 0x1100 && code <= 0x115f) ||\n (code >= 0x2e80 && code <= 0xa4cf) ||\n (code >= 0xac00 && code <= 0xd7a3) ||\n (code >= 0xf900 && code <= 0xfaff) ||\n (code >= 0xfe30 && code <= 0xfe6f) ||\n (code >= 0xff00 && code <= 0xff60) ||\n (code >= 0xffe0 && code <= 0xffe6);\n\n/** 单字符宽度,单位是 em(相对当前字号) */\nconst charWidthEm = (char: string, bold: boolean): number => {\n const code = char.codePointAt(0) ?? 0;\n if (isWideChar(code)) return 1;\n if (char === ' ') return 0.28;\n if (\"ilj.,:;'|!\".includes(char)) return 0.3;\n if (/[A-Z]/.test(char)) return bold ? 0.68 : 0.66;\n if (/[0-9]/.test(char)) return 0.58;\n return bold ? 0.6 : 0.56;\n};\n\nconst textWidthEm = (text: string, bold: boolean): number =>\n [...text].reduce((sum, char) => sum + charWidthEm(char, bold), 0);\n\n/** 可以在其后断行的位置:空格之后,或任意宽字符之后(中文没有空格) */\nconst isBreakAfter = (char: string): boolean =>\n char === ' ' || isWideChar(char.codePointAt(0) ?? 0);\n\nexport const wrapByWidth = (\n text: string,\n maxWidthEm: number,\n bold = true,\n): string[] => {\n const lines: string[] = [];\n let current = '';\n let currentEm = 0;\n let breakAt = -1;\n let breakEm = 0;\n\n const flush = (at: number, em: number) => {\n const line = (at >= 0 ? current.slice(0, at) : current).trim();\n if (line) lines.push(line);\n current = at >= 0 ? current.slice(at).trimStart() : '';\n currentEm = at >= 0 ? currentEm - em : 0;\n breakAt = -1;\n breakEm = 0;\n };\n\n for (const char of text) {\n const width = charWidthEm(char, bold);\n if (currentEm + width > maxWidthEm && current) {\n // 只有断点足够靠后(>40% 行宽)才用它,否则宁可硬切,避免出现极短的尾行\n if (breakAt > 0 && breakEm > maxWidthEm * 0.4) {\n flush(breakAt, breakEm);\n } else {\n flush(-1, currentEm);\n }\n }\n current += char;\n currentEm += width;\n if (isBreakAfter(char)) {\n breakAt = current.length;\n breakEm = currentEm;\n }\n }\n if (current.trim()) lines.push(current.trim());\n return lines.length > 0 ? lines : [''];\n};\n\nexport interface CoverLayout {\n lines: string[];\n fontSize: number;\n lineHeight: number;\n barX: number;\n barY: number;\n barWidth: number;\n barHeight: number;\n textX: number;\n firstBaseline: number;\n subtitleBaseline: number;\n subtitleFontSize: number;\n footerBaseline: number;\n footerFontSize: number;\n}\n\n/** 字号从基准值往下收敛直到能塞进 maxLines 行,下限 0.5 × 基准(再小不可读,宁可标题多占一行)。 */\nexport const layoutCover = (spec: CoverSpec): CoverLayout => {\n const scale = spec.width / COVER_DEFAULTS.width;\n const pad = 72 * scale;\n const barWidth = 6 * scale;\n const textX = pad + barWidth + 26 * scale;\n const contentWidth = spec.width - textX - pad;\n const baseFontSize = 58 * scale;\n const minFontSize = Math.max(20, baseFontSize * 0.5);\n const maxLines = 3;\n\n let fontSize = baseFontSize;\n let lines = wrapByWidth(spec.title, contentWidth / fontSize, true);\n for (let size = baseFontSize; size >= minFontSize; size -= 2) {\n const candidate = wrapByWidth(spec.title, contentWidth / size, true);\n const fits = candidate.every(\n (line) => textWidthEm(line, true) * size <= contentWidth + 0.5,\n );\n if (fits && candidate.length <= maxLines) {\n fontSize = size;\n lines = candidate;\n break;\n }\n fontSize = size;\n lines = candidate;\n }\n\n const lineHeight = fontSize * 1.22;\n const blockTop = pad + 24 * scale;\n const textBaseline = blockTop + fontSize;\n const barHeight = lineHeight * (lines.length - 1) + fontSize * 1.02;\n const subtitleFontSize = 26 * scale;\n const subtitleBaseline =\n blockTop + lineHeight * (lines.length - 1) + fontSize * 0.62 + 72 * scale;\n\n return {\n lines,\n fontSize,\n lineHeight,\n barX: pad,\n barY: blockTop + fontSize * 0.06,\n barWidth,\n barHeight,\n textX,\n firstBaseline: textBaseline,\n subtitleBaseline,\n subtitleFontSize,\n footerBaseline: spec.height - 60 * scale,\n footerFontSize: 24 * scale,\n };\n};\n\nconst fontStack = (mono: boolean): string =>\n mono\n ? \"'Menlo','Monaco','Courier New',monospace\"\n : \"'PingFang SC','Hiragino Sans GB','Microsoft YaHei','Noto Sans CJK SC','Source Han Sans SC',sans-serif\";\n\nexport const buildCoverSvg = (spec: CoverSpec): string => {\n assertHexColor(spec.bg, '背景色');\n assertHexColor(spec.accent, '强调色');\n assertHexColor(spec.text, '标题颜色');\n if (spec.bgTo !== undefined) assertHexColor(spec.bgTo, '渐变终止色');\n\n const layout = layoutCover(spec);\n const background =\n spec.bgTo === undefined\n ? `<rect width=\"${spec.width}\" height=\"${spec.height}\" fill=\"${spec.bg}\"/>`\n : `<defs><linearGradient id=\"bg\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">` +\n `<stop offset=\"0%\" stop-color=\"${spec.bg}\"/>` +\n `<stop offset=\"100%\" stop-color=\"${spec.bgTo}\"/></linearGradient></defs>` +\n `<rect width=\"${spec.width}\" height=\"${spec.height}\" fill=\"url(#bg)\"/>`;\n\n const titleLines = layout.lines\n .map(\n (line, index) =>\n `<text x=\"${layout.textX}\" y=\"${round(layout.firstBaseline + index * layout.lineHeight)}\" ` +\n `font-family=\"${fontStack(false)}\" font-size=\"${round(layout.fontSize)}\" ` +\n `font-weight=\"700\" fill=\"${spec.text}\">${escapeXml(line)}</text>`,\n )\n .join('\\n');\n\n const subtitle = spec.subtitle\n ? `<text x=\"${layout.textX}\" y=\"${round(layout.subtitleBaseline)}\" ` +\n `font-family=\"${fontStack(true)}\" font-size=\"${round(layout.subtitleFontSize)}\" ` +\n `font-weight=\"700\" fill=\"${spec.accent}\">${escapeXml(spec.subtitle)}</text>`\n : '';\n\n const footer =\n `<text x=\"${layout.barX}\" y=\"${round(layout.footerBaseline)}\" ` +\n `font-family=\"${fontStack(false)}\" font-size=\"${round(layout.footerFontSize)}\" ` +\n `fill=\"#64748B\">${escapeXml(spec.footer ?? COVER_DEFAULTS.footer)}</text>`;\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${spec.width}\" height=\"${spec.height}\" viewBox=\"0 0 ${spec.width} ${spec.height}\">`,\n background,\n `<rect x=\"${layout.barX}\" y=\"${round(layout.barY)}\" width=\"${layout.barWidth}\" height=\"${round(layout.barHeight)}\" rx=\"${layout.barWidth / 2}\" fill=\"${spec.accent}\"/>`,\n titleLines,\n subtitle,\n footer,\n '</svg>',\n ]\n .filter(Boolean)\n .join('\\n');\n};\n\nconst round = (value: number): number => Math.round(value * 100) / 100;\n","import {\n BACKEND_SERVICE_IMAGE_IDS,\n buildBackendBootCommand,\n buildBackendInitCommand,\n getBackendServiceDefaultPort,\n normalizeBackendServiceImageId,\n} from '@challenge/shared/backend-service-image';\nimport { z } from 'zod';\n\nimport { COVER_DEFAULTS } from './cover';\n\n/** 与 packages/challenge-web-app/server/trpc/schemas/publish-schema.ts 保持一致 */\nexport const DIFFICULTIES = ['easy', 'medium', 'hard', 'very_hard'] as const;\nexport type Difficulty = (typeof DIFFICULTIES)[number];\n\nexport const DEFAULT_CONFIG_FILES = [\n 'problem.config.ts',\n 'problem.config.mts',\n 'problem.config.js',\n 'problem.config.mjs',\n 'problem.config.json',\n] as const;\n\n/** 默认站点根目录:live-server 镜像与 initCommand 都以 `project` 为根 */\nexport const DEFAULT_JUDGE_UPLOAD_PATH = 'project';\nexport const DEFAULT_INIT_COMMAND = 'npx serve -l 3000 project';\n\n/** 题型:前端(静态站点 + Playwright)或后端服务(常驻进程 + HTTP 判题) */\nexport const PROBLEM_TYPES = ['frontend', 'backend_service'] as const;\nexport type ProblemType = (typeof PROBLEM_TYPES)[number];\n\n/** 本地生成封面的配色与排版:不随上传发给服务端(服务端只认 imageId),`qpc cover` 渲染 PNG 后由 --write 写回 imageId。 */\nexport const coverGenerateSchema = z.object({\n /** 背景色(纯色;配合 bgTo 变成对角线渐变) */\n bg: z.string().default(COVER_DEFAULTS.bg),\n /** 渐变终止色,留空 = 纯色背景 */\n bgTo: z.string().optional(),\n /** 强调色:左侧竖条 + 副标题 */\n accent: z.string().default(COVER_DEFAULTS.accent),\n /** 主标题颜色 */\n text: z.string().default(COVER_DEFAULTS.text),\n /** 副标题(建议写接口清单或一句话简介),留空则不渲染 */\n subtitle: z.string().optional(),\n /** 左下角页脚,默认 “Quanta Challenge” */\n footer: z.string().optional(),\n width: z.number().int().min(200).max(4096).default(COVER_DEFAULTS.width),\n height: z.number().int().min(200).max(4096).default(COVER_DEFAULTS.height),\n /** 输出文件(相对题目目录) */\n out: z.string().default('cover.png'),\n});\nexport type CoverGenerateOptions = z.output<typeof coverGenerateSchema>;\n\nexport const coverSchema = z.union([\n z.object({ mode: z.literal('default') }),\n z.object({\n mode: z.literal('custom'),\n /** 平台上的图片 id;`qpc cover --upload --write` 会把生成结果写回这里 */\n imageId: z.string().min(1).optional(),\n /** 配置了就能用 `qpc cover` 一键生成(后端题型必须自定义封面) */\n generate: coverGenerateSchema.optional(),\n }),\n]);\n\nexport const problemConfigSchema = z.object({\n title: z.string().min(1, 'title 不能为空'),\n /** 平台题目 id(qpc upload 返回的 pid):填了它就在该题目下追加新版本,否则每次新建 */\n problemId: z.number().int().positive().optional(),\n /** 题型;缺省为前端,老题目不需要改配置 */\n type: z.enum(PROBLEM_TYPES).default('frontend'),\n /** 题面正文;与 detailFile 二选一 */\n detail: z.string().min(1).optional(),\n /** 题面文件(相对题目目录),便于把长题面单独放一个 markdown */\n detailFile: z.string().min(1).optional(),\n difficulty: z.enum(DIFFICULTIES),\n tagIds: z\n .array(z.number().int().positive())\n .min(1, 'tagIds 至少需要一个标签(用 `qpc tag` 查看可用 id)'),\n /** 留空表示\"以判题脚本里各检查点之和为准\";填写则必须与之和相等 */\n totalScore: z.number().int().positive().optional(),\n cover: coverSchema.default({ mode: 'default' }),\n runtime: z\n .object({\n /** 判题时打包上传的目录,同时决定快照挂载路径(快照键为 `/<judgeUploadPath>/...`) */\n judgeUploadPath: z.string().min(1).default(DEFAULT_JUDGE_UPLOAD_PATH),\n initCommand: z.string().min(1).default(DEFAULT_INIT_COMMAND),\n buildCommand: z.string().min(1).optional(),\n bootCommand: z.string().min(1).optional(),\n /** 后端服务:初始镜像 id(不是 docker 镜像名,取值见 @challenge/shared/backend-service-image) */\n serviceImage: z.enum(BACKEND_SERVICE_IMAGE_IDS).optional(),\n /** 后端服务:服务监听端口(也是判题机请求的端口) */\n servicePort: z.number().int().positive().max(65535).default(3000),\n })\n .default({\n judgeUploadPath: DEFAULT_JUDGE_UPLOAD_PATH,\n initCommand: DEFAULT_INIT_COMMAND,\n servicePort: 3000,\n }),\n paths: z\n .object({\n template: z.string().min(1).default('template'),\n answer: z.string().min(1).default('answer'),\n judge: z.string().min(1).default('judge.js'),\n })\n .default({ template: 'template', answer: 'answer', judge: 'judge.js' }),\n});\n\nexport type ProblemConfigInput = z.input<typeof problemConfigSchema>;\nexport type ProblemConfig = z.output<typeof problemConfigSchema>;\n\n/** 后端题的镜像与 bootCommand 由镜像决定(覆盖作者写的值),initCommand 仅缺省时填默认值;回报被覆盖字段供 `qpc check` 提示。 */\nexport const applyBackendServiceImageDefaults = (\n config: ProblemConfig,\n): { config: ProblemConfig; overridden: string[] } => {\n if (config.type !== 'backend_service') {\n return { config, overridden: [] };\n }\n const mountPath =\n config.runtime.judgeUploadPath || DEFAULT_JUDGE_UPLOAD_PATH;\n const serviceImage = normalizeBackendServiceImageId(\n config.runtime.serviceImage,\n );\n const bootCommand = buildBackendBootCommand(serviceImage, mountPath);\n const defaultInitCommand = buildBackendInitCommand(serviceImage, mountPath);\n\n const overridden: string[] = [];\n if (\n config.runtime.bootCommand &&\n config.runtime.bootCommand !== bootCommand\n ) {\n overridden.push('runtime.bootCommand');\n }\n // initCommand 的 schema 默认值是静态服务器命令(前端用),后端题没写时会落到它上面;\n // 只有这种情况才用镜像默认值替掉它,作者写过的保留。\n const initCommand =\n !config.runtime.initCommand ||\n config.runtime.initCommand === DEFAULT_INIT_COMMAND\n ? defaultInitCommand\n : config.runtime.initCommand;\n\n return {\n config: {\n ...config,\n runtime: {\n ...config.runtime,\n serviceImage,\n servicePort:\n config.runtime.servicePort ??\n getBackendServiceDefaultPort(serviceImage),\n bootCommand,\n initCommand,\n },\n },\n overridden,\n };\n};\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { ConfigError } from '../core/errors';\nimport { pathExists } from '../utils/fs';\nimport {\n applyBackendServiceImageDefaults,\n DEFAULT_CONFIG_FILES,\n type ProblemConfig,\n problemConfigSchema,\n} from './problem-config-schema';\n\n// 配置的「形状」与「加载」分在两个文件: · problem-config-schema.ts 只依赖 zod,因此 program 入口(给配置文件 import 的 那个模块)不会把 node:fs / jiti 也拖进打包产物。 · 这里负责读文件、跑 jiti、解析路径。\nexport * from './problem-config-schema';\n\nexport interface ResolvedProblemConfig extends ProblemConfig {\n /** 题目目录(绝对路径) */\n rootDir: string;\n /** 配置文件(绝对路径) */\n configFile: string;\n /** 解析后的题面正文 */\n detail: string;\n /** 解析后的绝对路径 */\n paths: {\n template: string;\n answer: string;\n judge: string;\n };\n /** 后端题里被镜像注册表覆盖掉的自定义字段(`qpc check` 据此提示 RUN002)。 */\n overriddenByImage: string[];\n}\n\n/** 加载题目配置:用 jiti 而非 import()(原生 import 不认 .ts),并把 @challenge/problem-creator-cli 别名到本地 program 模块。 */\nexport const loadProblemConfig = async (\n rootDir: string,\n options: { file?: string } = {},\n): Promise<ResolvedProblemConfig> => {\n const configFile = await findConfigFile(rootDir, options.file);\n const module = await importConfig(configFile);\n const parsed = problemConfigSchema.safeParse(module);\n if (!parsed.success) {\n // 校验信息**必须进 message**:顶层错误打印只展示 message 与 hint,\n // 放进 details 的话用户不加 --verbose 就看不到\"到底哪个字段错了\"。\n const issues = parsed.error.issues.map(\n (issue) => `${issue.path.join('.') || '<root>'}: ${issue.message}`,\n );\n throw new ConfigError(\n `题目配置校验失败:${configFile}\\n - ${issues.join('\\n - ')}`,\n {\n details: { issues },\n hint: '对照 examples/hello-total/problem.config.ts 的字段说明修正。',\n },\n );\n }\n\n const parsedConfig = applyBackendServiceImageDefaults(parsed.data);\n const config = parsedConfig.config;\n const detail = await resolveDetail(config, rootDir, configFile);\n\n return {\n ...config,\n detail,\n rootDir,\n configFile,\n overriddenByImage: parsedConfig.overridden,\n paths: {\n template: resolve(rootDir, config.paths.template),\n answer: resolve(rootDir, config.paths.answer),\n judge: resolve(rootDir, config.paths.judge),\n },\n };\n};\n\nexport const findConfigFile = async (\n rootDir: string,\n explicit?: string,\n): Promise<string> => {\n if (explicit) {\n const candidate = isAbsolute(explicit)\n ? explicit\n : resolve(rootDir, explicit);\n if (!(await pathExists(candidate))) {\n throw new ConfigError(`指定的配置文件不存在:${candidate}`);\n }\n return candidate;\n }\n for (const name of DEFAULT_CONFIG_FILES) {\n const candidate = resolve(rootDir, name);\n if (await pathExists(candidate)) return candidate;\n }\n throw new ConfigError(\n `在 ${rootDir} 下找不到题目配置(期望 ${DEFAULT_CONFIG_FILES.join(' / ')} 之一)`,\n {\n hint: `创建 ${DEFAULT_CONFIG_FILES[0]},或先运行 \\`qpc init <目录>\\`。`,\n },\n );\n};\n\nconst importConfig = async (file: string): Promise<unknown> => {\n const { createJiti } = await import('jiti');\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: false,\n alias: {\n // 让配置文件里的 `import { defineProblemConfig } from '@challenge/problem-creator-cli'`\n // 无论 CLI 是从源码跑(tsx)还是从 dist 跑都能解析到同一个模块。\n '@challenge/problem-creator-cli': programModulePath(),\n },\n });\n try {\n return await jiti.import(file);\n } catch (error) {\n throw new ConfigError(`无法加载配置文件:${file}`, {\n cause: error,\n details: {\n reason: error instanceof Error ? error.message : String(error),\n },\n });\n }\n};\n\n/** 定位 program 模块(导出 defineProblemConfig 的文件);三种布局(打包后 / 未打包 dist / 源码直跑)按顺序探测。 */\nconst programModulePath = (): string => {\n const candidates = [\n './program.js',\n '../program.js',\n '../program.ts',\n './program.ts',\n ];\n for (const candidate of candidates) {\n const path = fileURLToPath(new URL(candidate, import.meta.url));\n if (existsSync(path)) return path;\n }\n throw new ConfigError(\n '内部错误:找不到 program 模块(无法解析 defineProblemConfig)',\n {\n details: { from: import.meta.url, candidates },\n },\n );\n};\n\nconst resolveDetail = async (\n config: ProblemConfig,\n rootDir: string,\n configFile: string,\n): Promise<string> => {\n if (config.detail) return config.detail;\n if (!config.detailFile) {\n throw new ConfigError(\n `题目配置缺少题面:${configFile} 里需要 detail 或 detailFile`,\n {\n hint: '提供 `detail`(正文)或 `detailFile`(相对题目目录的文件路径)。',\n },\n );\n }\n const file = resolve(rootDir, config.detailFile);\n if (!(await pathExists(file))) {\n throw new ConfigError(`detailFile 指向的文件不存在:${file}`);\n }\n return readFile(file, 'utf8');\n};\n\nexport const configDirName = (configFile: string): string =>\n dirname(configFile);\n","import { relative, sep } from 'node:path';\n\n/** Windows 上 path.sep 是 `\\`,但快照键、URL 路径必须永远是 `/` */\nexport const toPosix = (path: string): string => path.split(sep).join('/');\n\n/** 相对 base 的 posix 路径;不在 base 下时返回绝对 posix 路径 */\n/** 把绝对路径显示成相对 cwd 的形式,日志里更短更好读 */\nexport const displayPath = (cwd: string, target: string): string => {\n const rel = relative(cwd, target);\n return rel.startsWith('..') ? target : toPosix(rel);\n};\n\n/** 统一 `/` 前缀、折叠 `.` 与重复斜杠,用于快照键归一化 */\nexport const normalizeSnapshotKey = (key: string): string => {\n const segments = toPosix(key)\n .split('/')\n .filter((s) => s && s !== '.');\n return `/${segments.join('/')}`;\n};\n\nexport const joinSnapshotKey = (\n mountPath: string,\n relativePath: string,\n): string => normalizeSnapshotKey(`${mountPath}/${relativePath}`);\n\nexport const formatBytes = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n};\n","/** 判题脚本的静态分析:把常见坑(检查点不 return、点击 disabled 按钮、断言消息缺信息)在本地毫秒级挡住。策略是先把注释/字符串\"打码\"成等长 mask,再做括号配对与调用点查找,避免被字符串里的括号带偏。 */\n\nexport interface Checkpoint {\n name: string;\n score: number;\n /** 1-based 行号 */\n line: number;\n /** 是否 return 了具体分数(return; / 无 return 都是 false) */\n returnsValue: boolean;\n}\n\nexport interface Located<T> {\n line: number;\n value: T;\n}\n\nexport interface JudgeScriptAnalysis {\n /** 是否写了 `export default ...`(判题机靠文本替换 `export default ` → `const run = `) */\n hasDefaultExport: boolean;\n hasDefineTestHandler: boolean;\n /** 除 default 之外的导出,会残留在沙箱模块里,属于可疑写法 */\n namedExports: string[];\n checkpoints: Checkpoint[];\n /** 各检查点分值之和(解析不到的一律计 0 并单独报告) */\n checkpointTotal: number;\n unparsedCheckpoints: Located<string>[];\n clickWithoutTimeout: Located<string>[];\n /** 断言消息缺少\"期望 vs 实际\"(学生看不懂失败原因) */\n vagueExpectations: Located<string>[];\n expectationCount: number;\n lineCount: number;\n}\n\ninterface CallSite {\n /** mask 中的起止下标(end 为右括号之后) */\n start: number;\n end: number;\n /** 原始代码中的参数文本(保持原样,含换行) */\n args: string[];\n}\n\nconst IDENT = /[A-Za-z0-9_$]/;\n\nconst isRegexStart = (code: string, index: number): boolean => {\n let i = index - 1;\n while (i >= 0 && /\\s/.test(code[i] as string)) i -= 1;\n if (i < 0) return true;\n return /[([{,;:=!&|?+\\-*%~^<>]/.test(code[i] as string);\n};\n\nconst skipQuoted = (code: string, start: number, quote: string): number => {\n let i = start + 1;\n while (i < code.length) {\n const ch = code[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === quote) return i + 1;\n if (ch === '\\n') return i; // 未闭合的引号:就此打住,别把整个文件吃掉\n i += 1;\n }\n return code.length;\n};\n\n/** 模板串里的 `${}` 允许再嵌字符串/模板,必须递归跳过 */\nconst skipTemplate = (code: string, start: number): number => {\n let i = start + 1;\n while (i < code.length) {\n const ch = code[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === '`') return i + 1;\n if (ch === '$' && code[i + 1] === '{') {\n i = skipBalanced(code, i + 1, '{', '}');\n continue;\n }\n i += 1;\n }\n return code.length;\n};\n\nconst skipRegex = (code: string, start: number): number => {\n let i = start + 1;\n let inClass = false;\n while (i < code.length) {\n const ch = code[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === '[') inClass = true;\n else if (ch === ']') inClass = false;\n else if (ch === '/' && !inClass) return i + 1;\n else if (ch === '\\n') return i;\n i += 1;\n }\n return code.length;\n};\n\nconst skipBalanced = (\n code: string,\n openIndex: number,\n open: string,\n close: string,\n): number => {\n let depth = 0;\n let i = openIndex;\n while (i < code.length) {\n const ch = code[i] as string;\n if (ch === '/' && code[i + 1] === '/') {\n const end = code.indexOf('\\n', i);\n i = end === -1 ? code.length : end;\n continue;\n }\n if (ch === '/' && code[i + 1] === '*') {\n const end = code.indexOf('*/', i + 2);\n i = end === -1 ? code.length : end + 2;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n i = skipQuoted(code, i, ch);\n continue;\n }\n if (ch === '`') {\n i = skipTemplate(code, i);\n continue;\n }\n if (ch === '/' && isRegexStart(code, i)) {\n i = skipRegex(code, i);\n continue;\n }\n if (ch === open) depth += 1;\n else if (ch === close) {\n depth -= 1;\n if (depth === 0) return i + 1;\n }\n i += 1;\n }\n return code.length;\n};\n\n/** 把注释/字符串/模板串/正则替换成等长空格(保留换行,行号不变) */\nexport const maskNonCode = (code: string): string => {\n const chars = code.split('');\n const blank = (from: number, to: number) => {\n for (let i = from; i < to; i += 1) {\n if (chars[i] !== '\\n') chars[i] = ' ';\n }\n };\n\n let i = 0;\n while (i < code.length) {\n const ch = code[i] as string;\n const next = code[i + 1];\n if (ch === '/' && next === '/') {\n const end = code.indexOf('\\n', i);\n const to = end === -1 ? code.length : end;\n blank(i, to);\n i = to;\n continue;\n }\n if (ch === '/' && next === '*') {\n const end = code.indexOf('*/', i + 2);\n const to = end === -1 ? code.length : end + 2;\n blank(i, to);\n i = to;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n const to = skipQuoted(code, i, ch);\n blank(i, to);\n i = to;\n continue;\n }\n if (ch === '`') {\n const to = skipTemplate(code, i);\n blank(i, to);\n i = to;\n continue;\n }\n if (ch === '/' && isRegexStart(code, i)) {\n const to = skipRegex(code, i);\n blank(i, to);\n i = to;\n continue;\n }\n i += 1;\n }\n\n return chars.join('');\n};\n\n/** 在 mask 上按 top-level 逗号切分参数,再回原串取文本 */\nconst splitArgs = (\n code: string,\n mask: string,\n from: number,\n to: number,\n): string[] => {\n const args: string[] = [];\n let depth = 0;\n let start = from;\n for (let i = from; i < to; i += 1) {\n const ch = mask[i] as string;\n if (ch === '(' || ch === '[' || ch === '{') depth += 1;\n else if (ch === ')' || ch === ']' || ch === '}') depth -= 1;\n else if (ch === ',' && depth === 0) {\n args.push(code.slice(start, i));\n start = i + 1;\n }\n }\n if (to > from) args.push(code.slice(start, to));\n return args.map((arg) => arg.trim()).filter((arg) => arg.length > 0);\n};\n\n/** 查找 `callee(` 形式的调用点,支持点号路径与 `$.xxx` 美元前缀写法。 */\nconst findCalls = (code: string, mask: string, callee: string): CallSite[] => {\n const sites: CallSite[] = [];\n let i = 0;\n while (i < mask.length) {\n const index = mask.indexOf(callee, i);\n if (index === -1) break;\n const before = index === 0 ? '' : (mask[index - 1] as string);\n const afterIndex = index + callee.length;\n const after =\n afterIndex >= mask.length ? '' : (mask[afterIndex] as string);\n\n // 以标识符开头的 callee 才需要左侧边界检查;`.click` 这类以点开头的\n // callee 左侧必然是接收者(page / el),检查会把所有方法调用漏掉。\n if (IDENT.test(callee[0] as string) && before && IDENT.test(before)) {\n i = index + 1;\n continue;\n }\n if (after && IDENT.test(after)) {\n i = index + 1;\n continue;\n }\n\n let cursor = afterIndex;\n while (cursor < mask.length && /\\s/.test(mask[cursor] as string))\n cursor += 1;\n if (mask[cursor] !== '(') {\n i = index + 1;\n continue;\n }\n\n const end = skipBalanced(mask, cursor, '(', ')');\n sites.push({\n start: index,\n end,\n args: splitArgs(code, mask, cursor + 1, end - 1),\n });\n i = end;\n }\n return sites;\n};\n\nconst lineOf = (code: string, index: number): number => {\n let line = 1;\n for (let i = 0; i < index && i < code.length; i += 1) {\n if (code[i] === '\\n') line += 1;\n }\n return line;\n};\n\n/** 解析字面量字符串(支持 ' \" ` 与常见转义),非字面量返回 undefined */\nexport const parseStringLiteral = (text: string): string | undefined => {\n const trimmed = text.trim();\n const quote = trimmed[0];\n if (quote !== '\"' && quote !== \"'\" && quote !== '`') return undefined;\n if (trimmed.length < 2 || trimmed[trimmed.length - 1] !== quote)\n return undefined;\n const body = trimmed.slice(1, -1);\n if (quote === '`' && body.includes('${')) return undefined;\n return body.replace(/\\\\(.)/g, (_, char: string) => {\n const escapes: Record<string, string> = {\n n: '\\n',\n t: '\\t',\n r: '\\r',\n '\\\\': '\\\\',\n '\"': '\"',\n \"'\": \"'\",\n '`': '`',\n };\n return escapes[char] ?? char;\n });\n};\n\nexport const analyzeJudgeScript = (code: string): JudgeScriptAnalysis => {\n const mask = maskNonCode(code);\n\n const handlerCalls = findCalls(code, mask, 'defineTestHandler');\n const checkpointCalls = findCalls(code, mask, 'defineCheckPoint');\n const expectCalls = findCalls(code, mask, 'expect');\n\n const checkpoints: Checkpoint[] = [];\n const unparsedCheckpoints: Located<string>[] = [];\n\n for (const call of checkpointCalls) {\n const [nameArg = '', scoreArg = '', handlerArg = ''] = call.args;\n const name =\n parseStringLiteral(nameArg) ?? nameArg.replace(/\\s+/g, ' ').trim();\n const score = Number.parseFloat(scoreArg.trim());\n const line = lineOf(code, call.start);\n\n if (!Number.isFinite(score)) {\n unparsedCheckpoints.push({\n line,\n value: scoreArg.trim() || '<missing>',\n });\n }\n\n // 判分是否 return 是**最高频的坑**:handler 里没有带值的 return,\n // 即使断言全过也会记 0 分(defineTestHandler 里 score = successScore ?? 0)。\n const returnsValue = /\\breturn\\b\\s*[^;\\s}]/.test(maskNonCode(handlerArg));\n\n checkpoints.push({\n name: name || '<unnamed>',\n score: Number.isFinite(score) ? score : 0,\n line,\n returnsValue,\n });\n }\n\n const clickWithoutTimeout: Located<string>[] = [];\n for (const call of findCalls(code, mask, '.click')) {\n const snippet = code\n .slice(Math.max(0, call.start - 16), call.end)\n .replace(/\\s+/g, ' ')\n .trim();\n if (/\\btimeout\\b/.test(mask.slice(call.start, call.end))) continue;\n clickWithoutTimeout.push({\n line: lineOf(code, call.start),\n value: snippet,\n });\n }\n\n const vagueExpectations: Located<string>[] = [];\n for (const call of expectCalls) {\n const message = call.args[1];\n if (message === undefined) continue;\n // 只要出现插值/拼接/\"实际\"字样就认为信息足够\n if (/\\$\\{|\\+|实际|expected|Received/i.test(message)) continue;\n vagueExpectations.push({\n line: lineOf(code, call.start),\n value:\n parseStringLiteral(message) ?? message.replace(/\\s+/g, ' ').trim(),\n });\n }\n\n const namedExports: string[] = [];\n const exportRe =\n /\\bexport\\s+(?!default\\b)(?:const|let|var|function|class|async)\\s+([A-Za-z0-9_$]+)/g;\n for (const match of mask.matchAll(exportRe)) {\n if (match[1]) namedExports.push(match[1]);\n }\n\n return {\n hasDefaultExport: /\\bexport\\s+default\\b/.test(mask),\n hasDefineTestHandler: handlerCalls.length > 0,\n namedExports,\n checkpoints,\n checkpointTotal: checkpoints.reduce((sum, cp) => sum + cp.score, 0),\n unparsedCheckpoints,\n clickWithoutTimeout,\n vagueExpectations,\n expectationCount: expectCalls.length,\n lineCount: code.split('\\n').length,\n };\n};\n","import { readFile } from 'node:fs/promises';\nimport { extname, join } from 'node:path';\n\nimport { CliError } from '../core/errors';\nimport { walkFiles } from '../utils/fs';\nimport { joinSnapshotKey } from '../utils/paths';\n\n/** 二进制扩展名,与 web-app 的 acceptedBinaryExtensions 对齐;二进制须以 base64 传输,按 utf8 读会静默损坏文件。 */\nexport const BINARY_EXTENSIONS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'gif',\n 'bmp',\n 'tiff',\n 'webp',\n 'ico',\n 'cur',\n]);\n\n/** 这些目录/文件永远不进快照:构建产物与依赖不是题目内容 */\nexport const DEFAULT_IGNORE = new Set([\n 'node_modules',\n '.git',\n '.turbo',\n '.DS_Store',\n 'dist',\n 'coverage',\n]);\n\nexport interface SnapshotResult {\n /** 键为 `/project/...` 形式的绝对路径,与 Web 端提交快照的格式一致 */\n files: Record<string, string>;\n fileCount: number;\n totalBytes: number;\n /** 被忽略规则跳过的顶层条目,用于在预检里提示\"你可能漏传了东西\" */\n ignored: string[];\n}\n\nexport interface SnapshotOptions {\n /** 挂载路径,默认 `project`(等于 judgeUploadPath) */\n mountPath?: string;\n ignore?: (name: string) => boolean;\n}\n\n/** 把目录打包成提交快照:键须由 mountPath 打头(默认 `/project/...`),live-server 以 project 子目录为站点根。 */\nexport const collectSnapshot = async (\n root: string,\n options: SnapshotOptions = {},\n): Promise<SnapshotResult> => {\n const mountPath = options.mountPath ?? 'project';\n const ignore = (name: string): boolean =>\n DEFAULT_IGNORE.has(name) || (options.ignore?.(name) ?? false);\n\n const ignored = new Set<string>();\n const relativePaths = await walkFiles(root, {\n ignore: (name) => {\n if (!ignore(name)) return false;\n ignored.add(name);\n return true;\n },\n });\n\n const files: Record<string, string> = {};\n let totalBytes = 0;\n\n for (const relativePath of relativePaths) {\n const absolutePath = join(root, relativePath);\n let buffer: Buffer;\n try {\n buffer = await readFile(absolutePath);\n } catch (error) {\n throw new CliError(`快照读取失败:${absolutePath}`, { cause: error });\n }\n const extension = extname(relativePath).slice(1).toLowerCase();\n files[joinSnapshotKey(mountPath, relativePath)] = BINARY_EXTENSIONS.has(\n extension,\n )\n ? buffer.toString('base64')\n : buffer.toString('utf8');\n totalBytes += buffer.byteLength;\n }\n\n return {\n files,\n fileCount: Object.keys(files).length,\n totalBytes,\n ignored: [...ignored].sort(),\n };\n};\n","import { pathExists, readText } from '../utils/fs';\nimport { displayPath, formatBytes } from '../utils/paths';\nimport { analyzeJudgeScript, type JudgeScriptAnalysis } from './judge-script';\nimport type { ResolvedProblemConfig } from './problem-config';\nimport { collectSnapshot, type SnapshotResult } from './snapshot';\n\nexport type Severity = 'error' | 'warn' | 'info';\n\nexport interface Finding {\n /** 规则编号,可与 docs/RULES.md 对照;CI 里可以按编号豁免 */\n rule: string;\n severity: Severity;\n message: string;\n /** 相对题目目录的路径 */\n file?: string;\n line?: number;\n hint?: string;\n}\n\nexport interface ValidationReport {\n findings: Finding[];\n errors: number;\n warnings: number;\n /** 无 error 即视为通过(warning 默认不阻塞,--strict 时才阻塞) */\n ok: boolean;\n totalScore: number;\n stats: {\n checkpointCount: number;\n judgeLines: number;\n template: ArtifactStats;\n answer: ArtifactStats;\n };\n analysis: JudgeScriptAnalysis;\n templateSnapshot: Record<string, string>;\n answerSnapshot: Record<string, string>;\n}\n\nexport interface ArtifactStats {\n fileCount: number;\n totalBytes: number;\n ignored: string[];\n}\n\nexport interface ValidateOptions {\n /** 快照体积上限(字节),对齐 Web 端提交链路的实际承受能力 */\n maxUploadBytes?: number;\n maxFileCount?: number;\n}\n\n/** 出题预检(离线):覆盖 PROBLEM_AUTHORING 检查清单中可静态判定的部分;审不了的部分由 `qpc upload --wait` 拉回线上审计结果。 */\nexport const validateProblem = async (\n config: ResolvedProblemConfig,\n options: ValidateOptions = {},\n): Promise<ValidationReport> => {\n const findings: Finding[] = [];\n const push = (finding: Finding): void => {\n findings.push(finding);\n };\n\n const rel = (path: string): string => displayPath(config.rootDir, path);\n\n // ── 判题脚本 ────────────────────────────────────────────────\n const judgeExists = await pathExists(config.paths.judge);\n if (!judgeExists) {\n push({\n rule: 'JUD001',\n severity: 'error',\n message: `判题脚本不存在:${rel(config.paths.judge)}`,\n file: rel(config.paths.judge),\n hint: '在题目目录下创建 judge.js,参考 examples/hello-total/judge.js。',\n });\n }\n const judgeCode = judgeExists ? await readText(config.paths.judge) : '';\n const analysis = analyzeJudgeScript(judgeCode);\n\n if (judgeExists && !analysis.hasDefaultExport) {\n push({\n rule: 'JUD002',\n severity: 'error',\n message: '判题脚本缺少 `export default defineTestHandler(...)`',\n file: rel(config.paths.judge),\n hint: '判题机把文本 `export default ` 替换成 `const run = `;写成裸函数声明不会生效。',\n });\n }\n if (judgeExists && !analysis.hasDefineTestHandler) {\n push({\n rule: 'JUD003',\n severity: 'error',\n message: '判题脚本没有调用 defineTestHandler',\n file: rel(config.paths.judge),\n });\n }\n\n for (const checkpoint of analysis.checkpoints) {\n if (!checkpoint.returnsValue) {\n push({\n rule: 'JUD004',\n severity: 'error',\n message: `检查点「${checkpoint.name}」的 handler 没有 return 分数`,\n file: rel(config.paths.judge),\n line: checkpoint.line,\n hint: 'handler 末尾补 `return ${checkpoint.score};`。不 return 时即使断言全过也记 0 分。',\n });\n }\n if (checkpoint.score <= 0) {\n push({\n rule: 'JUD005',\n severity: 'warn',\n message: `检查点「${checkpoint.name}」分值为 ${checkpoint.score}`,\n file: rel(config.paths.judge),\n line: checkpoint.line,\n });\n }\n }\n\n for (const unparsed of analysis.unparsedCheckpoints) {\n push({\n rule: 'JUD006',\n severity: 'warn',\n message: `检查点分值不是字面量,无法在本地累加:${unparsed.value}`,\n file: rel(config.paths.judge),\n line: unparsed.line,\n hint: '请用数字字面量写分值,本地校验与线上审计才能对上。',\n });\n }\n\n const duplicated = duplicateNames(analysis.checkpoints.map((c) => c.name));\n for (const name of duplicated) {\n push({\n rule: 'JUD007',\n severity: 'warn',\n message: `检查点名称重复:${name}`,\n file: rel(config.paths.judge),\n hint: '同名检查点在判题详情里无法区分,建议改成唯一的描述。',\n });\n }\n\n for (const click of analysis.clickWithoutTimeout) {\n push({\n rule: 'JUD008',\n severity: 'warn',\n message: `click 未设置 timeout:${click.value}`,\n file: rel(config.paths.judge),\n line: click.line,\n hint: '目标可能是 disabled 按钮,Playwright 会重试到 30 秒超时;改派发合成事件或加 `{ timeout: 3000 }`。',\n });\n }\n\n for (const vague of analysis.vagueExpectations) {\n push({\n rule: 'JUD009',\n severity: 'info',\n message: `断言消息没有说明\"期望 vs 实际\":${vague.value}`,\n file: rel(config.paths.judge),\n line: vague.line,\n hint: '消息会原样展示给学生,建议拼接实际值,例如 `合计应为 10.50,实际为 \"${actual}\"`。',\n });\n }\n\n if (judgeExists && analysis.expectationCount === 0) {\n push({\n rule: 'JUD010',\n severity: 'warn',\n message: '判题脚本里没有任何 $.expect 断言',\n file: rel(config.paths.judge),\n });\n }\n\n for (const name of analysis.namedExports) {\n push({\n rule: 'JUD011',\n severity: 'warn',\n message: `存在 default 之外的导出:${name}`,\n file: rel(config.paths.judge),\n hint: '模块被替换后这些导出仍会残留,可能导致沙箱里出现意料之外的绑定。',\n });\n }\n\n // ── 分值 ───────────────────────────────────────────────────\n const totalScore = config.totalScore ?? analysis.checkpointTotal;\n if (\n config.totalScore !== undefined &&\n config.totalScore !== analysis.checkpointTotal\n ) {\n push({\n rule: 'CFG001',\n severity: 'error',\n message: `totalScore=${config.totalScore} 与检查点之和 ${analysis.checkpointTotal} 不一致`,\n file: rel(config.configFile),\n hint: '审计通过的条件是 score === totalScore,两者不等时线上会判失败。',\n });\n }\n if (config.totalScore === undefined) {\n push({\n rule: 'CFG002',\n severity: 'info',\n message: `未指定 totalScore,按检查点之和取 ${analysis.checkpointTotal}`,\n file: rel(config.configFile),\n });\n }\n\n // ── 运行期配置 ─────────────────────────────────────────────\n const isBackend = config.type === 'backend_service';\n const mountPath = config.runtime.judgeUploadPath;\n const initCommand = config.runtime.initCommand;\n // RUN001 只对前端题型成立:后端服务不要站点根,而是跑一个常驻进程。\n if (!isBackend && initCommand && !initCommand.includes(mountPath)) {\n push({\n rule: 'RUN001',\n severity: 'warn',\n message: `initCommand 未包含上传目录 \"${mountPath}\":${initCommand}`,\n file: rel(config.configFile),\n hint: '站点根必须等于判题打包目录,否则判题机会在错误的目录下找 index.html 直到超时。',\n });\n }\n if (config.cover.mode === 'custom' && !('imageId' in config.cover)) {\n push({\n rule: 'IMG001',\n severity: 'error',\n message: 'cover.mode=custom 时必须提供 imageId',\n file: rel(config.configFile),\n hint: '配置了 cover.generate 的话,跑 `qpc cover --upload --write` 一键生成并写回;否则把平台上的图片 id 填进 imageId。',\n });\n }\n\n // 后端服务题型的额外约束(详见 docs/BACKEND_SERVICE_PROBLEM.md)\n if (isBackend) {\n // RUN002:后端题的 bootCommand 由镜像决定,作者写的会被覆盖,因此只提示不报错。\n for (const field of config.overriddenByImage) {\n push({\n rule: 'RUN002',\n severity: 'warn',\n message: `${field} 会被初始镜像 ${config.runtime.serviceImage} 规定的命令覆盖,不会生效`,\n file: rel(config.configFile),\n hint: '编辑器里的一次性准备步骤由镜像决定(与容器内的离线安装保持一致);服务启动命令请写在 runtime.initCommand。',\n });\n }\n if (config.cover.mode === 'default') {\n push({\n rule: 'IMG002',\n severity: 'error',\n message: '后端服务题型必须使用自定义封面(没有首屏可截图)',\n file: rel(config.configFile),\n hint: '把 cover 改成 { mode: \"custom\", generate: { bg: \"#0F172A\", bgTo: \"#14432A\" } },再跑 `qpc cover --upload --write`。',\n });\n }\n }\n\n // ── 工程快照 ───────────────────────────────────────────────\n const template = await collectSnapshot(config.paths.template, { mountPath });\n const answer = await collectSnapshot(config.paths.answer, { mountPath });\n\n const checkArtifact = async (\n label: 'template' | 'answer',\n dir: string,\n snapshot: SnapshotResult,\n rulePrefix: string,\n requireIndex: boolean,\n ): Promise<void> => {\n const relative = rel(dir);\n if (!(await pathExists(dir))) {\n push({\n rule: `${rulePrefix}001`,\n severity: 'error',\n message: `${label} 目录不存在:${relative}`,\n file: relative,\n hint: '题目必须有答案模板(学生起点)与参考解(拿满分的答案)。',\n });\n return;\n }\n if (snapshot.fileCount === 0) {\n push({\n rule: `${rulePrefix}002`,\n severity: 'error',\n message: `${label} 目录为空:${relative}`,\n file: relative,\n });\n return;\n }\n const hasIndex = Object.keys(snapshot.files).some((key) =>\n key.endsWith('/index.html'),\n );\n if (requireIndex && label === 'template' && !hasIndex) {\n push({\n rule: 'TPL003',\n severity: 'error',\n message: `答案模板缺少 index.html(站点根 = ${mountPath})`,\n file: relative,\n hint: 'initCommand 以该目录为站点根启动静态服务器,没有 index.html 时判题会一直等选择器。',\n });\n }\n // 后端服务必须有锁文件,否则容器内的离线安装无从谈起。\n if (isBackend && label === 'answer') {\n const hasLockfile = Object.keys(snapshot.files).some((key) =>\n key.endsWith('/pnpm-lock.yaml'),\n );\n if (!hasLockfile) {\n push({\n rule: 'RUN003',\n severity: 'error',\n message: `后端服务参考答案缺少 pnpm-lock.yaml(应在 ${mountPath}/ 下)`,\n file: relative,\n hint: '离线安装依赖锁文件;没有它容器无法在断网环境下安装依赖。先在参考答案目录执行一次 pnpm install 生成。',\n });\n }\n }\n for (const ignored of snapshot.ignored) {\n push({\n rule: 'SNAP003',\n severity: 'info',\n message: `${relative} 下已跳过 ${ignored}/(构建产物或依赖)`,\n file: relative,\n });\n }\n };\n\n await checkArtifact(\n 'template',\n config.paths.template,\n template,\n 'TPL',\n !isBackend,\n );\n await checkArtifact(\n 'answer',\n config.paths.answer,\n answer,\n 'ANS',\n !isBackend,\n );\n\n const maxUploadBytes = options.maxUploadBytes ?? Number.POSITIVE_INFINITY;\n const maxFileCount = options.maxFileCount ?? 500;\n for (const [label, snapshot] of [\n ['template', template],\n ['answer', answer],\n ] as const) {\n if (snapshot.totalBytes > maxUploadBytes) {\n push({\n rule: 'SNAP001',\n severity: 'error',\n message: `${label} 快照体积 ${formatBytes(snapshot.totalBytes)} 超过上限 ${formatBytes(maxUploadBytes)}`,\n hint: '确认没有把 dist/、node_modules/ 或大图打进题目目录;必要时调整 QUANTA_MAX_UPLOAD_BYTES。',\n });\n }\n if (snapshot.fileCount > maxFileCount) {\n push({\n rule: 'SNAP002',\n severity: 'error',\n message: `${label} 快照文件数 ${snapshot.fileCount} 超过上限 ${maxFileCount}`,\n });\n }\n }\n\n const errors = findings.filter((f) => f.severity === 'error').length;\n const warnings = findings.filter((f) => f.severity === 'warn').length;\n\n return {\n findings,\n errors,\n warnings,\n ok: errors === 0,\n totalScore,\n stats: {\n checkpointCount: analysis.checkpoints.length,\n judgeLines: analysis.lineCount,\n template: toStats(template),\n answer: toStats(answer),\n },\n analysis,\n templateSnapshot: template.files,\n answerSnapshot: answer.files,\n };\n};\n\nconst toStats = (snapshot: SnapshotResult): ArtifactStats => ({\n fileCount: snapshot.fileCount,\n totalBytes: snapshot.totalBytes,\n ignored: snapshot.ignored,\n});\n\nconst duplicateNames = (names: string[]): string[] => {\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n for (const name of names) {\n if (seen.has(name)) duplicates.add(name);\n seen.add(name);\n }\n return [...duplicates];\n};\n","import type { BackendServiceImageId } from '@challenge/shared/backend-service-image';\nimport type { Difficulty } from '../domain/problem-config';\nimport type { HttpClient } from './http';\n\nexport interface UploadedImage {\n id: string;\n name: string;\n}\n\nexport interface UploadProblemInput {\n title: string;\n detail: string;\n tagIds: number[];\n judgeScript: string;\n difficulty: Difficulty;\n totalScore: number;\n answerTemplateSnapshot: Record<string, string>;\n referenceAnswerSnapshot: Record<string, string>;\n coverMode: 'default' | 'custom';\n coverImageId?: string;\n bootCommand?: string;\n initCommand?: string;\n buildCommand?: string;\n judgeUploadPath: string;\n /** 题型:frontend(默认)或 backend_service */\n problemType?: 'frontend' | 'backend_service';\n /** 后端服务:初始镜像 id(见 @challenge/shared/backend-service-image) */\n serviceImage?: BackendServiceImageId;\n /** 后端服务:服务监听端口 */\n servicePort?: number;\n}\n\nexport interface AuditCheckpointResult {\n score: number;\n totalScore: number;\n details: string;\n status: 'pass' | 'fail';\n cacheFiles?: Record<string, string>;\n}\n\nexport interface AuditRecord {\n id: number;\n result: 'pending' | 'success' | 'failed';\n score: number;\n type: 'audit' | 'judge';\n info: AuditCheckpointResult[] | { errorMessage?: string };\n pendingTime?: number;\n judgingTime?: number;\n createdAt?: string;\n}\n\nexport interface AuditDetail {\n pid: number;\n title: string;\n totalScore: number;\n /** 审计完成前是 draft,成功是 ready,失败是 invalid */\n status: 'draft' | 'ready' | 'invalid' | 'published';\n difficulty: Difficulty;\n tags: Array<{ name: string; color: string }>;\n imageName?: string;\n TemplateJudgeRecord?: Array<{ judgeRecord: AuditRecord }>;\n JudgeFile?: Array<{ judgeScript: string }>;\n BaseProblem?: { id: number; currentPid: number | null };\n}\n\nexport interface ProblemListItem {\n pid: number;\n title: string;\n status: string;\n totalScore: number;\n difficulty: Difficulty;\n updatedAt?: string;\n}\n\nexport interface Tag {\n tid: number;\n name: string;\n color?: string | null;\n description?: string | null;\n}\n\nexport interface CurrentUser {\n id: string;\n nickname?: string;\n email?: string;\n role?: string;\n}\n\n/** 出题相关的 admin tRPC 接口封装:命令里不出现 URL 字符串,接口变化改一处即可。 */\nexport interface AdminApi {\n login(input: { email: string; password: string }): Promise<{\n user: CurrentUser;\n csrfToken: string;\n }>;\n getCurrentUser(): Promise<CurrentUser>;\n /** 上传图片(`qpc cover --upload` 用它把生成的封面变成 imageId) */\n uploadImage(input: {\n fileBase64: string;\n fileName: string;\n }): Promise<UploadedImage>;\n uploadProblem(input: UploadProblemInput): Promise<{\n problemId: number;\n message: string;\n }>;\n /** 在已有基础题目(baseId)下创建新版本(发布页的\"重新发布\") */\n reuploadProblem(input: UploadProblemInput & { baseId: number }): Promise<{\n problemId: number;\n message: string;\n }>;\n getAuditDetail(problemId: number): Promise<AuditDetail>;\n setStatus(problemId: number, publish: boolean): Promise<{ message: string }>;\n listProblems(tagIds?: number[]): Promise<ProblemListItem[]>;\n /** 平台全部标签(public.tag.list,无需登录) */\n listTags(): Promise<Tag[]>;\n}\n\nexport const createAdminApi = (client: HttpClient): AdminApi => ({\n login: async (input) =>\n client.call<{ user: CurrentUser; csrfToken: string }>(\n 'auth.login.email',\n {\n input,\n method: 'POST',\n },\n ),\n\n getCurrentUser: async () => {\n const result = await client.call<{ user: CurrentUser }>(\n 'auth.login.getUser',\n {\n method: 'GET',\n },\n );\n return result.user;\n },\n\n uploadProblem: (input) =>\n client.call<{ problemId: number; message: string }>(\n 'admin.problem.upload',\n {\n input,\n method: 'POST',\n },\n ),\n\n reuploadProblem: (input) =>\n client.call<{ problemId: number; message: string }>(\n 'admin.problem.reupload',\n {\n input,\n method: 'POST',\n },\n ),\n\n uploadImage: (input) =>\n client.call<UploadedImage>('admin.image.upload', {\n input,\n method: 'POST',\n }),\n\n getAuditDetail: (problemId) =>\n client.call<AuditDetail>('admin.problem.getAuditDetail', {\n input: { problemId },\n method: 'GET',\n }),\n\n setStatus: (problemId, publish) =>\n client.call<{ message: string }>('admin.problem.setStatus', {\n input: { problemId, publish },\n method: 'POST',\n }),\n\n listProblems: async (tagIds = []) => {\n const result = await client.call<\n { problems?: ProblemListItem[] } | ProblemListItem[]\n >('admin.problem.list', { input: { tids: tagIds }, method: 'GET' });\n if (Array.isArray(result)) return result;\n return result.problems ?? [];\n },\n\n listTags: async () => {\n const tags = await client.call<RawTag[]>('public.tag.list', {\n method: 'GET',\n });\n return tags.map((tag) => ({\n tid: tag.tid,\n name: tag.name,\n color: tag.color ?? null,\n description: tag.description ?? null,\n }));\n },\n});\n\n/** `public.tag.list` 原样返回数据库整行,这里只声明用到的字段 */\ninterface RawTag {\n tid: number;\n name: string;\n color?: string | null;\n description?: string | null;\n}\n\n/** 取本题版本的判题记录(服务端按关系返回,[0] 即当前版本那条) */\nexport const auditRecordOf = (detail: AuditDetail): AuditRecord | undefined =>\n detail.TemplateJudgeRecord?.[0]?.judgeRecord;\n\n/** 审计是否已到终局:status 离开 draft 即算结束(失败时调度器只改 status 不补判题记录)。 */\nexport const isAuditSettled = (detail: AuditDetail): boolean => {\n if (detail.status !== 'draft') return true;\n const record = auditRecordOf(detail);\n return record !== undefined && record.result !== 'pending';\n};\n\n/** 从审计记录里取出检查点明细,兼容失败时只有 errorMessage 的情况 */\nexport const readAuditResults = (\n record: AuditRecord | undefined,\n): { results: AuditCheckpointResult[]; errorMessage?: string } => {\n if (!record) return { results: [] };\n if (Array.isArray(record.info)) return { results: record.info };\n const errorMessage = (record.info as { errorMessage?: string }).errorMessage;\n return { results: [], errorMessage };\n};\n","import type { Logger } from '../core/logger';\nimport type { Finding, Severity, ValidationReport } from '../domain/validate';\nimport { type AuditDetail, readAuditResults } from '../services/admin-api';\nimport { formatBytes } from '../utils/paths';\n\nconst SEVERITY_LABEL: Record<Severity, string> = {\n error: '错误',\n warn: '警告',\n info: '提示',\n};\n\nconst SEVERITY_ORDER: Severity[] = ['error', 'warn', 'info'];\n\nexport interface RenderFindingsOptions {\n /** 低调模式:info 只在 --verbose 时展示 */\n includeInfo?: boolean;\n}\n\n/** 人类可读的预检报告:格式 `<文件>:<行> [规则号] 说明`,编辑器可识别并直接跳转。 */\nexport const renderFindings = (\n logger: Logger,\n findings: Finding[],\n options: RenderFindingsOptions = {},\n): void => {\n const { colors } = logger;\n for (const severity of SEVERITY_ORDER) {\n const group = findings.filter((finding) => finding.severity === severity);\n if (group.length === 0) continue;\n if (severity === 'info' && !options.includeInfo) continue;\n\n const color =\n severity === 'error'\n ? colors.red\n : severity === 'warn'\n ? colors.yellow\n : colors.dim;\n logger.info(`${color(`${SEVERITY_LABEL[severity]} × ${group.length}`)}`);\n for (const finding of group) {\n const location = finding.file\n ? `${finding.file}${finding.line ? `:${finding.line}` : ''} `\n : '';\n logger.info(\n ` ${colors.bold(finding.rule)} ${location}${finding.message}`,\n );\n if (finding.hint) logger.detail(finding.hint);\n }\n }\n};\n\nexport const renderValidationSummary = (\n logger: Logger,\n report: ValidationReport,\n options: { title?: string } = {},\n): void => {\n const { colors } = logger;\n logger.step(options.title ?? '预检结果');\n logger.table([\n [\n '检查点',\n `${report.stats.checkpointCount} 个,合计 ${report.totalScore} 分`,\n ],\n [\n '答案模板',\n `${report.stats.template.fileCount} 个文件,${formatBytes(report.stats.template.totalBytes)}`,\n ],\n [\n '参考解',\n `${report.stats.answer.fileCount} 个文件,${formatBytes(report.stats.answer.totalBytes)}`,\n ],\n ['判题脚本', `${report.stats.judgeLines} 行`],\n [\n '结论',\n report.ok\n ? colors.green(`通过(${report.warnings} 条警告)`)\n : colors.red(`未通过(${report.errors} 个错误)`),\n ],\n ]);\n};\n\nexport const renderAuditDetail = (\n logger: Logger,\n detail: AuditDetail,\n options: { verbose?: boolean } = {},\n): boolean => {\n const { colors } = logger;\n const record = detail.TemplateJudgeRecord?.[0]?.judgeRecord;\n const { results, errorMessage } = readAuditResults(record);\n const score = record?.score ?? 0;\n\n logger.step(`题目 #${detail.pid} ${detail.title}`);\n logger.table([\n ['状态', detail.status],\n ['难度', detail.difficulty],\n ['审计得分', `${score} / ${detail.totalScore}`],\n ['审计结果', record?.result ?? 'unknown'],\n ]);\n\n for (const [index, item] of results.entries()) {\n const mark = item.status === 'pass' ? colors.green('✔') : colors.red('✖');\n logger.info(\n ` ${mark} [${index + 1}] ${item.score}/${item.totalScore} ${item.details ?? ''}`,\n );\n }\n if (errorMessage) logger.error(`审计执行失败:${errorMessage}`);\n if (options.verbose && detail.JudgeFile?.[0]?.judgeScript) {\n logger.debug(`判题脚本 ${detail.JudgeFile[0].judgeScript.length} 字符`);\n }\n\n return (\n record?.result === 'success' &&\n detail.totalScore > 0 &&\n score === detail.totalScore\n );\n};\n\n/** --json 输出:机器可读的稳定结构(字段名变更视为破坏性变更) */\nexport const validationToJson = (\n report: ValidationReport,\n): Record<string, unknown> => ({\n ok: report.ok,\n totalScore: report.totalScore,\n errors: report.errors,\n warnings: report.warnings,\n stats: report.stats,\n checkpoints: report.analysis.checkpoints,\n findings: report.findings,\n});\n\nexport const auditToJson = (detail: AuditDetail): Record<string, unknown> => {\n const record = detail.TemplateJudgeRecord?.[0]?.judgeRecord;\n return {\n problemId: detail.pid,\n title: detail.title,\n status: detail.status,\n totalScore: detail.totalScore,\n audit: record\n ? {\n result: record.result,\n score: record.score,\n ...readAuditResults(record),\n }\n : null,\n };\n};\n","import { resolve } from 'node:path';\n\nimport type { CommandContext } from '../core/context';\nimport { PrecheckError } from '../core/errors';\nimport { loadProblemConfig } from '../domain/problem-config';\nimport { type ValidationReport, validateProblem } from '../domain/validate';\nimport {\n renderFindings,\n renderValidationSummary,\n validationToJson,\n} from '../ui/report';\nimport type { CommandRegistry } from './registry';\n\nexport interface CheckOptions {\n dir: string;\n /** 警告也视为失败,适合放进 CI */\n strict?: boolean;\n}\n\nexport const registerCheckCommand = (registry: CommandRegistry): void => {\n const { program, context } = registry;\n\n program\n .command('check')\n .description('离线预检题目(判题脚本、快照、分值、运行配置)')\n .argument('[dir]', '题目目录(默认当前目录)', '.')\n .option('--strict', '警告也视为失败')\n .action(async (dir: string, options: Omit<CheckOptions, 'dir'>) => {\n const ctx = await context();\n await runCheck(ctx, { dir, ...options });\n });\n};\n\nexport const runCheck = async (\n ctx: CommandContext,\n options: CheckOptions,\n): Promise<ValidationReport> => {\n const rootDir = resolve(ctx.cwd, options.dir);\n ctx.logger.step(`读取题目配置 → ${rootDir}`);\n const config = await loadProblemConfig(rootDir);\n ctx.logger.detail(`title: ${config.title}`);\n\n const report = await validateProblem(config, {\n maxUploadBytes: ctx.env.maxUploadBytes,\n });\n\n renderFindings(ctx.logger, report.findings, {\n includeInfo: ctx.logger.level === 'debug',\n });\n renderValidationSummary(ctx.logger, report);\n\n if (ctx.logger.json) {\n ctx.logger.result(validationToJson(report));\n }\n\n if (!report.ok) {\n throw new PrecheckError(\n `预检未通过:${report.errors} 个错误、${report.warnings} 条警告`,\n {\n hint: '按上面的规则号逐条修复后重跑 `qpc check`。',\n },\n );\n }\n if (options.strict && report.warnings > 0) {\n throw new PrecheckError(`--strict:存在 ${report.warnings} 条警告`, {\n hint: '去掉 --strict 可只拦截错误;警告不影响线上审计。',\n });\n }\n\n ctx.logger.success('预检通过');\n return report;\n};\n","import { ConfigError } from '../core/errors';\nimport type { CoverPalette } from './cover-palette';\n\n// 一次写回的内容:imageId 必有,配色只在 --random 时给。\nexport interface CoverWrite {\n imageId: string;\n colors?: CoverPalette;\n}\n\n// 把生成好的封面(id + 可选配色)写回题目配置。 为什么要改文件而不是让用户手抄:一条 imageId 抄错一个字符,报错要等到线上 审计(\"图片不存在\"),而这正是 CLI 存在的意义。写完由调用方重新加载配置 校验,对不上就回滚。只做最小的文本手术:不引 AST,不重排用户原有的格式。\nexport const applyCoverUpdate = (\n content: string,\n update: CoverWrite,\n file: string,\n): string => {\n if (file.endsWith('.json')) {\n return applyToJson(content, update);\n }\n return applyToSource(content, update, file);\n};\n\nconst applyToJson = (content: string, update: CoverWrite): string => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch (error) {\n throw new ConfigError('题目配置不是合法 JSON,无法写回封面', {\n cause: error,\n hint: '手动把 imageId 与配色填进 cover。',\n });\n }\n const root = parsed as { cover?: Record<string, unknown> };\n const cover = root.cover;\n if (cover?.mode !== 'custom') {\n throw new ConfigError(\n '配置里没有 cover: { mode: \"custom\" },无法写回封面',\n { hint: '先按文档把封面改成自定义模式,再重跑。' },\n );\n }\n cover.imageId = update.imageId;\n if (update.colors) {\n const previous =\n cover.generate && typeof cover.generate === 'object'\n ? (cover.generate as Record<string, unknown>)\n : {};\n const generate: Record<string, unknown> = { ...previous };\n generate.bg = update.colors.bg;\n generate.accent = update.colors.accent;\n generate.text = update.colors.text;\n if (update.colors.bgTo === undefined) {\n delete generate.bgTo;\n } else {\n generate.bgTo = update.colors.bgTo;\n }\n cover.generate = generate;\n }\n return `${JSON.stringify(parsed, null, 3)}\\n`;\n};\n\nconst applyToSource = (\n content: string,\n update: CoverWrite,\n file: string,\n): string => {\n const coverMatch = /cover\\s*:\\s*\\{/.exec(content);\n if (!coverMatch) {\n throw new ConfigError(\n `在 ${file} 里找不到 cover: { ... },无法写回封面`,\n { hint: '把 imageId 与配色手动填进 cover。' },\n );\n }\n const openBrace = content.indexOf('{', coverMatch.index);\n const closeBrace = findObjectEnd(content, openBrace);\n if (closeBrace < 0) {\n throw new ConfigError(`在 ${file} 里无法解析 cover 对象(括号不配对)`, {\n hint: '把 imageId 与配色手动填进 cover。',\n });\n }\n\n const before = content.slice(0, openBrace);\n const after = content.slice(closeBrace + 1);\n const coverLineStart = content.lastIndexOf('\\n', coverMatch.index) + 1;\n const coverLinePrefix = content.slice(coverLineStart, coverMatch.index);\n const indent = /^[ \\t]*$/.test(coverLinePrefix)\n ? `${coverLinePrefix} `\n : `${/\\n([ \\t]+)\\S/.exec(before)?.[1] ?? ' '} `;\n\n let body = content.slice(openBrace, closeBrace + 1);\n if (update.colors) {\n body = writeColors(body, update.colors, indent, file);\n }\n body = writeImageId(body, update.imageId, file, indent);\n return `${before}${body}${after}`;\n};\n\n// 把平台题目 id 写回配置:填了 problemId 才会追加新版本,否则每次上传都新建一道题。\nexport const applyProblemIdUpdate = (\n content: string,\n problemId: number,\n file: string,\n): string => {\n if (file.endsWith('.json')) {\n return applyProblemIdToJson(content, problemId, file);\n }\n return applyProblemIdToSource(content, problemId, file);\n};\n\nconst applyProblemIdToJson = (\n content: string,\n problemId: number,\n file: string,\n): string => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch (error) {\n throw new ConfigError('题目配置不是合法 JSON,无法写回 problemId', {\n cause: error,\n hint: `手动把 problemId: ${problemId} 填进配置。`,\n });\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new ConfigError(`${file} 的顶层不是一个对象,无法写回 problemId`, {\n hint: `手动把 problemId: ${problemId} 填进配置。`,\n });\n }\n (parsed as Record<string, unknown>).problemId = problemId;\n return `${JSON.stringify(parsed, null, 3)}\\n`;\n};\n\nconst applyProblemIdToSource = (\n content: string,\n problemId: number,\n file: string,\n): string => {\n // 已经写过就只改值,位置与格式都不动。\n const existing = /\\bproblemId\\s*:\\s*\\d+/.exec(content);\n if (existing) return content.replace(existing[0], `problemId: ${problemId}`);\n\n const openBrace = findConfigObjectStart(content);\n if (openBrace < 0) {\n throw new ConfigError(\n `在 ${file} 里找不到题目配置对象,无法写回 problemId`,\n { hint: `手动把 problemId: ${problemId} 填进配置。` },\n );\n }\n\n const after = content.slice(openBrace + 1);\n const firstNewline = after.indexOf('\\n');\n const sameLine = after.slice(0, firstNewline < 0 ? undefined : firstNewline);\n // 与左括号同一行还有内容 -> 紧凑写法,就地插入;否则按下一行缩进另起一行。\n const insertion = /^[ \\t]*$/.test(sameLine)\n ? `\\n${/\\n([ \\t]+)\\S/.exec(after)?.[1] ?? ' '}problemId: ${problemId},`\n : ` problemId: ${problemId},`;\n return `${content.slice(0, openBrace + 1)}${insertion}${after}`;\n};\n\n// 把本题的标签写回配置:tagIds 是数组,已有就整段替换,没有就按模板位置补上。\nexport const applyTagIdsUpdate = (\n content: string,\n tagIds: number[],\n file: string,\n): string => {\n if (file.endsWith('.json')) {\n return applyTagIdsToJson(content, tagIds, file);\n }\n return applyTagIdsToSource(content, tagIds, file);\n};\n\nconst applyTagIdsToJson = (\n content: string,\n tagIds: number[],\n file: string,\n): string => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch (error) {\n throw new ConfigError('题目配置不是合法 JSON,无法写回 tagIds', {\n cause: error,\n hint: `手动把 tagIds: [${tagIds.join(', ')}] 填进配置。`,\n });\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new ConfigError(`${file} 的顶层不是一个对象,无法写回 tagIds`, {\n hint: `手动把 tagIds: [${tagIds.join(', ')}] 填进配置。`,\n });\n }\n (parsed as Record<string, unknown>).tagIds = tagIds;\n return `${JSON.stringify(parsed, null, 3)}\\n`;\n};\n\nconst applyTagIdsToSource = (\n content: string,\n tagIds: number[],\n file: string,\n): string => {\n const literal = `[${tagIds.join(', ')}]`;\n // 已经写过就只改数组,位置与格式不动。\n const existing = /\\btagIds\\s*:\\s*\\[[^\\]]*\\]/.exec(content);\n if (existing) return content.replace(existing[0], `tagIds: ${literal}`);\n\n // 优先插在 difficulty / title 的下一行,与 init 模板的字段顺序一致。\n for (const anchor of ['difficulty', 'title']) {\n const match = new RegExp(\n `\\\\b${anchor}\\\\s*:\\\\s*(['\"\\`])[^'\"\\`]*\\\\1,?`,\n ).exec(content);\n if (!match) continue;\n const lineStart = content.lastIndexOf('\\n', match.index) + 1;\n const prefix = content.slice(lineStart, match.index);\n const indent = /^([ \\t]*)$/.exec(prefix)?.[1] ?? ' ';\n const sep = /,\\s*$/.test(match[0]) ? '' : ',';\n const insertAt = match.index + match[0].length;\n const next = /^[ \\t]*$/.test(prefix)\n ? `${sep}\\n${indent}tagIds: ${literal},`\n : `${sep} tagIds: ${literal},`;\n return `${content.slice(0, insertAt)}${next}${content.slice(insertAt)}`;\n }\n\n const openBrace = findConfigObjectStart(content);\n if (openBrace < 0) {\n throw new ConfigError(\n `在 ${file} 里找不到题目配置对象,无法写回 tagIds`,\n { hint: `手动把 tagIds: ${literal} 填进配置。` },\n );\n }\n const after = content.slice(openBrace + 1);\n const firstNewline = after.indexOf('\\n');\n const sameLine = after.slice(0, firstNewline < 0 ? undefined : firstNewline);\n const insertion = /^[ \\t]*$/.test(sameLine)\n ? `\\n${/\\n([ \\t]+)\\S/.exec(after)?.[1] ?? ' '}tagIds: ${literal},`\n : ` tagIds: ${literal},`;\n return `${content.slice(0, openBrace + 1)}${insertion}${after}`;\n};\n\n// 定位配置对象(defineProblemConfig({ ... }))的 {,兼容直接 export default { ... } 的写法。\nconst findConfigObjectStart = (content: string): number => {\n const wrapper = /defineProblemConfig\\s*\\(\\s*\\{/.exec(content);\n if (wrapper) return wrapper.index + wrapper[0].lastIndexOf('{');\n const fallback = /export\\s+default\\s*\\{/.exec(content);\n if (fallback) return fallback.index + fallback[0].lastIndexOf('{');\n return content.indexOf('{');\n};\n\n// 找到 cover.generate,就地改颜色;没有 generate 就在 cover 里补一个。\nconst writeColors = (\n body: string,\n colors: CoverPalette,\n coverIndent: string,\n file: string,\n): string => {\n const generateMatch = /generate\\s*:\\s*\\{/.exec(body);\n if (!generateMatch) {\n return insertGenerate(body, colors, coverIndent, file);\n }\n const openBrace = body.indexOf('{', generateMatch.index);\n const closeBrace = findObjectEnd(body, openBrace);\n if (closeBrace < 0) {\n throw new ConfigError(\n `在 ${file} 里无法解析 cover.generate(括号不配对)`,\n {\n hint: '把配色手动填进 cover.generate。',\n },\n );\n }\n const generatePrefix = body.slice(openBrace, closeBrace + 1);\n const generateIndent = detectIndent(generatePrefix) ?? `${coverIndent} `;\n let generateBody = generatePrefix;\n generateBody = upsertColor(generateBody, 'bg', colors.bg, generateIndent);\n generateBody = upsertColor(\n generateBody,\n 'bgTo',\n colors.bgTo,\n generateIndent,\n );\n generateBody = upsertColor(\n generateBody,\n 'accent',\n colors.accent,\n generateIndent,\n );\n generateBody = upsertColor(\n generateBody,\n 'text',\n colors.text,\n generateIndent,\n );\n return body.slice(0, openBrace) + generateBody + body.slice(closeBrace + 1);\n};\n\n// 没有 generate 时补一个:插在 mode: 'custom' 之后,风格与 insertImageId 一致。\nconst insertGenerate = (\n body: string,\n colors: CoverPalette,\n indent: string,\n file: string,\n): string => {\n const modeMatch = /mode\\s*:\\s*(['\"`])custom\\1,?/.exec(body);\n if (!modeMatch) {\n throw new ConfigError(\n `在 ${file} 的 cover 对象里找不到 mode: 'custom',无法写入 generate`,\n { hint: '把配色手动填进 cover.generate。' },\n );\n }\n const literal = formatColors(colors);\n const matched = modeMatch[0];\n const hasComma = /,\\s*$/.test(matched);\n const linePrefix = body.slice(\n body.lastIndexOf('\\n', modeMatch.index) + 1,\n modeMatch.index,\n );\n const inline = !/^[ \\t]*$/.test(linePrefix);\n const separator = hasComma ? ' ' : ', ';\n const replacement = inline\n ? `${matched}${separator}generate: { ${literal} },`\n : `${matched}${hasComma ? '' : ','}\\n${indent}generate: { ${literal} },`;\n return body.replace(matched, replacement);\n};\n\nconst formatColors = (colors: CoverPalette): string => {\n const parts = [\n `bg: '${colors.bg}'`,\n colors.bgTo === undefined ? undefined : `bgTo: '${colors.bgTo}'`,\n `accent: '${colors.accent}'`,\n `text: '${colors.text}'`,\n ].filter((part): part is string => part !== undefined);\n return parts.join(', ');\n};\n\nconst writeImageId = (\n body: string,\n imageId: string,\n file: string,\n indent: string,\n): string => {\n const existing = /imageId\\s*:\\s*(['\"`])(?:[^'\"`]*)\\1/.exec(body);\n return existing\n ? body.replace(existing[0], `imageId: '${imageId}'`)\n : insertImageId(body, imageId, file, indent);\n};\n\n// 追加 imageId:插在 mode: 'custom' 之后。 分两种写法,目的是不重排用户原有格式: · cover 与 mode 同一行 -> 就地插在同一行 · mode 自己占一行 -> 换行后沿用同一缩进\nconst insertImageId = (\n body: string,\n imageId: string,\n file: string,\n indent: string,\n): string => {\n const modeMatch = /mode\\s*:\\s*(['\"`])custom\\1,?/.exec(body);\n if (!modeMatch) {\n throw new ConfigError(\n `在 ${file} 的 cover 对象里找不到 mode: 'custom',无法写回 imageId`,\n { hint: '把 imageId 手动填进 cover.imageId。' },\n );\n }\n const matched = modeMatch[0];\n const hasComma = /,\\s*$/.test(matched);\n const linePrefix = body.slice(\n body.lastIndexOf('\\n', modeMatch.index) + 1,\n modeMatch.index,\n );\n const inline = !/^[ \\t]*$/.test(linePrefix);\n const separator = hasComma ? ' ' : ', ';\n const replacement = inline\n ? `${matched}${separator}imageId: '${imageId}',`\n : `${matched}${hasComma ? '' : ','}\\n${indent}imageId: '${imageId}',`;\n return body.replace(matched, replacement);\n};\n\n// key: 'value' 的正则片段,group 1 是引号,供 \\1 配对使用。\nconst keyPattern = (key: string): string =>\n `\\\\b${key}\\\\s*:\\\\s*(['\"\\`])(?:[^'\"\\`]*)\\\\1`;\n\nconst detectIndent = (body: string): string | undefined =>\n /\\n([ \\t]+)\\S/.exec(body)?.[1];\n\n// 有则改写,值为 undefined 则删除,没有则插入。\nconst upsertColor = (\n body: string,\n key: string,\n value: string | undefined,\n indent: string,\n): string => {\n const existing = new RegExp(keyPattern(key)).exec(body);\n if (value === undefined) {\n return existing ? removeKey(body, key) : body;\n }\n if (existing) {\n return body.replace(existing[0], `${key}: '${value}'`);\n }\n return insertKey(body, key, value, indent);\n};\n\nconst insertKey = (\n body: string,\n key: string,\n value: string,\n indent: string,\n): string => {\n const inner = body.slice(1, -1);\n if (inner.trim() === '') return `{ ${key}: '${value}' }`;\n if (!inner.includes('\\n')) return body.replace('{', `{ ${key}: '${value}',`);\n const entryIndent = detectIndent(body) ?? indent;\n return body.replace('{', `{\\n${entryIndent}${key}: '${value}',`);\n};\n\n// 删除一个键,连带处理逗号,避免留下 `{ , }` 这种坏字面量。\nconst removeKey = (body: string, key: string): string => {\n const pattern = keyPattern(key);\n const trailing = new RegExp(`${pattern}\\\\s*,\\\\s*`);\n if (trailing.test(body)) return body.replace(trailing, '');\n const leading = new RegExp(`\\\\s*,\\\\s*${pattern}`);\n if (leading.test(body)) return body.replace(leading, '');\n return body.replace(new RegExp(pattern), '');\n};\n\n// 从 `{` 出发找配对的 `}`,跳过字符串与模板串。 不处理正则字面量:配置文件里的 cover 对象几乎不可能出现正则,为此写一个 JS 词法分析器代价太大,而这里错了也只是抛错让用户手改。\nconst findObjectEnd = (content: string, openBrace: number): number => {\n let depth = 0;\n let quote: string | null = null;\n for (let i = openBrace; i < content.length; i += 1) {\n const char = content[i]!;\n const previous = content[i - 1];\n if (quote) {\n if (char === quote && previous !== '\\\\') quote = null;\n continue;\n }\n if (char === \"'\" || char === '\"' || char === '`') {\n quote = char;\n continue;\n }\n if (char === '{') depth += 1;\n if (char === '}') {\n depth -= 1;\n if (depth === 0) return i;\n }\n }\n return -1;\n};\n","import { COVER_DEFAULTS } from './cover';\n\nexport interface CoverPalette {\n bg: string;\n bgTo?: string;\n accent: string;\n text: string;\n}\n\nexport interface RandomPaletteResult {\n palette: CoverPalette;\n seed: number;\n scheme: string;\n}\n\nconst TEXT_CONTRAST = 7;\nconst ACCENT_CONTRAST = 4.5;\n\n// 背景色相锚点:只列深色底好看的色相(蓝 / 青 / 绿 / 紫 / 红 / 棕)。\n// 不列黄色系:深黄在屏幕上是脏土色。\nconst BG_ANCHORS: ReadonlyArray<{ name: string; hue: number }> = [\n { name: '深蓝', hue: 216 },\n { name: '靛蓝', hue: 232 },\n { name: '青蓝', hue: 198 },\n { name: '幽绿', hue: 168 },\n { name: '松绿', hue: 148 },\n { name: '紫罗兰', hue: 262 },\n { name: '暗紫', hue: 280 },\n { name: '酒红', hue: 348 },\n { name: '暗红', hue: 10 },\n { name: '暖棕', hue: 26 },\n];\n\nconst clamp01 = (value: number): number => Math.min(1, Math.max(0, value));\n\n// mulberry32:32 位状态、无依赖、同种子同结果,用来让随机配色可复现。\nconst createRandom = (seed: number): (() => number) => {\n let state = seed >>> 0;\n return () => {\n state = (state + 0x6d2b79f5) >>> 0;\n let value = state;\n value = Math.imul(value ^ (value >>> 15), value | 1);\n value ^= value + Math.imul(value ^ (value >>> 7), value | 61);\n return ((value ^ (value >>> 14)) >>> 0) / 4294967296;\n };\n};\n\nconst hueToRgb = (\n hue: number,\n chroma: number,\n second: number,\n): [number, number, number] => {\n if (hue < 60) return [chroma, second, 0];\n if (hue < 120) return [second, chroma, 0];\n if (hue < 180) return [0, chroma, second];\n if (hue < 240) return [0, second, chroma];\n if (hue < 300) return [second, 0, chroma];\n return [chroma, 0, second];\n};\n\nconst toHexByte = (value: number): string =>\n Math.round(clamp01(value) * 255)\n .toString(16)\n .padStart(2, '0')\n .toUpperCase();\n\n// HSL(h 单位度,s/l 为 0~1)-> #RRGGBB\nexport const hslToHex = (hue: number, sat: number, light: number): string => {\n const h = ((hue % 360) + 360) % 360;\n const s = clamp01(sat);\n const l = clamp01(light);\n const chroma = (1 - Math.abs(2 * l - 1)) * s;\n const second = chroma * (1 - Math.abs(((h / 60) % 2) - 1));\n const offset = l - chroma / 2;\n const [r, g, b] = hueToRgb(h, chroma, second);\n return `#${toHexByte(r + offset)}${toHexByte(g + offset)}${toHexByte(b + offset)}`;\n};\n\nconst parseHex = (hex: string): [number, number, number] => {\n const value = hex.slice(1);\n const full =\n value.length === 3\n ? [...value].map((char) => char + char).join('')\n : value.slice(0, 6);\n return [\n Number.parseInt(full.slice(0, 2), 16),\n Number.parseInt(full.slice(2, 4), 16),\n Number.parseInt(full.slice(4, 6), 16),\n ];\n};\n\nconst toLinear = (channel: number): number => {\n const value = channel / 255;\n return value <= 0.03928 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n};\n\nconst relativeLuminance = (hex: string): number => {\n const [r, g, b] = parseHex(hex);\n return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n};\n\n// WCAG 对比度,范围 1~21;谁亮谁暗不影响结果。\nexport const contrastRatio = (a: string, b: string): number => {\n const [high, low] = [relativeLuminance(a), relativeLuminance(b)].sort(\n (x, y) => y - x,\n ) as [number, number];\n return (high + 0.05) / (low + 0.05);\n};\n\n// 检查一套配色是否(仍)满足对比度下限,不满足时返回人话原因。 --random 单独用时必定通过;这个函数主要拦「随机配色 + 显式 --bg/--text 覆盖」 把可读性破坏掉的情况,例如 --random --bg \"#ffffff\" 会让近白标题看不见。\nexport const describePaletteProblem = (\n palette: CoverPalette,\n): string | undefined => {\n const backgrounds =\n palette.bgTo === undefined ? [palette.bg] : [palette.bg, palette.bgTo];\n const requirements: Array<[string, string, number]> = [\n [palette.text, '主标题色', TEXT_CONTRAST],\n [palette.accent, '强调色', ACCENT_CONTRAST],\n ];\n for (const [color, label, minimum] of requirements) {\n for (const bg of backgrounds) {\n const ratio = contrastRatio(color, bg);\n if (ratio < minimum) {\n return `${label} ${color} 对背景 ${bg} 的对比度只有 ${ratio.toFixed(2)}:1(要求 ≥ ${minimum}:1)`;\n }\n }\n }\n return undefined;\n};\n\n// 从配色关系里抽一个强调色色相偏移,而不是全色环乱抽,这是和谐的来源。\n// 同色系比例最高:深色底 + 同色系亮色强调是最不容易出错的组合。\nconst pickRelation = (rand: () => number): { name: string; offset: number } => {\n const sign = rand() < 0.5 ? -1 : 1;\n const roll = rand();\n if (roll < 0.22) return { name: '同色系', offset: sign * (6 + rand() * 20) };\n if (roll < 0.45)\n return { name: '邻近色', offset: sign * (30 + rand() * 25) };\n if (roll < 0.7) {\n return { name: '分裂互补', offset: sign * (138 + rand() * 24) };\n }\n if (roll < 0.88) {\n return { name: '互补色', offset: sign * (172 + rand() * 16) };\n }\n return { name: '三角色', offset: sign * (108 + rand() * 24) };\n};\n\n// 在满足对比度下限的前提下选强调色明度。深色背景上明度越高对比度越大,所以 达标区间是连续的 [min, 0.94]。先扫出刚好达标的下界再加余量:颜色够鲜艳,又 有安全边际;纯蓝这类亮度天生低的色相会被推到更亮的位置。\nconst fitAccent = (\n hue: number,\n sat: number,\n backgrounds: readonly string[],\n rand: () => number,\n): string => {\n const meetsContrast = (light: number): boolean => {\n const candidate = hslToHex(hue, sat, light);\n return backgrounds.every(\n (bg) => contrastRatio(candidate, bg) >= ACCENT_CONTRAST,\n );\n };\n\n let minimum: number | undefined;\n for (let light = 0.94; light >= 0.5; light -= 0.005) {\n if (meetsContrast(light)) {\n minimum = light;\n } else if (minimum !== undefined) {\n break;\n }\n }\n // 兜底:理论上不该发生,退回默认强调色而不是输出不可读的颜色。\n if (minimum === undefined) return COVER_DEFAULTS.accent;\n // 加余量让颜色更鲜艳,但不能低于 minimum——纯蓝这类色相要求的明度可能很高,\n // 一味往下夹会突破 4.5:1(实测过 4.39:1)。\n const preferred = minimum + 0.05 + rand() * 0.06;\n return hslToHex(hue, sat, Math.max(minimum, Math.min(0.9, preferred)));\n};\n\n// 生成一套配色;不传 seed 时随机取一个,并在返回值里给出,便于复现。\nexport const randomCoverPalette = (seed?: number): RandomPaletteResult => {\n const resolvedSeed = (seed ?? Math.floor(Math.random() * 0xffffffff)) >>> 0;\n const rand = createRandom(resolvedSeed);\n\n // 背景:深色 + 中等饱和的窄带;色相在锚点附近小幅抖动,避免每套都一样。\n const anchor = BG_ANCHORS[Math.floor(rand() * BG_ANCHORS.length)]!;\n const bgHue = anchor.hue + (rand() - 0.5) * 16;\n const bgSat = 0.34 + rand() * 0.2;\n const bgLight = 0.095 + rand() * 0.07;\n const bg = hslToHex(bgHue, bgSat, bgLight);\n\n // 标题:接近白色,只掺一点背景色相,避免死白显得脱节。\n const text = hslToHex(\n bgHue + (rand() - 0.5) * 24,\n 0.06 + rand() * 0.1,\n 0.94 + rand() * 0.03,\n );\n\n // 渐变:约 60% 的方案给渐变终止色,色相小幅漂移、明度略抬,保持同一氛围。\n let bgTo: string | undefined;\n if (rand() < 0.6) {\n const toHue = bgHue + (rand() - 0.5) * 40;\n const toSat = clamp01(bgSat + (rand() - 0.5) * 0.12);\n let toLight = bgLight + 0.03 + rand() * 0.06;\n // 渐变端点也要让标题读得清:读不清就压回明度,压回背景色则干脆不要渐变。\n while (\n toLight > bgLight &&\n contrastRatio(text, hslToHex(toHue, toSat, toLight)) < TEXT_CONTRAST\n ) {\n toLight -= 0.01;\n }\n if (toLight > bgLight + 0.005) {\n bgTo = hslToHex(toHue, toSat, toLight);\n }\n }\n\n const relation = pickRelation(rand);\n const accentSat =\n relation.name === '同色系' ? 0.6 + rand() * 0.3 : 0.72 + rand() * 0.28;\n const accent = fitAccent(\n bgHue + relation.offset,\n accentSat,\n bgTo === undefined ? [bg] : [bg, bgTo],\n rand,\n );\n\n return {\n palette: { bg, bgTo, accent, text },\n seed: resolvedSeed,\n scheme: `${anchor.name} · ${relation.name}`,\n };\n};\n","import sharp from 'sharp';\n\nimport { buildCoverSvg, type CoverSpec } from '../domain/cover';\n\n/** 把封面描述光栅化成 PNG。 */\nexport const renderCoverPng = async (spec: CoverSpec): Promise<Buffer> =>\n sharp(Buffer.from(buildCoverSvg(spec), 'utf8'))\n .png()\n .toBuffer();\n","import { createInterface } from 'node:readline';\nimport {\n multiselect as clackMultiselect,\n select as clackSelect,\n isCancel,\n} from '@clack/prompts';\n\nimport { CanceledError, UsageError } from '../core/errors';\n\nexport interface PromptIO {\n stdin: NodeJS.ReadStream;\n stderr: (chunk: string) => void;\n // @clack/core 要的是真正的可写流(读 isTTY、写光标控制序列),只给 write 函数会崩。\n stderrStream?: NodeJS.WriteStream;\n}\n\nconst isInteractive = (stdin: NodeJS.ReadStream): boolean =>\n Boolean(stdin.isTTY) && typeof stdin.setRawMode === 'function';\n\n/** 读取密码 / 令牌时不回显:TTY 下走 raw mode 收集按键(不用 readline 私有 API),非 TTY 降级为普通读取。 */\nexport const promptHidden = async (\n question: string,\n io: PromptIO,\n): Promise<string> => {\n const { stdin, stderr } = io;\n\n if (!isInteractive(stdin)) {\n const rl = createInterface({ input: stdin, terminal: false });\n const answer = await new Promise<string>((resolve) => {\n rl.question(question, resolve);\n });\n rl.close();\n return answer.trim();\n }\n\n stderr(question);\n const wasRaw = Boolean(stdin.isRaw);\n stdin.setRawMode?.(true);\n stdin.resume();\n\n return new Promise<string>((resolve, reject) => {\n const chars: string[] = [];\n const cleanup = () => {\n stdin.setRawMode?.(wasRaw);\n stdin.removeListener('data', onData);\n stdin.pause();\n stderr('\\n');\n };\n const onData = (chunk: Buffer) => {\n for (const char of chunk.toString('utf8')) {\n if (char === '\\r' || char === '\\n') {\n cleanup();\n resolve(chars.join(''));\n return;\n }\n if (char === '\\u0003') {\n cleanup();\n reject(new CanceledError());\n return;\n }\n if (char === '\\u007f' || char === '\\b') {\n chars.pop();\n continue;\n }\n chars.push(char);\n }\n };\n stdin.on('data', onData);\n });\n};\n\n/** 普通可见输入(不需要隐藏的字段,如邮箱) */\nexport const promptVisible = async (\n question: string,\n io: PromptIO,\n): Promise<string> => {\n const rl = createInterface({ input: io.stdin, terminal: false });\n const answer = await new Promise<string>((resolve) => {\n rl.question(question, resolve);\n });\n rl.close();\n return answer.trim();\n};\n\n/** 从管道读取全部内容(`echo $TOKEN | qpc login --password-stdin`) */\nexport const readAllStdin = async (\n stdin: NodeJS.ReadStream,\n): Promise<string> => {\n const chunks: Buffer[] = [];\n for await (const chunk of stdin) {\n chunks.push(Buffer.from(chunk as Buffer));\n }\n return Buffer.concat(chunks).toString('utf8').trim();\n};\n\nexport const confirm = async (\n question: string,\n io: PromptIO,\n defaultValue = false,\n): Promise<boolean> => {\n if (!io.stdin.isTTY) {\n throw new UsageError('当前不是交互式终端,无法确认', {\n hint: '请在命令中显式加上 --yes 表示确认,或使用 --dry-run 预览。',\n });\n }\n const rl = createInterface({ input: io.stdin, terminal: false });\n const answer = await new Promise<string>((resolve) => {\n rl.question(`${question} ${defaultValue ? '[Y/n]' : '[y/N]'} `, resolve);\n });\n rl.close();\n const normalized = answer.trim().toLowerCase();\n if (normalized === '') return defaultValue;\n return normalized === 'y' || normalized === 'yes';\n};\n\nexport interface SelectChoice<T extends string> {\n value: T;\n label: string;\n // 右侧灰字补充说明\n hint?: string;\n}\n\n// @clack/prompts 的 Option<Value> 在 Value 为泛型时会退化成联合类型,这里收敛成 Primitive 分支的形状。\ninterface ClackOption {\n value: string;\n label: string;\n hint?: string;\n}\n\n/** 方向键单选(@clack/prompts 的 select),比敲编号更接近 IDE 交互;非 TTY 直接抛用法错误。 */\nexport const select = async <T extends string>(\n message: string,\n choices: SelectChoice<T>[],\n io: PromptIO,\n options: { initialValue?: T } = {},\n): Promise<T> => {\n if (!isInteractive(io.stdin)) {\n throw new UsageError('当前不是交互式终端,无法选择', {\n hint: '请在命令里显式指定,例如 `qpc init --type backend_service`。',\n });\n }\n\n const answer = await clackSelect<string>({\n message,\n options: choices.map(\n (choice): ClackOption => ({\n value: choice.value,\n label: choice.label,\n ...(choice.hint === undefined ? {} : { hint: choice.hint }),\n }),\n ),\n ...(options.initialValue === undefined\n ? {}\n : { initialValue: options.initialValue }),\n input: io.stdin,\n output: io.stderrStream ?? process.stderr,\n });\n\n if (isCancel(answer)) {\n throw new CanceledError('已取消选择');\n }\n return answer as T;\n};\n\nexport interface MultiSelectChoice<T extends string> {\n value: T;\n label: string;\n hint?: string;\n}\n\n/** 方向键多选(空格切换,回车确认)。非 TTY 同样报用法错误,由调用方回落。 */\nexport const multiselect = async <T extends string>(\n message: string,\n choices: MultiSelectChoice<T>[],\n io: PromptIO,\n options: { initialValues?: T[]; required?: boolean } = {},\n): Promise<T[]> => {\n if (!isInteractive(io.stdin)) {\n throw new UsageError('当前不是交互式终端,无法多选', {\n hint: '请在命令里显式指定,例如 `qpc tag --set 1,2`。',\n });\n }\n\n const answer = await clackMultiselect<string>({\n message,\n options: choices.map(\n (choice): ClackOption => ({\n value: choice.value,\n label: choice.label,\n ...(choice.hint === undefined ? {} : { hint: choice.hint }),\n }),\n ),\n ...(options.initialValues === undefined\n ? {}\n : { initialValues: options.initialValues }),\n ...(options.required === undefined ? {} : { required: options.required }),\n input: io.stdin,\n output: io.stderrStream ?? process.stderr,\n });\n\n if (isCancel(answer)) {\n throw new CanceledError('已取消选择');\n }\n return answer as T[];\n};\n","import type { CommandContext } from '../core/context';\nimport { AuthError } from '../core/errors';\nimport { confirm } from '../utils/terminal';\n\n/** 所有需要登录的命令都从这里过一道,错误信息才统一 */\nexport const requireSession = (ctx: CommandContext): void => {\n if (!ctx.client.hasSession) {\n throw new AuthError('尚未登录', {\n hint: `先执行 \\`qpc login --api ${ctx.env.apiUrl}\\`(或设置 QUANTA_TOKEN)。`,\n });\n }\n};\n\nexport const summarizeUser = (user: {\n nickname?: string;\n email?: string;\n role?: string;\n}): string =>\n [user.nickname, user.email, user.role].filter(Boolean).join(' · ') ||\n '<unknown>';\n\n/** 交互确认(仅在改服务端状态的命令里用):--yes 直接放行;非 TTY 且无 --yes 也放行,避免 CI 卡死并记录\"已跳过确认\"。 */\nexport const confirmOrSkip = async (\n ctx: CommandContext,\n question: string,\n): Promise<boolean> => {\n if (ctx.assumeYes) return true;\n if (!ctx.runtime.stdin.isTTY) {\n ctx.logger.detail('非交互环境,已跳过确认(--yes 可显式声明)');\n return true;\n }\n return confirm(question, {\n stdin: ctx.runtime.stdin,\n stderr: ctx.runtime.stderr,\n });\n};\n","import { basename, relative, resolve } from 'node:path';\n\nimport type { CommandContext } from '../core/context';\nimport { ConfigError, UsageError } from '../core/errors';\nimport { applyCoverUpdate } from '../domain/config-writer';\nimport {\n assertHexColor,\n COVER_DEFAULTS,\n COVER_SUGGESTED_BG_TO,\n type CoverSpec,\n} from '../domain/cover';\nimport {\n type CoverPalette,\n describePaletteProblem,\n randomCoverPalette,\n} from '../domain/cover-palette';\nimport { loadProblemConfig } from '../domain/problem-config';\nimport { createAdminApi } from '../services/admin-api';\nimport { renderCoverPng } from '../services/cover-image';\nimport { readText, writeBinary, writeTextAtomic } from '../utils/fs';\nimport { formatBytes } from '../utils/paths';\nimport type { CommandRegistry } from './registry';\nimport { requireSession } from './support';\n\nexport interface CoverOptions {\n dir: string;\n out?: string;\n bg?: string;\n bgTo?: string;\n accent?: string;\n text?: string;\n subtitle?: string;\n footer?: string;\n width?: string;\n height?: string;\n random?: boolean;\n seed?: string;\n upload?: boolean;\n write?: boolean;\n}\n\nexport const registerCoverCommand = (registry: CommandRegistry): void => {\n const { program, context } = registry;\n\n program\n .command('cover')\n .description('生成封面图(可上传、写回配置)')\n .argument('[dir]', '题目目录(默认当前目录)', '.')\n .option('--out <file>', '输出文件(默认取配置里的 cover.generate.out)')\n .option('--bg <color>', `背景色,默认 ${COVER_DEFAULTS.bg}`)\n .option(\n '--bg-to <color>',\n `渐变终止色(给了就画渐变),推荐 ${COVER_SUGGESTED_BG_TO}`,\n )\n .option('--accent <color>', `强调色,默认 ${COVER_DEFAULTS.accent}`)\n .option('--text <color>', `主标题颜色,默认 ${COVER_DEFAULTS.text}`)\n .option('--subtitle <text>', '副标题(留空则不渲染)')\n .option('--footer <text>', `左下角页脚,默认 ${COVER_DEFAULTS.footer}`)\n .option('--width <px>', `画布宽度,默认 ${COVER_DEFAULTS.width}`)\n .option('--height <px>', `画布高度,默认 ${COVER_DEFAULTS.height}`)\n .option('--random', '随机生成一套合理配色(可复现)')\n .option('--seed <n>', '配合 --random:固定种子')\n .option('--upload', '上传封面,输出 imageId')\n .option('--write', '把 imageId 与配色写回配置(隐含 --upload)')\n .action(async (dir: string, options: Omit<CoverOptions, 'dir'>) => {\n const ctx = await context();\n await runCover(ctx, { dir, ...options });\n });\n};\n\nexport const runCover = async (\n ctx: CommandContext,\n options: CoverOptions,\n): Promise<void> => {\n const rootDir = resolve(ctx.cwd, options.dir);\n const config = await loadProblemConfig(rootDir);\n\n if (config.cover.mode !== 'custom') {\n throw new ConfigError(\n '当前题目用的是「首屏截图」封面,不需要也不应该生成封面图',\n {\n hint: \"改成 cover: { mode: 'custom', generate: { ... } } 再跑 `qpc cover`。\",\n },\n );\n }\n\n const generate = config.cover.generate;\n const outFile = resolve(\n rootDir,\n options.out ?? generate?.out ?? 'cover.png',\n );\n const randomized = resolveRandom(options);\n const spec = resolveSpec(\n config.title,\n generate,\n options,\n randomized?.palette,\n );\n\n // --random 的承诺是「输出一定可读」。整组生成的配色已逐项校验,但显式颜色\n // 参数优先级更高、可能把它覆盖坏,所以要对最终配色再验一次。\n if (randomized) {\n const problem = describePaletteProblem({\n bg: spec.bg,\n bgTo: spec.bgTo,\n accent: spec.accent,\n text: spec.text,\n });\n if (problem) {\n throw new UsageError(`随机配色与显式颜色参数冲突:${problem}`, {\n hint: '去掉颜色参数让 --random 整组生成,或整组手动指定。',\n });\n }\n }\n\n // 随机配色只在 --write 时落盘;--upload 不写配置。\n const colors: CoverPalette | undefined = randomized\n ? {\n bg: spec.bg,\n bgTo: spec.bgTo,\n accent: spec.accent,\n text: spec.text,\n }\n : undefined;\n\n ctx.logger.step(`渲染封面 → ${relative(ctx.cwd, outFile) || outFile}`);\n const png = await renderCoverPng(spec);\n try {\n await writeBinary(outFile, png);\n } catch (error) {\n throw new ConfigError(`无法写入封面文件:${outFile}`, { cause: error });\n }\n\n const rows: Array<[string, string]> = [\n ['标题', spec.title],\n ['副标题', spec.subtitle || '<无>'],\n ['尺寸', `${spec.width} × ${spec.height}`],\n [\n '配色',\n `${spec.bg}${spec.bgTo ? ` → ${spec.bgTo}` : ''} / ${spec.accent}`,\n ],\n ];\n if (randomized) {\n rows.push(['随机', `${randomized.scheme}(seed=${randomized.seed})`]);\n }\n rows.push(['文件', `${outFile}(${formatBytes(png.byteLength)})`]);\n ctx.logger.table(rows);\n ctx.logger.success('封面已生成');\n\n const shouldUpload = options.upload === true || options.write === true;\n if (!shouldUpload) {\n if (ctx.logger.json) {\n ctx.logger.result({\n out: outFile,\n bytes: png.byteLength,\n spec,\n random: randomized\n ? { seed: randomized.seed, scheme: randomized.scheme }\n : undefined,\n });\n }\n return;\n }\n\n requireSession(ctx);\n const api = createAdminApi(ctx.client);\n ctx.logger.step('上传封面(admin.image.upload)');\n const image = await api.uploadImage({\n fileBase64: png.toString('base64'),\n fileName: basename(outFile),\n });\n ctx.logger.success(`封面已上传:${image.id}`);\n\n if (options.write) {\n const written = await writeBackCover(config.configFile, image.id, colors);\n ctx.logger.success(\n `${colors ? 'imageId 与配色' : 'imageId'} 已写回 ${relative(ctx.cwd, written) || written}`,\n );\n } else {\n ctx.logger.info(' 加 --write 可写回配置');\n }\n\n if (ctx.logger.json) {\n ctx.logger.result({\n out: outFile,\n bytes: png.byteLength,\n imageId: image.id,\n imageName: image.name,\n spec,\n random: randomized\n ? { seed: randomized.seed, scheme: randomized.scheme }\n : undefined,\n wroteColors: options.write === true && colors !== undefined,\n configFile: options.write ? config.configFile : undefined,\n });\n }\n};\n\n// 写回之后重新加载一次配置验证。文本手术总有翻车的可能(用户写得足够奇怪就\n// 匹配不到),而写坏的配置比没写更糟。验证失败就回滚,把「改坏了」变成「没改」。\nconst writeBackCover = async (\n configFile: string,\n imageId: string,\n colors: CoverPalette | undefined,\n): Promise<string> => {\n const original = await readText(configFile);\n const patched = applyCoverUpdate(original, { imageId, colors }, configFile);\n await writeTextAtomic(configFile, patched);\n try {\n const reloaded = await loadProblemConfig(resolve(configFile, '..'));\n if (\n reloaded.cover.mode !== 'custom' ||\n reloaded.cover.imageId !== imageId\n ) {\n throw new Error('写回后读取到的 imageId 与预期不一致');\n }\n if (colors) {\n const generate = reloaded.cover.generate;\n const matches =\n generate !== undefined &&\n generate.bg === colors.bg &&\n generate.bgTo === colors.bgTo &&\n generate.accent === colors.accent &&\n generate.text === colors.text;\n if (!matches) throw new Error('写回后读取到的配色与预期不一致');\n }\n } catch (error) {\n await writeTextAtomic(configFile, original);\n throw new ConfigError('写回封面信息后配置校验失败,已回滚原文件', {\n cause: error,\n hint: `手动把 imageId 填成 ${imageId},并抄回配色。`,\n });\n }\n return configFile;\n};\n\n// --random 的入口:解析 seed,交给纯函数生成配色。\n// --seed 单独出现没意义,提前拦下比默默忽略好。\nconst resolveRandom = (\n options: CoverOptions,\n): ReturnType<typeof randomCoverPalette> | undefined => {\n if (!options.random) {\n if (options.seed !== undefined) {\n throw new UsageError('--seed 只有在 --random 时才有意义', {\n hint: '例如 `qpc cover --random --seed 42`。',\n });\n }\n return undefined;\n }\n return randomCoverPalette(parseSeed(options.seed));\n};\n\nconst parseSeed = (value: string | undefined): number | undefined => {\n if (value === undefined) return undefined;\n if (!/^\\d+$/.test(value)) {\n throw new UsageError(`--seed 必须是非负整数:${value}`, {\n hint: '例如 `qpc cover --random --seed 42`。',\n });\n }\n const seed = Number.parseInt(value, 10);\n if (!Number.isSafeInteger(seed) || seed > 0xffffffff) {\n throw new UsageError(`--seed 超出范围(0~4294967295):${value}`);\n }\n return seed;\n};\n\nconst resolveSpec = (\n title: string,\n generate: (Partial<CoverSpec> & { out?: string }) | undefined,\n options: CoverOptions,\n palette: CoverPalette | undefined,\n): CoverSpec => {\n const pick = (flag: string | undefined, fromConfig: string | undefined) =>\n flag ?? fromConfig;\n\n const color = (\n value: string | undefined,\n fallback: string,\n field: string,\n ): string => assertHexColor(value ?? fallback, field);\n\n // 颜色优先级:显式参数 > --random > 配置 > 默认值。--random 生效时不再回落 到配置,否则配置里写死的配色会让 --random 看起来没生效。bgTo 特殊:随机 也可能主动决定「不要渐变」,这时同样不读配置,否则会冒出多余渐变。\n const colorFrom = (\n flag: string | undefined,\n fromRandom: string | undefined,\n fromConfig: string | undefined,\n ): string | undefined =>\n flag ?? (palette === undefined ? fromConfig : fromRandom);\n\n const bgTo = colorFrom(options.bgTo, palette?.bgTo, generate?.bgTo);\n\n return {\n title,\n subtitle: pick(options.subtitle, generate?.subtitle),\n footer: pick(options.footer, generate?.footer),\n bg: color(\n colorFrom(options.bg, palette?.bg, generate?.bg),\n COVER_DEFAULTS.bg,\n '--bg',\n ),\n bgTo:\n bgTo === undefined\n ? undefined\n : color(bgTo, COVER_DEFAULTS.bg, '--bg-to'),\n accent: color(\n colorFrom(options.accent, palette?.accent, generate?.accent),\n COVER_DEFAULTS.accent,\n '--accent',\n ),\n text: color(\n colorFrom(options.text, palette?.text, generate?.text),\n COVER_DEFAULTS.text,\n '--text',\n ),\n width: parseSize(\n options.width,\n generate?.width,\n COVER_DEFAULTS.width,\n '--width',\n ),\n height: parseSize(\n options.height,\n generate?.height,\n COVER_DEFAULTS.height,\n '--height',\n ),\n };\n};\n\nconst parseSize = (\n flag: string | undefined,\n fromConfig: number | undefined,\n fallback: number,\n field: string,\n): number => {\n if (flag === undefined) return fromConfig ?? fallback;\n const value = Number.parseInt(flag, 10);\n if (!Number.isFinite(value) || value < 200 || value > 4096) {\n throw new UsageError(`${field} 必须是 200~4096 之间的整数:${flag}`);\n }\n return value;\n};\n","export interface JwtClaims {\n userId?: string;\n role?: string;\n exp?: number;\n iat?: number;\n}\n\n/** 只解码 JWT 的 payload 用于展示(过期时间、角色);刻意不校验签名,真正鉴权在服务端。 */\nexport const decodeJwt = (token: string): JwtClaims | undefined => {\n const segments = token.split('.');\n if (segments.length < 2 || !segments[1]) return undefined;\n try {\n const payload = Buffer.from(\n segments[1].replace(/-/g, '+').replace(/_/g, '/'),\n 'base64',\n ).toString('utf8');\n const parsed = JSON.parse(payload) as JwtClaims;\n return typeof parsed === 'object' && parsed !== null ? parsed : undefined;\n } catch {\n return undefined;\n }\n};\n\nexport const describeTokenExpiry = (\n token: string | undefined,\n now = Date.now(),\n): string => {\n if (!token) return '无';\n const claims = decodeJwt(token);\n if (!claims?.exp) return '未知(无法解析 exp)';\n const expiresAt = claims.exp * 1000;\n const remainingMs = expiresAt - now;\n const stamp = new Date(expiresAt).toISOString();\n if (remainingMs <= 0) return `已过期(${stamp})`;\n if (remainingMs < 60_000)\n return `${Math.round(remainingMs / 1000)} 秒后过期(${stamp})`;\n return `${Math.round(remainingMs / 60_000)} 分钟后过期(${stamp})`;\n};\n","import { existsSync } from 'node:fs';\nimport { stat } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport type { CommandContext } from '../core/context';\nimport { ApiError, CliError } from '../core/errors';\nimport { DEFAULT_CONFIG_FILES } from '../domain/problem-config';\nimport { describeTokenExpiry } from '../utils/jwt';\nimport type { CommandRegistry } from './registry';\nimport { summarizeUser } from './support';\n\ntype CheckStatus = 'ok' | 'warn' | 'fail' | 'skip';\n\ninterface CheckResult {\n name: string;\n status: CheckStatus;\n detail: string;\n /** 失败时的修复建议 */\n fix?: string;\n}\n\nconst MIN_NODE_MAJOR = 20;\n\nexport const registerDoctorCommand = (registry: CommandRegistry): void => {\n const { program, context } = registry;\n\n program\n .command('doctor')\n .description('自检:运行环境、API 可达性、登录状态')\n .action(async () => {\n const ctx = await context();\n await runDoctor(ctx);\n });\n};\n\nexport const runDoctor = async (ctx: CommandContext): Promise<void> => {\n const results: CheckResult[] = [];\n\n results.push(checkNodeVersion());\n\n const credentials = await checkCredentialsFile(ctx);\n results.push(credentials);\n\n results.push(await checkApiReachable(ctx));\n results.push(await checkSession(ctx));\n\n const configFile = DEFAULT_CONFIG_FILES.map((name) =>\n existsSync(join(ctx.cwd, name)),\n ).some(Boolean);\n results.push({\n name: '当前目录的题目配置',\n status: configFile ? 'ok' : 'skip',\n detail: configFile\n ? '找到 problem.config.*'\n : `在 ${ctx.cwd} 未找到(用 --cwd 指定题目目录)`,\n });\n\n ctx.logger.step('qpc doctor');\n const symbols: Record<CheckStatus, string> = {\n ok: ctx.logger.colors.green('✔'),\n warn: ctx.logger.colors.yellow('▲'),\n fail: ctx.logger.colors.red('✖'),\n skip: ctx.logger.colors.dim('–'),\n };\n for (const result of results) {\n ctx.logger.info(\n ` ${symbols[result.status]} ${result.name}:${result.detail}`,\n );\n if (result.fix && result.status !== 'ok')\n ctx.logger.detail(`修复:${result.fix}`);\n }\n\n const failures = results.filter((result) => result.status === 'fail');\n if (ctx.logger.json) {\n ctx.logger.result({\n ok: failures.length === 0,\n checks: results,\n apiUrl: ctx.env.apiUrl,\n credentialsFile: ctx.credentialsFile,\n });\n }\n\n if (failures.length > 0) {\n throw new CliError(`${failures.length} 项检查失败`, {\n hint: '按上面的\"修复\"逐项处理;只关心题目本身时可以先跑 `qpc check`。',\n });\n }\n ctx.logger.success('全部检查通过');\n};\n\nconst checkNodeVersion = (): CheckResult => {\n const major = Number.parseInt(\n process.versions.node.split('.')[0] ?? '0',\n 10,\n );\n return {\n name: 'Node 版本',\n status: major >= MIN_NODE_MAJOR ? 'ok' : 'fail',\n detail: `v${process.versions.node}`,\n fix: `升级到 Node ${MIN_NODE_MAJOR} 及以上`,\n };\n};\n\nconst checkCredentialsFile = async (\n ctx: CommandContext,\n): Promise<CheckResult> => {\n if (!existsSync(ctx.credentialsFile)) {\n return {\n name: '凭据文件',\n status: ctx.client.hasSession ? 'ok' : 'warn',\n detail: ctx.client.hasSession\n ? '不存在,但已通过环境变量提供令牌'\n : `不存在:${ctx.credentialsFile}`,\n fix: 'qpc login',\n };\n }\n const info = await stat(ctx.credentialsFile).catch(() => undefined);\n if (!info) {\n return {\n name: '凭据文件',\n status: 'warn',\n detail: `无法读取:${ctx.credentialsFile}`,\n fix: 'qpc login',\n };\n }\n const mode = (info.mode & 0o777).toString(8);\n // 令牌文件对同机其它用户可读是真实的安全问题,值得报 warn\n const tooOpen = (info.mode & 0o077) !== 0;\n return {\n name: '凭据文件',\n status: tooOpen ? 'warn' : 'ok',\n detail: `${ctx.credentialsFile}(权限 ${mode})`,\n fix: tooOpen ? `chmod 600 ${ctx.credentialsFile}` : undefined,\n };\n};\n\nconst checkApiReachable = async (ctx: CommandContext): Promise<CheckResult> => {\n try {\n // getUser 是受保护接口:未登录会返回 401,正好用来证明\"服务活着且有 tRPC 路由\"。\n await ctx.client.call('auth.login.getUser', { method: 'GET' });\n return {\n name: 'API 可达',\n status: 'ok',\n detail: `${ctx.env.apiUrl}(已登录)`,\n };\n } catch (error) {\n if (\n error instanceof ApiError &&\n (error.status === 401 || error.status === 403)\n ) {\n return {\n name: 'API 可达',\n status: 'ok',\n detail: `${ctx.env.apiUrl}(未登录/无权限,但服务正常)`,\n };\n }\n return {\n name: 'API 可达',\n status: 'fail',\n detail: error instanceof Error ? error.message : String(error),\n fix: '确认 Web 应用已启动(docker compose up -d),或用 --api 指定地址',\n };\n }\n};\n\nconst checkSession = async (ctx: CommandContext): Promise<CheckResult> => {\n if (!ctx.client.hasSession) {\n return {\n name: '登录状态',\n status: 'warn',\n detail: '未登录',\n fix: `qpc login --api ${ctx.env.apiUrl}`,\n };\n }\n try {\n const user = await ctx.client.call<{ user: Record<string, string> }>(\n 'auth.login.getUser',\n { method: 'GET' },\n );\n const role = user.user.role;\n const admin = role === 'ADMIN' || role === 'SUPER_ADMIN';\n return {\n name: '登录状态',\n status: admin ? 'ok' : 'warn',\n detail: `${summarizeUser(user.user)};access token ${describeTokenExpiry(ctx.credentials.cookies.access)}`,\n fix: admin ? undefined : '出题接口要求 ADMIN 角色,请用管理员账号登录',\n };\n } catch (error) {\n return {\n name: '登录状态',\n status: 'fail',\n detail: error instanceof Error ? error.message : String(error),\n fix: 'qpc login(凭据可能已过期或被服务端密钥轮换失效)',\n };\n }\n};\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport {\n buildBackendInitCommand,\n DEFAULT_BACKEND_SERVICE_IMAGE_ID,\n getBackendServiceDefaultPort,\n} from '@challenge/shared/backend-service-image';\n\nimport { ConfigError } from '../core/errors';\nimport {\n COVER_DEFAULTS,\n COVER_SUGGESTED_BG_TO,\n type CoverSpec,\n} from '../domain/cover';\nimport {\n DEFAULT_INIT_COMMAND,\n type Difficulty,\n type ProblemType,\n} from '../domain/problem-config';\nimport { readText, walkFiles } from '../utils/fs';\n\nexport interface ScaffoldVars {\n title: string;\n // 题型:前端(静态站点 + Playwright)或后端服务(常驻进程 + HTTP)\n type: ProblemType;\n difficulty: Difficulty;\n tagIds: number[];\n // 站点根目录 / 判题打包目录\n mountPath: string;\n}\n\nexport interface ScaffoldFile {\n // 相对题目目录的 posix 路径\n path: string;\n content: string;\n}\n\n// 需要 init 额外光栅化的封面(后端题型没有首屏可截图)\nexport interface ScaffoldCover {\n path: string;\n spec: CoverSpec;\n}\n\nexport interface ScaffoldResult {\n files: ScaffoldFile[];\n cover?: ScaffoldCover;\n}\n\n// 模板里用 `gitignore` 这个名字:真叫 `.gitignore` 会被 git 当成忽略规则。\nconst GITIGNORE_TEMPLATE = 'gitignore';\n\n// 模板文件里的占位符,生成时一次性插值,产物里不留任何 `{{...}}`。\nconst PLACEHOLDER = /\\{\\{(\\w+)\\}\\}/g;\n\n// 模板是包根 `templates/<type>/` 下的真实文件:源码直跑取 ../../templates,打包产物取 ../templates。\nconst TEMPLATE_DIR_CANDIDATES = ['../../templates', '../templates'] as const;\n\nconst resolveTemplateDir = (type: ProblemType): string => {\n for (const candidate of TEMPLATE_DIR_CANDIDATES) {\n const dir = fileURLToPath(\n new URL(`${candidate}/${type}`, import.meta.url),\n );\n if (existsSync(dir)) return dir;\n }\n throw new ConfigError('内部错误:找不到脚手架模板目录', {\n details: { from: import.meta.url, type },\n });\n};\n\n// 把 `templates/<type>/` 下的文件读出、替换 `{{...}}` 占位符后落到题目目录;示例刻意零依赖,离线安装才有稳定第一步。\nexport const buildProblemScaffold = async (\n vars: ScaffoldVars,\n): Promise<ScaffoldResult> => {\n const templateDir = resolveTemplateDir(vars.type);\n const context = buildContext(vars);\n\n // 忽略编辑器/系统垃圾文件:模板目录在版本库里,本地浏览可能留下 .DS_Store。\n const relativePaths = await walkFiles(templateDir, {\n ignore: (name) => name === '.DS_Store',\n });\n const files = await Promise.all(\n relativePaths.map(async (relativePath) => {\n const raw = await readText(join(templateDir, relativePath));\n return {\n path:\n relativePath === GITIGNORE_TEMPLATE\n ? '.gitignore'\n : relativePath,\n content: renderTemplate(raw, context, relativePath),\n };\n }),\n );\n\n return {\n files,\n cover:\n vars.type === 'backend_service'\n ? { path: 'cover.png', spec: buildBackendCoverSpec(vars.title) }\n : undefined,\n };\n};\n\nconst renderTemplate = (\n content: string,\n context: Record<string, string>,\n file: string,\n): string =>\n content.replace(PLACEHOLDER, (match, key: string) => {\n const value = context[key];\n if (value === undefined) {\n throw new ConfigError(`模板 ${file} 引用了未知占位符 ${match}`, {\n details: {\n file,\n placeholder: key,\n available: Object.keys(context).sort(),\n },\n });\n }\n return value;\n });\n\nconst buildContext = (vars: ScaffoldVars): Record<string, string> => {\n const { title, type, difficulty, tagIds, mountPath } = vars;\n const context: Record<string, string> = {\n title,\n difficulty,\n tagIds: tagIds.join(', '),\n mountPath,\n initCommand:\n type === 'backend_service'\n ? buildBackendInitCommand(\n DEFAULT_BACKEND_SERVICE_IMAGE_ID,\n mountPath,\n )\n : DEFAULT_INIT_COMMAND.replace(/\\sproject$/, ` ${mountPath}`),\n };\n\n if (type === 'backend_service') {\n context.serviceImage = DEFAULT_BACKEND_SERVICE_IMAGE_ID;\n context.servicePort = String(\n getBackendServiceDefaultPort(DEFAULT_BACKEND_SERVICE_IMAGE_ID),\n );\n context.coverBg = BACKEND_COVER.bg;\n context.coverBgTo = BACKEND_COVER.bgTo;\n context.coverAccent = BACKEND_COVER.accent;\n context.coverSubtitle = BACKEND_COVER.subtitle;\n }\n\n return context;\n};\n\n// 后端脚手架示例用的封面配色(也写进模板里的 `cover.generate`)\nconst BACKEND_COVER = {\n bg: COVER_DEFAULTS.bg,\n bgTo: COVER_SUGGESTED_BG_TO,\n accent: COVER_DEFAULTS.accent,\n subtitle: 'GET /health',\n} as const;\n\n// 后端题型默认封面:示例 API 没有首屏可截图,init 先本地渲染 cover.png,再由 `qpc cover --upload --write` 上传换 id。\nexport const buildBackendCoverSpec = (title: string): CoverSpec => ({\n title,\n subtitle: BACKEND_COVER.subtitle,\n bg: BACKEND_COVER.bg,\n bgTo: BACKEND_COVER.bgTo,\n accent: BACKEND_COVER.accent,\n text: COVER_DEFAULTS.text,\n width: COVER_DEFAULTS.width,\n height: COVER_DEFAULTS.height,\n});\n","import { resolve } from 'node:path';\n\nimport type { CommandContext } from '../core/context';\nimport { UsageError } from '../core/errors';\nimport {\n DEFAULT_JUDGE_UPLOAD_PATH,\n DIFFICULTIES,\n type Difficulty,\n PROBLEM_TYPES,\n type ProblemType,\n} from '../domain/problem-config';\nimport { renderCoverPng } from '../services/cover-image';\nimport { buildProblemScaffold } from '../templates/problem-scaffold';\nimport { listDir, writeBinary, writeTextWithMode } from '../utils/fs';\nimport { displayPath, formatBytes } from '../utils/paths';\nimport { select } from '../utils/terminal';\nimport type { CommandRegistry } from './registry';\n\nexport interface InitOptions {\n name?: string;\n type?: string;\n difficulty?: string;\n tag?: string[];\n mount?: string;\n force?: boolean;\n}\n\nexport const registerInitCommand = (registry: CommandRegistry): void => {\n const { program, context } = registry;\n\n program\n .command('init')\n .description(\n '生成题目骨架:problem.config.ts / judge.js / template / answer',\n )\n .argument('[dir]', '目标目录(默认当前目录)', '.')\n .option('--name <title>', '题目标题(默认取目录名)')\n .option(\n '--type <type>',\n `题型:${PROBLEM_TYPES.join(' | ')}(不传则方向键选择;非交互环境默认 frontend)`,\n )\n .option(\n '--difficulty <level>',\n `难度:${DIFFICULTIES.join(' | ')}`,\n 'easy',\n )\n .option('--tag <id...>', '标签 id,可给多个(用 `qpc tag` 查看)', ['1'])\n .option(\n '--mount <path>',\n '判题打包目录 / 快照挂载路径',\n DEFAULT_JUDGE_UPLOAD_PATH,\n )\n .option('--force', '目录非空时仍然写入(只覆盖同名文件,不删除其它文件)')\n .action(async (dir: string, options: InitOptions) => {\n const ctx = await context();\n await runInit(ctx, dir, options);\n });\n};\n\nexport const runInit = async (\n ctx: CommandContext,\n dir: string,\n options: InitOptions,\n): Promise<void> => {\n const target = resolve(ctx.cwd, dir);\n const difficulty = assertDifficulty(options.difficulty);\n const tagIds = assertTagIds(options.tag);\n const mountPath = options.mount ?? DEFAULT_JUDGE_UPLOAD_PATH;\n const title = options.name?.trim() || defaultTitle(target);\n\n if (!options.force) {\n const existing = (await listDir(target)).filter(\n (name) => name !== '.git',\n );\n if (existing.length > 0) {\n throw new UsageError(`目录非空:${displayPath(ctx.cwd, target)}`, {\n hint: '换一个空目录,或加 --force 覆盖同名文件(已有文件不会被删除)。',\n });\n }\n }\n\n const type = await resolveProblemType(ctx, options.type);\n\n const scaffold = await buildProblemScaffold({\n title,\n type,\n difficulty,\n tagIds,\n mountPath,\n });\n\n ctx.logger.step(\n `生成${type === 'backend_service' ? '后端服务题' : '前端题'}骨架 → ${displayPath(ctx.cwd, target)}`,\n );\n for (const file of scaffold.files) {\n await writeTextWithMode(resolve(target, file.path), file.content);\n ctx.logger.success(\n `${file.path} ${ctx.logger.colors.dim(`${file.content.length} 字符`)}`,\n );\n }\n\n // 后端题没有首屏可截图:init 先本地渲染 cover.png,失败不阻断,qpc cover 可重试。\n if (scaffold.cover) {\n const outFile = resolve(target, scaffold.cover.path);\n try {\n const png = await renderCoverPng(scaffold.cover.spec);\n await writeBinary(outFile, png);\n ctx.logger.success(\n `${scaffold.cover.path} ${ctx.logger.colors.dim(formatBytes(png.byteLength))}`,\n );\n } catch (error) {\n ctx.logger.warn(\n `封面渲染失败(${error instanceof Error ? error.message : String(error)}):配置里已有 cover.generate,跑 \\`qpc cover\\` 可重试`,\n );\n }\n }\n\n const cd = dir === '.' ? 'qpc' : `cd ${displayPath(ctx.cwd, target)} && qpc`;\n ctx.logger.blank();\n ctx.logger.step('下一步');\n if (type === 'backend_service') {\n ctx.logger.info(\n ` ${cd} cover --upload --write # 后端题必须自定义封面:生成 → 上传 → 写回 imageId`,\n );\n }\n ctx.logger.info(` ${cd} check # 毫秒级静态预检`);\n ctx.logger.info(` ${cd} upload --wait # 上传并等待审计(约 20 秒)`);\n\n if (ctx.logger.json) {\n ctx.logger.result({\n dir: target,\n type,\n files: scaffold.files.map((file) => file.path),\n cover: scaffold.cover?.path,\n difficulty,\n tagIds,\n });\n }\n};\n\nconst defaultTitle = (target: string): string =>\n target.split(/[\\\\/]/).filter(Boolean).pop() ?? '未命名题目';\n\nconst assertProblemType = (value: string | undefined): ProblemType => {\n const candidate = (value ?? 'frontend') as ProblemType;\n if (!PROBLEM_TYPES.includes(candidate)) {\n throw new UsageError(`题型不合法:${value}`, {\n hint: `可选值:${PROBLEM_TYPES.join(' | ')}`,\n });\n }\n return candidate;\n};\n\n// 未给 --type 时交互选择;CI / 管道 / --json / --yes 下退回 frontend,保持老行为。\nconst resolveProblemType = async (\n ctx: CommandContext,\n value: string | undefined,\n): Promise<ProblemType> => {\n if (value !== undefined) return assertProblemType(value);\n if (ctx.assumeYes || ctx.logger.json || !ctx.runtime.stdin.isTTY) {\n return 'frontend';\n }\n return select<ProblemType>(\n '请选择题型',\n [\n {\n value: 'frontend',\n label: '前端题(frontend)',\n hint: '静态站点,用 Playwright 判题',\n },\n {\n value: 'backend_service',\n label: '后端服务题(backend_service)',\n hint: '常驻进程,用 HTTP 判题,模板含封面图',\n },\n ],\n {\n stdin: ctx.runtime.stdin,\n stderr: ctx.runtime.stderr,\n stderrStream: ctx.runtime.stderrStream,\n },\n { initialValue: 'frontend' },\n );\n};\n\nconst assertDifficulty = (value: string | undefined): Difficulty => {\n const candidate = (value ?? 'easy') as Difficulty;\n if (!DIFFICULTIES.includes(candidate)) {\n throw new UsageError(`难度不合法:${value}`, {\n hint: `可选值:${DIFFICULTIES.join(' | ')}`,\n });\n }\n return candidate;\n};\n\nconst assertTagIds = (values: string[] | undefined): number[] => {\n const list = values && values.length > 0 ? values : ['1'];\n const parts = list.flatMap((value) =>\n value\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean),\n );\n const parsed = parts.map((part) => Number.parseInt(part, 10));\n if (parsed.some((id) => !Number.isInteger(id) || id <= 0)) {\n throw new UsageError(`标签 id 必须是正整数:${parts.join(', ')}`, {\n hint: '运行 `qpc tag` 查看可用标签 id,或用 `qpc tag --write` 交互选择。',\n });\n }\n return parsed;\n};\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { z } from 'zod';\n\nimport { ConfigError } from '../core/errors';\nimport { pathExists, readText, writeTextWithMode } from '../utils/fs';\n\nexport const credentialsSchema = z.object({\n version: z.literal(1),\n apiUrl: z.string().optional(),\n cookies: z.object({\n access: z.string().optional(),\n refresh: z.string().optional(),\n csrf: z.string().optional(),\n }),\n user: z\n .object({\n id: z.string(),\n nickname: z.string().optional(),\n email: z.string().optional(),\n role: z.string().optional(),\n })\n .optional(),\n updatedAt: z.string().optional(),\n});\n\nexport type Credentials = z.infer<typeof credentialsSchema>;\nexport type CookieJar = Credentials['cookies'];\n\nexport const emptyCredentials = (): Credentials => ({\n version: 1,\n cookies: {},\n});\n\n/** 凭据目录遵循 XDG:QUANTA_CONFIG_DIR > XDG_CONFIG_HOME > ~/.config;不放项目目录,避免换目录重登或误提交令牌。 */\nexport const resolveConfigDir = (\n env: NodeJS.ProcessEnv = process.env,\n): string => {\n const explicit = env.QUANTA_CONFIG_DIR;\n if (explicit) return explicit;\n const xdg = env.XDG_CONFIG_HOME;\n if (xdg) return xdg;\n return join(homedir(), '.config');\n};\n\nexport const credentialsPath = (configDir: string): string =>\n join(configDir, 'quanta', 'credentials.json');\n\nexport const readCredentials = async (file: string): Promise<Credentials> => {\n if (!(await pathExists(file))) return emptyCredentials();\n const raw = await readText(file);\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new ConfigError(`凭据文件不是合法 JSON:${file}`, {\n cause: error,\n hint: '执行 `qpc logout` 后重新 `qpc login`。',\n });\n }\n const result = credentialsSchema.safeParse(parsed);\n if (!result.success) {\n throw new ConfigError(`凭据文件结构无法识别:${file}`, {\n details: { issues: result.error.issues.map((i) => i.message) },\n hint: '执行 `qpc logout` 后重新 `qpc login`。',\n });\n }\n return result.data;\n};\n\n/** 凭据是令牌,权限必须是 0600:同机器上的其它用户不应能读到 */\nexport const writeCredentials = async (\n file: string,\n credentials: Credentials,\n): Promise<void> => {\n await writeTextWithMode(\n file,\n `${JSON.stringify({ ...credentials, updatedAt: new Date().toISOString() }, null, 3)}\\n`,\n 0o600,\n );\n};\n\nexport const removeCredentials = async (file: string): Promise<boolean> => {\n const { rm } = await import('node:fs/promises');\n if (!(await pathExists(file))) return false;\n await rm(file, { force: true });\n return true;\n};\n","/** OAuth 2.0 设备授权流程(RFC 8628)共享协议定义:服务端与 CLI 必须用同一份常量,否则会出现间歇性 invalid_grant;只放纯数据与纯函数。 */\n\n/** RFC 8628 §3.4:设备码流程专用的 grant_type */\nexport const DEVICE_CODE_GRANT_TYPE =\n 'urn:ietf:params:oauth:grant-type:device_code';\n\n/** RFC 8628 §6.1 推荐的 base20 字符集(去掉元音与易混字符 0/O、1/I/L)。 */\nexport const USER_CODE_ALPHABET = 'BCDFGHJKLMNPQRSTVWXZ';\nexport const USER_CODE_LENGTH = 8;\n/** 展示用分组:显示 WDJB-MJHT,但比对时横线是可选的 */\nexport const USER_CODE_GROUP_SIZE = 4;\n\n/** 设备码存活时间(秒)。RFC §5.4 要求\"够用但尽量短\"以限制钓鱼码的可利用期。 */\nexport const DEVICE_CODE_TTL_SECONDS = 600;\n/** user_code 允许的失败尝试次数(RFC §5.1);超出作废整条会话,防换 IP 爆破。 */\nexport const USER_CODE_MAX_ATTEMPTS = 5;\n/** RFC §3.2 的 interval 默认值 */\nexport const DEVICE_CODE_POLL_INTERVAL_SECONDS = 5;\n/** RFC §3.5 收到 slow_down 时每次增加 5 秒 */\nexport const DEVICE_CODE_SLOW_DOWN_SECONDS = 5;\n\n/** 本服务认得的 client_id(自研 CLI,无第三方 client) */\nexport const DEVICE_FLOW_CLIENT_ID = 'quanta-problem-creator-cli';\n\n/** 给 CLI 展示、并用于校验申请的权限范围 */\nexport const DEVICE_FLOW_SCOPE = 'problem:write';\n\n/** 规范化用户输入的 user_code(RFC §6.1):去横线、转大写、剔除字符集外字符(复制的末尾空格不应让合法输入作废)。 */\nexport const normalizeUserCode = (input: string): string =>\n [...input.toUpperCase()].filter((char) => USER_CODE_ALPHABET.includes(char)).join('');\n\n/** 把规范化后的码按展示分组拼回带横线的形式(用于回显给用户核对) */\nexport const formatUserCode = (normalized: string): string => {\n const groups: string[] = [];\n for (let i = 0; i < normalized.length; i += USER_CODE_GROUP_SIZE) {\n groups.push(normalized.slice(i, i + USER_CODE_GROUP_SIZE));\n }\n return groups.join('-');\n};\n\nexport const isValidUserCode = (normalized: string): boolean =>\n normalized.length === USER_CODE_LENGTH &&\n [...normalized].every((char) => USER_CODE_ALPHABET.includes(char));\n\n/** RFC 8628 §3.5 的错误码(另外还要处理 RFC 6749 的 invalid_grant 等) */\nexport const DEVICE_FLOW_ERRORS = {\n /** 用户还没批准,继续按 interval 轮询 */\n authorizationPending: 'authorization_pending',\n /** 轮询太快:interval 必须 +5s */\n slowDown: 'slow_down',\n /** 用户明确拒绝:立即停止轮询 */\n accessDenied: 'access_denied',\n /** device_code 过期,会话结束 */\n expiredToken: 'expired_token',\n} as const;\n\nexport type DeviceFlowError =\n (typeof DEVICE_FLOW_ERRORS)[keyof typeof DEVICE_FLOW_ERRORS];\n\n/** 授权会话的 Redis 键。集中在这里避免两端拼错前缀。 */\nexport const deviceCodeKey = (deviceCode: string): string =>\n `oauth:device:${deviceCode}`;\nexport const userCodeKey = (normalizedUserCode: string): string =>\n `oauth:user:${normalizedUserCode}`;\n/** 尝试次数计数(独立于会话对象,便于用 INCR 原子累加) */\nexport const userCodeAttemptsKey = (normalizedUserCode: string): string =>\n `oauth:user-attempts:${normalizedUserCode}`;\n\n/** 会话状态机:pending ——(用户点同意)→ approved ——(CLI 换到 token)→ consumed */\nexport const DEVICE_SESSION_STATUS = {\n pending: 'pending',\n approved: 'approved',\n denied: 'denied',\n /** 被 CLI 取走后立即置为该状态,防止同一 device_code 被换两次 token */\n consumed: 'consumed',\n} as const;\n\nexport type DeviceSessionStatus =\n (typeof DEVICE_SESSION_STATUS)[keyof typeof DEVICE_SESSION_STATUS];\n\n/** Redis 中保存的授权会话 */\nexport interface DeviceSession {\n deviceCode: string;\n /** 规范化(无横线、大写)的 user_code */\n userCode: string;\n clientId: string;\n scope: string;\n status: DeviceSessionStatus;\n /** 用户批准后写入 */\n userId?: string;\n createdAt: number;\n}\n\n/** CLI 发起设备授权请求(RFC §3.1)后拿到的响应(RFC §3.2) */\nexport interface DeviceAuthorizationResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n}\n\n/** 成功换到的令牌(RFC 6749 §5.1 的子集) */\nexport interface DeviceTokenResponse {\n access_token: string;\n refresh_token: string;\n token_type: 'Bearer';\n expires_in: number;\n scope: string;\n}\n\n/** 设备授权端点与令牌端点的路径(两端共用,改一处即可) */\nexport const DEVICE_FLOW_PATHS = {\n deviceAuthorization: '/api/oauth/device/authorize',\n deviceToken: '/api/oauth/device/token',\n /** 用户在浏览器里确认授权的人机页面 */\n verification: '/auth/device',\n} as const;\n","export const sleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(\n signal.reason instanceof Error\n ? signal.reason\n : new Error('aborted'),\n );\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(\n signal?.reason instanceof Error\n ? signal.reason\n : new Error('aborted'),\n );\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n\nexport interface PollOptions<T> {\n /** 返回 undefined 表示\"还没好,继续等\" */\n probe: (attempt: number) => Promise<T | undefined>;\n intervalMs?: number;\n timeoutMs?: number;\n signal?: AbortSignal;\n onTick?: (elapsedMs: number, attempt: number) => void;\n}\n\n/** 轮询直到 probe 返回非 undefined 或超时;超时返回 undefined 而非抛错,让调用方自行区分超时语义。 */\nexport const poll = async <T>(\n options: PollOptions<T>,\n): Promise<T | undefined> => {\n const intervalMs = options.intervalMs ?? 2_000;\n const timeoutMs = options.timeoutMs ?? 120_000;\n const startedAt = Date.now();\n let attempt = 0;\n\n for (;;) {\n attempt += 1;\n const value = await options.probe(attempt);\n if (value !== undefined) return value;\n\n const elapsed = Date.now() - startedAt;\n if (elapsed + intervalMs > timeoutMs) return undefined;\n options.onTick?.(elapsed, attempt);\n await sleep(intervalMs, options.signal);\n }\n};\n","import { readFileSync } from 'node:fs';\n\nexport const CLI_NAME = 'qpc';\nexport const CLI_DESCRIPTION = 'Quanta 出题工具:脚手架、离线预检、上传与发布';\n\nconst readVersion = (): string => {\n try {\n const raw = readFileSync(\n new URL('../package.json', import.meta.url),\n 'utf8',\n );\n const parsed = JSON.parse(raw) as { version?: string };\n return parsed.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n};\n\nexport const CLI_VERSION = readVersion();\n","import {\n DEVICE_CODE_GRANT_TYPE,\n DEVICE_CODE_SLOW_DOWN_SECONDS,\n DEVICE_FLOW_CLIENT_ID,\n DEVICE_FLOW_ERRORS,\n DEVICE_FLOW_PATHS,\n DEVICE_FLOW_SCOPE,\n type DeviceAuthorizationResponse,\n type DeviceTokenResponse,\n} from '@challenge/shared/oauth';\n\nimport { CliError, PrecheckError } from '../core/errors';\nimport type { Logger } from '../core/logger';\nimport { sleep } from '../utils/async';\nimport { CLI_VERSION } from '../version';\n\nexport interface DeviceFlowOptions {\n baseUrl: string;\n fetch: typeof globalThis.fetch;\n logger: Logger;\n signal?: AbortSignal;\n timeoutMs?: number;\n /** 覆盖轮询间隔(秒),仅测试用;正常流程遵循服务端下发的 interval */\n overrideIntervalSeconds?: number;\n}\n\nexport interface DeviceFlowResult {\n tokens: DeviceTokenResponse;\n /** 供 UI 展示 */\n userCode: string;\n verificationUri: string;\n}\n\n/** 设备授权 + 轮询换 token(RFC 8628 §3.1 → §3.5) */\nexport interface DeviceFlow {\n requestCodes(): Promise<DeviceAuthorizationResponse>;\n pollForToken(\n auth: DeviceAuthorizationResponse,\n onPending?: (elapsedMs: number) => void,\n ): Promise<DeviceTokenResponse>;\n}\n\ninterface OAuthErrorBody {\n error?: string;\n error_description?: string;\n}\n\nconst postForm = async (\n options: DeviceFlowOptions,\n path: string,\n body: Record<string, string>,\n): Promise<{ status: number; json: unknown }> => {\n const timeoutMs = options.timeoutMs ?? 15_000;\n const signal = options.signal\n ? AbortSignal.any([options.signal, AbortSignal.timeout(timeoutMs)])\n : AbortSignal.timeout(timeoutMs);\n\n let response: Response;\n try {\n response = await options.fetch(`${options.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n // RFC 8628 §3.1 要求 x-www-form-urlencoded;服务端为兼容也收 JSON,\n // 但这里按规范发送,避免依赖服务端的宽松解析。\n 'content-type': 'application/x-www-form-urlencoded',\n accept: 'application/json',\n 'user-agent': `qpc/${CLI_VERSION} (quanta-problem-creator)`,\n },\n body: new URLSearchParams(body).toString(),\n signal,\n });\n } catch (error) {\n throw new CliError(`无法连接 ${options.baseUrl}${path}`, {\n cause: error,\n hint: '确认 API 地址正确且服务已启动:qpc doctor',\n });\n }\n\n const text = await response.text();\n let json: unknown;\n try {\n json = text ? JSON.parse(text) : undefined;\n } catch {\n json = undefined;\n }\n return { status: response.status, json };\n};\n\nexport const createDeviceFlow = (options: DeviceFlowOptions): DeviceFlow => {\n const requestCodes = async (): Promise<DeviceAuthorizationResponse> => {\n const { status, json } = await postForm(\n options,\n DEVICE_FLOW_PATHS.deviceAuthorization,\n { client_id: DEVICE_FLOW_CLIENT_ID, scope: DEVICE_FLOW_SCOPE },\n );\n\n const body = json as\n | (Partial<DeviceAuthorizationResponse> & OAuthErrorBody)\n | undefined;\n if (status !== 200 || !body?.device_code || !body.user_code) {\n throw new CliError(`服务端拒绝了设备授权请求(HTTP ${status})`, {\n details: { body: body ?? null },\n hint:\n body?.error === 'invalid_client'\n ? '服务端不认识本客户端的 client_id,确认 CLI 与服务端版本一致。'\n : '检查 API 地址是否指向 quanta-challenge 应用(而非其它服务)。',\n });\n }\n\n return {\n device_code: body.device_code,\n user_code: body.user_code,\n verification_uri: body.verification_uri ?? '',\n verification_uri_complete: body.verification_uri_complete ?? '',\n // RFC §3.2:interval 缺省时客户端必须按 5 秒处理\n interval: body.interval ?? 5,\n expires_in: body.expires_in ?? 600,\n };\n };\n\n const pollForToken = async (\n auth: DeviceAuthorizationResponse,\n onPending?: (elapsedMs: number) => void,\n ): Promise<DeviceTokenResponse> => {\n // RFC §3.5:每次收到 slow_down 都必须把间隔**累加** 5 秒,\n // 且对后续请求持续生效 —— 不能只在那一轮临时加大。\n let intervalMs =\n (options.overrideIntervalSeconds ?? auth.interval) * 1_000;\n const deadline = Date.now() + auth.expires_in * 1_000;\n const startedAt = Date.now();\n let consecutiveNetworkErrors = 0;\n\n for (;;) {\n if (Date.now() >= deadline) {\n throw new CliError('设备授权码已过期', {\n hint: '重新执行 `qpc login` 会生成新的验证码。',\n });\n }\n\n let status: number;\n let body: (Partial<DeviceTokenResponse> & OAuthErrorBody) | undefined;\n try {\n const result = await postForm(\n options,\n DEVICE_FLOW_PATHS.deviceToken,\n {\n grant_type: DEVICE_CODE_GRANT_TYPE,\n device_code: auth.device_code,\n client_id: DEVICE_FLOW_CLIENT_ID,\n },\n );\n status = result.status;\n body = result.json as typeof body;\n consecutiveNetworkErrors = 0;\n } catch (error) {\n // RFC §3.5:连接超时后客户端必须**单向降低**轮询频率,\n // 推荐指数退避。否则服务端抖动时客户端会持续加压。\n consecutiveNetworkErrors += 1;\n intervalMs *= 2;\n options.logger.warn(\n `轮询失败(第 ${consecutiveNetworkErrors} 次),间隔调整为 ${Math.round(intervalMs / 1000)} 秒`,\n );\n if (consecutiveNetworkErrors >= 5) throw error;\n await sleep(intervalMs, options.signal);\n continue;\n }\n\n if (status === 200 && body?.access_token && body.refresh_token) {\n return {\n access_token: body.access_token,\n refresh_token: body.refresh_token,\n token_type: 'Bearer',\n expires_in: body.expires_in ?? 900,\n scope: body.scope ?? DEVICE_FLOW_SCOPE,\n };\n }\n\n const error = body?.error;\n if (error === DEVICE_FLOW_ERRORS.authorizationPending) {\n onPending?.(Date.now() - startedAt);\n } else if (error === DEVICE_FLOW_ERRORS.slowDown) {\n intervalMs += DEVICE_CODE_SLOW_DOWN_SECONDS * 1_000;\n options.logger.detail(\n `服务端要求降低轮询频率,间隔调整为 ${Math.round(intervalMs / 1000)} 秒`,\n );\n } else if (error === DEVICE_FLOW_ERRORS.accessDenied) {\n throw new PrecheckError('授权被拒绝', {\n hint: '你在确认页点击了拒绝;重新执行 `qpc login` 可再试一次。',\n });\n } else if (error === DEVICE_FLOW_ERRORS.expiredToken) {\n throw new CliError('设备授权码已失效(可能已被使用)', {\n hint: '重新执行 `qpc login`。',\n });\n } else {\n throw new CliError(\n `换令牌失败${error ? `:${error}` : `(HTTP ${status})`}`,\n {\n details: {\n status,\n error: body?.error,\n description: body?.error_description,\n },\n },\n );\n }\n\n await sleep(intervalMs, options.signal);\n }\n };\n\n return { requestCodes, pollForToken };\n};\n","import { spawn } from 'node:child_process';\n\n/** 打开系统默认浏览器(不引入 open 依赖,三平台各一条命令);返回\"是否成功发起\",调用方必须同时打印 URL 供手动打开。 */\nexport const openBrowser = async (url: string): Promise<boolean> => {\n const platform = process.platform;\n const command =\n platform === 'darwin'\n ? { file: 'open', args: [url] }\n : platform === 'win32'\n ? // cmd 的 start 是内置命令;第一个空参数是为了让 start 把带引号的 URL\n // 当作标题之外的参数(Windows 上 start 会把第一个引号参数当窗口标题)。\n { file: 'cmd', args: ['/c', 'start', '', url] }\n : { file: 'xdg-open', args: [url] };\n\n return new Promise<boolean>((resolve) => {\n try {\n const child = spawn(command.file, command.args, {\n stdio: 'ignore',\n detached: true,\n });\n child.on('error', () => resolve(false));\n child.on('spawn', () => {\n child.unref();\n resolve(true);\n });\n } catch {\n resolve(false);\n }\n });\n};\n","import type { CommandContext } from '../core/context';\nimport { UsageError } from '../core/errors';\nimport { createAdminApi } from '../services/admin-api';\nimport {\n readCredentials,\n removeCredentials,\n writeCredentials,\n} from '../services/credentials';\nimport { createDeviceFlow } from '../services/device-flow';\nimport { openBrowser } from '../utils/browser';\nimport { describeTokenExpiry } from '../utils/jwt';\nimport { promptHidden, promptVisible, readAllStdin } from '../utils/terminal';\nimport type { CommandRegistry } from './registry';\nimport { summarizeUser } from './support';\n\nexport interface LoginOptions {\n email?: string;\n passwordStdin?: boolean;\n logout?: boolean;\n show?: boolean;\n /** 用设备码流程登录(RFC 8628),不需要输入密码 */\n device?: boolean;\n /** 只打印验证地址与验证码,不自动打开浏览器 */\n noBrowser?: boolean;\n}\n\nexport const registerLoginCommand = (registry: CommandRegistry): void => {\n const { program, context } = registry;\n\n program\n .command('login')\n .description(\n '登录并保存会话凭据(默认 ~/.config/quanta/credentials.json)',\n )\n .option(\n '--email <email>',\n '账号邮箱(显式走密码登录;也可用 QUANTA_EMAIL)',\n )\n .option(\n '--password-stdin',\n '从标准输入读取密码(显式走密码登录,推荐用于 CI)',\n )\n .option('--show', '只显示当前登录状态,不做登录')\n .option('--logout', '删除本地凭据')\n .option('--device', '用设备码在浏览器里授权登录(默认行为)')\n .option(\n '--no-browser',\n '设备码流程下只打印地址与验证码,不自动打开浏览器',\n )\n .action(async (options: LoginOptions) => {\n const ctx = await context();\n await runLogin(ctx, options);\n });\n};\n\n/** 密码登录是显式选项(默认走设备码):只有给了 --email / --password-stdin 才走密码流程,环境变量不单独切换流程。 */\nconst wantsPasswordFlow = (options: LoginOptions): boolean =>\n Boolean(options.email || options.passwordStdin);\n\nexport const runLogin = async (\n ctx: CommandContext,\n options: LoginOptions,\n): Promise<void> => {\n if (options.logout) {\n const removed = await removeCredentials(ctx.credentialsFile);\n ctx.logger.info(\n removed\n ? `已删除凭据:${ctx.credentialsFile}`\n : `本地没有凭据:${ctx.credentialsFile}`,\n );\n if (ctx.logger.json) ctx.logger.result({ loggedOut: true, removed });\n return;\n }\n\n if (options.show) {\n // 直接读文件而不是用 ctx:--show 需要展示\"文件里到底存了什么\",\n // 而 ctx 已经被环境变量覆盖过(QUANTA_TOKEN 等)。\n const stored = await readCredentials(ctx.credentialsFile);\n const api = createAdminApi(ctx.client);\n let user = stored.user;\n if (ctx.client.hasSession) {\n user = await api.getCurrentUser().catch(() => stored.user);\n }\n ctx.logger.table([\n ['凭据文件', ctx.credentialsFile],\n ['API', ctx.client.baseUrl],\n ['用户', user ? summarizeUser(user) : '<未登录>'],\n ['access token', describeTokenExpiry(stored.cookies.access)],\n ['refresh token', stored.cookies.refresh ? '已保存' : '无'],\n [\n 'csrf token',\n stored.cookies.csrf ? '已保存' : '无(将使用 x-ssr 通道)',\n ],\n ]);\n if (ctx.logger.json) {\n ctx.logger.result({\n credentialsFile: ctx.credentialsFile,\n apiUrl: ctx.client.baseUrl,\n user: user ?? null,\n hasSession: ctx.client.hasSession,\n });\n }\n return;\n }\n\n // 默认设备码:--device 显式指定,或没给任何密码登录参数时都走它\n if (options.device || !wantsPasswordFlow(options)) {\n await runDeviceLogin(ctx, options);\n return;\n }\n\n const email =\n options.email?.trim() ||\n ctx.runtime.env.QUANTA_EMAIL?.trim() ||\n (await promptVisible('邮箱:', {\n stdin: ctx.runtime.stdin,\n stderr: ctx.runtime.stderr,\n }));\n if (!email)\n throw new UsageError('缺少邮箱:用 --email 或 QUANTA_EMAIL 提供');\n\n const password = await resolvePassword(ctx, options);\n\n const api = createAdminApi(ctx.client);\n ctx.logger.step(`登录 ${ctx.client.baseUrl}`);\n const result = await api.login({ email, password });\n\n // 服务端同时下发 cookie(客户端已自动吸收)与 csrfToken 字段;\n // 两者取其一即可,这里把 body 里的值作为兜底,避免 set-cookie 被代理吞掉时无法鉴权。\n if (result.csrfToken && !ctx.client.cookies.csrf) {\n ctx.client.cookies.csrf = result.csrfToken;\n }\n\n await writeCredentials(ctx.credentialsFile, {\n version: 1,\n apiUrl: ctx.env.apiUrl,\n cookies: { ...ctx.client.cookies },\n user: result.user,\n });\n\n ctx.logger.success(`已登录:${summarizeUser(result.user)}`);\n ctx.logger.detail(`凭据已写入 ${ctx.credentialsFile}(权限 0600)`);\n if (result.user.role !== 'ADMIN' && result.user.role !== 'SUPER_ADMIN') {\n ctx.logger.warn(`当前角色是 ${result.user.role},出题接口要求 ADMIN`);\n }\n\n if (ctx.logger.json) {\n ctx.logger.result({\n credentialsFile: ctx.credentialsFile,\n apiUrl: ctx.env.apiUrl,\n user: result.user,\n });\n }\n};\n\n/** 设备码登录(RFC 8628)—— `qpc login` 的默认流程:申请验证码 → 浏览器授权 → 轮询换 token → 写入凭据;密码不经过 CLI 且可复用已有登录态。 */\nconst runDeviceLogin = async (\n ctx: CommandContext,\n options: LoginOptions,\n): Promise<void> => {\n const flow = createDeviceFlow({\n baseUrl: ctx.env.apiUrl,\n fetch: ctx.runtime.fetch as typeof globalThis.fetch,\n logger: ctx.logger,\n ...(ctx.runtime.signal ? { signal: ctx.runtime.signal } : {}),\n timeoutMs: ctx.env.timeoutMs,\n });\n\n ctx.logger.step(`向 ${ctx.env.apiUrl} 申请设备授权码`);\n const auth = await flow.requestCodes();\n\n // RFC §3.3:必须同时展示 verification_uri 与 user_code。 verification_uri_complete 只是便利(预填码),不能替代这两项 —— 用户需要用验证码核对\"待授权的设备就是眼前这台\"(也是 RFC §5.4 的防钓鱼要求)。\n ctx.logger.blank();\n ctx.logger.info('请在浏览器中完成授权:');\n ctx.logger.info(` 地址:${auth.verification_uri}`);\n ctx.logger.info(` 验证码:${ctx.logger.colors.bold(auth.user_code)}`);\n ctx.logger.detail(\n `验证码 ${Math.round(auth.expires_in / 60)} 分钟内有效,请在确认页核对与本终端一致`,\n );\n ctx.logger.blank();\n\n if (!options.noBrowser) {\n const target = auth.verification_uri_complete || auth.verification_uri;\n const opened = await openBrowser(target);\n ctx.logger.detail(\n opened\n ? '已尝试在浏览器中打开授权页面'\n : '无法自动打开浏览器,请手动访问上面的地址',\n );\n }\n\n ctx.logger.step('等待授权完成(Ctrl-C 取消)');\n\n const tokens = await flow.pollForToken(auth, (elapsedMs) => {\n if (ctx.logger.level === 'debug') {\n ctx.logger.detail(\n `仍在等待授权… 已等待 ${Math.round(elapsedMs / 1000)} 秒`,\n );\n }\n });\n\n ctx.client.cookies.access = tokens.access_token;\n ctx.client.cookies.refresh = tokens.refresh_token;\n\n await writeCredentials(ctx.credentialsFile, {\n version: 1,\n apiUrl: ctx.env.apiUrl,\n cookies: { ...ctx.client.cookies },\n });\n\n // 立刻用拿到的 token 查一次用户信息: token 到底能不能用、角色是不是 ADMIN,现在就能告诉用户, 而不是等他跑 upload 时才失败。\n const api = createAdminApi(ctx.client);\n let summary = '已登录';\n try {\n const user = await api.getCurrentUser();\n summary = `已登录:${summarizeUser(user)}`;\n await writeCredentials(ctx.credentialsFile, {\n version: 1,\n apiUrl: ctx.env.apiUrl,\n cookies: { ...ctx.client.cookies },\n user,\n });\n if (user.role !== 'ADMIN' && user.role !== 'SUPER_ADMIN') {\n ctx.logger.warn(\n `当前角色是 ${user.role},出题接口要求 ADMIN,upload/publish 会被拒绝`,\n );\n }\n } catch (error) {\n // 凭据已经落盘成功,取用户信息失败不该让整个登录失败\n ctx.logger.warn(\n `登录成功但读取用户信息失败:${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n ctx.logger.success(summary);\n ctx.logger.detail(`凭据已写入 ${ctx.credentialsFile}(权限 0600)`);\n\n if (ctx.logger.json) {\n ctx.logger.result({\n loginMethod: 'device_code',\n credentialsFile: ctx.credentialsFile,\n apiUrl: ctx.env.apiUrl,\n scope: tokens.scope,\n });\n }\n};\n\nconst resolvePassword = async (\n ctx: CommandContext,\n options: LoginOptions,\n): Promise<string> => {\n const fromEnv = ctx.runtime.env.QUANTA_PASSWORD;\n if (fromEnv) return fromEnv;\n\n if (options.passwordStdin) {\n const value = await readAllStdin(ctx.runtime.stdin);\n if (!value) throw new UsageError('--password-stdin 没有读到内容');\n return value;\n }\n\n if (!ctx.runtime.stdin.isTTY) {\n throw new UsageError('非交互环境下无法提示输入密码', {\n hint: '用 `echo \"$PASSWORD\" | qpc login --password-stdin`,或设置 QUANTA_PASSWORD。',\n });\n }\n\n const value = await promptHidden('密码(不会回显):', {\n stdin: ctx.runtime.stdin,\n stderr: ctx.runtime.stderr,\n });\n if (!value) throw new UsageError('密码为空');\n return value;\n};\n","import type { CommandContext } from '../core/context';\nimport { UsageError } from '../core/errors';\nimport {\n auditRecordOf,\n createAdminApi,\n isAuditSettled,\n} from '../services/admin-api';\nimport { auditToJson, renderAuditDetail } from '../ui/report';\nimport { sleep } from '../utils/async';\nimport type { CommandRegistry } from './registry';\nimport { requireSession } from './support';\n\nexport interface StatusOptions {\n problemId: string;\n watch?: boolean;\n interval?: string;\n}\n\nexport const registerStatusCommand = (registry: CommandRegistry): void => {\n const { program, context } = registry;\n\n program\n .command('status')\n .description('查看题目状态与最近一次审计的检查点明细')\n .argument('<problemId>', '题目版本 id(upload 返回的 pid)')\n .option('--watch', '持续刷新,直到审计出结果(Ctrl-C 退出)')\n .option('--interval <seconds>', '刷新间隔(秒)', '3')\n .action(\n async (\n problemId: string,\n options: Omit<StatusOptions, 'problemId'>,\n ) => {\n const ctx = await context();\n await runStatus(ctx, { problemId, ...options });\n },\n );\n};\n\nexport const runStatus = async (\n ctx: CommandContext,\n options: StatusOptions,\n): Promise<void> => {\n const problemId = parseProblemId(options.problemId);\n requireSession(ctx);\n const api = createAdminApi(ctx.client);\n\n if (!options.watch) {\n const detail = await api.getAuditDetail(problemId);\n renderAuditDetail(ctx.logger, detail, {\n verbose: ctx.logger.level === 'debug',\n });\n if (ctx.logger.json) ctx.logger.result(auditToJson(detail));\n return;\n }\n\n const intervalMs = parseInterval(options.interval);\n let lastSignature = '';\n for (;;) {\n if (ctx.runtime.signal?.aborted) return;\n const detail = await api.getAuditDetail(problemId);\n const record = auditRecordOf(detail);\n const signature = `${detail.status}|${record?.result ?? 'none'}|${record?.score ?? 0}`;\n if (signature !== lastSignature) {\n lastSignature = signature;\n ctx.logger.blank();\n renderAuditDetail(ctx.logger, detail, {\n verbose: ctx.logger.level === 'debug',\n });\n } else {\n ctx.logger.detail(`状态未变化(${signature})`);\n }\n\n if (isAuditSettled(detail)) {\n if (ctx.logger.json) ctx.logger.result(auditToJson(detail));\n ctx.logger.success('审计已出结果,停止刷新');\n return;\n }\n await sleep(intervalMs, ctx.runtime.signal);\n }\n};\n\nexport const parseProblemId = (value: string): number => {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new UsageError(`题目 id 必须是正整数:${value}`, {\n hint: 'id 来自 `qpc upload` 的输出,或管理端题目列表。',\n });\n }\n return parsed;\n};\n\nconst parseInterval = (value: string | undefined): number => {\n const seconds = Number.parseFloat(value ?? '3');\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new UsageError(`--interval 必须是正数(秒):${value}`);\n }\n return seconds * 1_000;\n};\n","import type { CommandContext } from '../core/context';\nimport { UsageError } from '../core/errors';\nimport { createAdminApi } from '../services/admin-api';\nimport type { CommandRegistry } from './registry';\nimport { parseProblemId } from './status';\nimport { requireSession } from './support';\n\nexport interface PublishOptions {\n problemId: string;\n unpublish?: boolean;\n}\n\nexport const registerPublishCommand = (registry: CommandRegistry): void => {\n const { program, context } = registry;\n\n program\n .command('publish')\n .description('发布题目(status: ready → published),或 --unpublish 下架')\n .argument('<problemId>', '题目版本 id')\n .option('--unpublish', '下架(published → ready)')\n .action(\n async (\n problemId: string,\n options: Omit<PublishOptions, 'problemId'>,\n ) => {\n const ctx = await context();\n await runPublish(ctx, { problemId, ...options });\n },\n );\n};\n\nexport const runPublish = async (\n ctx: CommandContext,\n options: PublishOptions,\n): Promise<void> => {\n const problemId = parseProblemId(options.problemId);\n requireSession(ctx);\n const api = createAdminApi(ctx.client);\n\n // 先看状态:服务端只允许 ready / published 之间切换,\n // 提前拦下\"审计还没通过就想发布\"可以省一次 400 与一轮困惑。\n const detail = await api.getAuditDetail(problemId);\n const publish = !options.unpublish;\n\n if (publish && !['ready', 'published'].includes(detail.status)) {\n throw new UsageError(\n `题目 #${problemId} 当前状态是 ${detail.status},不能发布`,\n {\n hint: '只有审计通过(status=ready)的版本才能发布;先 `qpc status <id> --watch` 看审计结果。',\n },\n );\n }\n if (!publish && detail.status !== 'published') {\n throw new UsageError(\n `题目 #${problemId} 当前状态是 ${detail.status},无需下架`,\n );\n }\n\n ctx.logger.step(\n `${publish ? '发布' : '下架'}题目 #${problemId}(${detail.title})`,\n );\n const result = await api.setStatus(problemId, publish);\n ctx.logger.success(result.message);\n\n if (ctx.logger.json) {\n ctx.logger.result({\n problemId,\n publish,\n status: publish ? 'published' : 'ready',\n message: result.message,\n });\n }\n};\n","import { resolve } from 'node:path';\n\nimport type { CommandContext } from '../core/context';\nimport { ConfigError, UsageError } from '../core/errors';\nimport { applyTagIdsUpdate } from '../domain/config-writer';\nimport { findConfigFile, loadProblemConfig } from '../domain/problem-config';\nimport { createAdminApi, type Tag } from '../services/admin-api';\nimport { readText, writeTextAtomic } from '../utils/fs';\nimport { displayPath } from '../utils/paths';\nimport { multiselect } from '../utils/terminal';\nimport type { CommandRegistry } from './registry';\n\nexport interface TagOptions {\n dir: string;\n /** 交互式多选标签并写回配置 */\n write?: boolean;\n /** 直接指定标签 id(逗号或空格分隔),写回配置 */\n set?: string[];\n}\n\nexport const registerTagCommand = (registry: CommandRegistry): void => {\n const { program, context } = registry;\n\n program\n .command('tag')\n .description('查看平台标签;--write 交互多选后把 tagIds 写回配置')\n .argument('[dir]', '题目目录(默认当前目录)', '.')\n .option('--write', '交互式多选标签并写回配置')\n .option('--set <id...>', '直接指定标签 id(逗号或空格分隔),写回配置')\n .action(async (dir: string, options: Omit<TagOptions, 'dir'>) => {\n const ctx = await context();\n await runTag(ctx, { dir, ...options });\n });\n};\n\nexport const runTag = async (\n ctx: CommandContext,\n options: TagOptions,\n): Promise<void> => {\n if (options.write && options.set !== undefined) {\n throw new UsageError('--write 与 --set 不能同时使用', {\n hint: '--write 是交互多选,--set 是直接指定 id,二选一。',\n });\n }\n\n const api = createAdminApi(ctx.client);\n ctx.logger.step('读取平台标签(public.tag.list)');\n const tags = await api.listTags();\n\n // 只查看不写回:不需要题目目录,也不需要登录。\n if (!options.write && options.set === undefined) {\n renderTags(ctx, tags);\n if (ctx.logger.json) ctx.logger.result({ tags });\n return;\n }\n\n if (tags.length === 0) {\n throw new UsageError('平台上还没有标签,无法配置', {\n hint: '先在管理端「标签管理」创建标签,再重跑。',\n });\n }\n\n const rootDir = resolve(ctx.cwd, options.dir);\n const configFile = await findConfigFile(rootDir);\n\n const tagIds =\n options.set !== undefined\n ? assertTagsExist(parseTagIds(options.set), tags)\n : await pickTags(ctx, tags, await readCurrentTagIds(configFile));\n\n const written = await writeBackTagIds(configFile, tagIds);\n ctx.logger.blank();\n renderTags(ctx, tags, new Set(tagIds));\n ctx.logger.success(\n `tagIds 已写回 ${displayPath(ctx.cwd, written)}:[${tagIds.join(', ')}]`,\n );\n\n if (ctx.logger.json) {\n ctx.logger.result({\n tagIds,\n tags,\n configFile,\n });\n }\n};\n\nconst renderTags = (\n ctx: CommandContext,\n tags: Tag[],\n selected?: Set<number>,\n): void => {\n if (tags.length === 0) {\n ctx.logger.warn('平台上还没有标签');\n return;\n }\n const { colors } = ctx.logger;\n ctx.logger.step(`平台标签(${tags.length} 个)`);\n for (const tag of tags) {\n const mark = selected\n ? selected.has(tag.tid)\n ? colors.green('●')\n : colors.dim('○')\n : colors.dim('·');\n const color = tag.color ? colors.dim(tag.color) : '';\n ctx.logger.info(` ${mark} #${tag.tid} ${tag.name} ${color}`);\n if (tag.description) ctx.logger.detail(tag.description);\n }\n};\n\nconst pickTags = async (\n ctx: CommandContext,\n tags: Tag[],\n current: number[],\n): Promise<number[]> => {\n const chosen = await multiselect(\n '选择本题的标签(空格切换,回车确认)',\n tags.map((tag) => ({\n value: String(tag.tid),\n label: `#${tag.tid} ${tag.name}`,\n ...(tag.color ? { hint: tag.color } : {}),\n })),\n {\n stdin: ctx.runtime.stdin,\n stderr: ctx.runtime.stderr,\n stderrStream: ctx.runtime.stderrStream,\n },\n { initialValues: current.map(String), required: true },\n );\n return chosen.map((value) => Number.parseInt(value, 10));\n};\n\n// 配置里已有的 tagIds,用于多选预选中;缺 tagIds 的旧配置也能读(不跑 schema)。\nconst readCurrentTagIds = async (configFile: string): Promise<number[]> => {\n const content = await readText(configFile);\n const match = /\\btagIds\\s*:\\s*\\[([^\\]]*)\\]/.exec(content);\n if (!match) return [];\n return (match[1] ?? '')\n .split(',')\n .map((part) => Number.parseInt(part.trim(), 10))\n .filter((id) => Number.isInteger(id) && id > 0);\n};\n\nconst parseTagIds = (values: string[]): number[] => {\n const parts = values\n .flatMap((value) => value.split(','))\n .map((part) => part.trim())\n .filter(Boolean);\n const parsed = parts.map((part) => Number.parseInt(part, 10));\n if (\n parsed.length === 0 ||\n parsed.some((id) => !Number.isInteger(id) || id <= 0)\n ) {\n throw new UsageError(`标签 id 必须是正整数:${parts.join(', ')}`, {\n hint: '运行 `qpc tag` 查看可用 id。',\n });\n }\n return parsed;\n};\n\nconst assertTagsExist = (tagIds: number[], tags: Tag[]): number[] => {\n const known = new Set(tags.map((tag) => tag.tid));\n const missing = tagIds.filter((id) => !known.has(id));\n if (missing.length > 0) {\n throw new UsageError(`标签不存在:${missing.join(', ')}`, {\n hint: `可用 id:${tags\n .map((tag) => tag.tid)\n .join(', ')}(\\`qpc tag\\` 看名称)。`,\n });\n }\n return tagIds;\n};\n\n// 写完重新加载校验,对不上就回滚(与 problemId / imageId 写回同一套做法)。\nconst writeBackTagIds = async (\n configFile: string,\n tagIds: number[],\n): Promise<string> => {\n const original = await readText(configFile);\n const patched = applyTagIdsUpdate(original, tagIds, configFile);\n await writeTextAtomic(configFile, patched);\n try {\n const reloaded = await loadProblemConfig(resolve(configFile, '..'));\n const same =\n reloaded.tagIds.length === tagIds.length &&\n reloaded.tagIds.every((id, index) => id === tagIds[index]);\n if (!same) throw new Error('写回后读取到的 tagIds 与预期不一致');\n } catch (error) {\n await writeTextAtomic(configFile, original);\n throw new ConfigError('写回 tagIds 后配置校验失败,已回滚原文件', {\n cause: error,\n hint: `手动把 tagIds 填成 [${tagIds.join(', ')}]。`,\n });\n }\n return configFile;\n};\n","import { relative, resolve } from 'node:path';\n\nimport type { CommandContext } from '../core/context';\nimport { ConfigError, PrecheckError, UsageError } from '../core/errors';\nimport { applyProblemIdUpdate } from '../domain/config-writer';\nimport { loadProblemConfig } from '../domain/problem-config';\nimport { type ValidationReport, validateProblem } from '../domain/validate';\nimport {\n type AuditDetail,\n auditRecordOf,\n createAdminApi,\n isAuditSettled,\n} from '../services/admin-api';\nimport {\n renderAuditDetail,\n renderFindings,\n validationToJson,\n} from '../ui/report';\nimport { poll } from '../utils/async';\nimport { readText, writeTextAtomic } from '../utils/fs';\nimport { formatBytes } from '../utils/paths';\nimport type { CommandRegistry } from './registry';\nimport { parseProblemId } from './status';\nimport { confirmOrSkip, requireSession } from './support';\n\nexport interface UploadOptions {\n dir: string;\n /** 只打印将要提交的内容,不发请求 */\n dryRun?: boolean;\n /** 跳过预检(不推荐:等于把静态错误留给线上) */\n skipCheck?: boolean;\n /** 上传后等待审计结果,默认 true */\n wait?: boolean;\n /** 审计等待超时(秒) */\n timeout?: string;\n /** 轮询间隔(秒) */\n interval?: string;\n /** 在该题目 id 下追加新版本(覆盖配置里的 problemId) */\n problem?: string;\n /** 强制新建题目,忽略配置 / 参数里的 problemId */\n new?: boolean;\n /** 把本次使用的题目 id 写回配置 */\n write?: boolean;\n}\n\nexport const registerUploadCommand = (registry: CommandRegistry): void => {\n const { program, context } = registry;\n\n program\n .command('upload')\n .description('上传题目(新建或追加版本)并可等待线上审计结果')\n .argument('[dir]', '题目目录(默认当前目录)', '.')\n .option('--dry-run', '只做预检并打印将要提交的内容')\n .option('--skip-check', '跳过预检(不建议)')\n .option('--no-wait', '上传后不等待审计')\n .option(\n '--problem <pid>',\n '在该题目下追加新版本(覆盖配置里的 problemId)',\n )\n .option('--new', '强制新建题目(忽略配置里的 problemId)')\n .option('--write', '把本次使用的题目 id 写回配置')\n .option('--timeout <seconds>', '审计等待超时(秒)', '180')\n .option('--interval <seconds>', '审计状态轮询间隔(秒)', '2')\n .action(async (dir: string, options: Omit<UploadOptions, 'dir'>) => {\n const ctx = await context();\n await runUpload(ctx, { dir, ...options });\n });\n};\n\nexport const runUpload = async (\n ctx: CommandContext,\n options: UploadOptions,\n): Promise<void> => {\n const rootDir = resolve(ctx.cwd, options.dir);\n const config = await loadProblemConfig(rootDir);\n\n // --new 与 --problem 语义互斥,提前拦下比让服务端猜好。\n if (options.new && options.problem !== undefined) {\n throw new UsageError('--new 与 --problem 不能同时使用', {\n hint: '要新建题目就别指定 --problem;要追加版本就别加 --new。',\n });\n }\n // 本次要追加版本的题目 id:--problem > 配置里的 problemId;--new 一律新建。\n const targetProblemId = resolveTargetProblemId(options, config.problemId);\n\n let report: ValidationReport;\n if (options.skipCheck) {\n ctx.logger.warn(\n '已跳过预检(--skip-check):静态错误会留到线上审计才暴露',\n );\n report = await validateProblem(config, {\n maxUploadBytes: ctx.env.maxUploadBytes,\n });\n } else {\n report = await validateProblem(config, {\n maxUploadBytes: ctx.env.maxUploadBytes,\n });\n renderFindings(ctx.logger, report.findings);\n if (!report.ok) {\n throw new PrecheckError(\n `预检未通过:${report.errors} 个错误,已中止上传`,\n {\n hint: '修复后重跑;确实要强行上传时用 --skip-check。',\n },\n );\n }\n }\n\n const judgeScript = await readText(config.paths.judge);\n const payload = {\n title: config.title,\n detail: config.detail,\n tagIds: config.tagIds,\n difficulty: config.difficulty,\n totalScore: report.totalScore,\n judgeScript,\n answerTemplateSnapshot: report.templateSnapshot,\n referenceAnswerSnapshot: report.answerSnapshot,\n coverMode: config.cover.mode,\n ...(config.cover.mode === 'custom'\n ? { coverImageId: config.cover.imageId }\n : {}),\n ...(config.runtime.bootCommand\n ? { bootCommand: config.runtime.bootCommand }\n : {}),\n ...(config.runtime.buildCommand\n ? { buildCommand: config.runtime.buildCommand }\n : {}),\n initCommand: config.runtime.initCommand,\n judgeUploadPath: config.runtime.judgeUploadPath,\n problemType: config.type,\n ...(config.runtime.serviceImage\n ? { serviceImage: config.runtime.serviceImage }\n : {}),\n servicePort: config.runtime.servicePort,\n };\n\n const payloadBytes =\n Buffer.byteLength(judgeScript, 'utf8') +\n report.stats.template.totalBytes +\n report.stats.answer.totalBytes;\n\n ctx.logger.step('上传内容摘要');\n ctx.logger.table([\n ['标题', config.title],\n ['难度 / 总分', `${config.difficulty} / ${report.totalScore}`],\n ['标签', config.tagIds.join(', ')],\n ['判题打包目录', config.runtime.judgeUploadPath],\n ['题型', config.type],\n ['启动命令', config.runtime.initCommand ?? '<默认>'],\n ['答案模板', `${report.stats.template.fileCount} 个文件`],\n ['参考解', `${report.stats.answer.fileCount} 个文件`],\n ['判题脚本', `${Buffer.byteLength(judgeScript, 'utf8')} 字节`],\n ['请求体', formatBytes(payloadBytes)],\n [\n '目标',\n targetProblemId === undefined\n ? '新建题目'\n : `题目 #${targetProblemId} 的新版本`,\n ],\n [\n '接口',\n `${ctx.env.apiUrl} → ${\n targetProblemId === undefined\n ? 'admin.problem.upload'\n : 'admin.problem.reupload'\n }`,\n ],\n ]);\n\n if (options.dryRun) {\n ctx.logger.success('--dry-run:未发起任何请求');\n if (ctx.logger.json) {\n ctx.logger.result({\n dryRun: true,\n mode: targetProblemId === undefined ? 'create' : 'version',\n targetProblemId,\n payload: {\n ...payload,\n judgeScript: `<${judgeScript.length} 字符>`,\n answerTemplateSnapshot: `<${report.stats.template.fileCount} 个文件>`,\n referenceAnswerSnapshot: `<${report.stats.answer.fileCount} 个文件>`,\n },\n validation: validationToJson(report),\n });\n }\n return;\n }\n\n requireSession(ctx);\n const api = createAdminApi(ctx.client);\n\n // 追加版本时服务端要的是基础题 id(baseId),先按题目 id 查出来。\n let baseId: number | undefined;\n if (targetProblemId !== undefined) {\n ctx.logger.step(`查找题目 #${targetProblemId} 的基础题 id`);\n const target = await api.getAuditDetail(targetProblemId);\n baseId = target.BaseProblem?.id;\n if (baseId === undefined) {\n throw new PrecheckError(\n `题目 #${targetProblemId} 没有关联的基础题,无法追加版本`,\n {\n hint: '确认这个 id 来自 `qpc upload` / 管理端,且属于当前账号。',\n },\n );\n }\n }\n\n await confirmOrSkip(\n ctx,\n targetProblemId === undefined\n ? '确认创建新题目?'\n : `确认在题目 #${targetProblemId} 下创建新版本?`,\n );\n\n ctx.logger.step(\n baseId === undefined ? '提交 upload 请求' : '提交 reupload 请求',\n );\n const created =\n baseId === undefined\n ? await api.uploadProblem(payload)\n : await api.reuploadProblem({ ...payload, baseId });\n const problemId = created.problemId;\n ctx.logger.success(\n baseId === undefined\n ? `题目已创建:#${problemId}(${created.message})`\n : `新版本已创建:#${problemId}(${created.message})`,\n );\n\n // 只在整条命令成功后写回:失败时留下 problemId 会把配置指向一道没通过的题。\n const writeBackIfRequested = async (): Promise<void> => {\n if (!options.write) return;\n const written = await writeBackProblemId(config.configFile, problemId);\n ctx.logger.success(\n `problemId 已写回 ${relative(ctx.cwd, written) || written}`,\n );\n };\n\n if (!options.write) {\n if (targetProblemId === undefined && config.problemId === undefined) {\n ctx.logger.info(\n ` 加 --write 可把 problemId: ${problemId} 写回配置,之后上传默认在该题目下追加版本`,\n );\n } else if (options.new && config.problemId !== undefined) {\n ctx.logger.warn(\n ` 配置里的 problemId: ${config.problemId} 仍指向旧题目;要改用新题目请加 --write`,\n );\n }\n }\n\n if (options.wait === false) {\n await writeBackIfRequested();\n ctx.logger.info(` 审计状态:qpc status ${problemId} --watch`);\n if (ctx.logger.json) ctx.logger.result({ problemId, waited: false });\n return;\n }\n\n const detail = await waitForAudit(\n ctx,\n problemId,\n options.timeout,\n options.interval,\n );\n const passed = renderAuditDetail(ctx.logger, detail, {\n verbose: ctx.logger.level === 'debug',\n });\n\n if (ctx.logger.json) ctx.logger.result({ problemId, waited: true, detail });\n\n if (!passed) {\n const hasRecord = auditRecordOf(detail) !== undefined;\n const reason = hasRecord\n ? '看上面的检查点明细:分数不等通常是\"参考解拿不到满分\"或\"totalScore 与检查点之和不一致\"。'\n : '题目状态已置为 invalid,但判题记录没有写回:多半是判题机/容器出结果前就崩了,看调度器日志。';\n throw new PrecheckError(`题目 #${problemId} 审计未通过`, {\n hint: options.write\n ? `${reason}(--write 已跳过:审计未通过不写回 problemId)`\n : reason,\n });\n }\n\n await writeBackIfRequested();\n ctx.logger.success(`审计通过:${detail.totalScore} 分满分`);\n ctx.logger.info(` 发布:qpc publish ${problemId}`);\n};\n\n/** 轮询审计状态直到 judgeRecord 不再是 pending */\nexport const waitForAudit = async (\n ctx: CommandContext,\n problemId: number,\n timeoutSeconds?: string,\n intervalSeconds?: string,\n): Promise<AuditDetail> => {\n const api = createAdminApi(ctx.client);\n const timeoutMs = parsePositiveSeconds(timeoutSeconds, 180) * 1_000;\n const intervalMs = parsePositiveSeconds(intervalSeconds, 2) * 1_000;\n ctx.logger.step(`等待审计结果(最多 ${Math.round(timeoutMs / 1000)} 秒)`);\n\n const detail = await poll<AuditDetail>({\n intervalMs,\n timeoutMs,\n signal: ctx.runtime.signal,\n probe: async () => {\n const current = await api.getAuditDetail(problemId);\n if (isAuditSettled(current)) return current;\n ctx.logger.detail(`审计进行中…(status=${current.status})`);\n return undefined;\n },\n });\n\n if (!detail) {\n throw new PrecheckError(`等待审计超时(题目 #${problemId})`, {\n hint: `可能原因:调度器未运行 / 判题机容器起不来。检查 qpc status ${problemId},并看调度器日志。`,\n });\n }\n\n return detail;\n};\n\n/** 秒数参数统一在这里校验:负数/NaN 必须变成用法错误而不是静默取默认值 */\nconst parsePositiveSeconds = (\n value: string | undefined,\n fallback: number,\n): number => {\n if (value === undefined) return fallback;\n const seconds = Number.parseFloat(value);\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new UsageError(`时间参数必须是正数(秒):${value}`);\n }\n return seconds;\n};\n\n/** 本次要追加版本的题目 id:--problem > 配置里的 problemId;--new 一律新建 */\nconst resolveTargetProblemId = (\n options: UploadOptions,\n configuredProblemId: number | undefined,\n): number | undefined => {\n if (options.new) return undefined;\n if (options.problem !== undefined) return parseProblemId(options.problem);\n return configuredProblemId;\n};\n\n// 写回后重新加载配置验证,对不上就回滚(同 qpc cover --write)。\nconst writeBackProblemId = async (\n configFile: string,\n problemId: number,\n): Promise<string> => {\n const original = await readText(configFile);\n const patched = applyProblemIdUpdate(original, problemId, configFile);\n await writeTextAtomic(configFile, patched);\n try {\n const reloaded = await loadProblemConfig(resolve(configFile, '..'));\n if (reloaded.problemId !== problemId) {\n throw new Error('写回后读取到的 problemId 与预期不一致');\n }\n } catch (error) {\n await writeTextAtomic(configFile, original);\n throw new ConfigError('写回 problemId 后配置校验失败,已回滚原文件', {\n cause: error,\n hint: `手动把 problemId: ${problemId} 填进配置。`,\n });\n }\n return configFile;\n};\n","import { registerCheckCommand } from './check';\nimport { registerCoverCommand } from './cover';\nimport { registerDoctorCommand } from './doctor';\nimport { registerInitCommand } from './init';\nimport { registerLoginCommand } from './login';\nimport { registerPublishCommand } from './publish';\nimport type { CommandRegistry } from './registry';\nimport { registerStatusCommand } from './status';\nimport { registerTagCommand } from './tag';\nimport { registerUploadCommand } from './upload';\n\nexport type { CommandRegistry } from './registry';\n\n/** 命令清单(也是 `qpc --help` 的顺序):按出题人实际使用顺序排,登录与自检放最后。 */\nexport const registerCommands = (registry: CommandRegistry): void => {\n registerInitCommand(registry);\n registerCheckCommand(registry);\n registerCoverCommand(registry);\n registerTagCommand(registry);\n registerUploadCommand(registry);\n registerStatusCommand(registry);\n registerPublishCommand(registry);\n registerLoginCommand(registry);\n registerDoctorCommand(registry);\n};\n","import { ApiError, isAbortError, NetworkError } from '../core/errors';\nimport type { Logger } from '../core/logger';\nimport { CLI_VERSION } from '../version';\nimport type { CookieJar } from './credentials';\n\nexport type FetchLike = (\n input: string,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface HttpClientOptions {\n baseUrl: string;\n fetch: FetchLike;\n cookies: CookieJar;\n logger: Pick<Logger, 'debug' | 'warn'>;\n timeoutMs?: number;\n signal?: AbortSignal;\n /** 令牌刷新后回写凭据文件 */\n onCookiesChanged?: (cookies: CookieJar) => void | Promise<void>;\n}\n\nexport interface CallOptions {\n input?: unknown;\n method?: 'GET' | 'POST';\n signal?: AbortSignal;\n}\n\n/** tRPC 非批量(httpLink)的响应信封;仓库未启用 transformer,因此没有 json 包装层 */\ninterface TrpcSuccess {\n result: { data: unknown };\n}\ninterface TrpcFailure {\n error: {\n json: {\n message?: string;\n code?: number;\n data?: {\n code?: string;\n httpStatus?: number;\n traceId?: string;\n zodError?: unknown;\n };\n };\n };\n}\n\nconst COOKIE_NAMES = {\n access: 'quanta_access_token',\n refresh: 'quanta_refresh_token',\n csrf: 'quanta_csrf_token',\n} as const;\n\nexport class HttpClient {\n readonly baseUrl: string;\n cookies: CookieJar;\n private readonly options: HttpClientOptions;\n private refreshing: Promise<boolean> | undefined;\n\n constructor(options: HttpClientOptions) {\n this.options = options;\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.cookies = { ...options.cookies };\n }\n\n get hasSession(): boolean {\n return Boolean(this.cookies.access || this.cookies.refresh);\n }\n\n private url(path: string): string {\n if (/^https?:\\/\\//i.test(path)) return path;\n return `${this.baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n }\n\n private headers(extra: Record<string, string> = {}): Record<string, string> {\n const headers: Record<string, string> = {\n accept: 'application/json',\n 'user-agent': `qpc/${CLI_VERSION} (quanta-problem-creator)`,\n ...extra,\n };\n\n const cookie = Object.entries(COOKIE_NAMES)\n .map(([key, name]) => {\n const value = this.cookies[key as keyof CookieJar];\n return value ? `${name}=${value}` : undefined;\n })\n .filter((entry): entry is string => Boolean(entry))\n .join('; ');\n if (cookie) headers.cookie = cookie;\n\n // 只有 access token(如 CI 注入 QUANTA_TOKEN)没有 csrf 值时,退回 `x-ssr: 1`。\n if (this.cookies.csrf) {\n headers['x-csrf-token'] = this.cookies.csrf;\n } else {\n headers['x-ssr'] = '1';\n }\n\n return headers;\n }\n\n /** 解析 set-cookie 并并入 cookie jar,返回是否有变化 */\n private absorbCookies(response: Response): boolean {\n const raw = response.headers.getSetCookie?.() ?? [];\n if (raw.length === 0) return false;\n let changed = false;\n for (const entry of raw) {\n const [pair] = entry.split(';');\n if (!pair) continue;\n const index = pair.indexOf('=');\n if (index <= 0) continue;\n const name = pair.slice(0, index).trim();\n const value = pair.slice(index + 1).trim();\n for (const [key, cookieName] of Object.entries(COOKIE_NAMES)) {\n if (name !== cookieName) continue;\n const slot = key as keyof CookieJar;\n if (value === '') {\n delete this.cookies[slot];\n } else if (this.cookies[slot] !== value) {\n this.cookies[slot] = value;\n } else {\n continue;\n }\n changed = true;\n }\n }\n return changed;\n }\n\n private async persistCookies(): Promise<void> {\n await this.options.onCookiesChanged?.(this.cookies);\n }\n\n /** 低层请求:负责超时、错误分类与 cookie 吸收,不做 tRPC 解码 */\n async request(\n path: string,\n init: RequestInit & { timeoutMs?: number } = {},\n ): Promise<Response> {\n const url = this.url(path);\n const timeoutMs = init.timeoutMs ?? this.options.timeoutMs ?? 15_000;\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n const signal = init.signal\n ? AbortSignal.any([init.signal, timeoutSignal])\n : timeoutSignal;\n\n // 会话头须统一注入而非只给写请求加:GET 查询同样需要 cookie 与 csrf,漏掉会表现为\"查询全 401 而写接口正常\"。\n const headers: Record<string, string> = {\n ...this.headers(),\n ...((init.headers as Record<string, string> | undefined) ?? {}),\n };\n\n this.options.logger.debug(`${init.method ?? 'GET'} ${url}`);\n let response: Response;\n try {\n response = await this.options.fetch(url, { ...init, headers, signal });\n } catch (error) {\n if (isAbortError(error)) {\n throw new NetworkError(`请求超时或已取消:${url}`, {\n cause: error,\n details: { url, timeoutMs },\n hint: '确认服务已启动(docker compose up -d),或调大 QUANTA_HTTP_TIMEOUT。',\n });\n }\n throw new NetworkError(`无法连接 ${url}`, {\n cause: error,\n details: { url },\n hint: '确认 API 地址正确且服务已启动:qpc doctor',\n });\n }\n\n if (this.absorbCookies(response)) await this.persistCookies();\n return response;\n }\n\n /** 调用 tRPC procedure。path 形如 `admin.problem.upload` */\n async call<T>(path: string, options: CallOptions = {}): Promise<T> {\n const method = options.method ?? 'POST';\n const endpoint = `/api/trpc/${path}`;\n\n // 只刷新一次:服务端持续返回 401 时(例如账号被降权)不能无限循环刷新。\n const send = async (retried = false): Promise<T> => {\n const response =\n method === 'GET'\n ? await this.request(\n `${endpoint}?input=${encodeURIComponent(JSON.stringify(options.input ?? null))}`,\n { method: 'GET', signal: options.signal },\n )\n : await this.request(endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(options.input ?? null),\n signal: options.signal,\n });\n\n const text = await response.text();\n const payload = parseJson(text);\n\n if (response.ok && isTrpcSuccess(payload))\n return payload.result.data as T;\n\n if (\n response.status === 401 &&\n !retried &&\n (await this.refreshSession())\n ) {\n return send(true);\n }\n\n throw this.toApiError(response, payload, endpoint);\n };\n\n return send();\n }\n\n /** 用 refresh token 换新的 access token(GET /api/refresh);token 仅 15 分钟,刷新是必需路径。 */\n async refreshSession(): Promise<boolean> {\n if (this.refreshing) return this.refreshing;\n if (!this.cookies.refresh) return false;\n\n this.refreshing = (async () => {\n try {\n const response = await this.request('/api/refresh', {\n method: 'GET',\n });\n if (!response.ok) {\n this.options.logger.warn(\n '刷新登录状态失败,请重新执行 `qpc login`',\n );\n return false;\n }\n await response.arrayBuffer();\n this.options.logger.debug('access token 已刷新');\n return Boolean(this.cookies.access);\n } catch {\n return false;\n } finally {\n this.refreshing = undefined;\n }\n })();\n\n return this.refreshing;\n }\n\n private toApiError(\n response: Response,\n payload: unknown,\n path: string,\n ): ApiError {\n const failure = payload as TrpcFailure | undefined;\n const json = failure?.error?.json;\n const message = json?.message ?? `HTTP ${response.status}`;\n const status = json?.data?.httpStatus ?? response.status;\n\n if (status === 401 || status === 403) {\n return new ApiError(message, {\n status,\n path,\n details: { code: json?.data?.code, traceId: json?.data?.traceId },\n hint:\n status === 401\n ? '登录状态已失效:qpc login --force 重新登录。'\n : '当前账号没有管理员权限(出题接口要求 role=ADMIN)。',\n });\n }\n\n return new ApiError(message, {\n status,\n path,\n details: {\n code: json?.data?.code,\n traceId: json?.data?.traceId,\n zodError: json?.data?.zodError,\n },\n });\n }\n}\n\nconst parseJson = (text: string): unknown => {\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n};\n\nconst isTrpcSuccess = (payload: unknown): payload is TrpcSuccess =>\n typeof payload === 'object' &&\n payload !== null &&\n 'result' in payload &&\n typeof (payload as TrpcSuccess).result?.data !== 'undefined';\n","import { resolveConfigDir } from '../services/credentials';\n\nexport const DEFAULT_API_URL = 'http://localhost:3000';\nexport const DEFAULT_HTTP_TIMEOUT_MS = 15_000;\n/** 5 MiB:与任务快照的实际体量匹配,超过基本意味着把构建产物打进去了 */\nexport const DEFAULT_MAX_UPLOAD_BYTES = 5 * 1024 * 1024;\n\nexport interface EnvConfig {\n /** 生效地址(命令行参数 > QUANTA_API_URL > 凭据文件 > 此默认值,见 createCommandContext) */\n apiUrl: string;\n /** 仅在显式设置 `QUANTA_API_URL` 时存在;用于让环境变量压过凭据里记住的地址 */\n apiUrlFromEnv: string | undefined;\n token: string | undefined;\n timeoutMs: number;\n maxUploadBytes: number;\n configDir: string;\n}\n\nconst parsePositiveInt = (\n value: string | undefined,\n fallback: number,\n): number => {\n if (!value) return fallback;\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n};\n\n/** 环境变量是\"默认值层\",命令行参数优先级更高;显式设置的 QUANTA_API_URL 也压过凭据文件(在 createCommandContext 里叠加) */\nexport const resolveEnvConfig = (\n env: NodeJS.ProcessEnv = process.env,\n): EnvConfig => {\n const apiUrlFromEnv = env.QUANTA_API_URL?.trim() || undefined;\n return {\n apiUrl: apiUrlFromEnv || DEFAULT_API_URL,\n apiUrlFromEnv,\n token: env.QUANTA_TOKEN?.trim() || undefined,\n timeoutMs: parsePositiveInt(\n env.QUANTA_HTTP_TIMEOUT,\n DEFAULT_HTTP_TIMEOUT_MS,\n ),\n maxUploadBytes: parsePositiveInt(\n env.QUANTA_MAX_UPLOAD_BYTES,\n DEFAULT_MAX_UPLOAD_BYTES,\n ),\n configDir: resolveConfigDir(env),\n };\n};\n","import { createColors } from 'picocolors';\n\n/** picocolors 的类型入口是 `export =`,拿不到具名类型导出,用 ReturnType 取 */\ntype Colors = ReturnType<typeof createColors>;\n\nexport const LOG_LEVELS = ['silent', 'error', 'warn', 'info', 'debug'] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\n/** 语义级别 -> OTel severity_number / severity_text(docs/LOG_REPORTING_PROTOCOL.md §5)。 */\nconst OTEL_SEVERITY: Record<\n Exclude<LogLevel, 'silent'>,\n { number: number; text: string }\n> = {\n error: { number: 17, text: 'ERROR' },\n warn: { number: 13, text: 'WARN' },\n info: { number: 9, text: 'INFO' },\n debug: { number: 5, text: 'DEBUG' },\n};\n\nexport const LOG_LEVEL_RANK: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n};\n\nexport const isLogLevel = (value: string): value is LogLevel =>\n (LOG_LEVELS as readonly string[]).includes(value);\n\nexport interface Logger {\n readonly level: LogLevel;\n readonly json: boolean;\n error(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n info(message: string, meta?: Record<string, unknown>): void;\n debug(message: string, meta?: Record<string, unknown>): void;\n /** 步骤标题:▸ 解析配置 */\n step(message: string): void;\n /** 成功项:✔ 审计通过 */\n success(message: string): void;\n /** 失败项:✖ 检查点缺少 return */\n fail(message: string): void;\n /** 缩进的补充信息 */\n detail(message: string): void;\n /** 空行:避免出现 `[i] ` 这种带前缀的空行 */\n blank(): void;\n /** 机器可读结果,写到 stdout(--json 时是人类可读输出的替代品) */\n result(payload: unknown): void;\n colors: Colors;\n /** 两列对齐表格,用于 findings / 状态清单 */\n table(rows: Array<[string, string]>): void;\n}\n\nexport interface LoggerOptions {\n level?: LogLevel;\n json?: boolean;\n color?: boolean;\n stdout?: (chunk: string) => void;\n stderr?: (chunk: string) => void;\n}\n\nconst write = (target: (chunk: string) => void, line: string) =>\n target(`${line}\\n`);\n\n/** 输出通道约定:stdout = 命令结果(含 --json),stderr = 诊断信息;保证 `qpc --json | jq` 拿到干净的 JSON。 */\nexport const createLogger = (options: LoggerOptions = {}): Logger => {\n const level = options.level ?? 'info';\n const json = options.json ?? false;\n // --json 模式下禁用着色:body 与 attributes 会被机器消费,ANSI 码会污染字段值。\n const colors = createColors(json ? false : (options.color ?? true));\n const stdout =\n options.stdout ?? ((chunk: string) => process.stdout.write(chunk));\n const stderr =\n options.stderr ?? ((chunk: string) => process.stderr.write(chunk));\n\n const enabled = (candidate: LogLevel) =>\n LOG_LEVEL_RANK[candidate] <= LOG_LEVEL_RANK[level] && level !== 'silent';\n\n const emit = (\n candidate: Exclude<LogLevel, 'silent'>,\n symbol: string,\n message: string,\n meta?: Record<string, unknown>,\n stream: 'stdout' | 'stderr' = 'stderr',\n ) => {\n if (!enabled(candidate)) return;\n if (json) {\n // --json 模式:按 LOG_REPORTING_PROTOCOL 输出 OTel 风格 JSON Lines 到\n // stderr(stdout 仍保留给命令结果,见上方通道约定)。\n const severity = OTEL_SEVERITY[candidate];\n const attributes =\n meta && Object.keys(meta).length > 0 ? meta : undefined;\n write(\n stderr,\n JSON.stringify({\n timestamp: new Date().toISOString(),\n severity_number: severity.number,\n severity_text: severity.text,\n body: message,\n ...(attributes ? { attributes } : {}),\n resource: { 'service.name': 'challenge-problem-creator-cli' },\n }),\n );\n return;\n }\n const target = stream === 'stdout' ? stdout : stderr;\n const label = symbol ? `${symbol} ` : '';\n write(target, `${label}${message}`);\n if (meta && Object.keys(meta).length > 0) {\n write(target, colors.dim(` ${JSON.stringify(meta)}`));\n }\n };\n\n const symbols = colors.isColorSupported\n ? {\n info: colors.blue('ℹ'),\n warn: colors.yellow('▲'),\n error: colors.red('✖'),\n step: colors.cyan('▸'),\n success: colors.green('✔'),\n fail: colors.red('✖'),\n }\n : {\n info: '[i]',\n warn: '[!]',\n error: '[x]',\n step: '>',\n success: '[ok]',\n fail: '[x]',\n };\n\n return {\n level,\n json,\n colors,\n error: (message, meta) => emit('error', symbols.error, message, meta),\n warn: (message, meta) =>\n emit('warn', symbols.warn, colors.yellow(message), meta),\n info: (message, meta) =>\n emit('info', symbols.info, message, meta, 'stdout'),\n debug: (message, meta) =>\n emit('debug', colors.dim('·'), colors.dim(message), meta),\n step: (message) =>\n emit('info', symbols.step, colors.bold(message), undefined, 'stdout'),\n success: (message) =>\n emit(\n 'info',\n symbols.success,\n colors.green(message),\n undefined,\n 'stdout',\n ),\n fail: (message) => emit('error', symbols.fail, colors.red(message)),\n detail: (message) =>\n emit('info', '', colors.dim(` ${message}`), undefined, 'stdout'),\n blank: () => {\n if (json || level === 'silent') return;\n write(stderr, '');\n },\n result: (payload) => {\n write(stdout, json ? JSON.stringify(payload) : String(payload));\n },\n table: (rows) => {\n if (json || rows.length === 0) return;\n const width = Math.max(...rows.map(([key]) => displayWidth(key)));\n for (const [key, value] of rows) {\n const pad = ' '.repeat(Math.max(0, width - displayWidth(key)));\n write(stdout, ` ${key}${pad} ${value}`);\n }\n },\n };\n};\n\n/** CJK 字符占两列宽,表格对齐必须区分处理,否则中文键名会错位 */\nconst displayWidth = (text: string): number => {\n let width = 0;\n for (const char of text) {\n const code = char.codePointAt(0) ?? 0;\n width += code >= 0x1100 && isWide(code) ? 2 : 1;\n }\n return width;\n};\n\nconst isWide = (code: number): boolean =>\n (code >= 0x1100 && code <= 0x115f) ||\n (code >= 0x2e80 && code <= 0xa4cf) ||\n (code >= 0xac00 && code <= 0xd7a3) ||\n (code >= 0xf900 && code <= 0xfaff) ||\n (code >= 0xfe30 && code <= 0xfe6f) ||\n (code >= 0xff00 && code <= 0xff60) ||\n (code >= 0xffe0 && code <= 0xffe6);\n","import { resolve } from 'node:path';\n\nimport {\n type Credentials,\n credentialsPath,\n readCredentials,\n writeCredentials,\n} from '../services/credentials';\nimport { HttpClient } from '../services/http';\nimport { type EnvConfig, resolveEnvConfig } from './env';\nimport { createLogger, type Logger, type LogLevel } from './logger';\nimport type { CliRuntime } from './runtime';\n\n/** 全局参数(root command),子命令通过 optsWithGlobals() 取到 */\nexport interface GlobalOptions {\n api?: string;\n token?: string;\n cwd?: string;\n json?: boolean;\n quiet?: boolean;\n verbose?: boolean;\n color?: boolean;\n yes?: boolean;\n}\n\nexport interface CommandContext {\n runtime: CliRuntime;\n logger: Logger;\n /** 相对路径的基准目录(--cwd > INIT_CWD > 进程 cwd) */\n cwd: string;\n env: EnvConfig;\n credentialsFile: string;\n credentials: Credentials;\n client: HttpClient;\n /** 交互确认开关:--yes 时跳过确认 */\n assumeYes: boolean;\n /** 凭据发生变化时落盘(登录、令牌刷新都会触发) */\n persistCredentials: (next?: Credentials) => Promise<void>;\n}\n\nconst resolveLogLevel = (options: GlobalOptions): LogLevel => {\n if (options.verbose) return 'debug';\n if (options.quiet) return 'error';\n return 'info';\n};\n\nconst resolveColor = (options: GlobalOptions, runtime: CliRuntime): boolean => {\n if (options.color !== undefined) return options.color;\n if (runtime.env.NO_COLOR) return false;\n return runtime.isTTY ?? false;\n};\n\n/** 组装一次命令执行所需的全部上下文;优先级:命令行参数 > 环境变量 > 凭据文件 > 内置默认值。 */\nexport const createCommandContext = async (\n options: GlobalOptions,\n runtime: CliRuntime,\n): Promise<CommandContext> => {\n const env = resolveEnvConfig(runtime.env);\n const logger = createLogger({\n level: resolveLogLevel(options),\n json: options.json ?? false,\n color: resolveColor(options, runtime),\n stdout: runtime.stdout,\n stderr: runtime.stderr,\n });\n\n // 相对路径的基准目录: 1. --cwd(显式指定,CI 用) 2. INIT_CWD —— npm/pnpm 跑脚本时会把它设成\"用户敲命令时所在的目录\", 于是从仓库根执行 `pnpm qpc check my-problem` 时按仓库根解析, 而不是按包目录(脚本 cwd)解析。 3. 进程 cwd(直接 `node dist/index.js` 时)\n const baseDir = options.cwd ?? runtime.env.INIT_CWD ?? runtime.cwd;\n const cwd = resolve(runtime.cwd, baseDir);\n const credentialsFile = credentialsPath(env.configDir);\n const stored = await readCredentials(credentialsFile);\n\n const apiUrl = (\n options.api ??\n env.apiUrlFromEnv ??\n stored.apiUrl ??\n env.apiUrl\n ).replace(/\\/+$/, '');\n const credentials: Credentials = {\n ...stored,\n apiUrl,\n cookies: { ...stored.cookies },\n };\n\n const tokenFromEnv = Boolean(options.token ?? env.token);\n if (tokenFromEnv) credentials.cookies.access = options.token ?? env.token;\n\n /** 环境变量 / --token 提供的令牌不落盘:那是 CI 的临时凭据。 */\n const persistCredentials = async (next?: Credentials): Promise<void> => {\n if (tokenFromEnv && !next) return;\n await writeCredentials(credentialsFile, next ?? credentials);\n };\n\n const client = new HttpClient({\n baseUrl: apiUrl,\n fetch: runtime.fetch,\n cookies: credentials.cookies,\n logger,\n timeoutMs: env.timeoutMs,\n signal: runtime.signal,\n onCookiesChanged: (cookies) => {\n if (tokenFromEnv) return;\n return persistCredentials({ ...credentials, cookies });\n },\n });\n\n return {\n runtime,\n logger,\n cwd,\n env: { ...env, apiUrl },\n credentialsFile,\n credentials,\n client,\n assumeYes: options.yes ?? false,\n persistCredentials,\n };\n};\n","import type { FetchLike } from '../services/http';\nimport { CanceledError } from './errors';\n\n/** 运行环境的一切外部依赖都从 runtime 取、不直接读 process,便于单元测试注入假依赖。 */\nexport interface CliRuntime {\n cwd: string;\n env: NodeJS.ProcessEnv;\n stdin: NodeJS.ReadStream;\n stdout: (chunk: string) => void;\n stderr: (chunk: string) => void;\n // 交互式提示库需要可写流本体(TTY 判定 + 光标控制),与 stderr 函数同源。\n stderrStream?: NodeJS.WriteStream;\n fetch: FetchLike;\n now: () => number;\n signal?: AbortSignal;\n // 默认取 process.stdout.isTTY\n isTTY?: boolean;\n}\n\nexport const createProcessRuntime = (\n overrides: Partial<CliRuntime> = {},\n): CliRuntime => ({\n cwd: process.cwd(),\n env: process.env,\n stdin: process.stdin,\n stdout: (chunk) => process.stdout.write(chunk),\n stderr: (chunk) => process.stderr.write(chunk),\n stderrStream: process.stderr,\n fetch: ((input: string, init?: RequestInit) =>\n globalThis.fetch(input, init)) as FetchLike,\n now: () => Date.now(),\n isTTY: Boolean(process.stdout.isTTY),\n ...overrides,\n});\n\n/** 安装 Ctrl-C 处理:第一次 SIGINT abort 尽快收尾,第二次直接退出。 */\nexport const installSignalHandlers = (\n runtime: CliRuntime,\n): { controller: AbortController; dispose: () => void } => {\n const controller = new AbortController();\n let interrupts = 0;\n const onSignal = () => {\n interrupts += 1;\n if (interrupts > 1) {\n runtime.stderr('\\n再次收到中断信号,立即退出。\\n');\n process.exit(130);\n }\n runtime.stderr('\\n正在取消…(再按一次 Ctrl-C 强制退出)\\n');\n controller.abort(new CanceledError('已取消(Ctrl-C)'));\n };\n process.on('SIGINT', onSignal);\n process.on('SIGTERM', onSignal);\n return {\n controller,\n dispose: () => {\n process.removeListener('SIGINT', onSignal);\n process.removeListener('SIGTERM', onSignal);\n },\n };\n};\n","import { Command, CommanderError } from 'commander';\n\nimport { type CommandRegistry, registerCommands } from './commands';\nimport { createCommandContext, type GlobalOptions } from './core/context';\nimport { toCliError } from './core/errors';\nimport { EXIT } from './core/exit-codes';\nimport { createLogger } from './core/logger';\nimport { type CliRuntime, createProcessRuntime } from './core/runtime';\nimport { CLI_DESCRIPTION, CLI_NAME, CLI_VERSION } from './version';\n\n/** 创建命令树;无 process.exit(),退出码由 runCli 返回给调用方,测试可在同进程反复跑。 */\nexport const createProgram = (runtime: CliRuntime): Command => {\n const program = new Command();\n\n program\n .name(CLI_NAME)\n .description(CLI_DESCRIPTION)\n .version(CLI_VERSION, '-v, --version', '查看版本号')\n .option(\n '--api <url>',\n 'Web 应用地址(默认 QUANTA_API_URL 或 http://localhost:3000)',\n )\n .option(\n '--token <token>',\n '直接使用访问令牌(默认 QUANTA_TOKEN;不会写入凭据文件)',\n )\n .option(\n '--cwd <dir>',\n '工作目录基准(解析顺序:--cwd > INIT_CWD > 进程 cwd)',\n )\n .option('--json', '输出机器可读 JSON(stdout 只有结果,日志走 stderr)')\n .option('--quiet', '隐藏进度信息,只保留错误与命令结果')\n .option('--verbose', '输出调试信息')\n .option('--no-color', '禁用彩色输出')\n .option('-y, --yes', '跳过交互确认(CI 必给)')\n .showHelpAfterError('(用 `qpc --help` 查看全部用法)')\n .configureOutput({\n writeOut: (chunk) => runtime.stdout(chunk),\n writeErr: (chunk) => runtime.stderr(chunk),\n })\n .exitOverride();\n\n /** 全局参数解析:--no-color 须看选项来源判断显式指定,否则非 TTY 里会输出 ANSI 乱码。 */\n const globals = (): GlobalOptions => {\n const options = program.opts<Record<string, unknown>>();\n const colorExplicit = program.getOptionValueSource('color') === 'cli';\n return {\n api: asString(options.api),\n token: asString(options.token),\n cwd: asString(options.cwd),\n json: Boolean(options.json),\n quiet: Boolean(options.quiet),\n verbose: Boolean(options.verbose),\n yes: Boolean(options.yes),\n color: colorExplicit ? Boolean(options.color) : undefined,\n };\n };\n\n const registry: CommandRegistry = {\n program,\n context: () => createCommandContext(globals(), runtime),\n };\n registerCommands(registry);\n\n return program;\n};\n\nexport const runCli = async (\n argv: string[],\n runtime: CliRuntime = createProcessRuntime(),\n): Promise<number> => {\n const program = createProgram(runtime);\n try {\n await program.parseAsync(argv, { from: 'node' });\n return EXIT.OK;\n } catch (error) {\n if (error instanceof CommanderError) {\n // --help / --version 走的是异常通道,但它们是成功而不是失败\n return error.exitCode === 0 ? EXIT.OK : EXIT.USAGE;\n }\n\n const cliError = toCliError(error);\n const json = argv.includes('--json');\n const logger = createLogger({\n level: 'debug',\n json,\n color: runtime.isTTY ?? false,\n stdout: runtime.stdout,\n stderr: runtime.stderr,\n });\n\n if (json) {\n logger.result({\n ok: false,\n error: {\n name: cliError.name,\n message: cliError.message,\n hint: cliError.hint,\n details: cliError.details,\n exitCode: cliError.exitCode,\n },\n });\n } else {\n logger.error(cliError.message);\n if (cliError.hint) logger.info(` ${cliError.hint}`);\n if (cliError.details && argv.includes('--verbose')) {\n logger.detail(JSON.stringify(cliError.details, null, 3));\n }\n if (!(error instanceof Error) || !(error instanceof CommanderError)) {\n const cause = (cliError as { cause?: unknown }).cause;\n if (\n argv.includes('--verbose') &&\n cause instanceof Error &&\n cause.stack\n ) {\n logger.detail(cause.stack);\n }\n }\n }\n\n return cliError.exitCode;\n }\n};\n\nconst asString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined;\n","#!/usr/bin/env node\nimport { runCli } from './cli';\nimport { createProcessRuntime, installSignalHandlers } from './core/runtime';\n\n/** bin 入口:组装运行时、跑 CLI、把退出码交给 shell;只有这里允许有副作用。 */\nconst runtime = createProcessRuntime();\nconst { controller, dispose } = installSignalHandlers(runtime);\n\nconst exitCode = await runCli(process.argv, {\n ...runtime,\n signal: controller.signal,\n});\ndispose();\nprocess.exitCode = exitCode;\n"]}