@wcs-edu-os/cli 0.0.0-stage → 0.1.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/index.ts","../src/program.ts","../../core/src/registry.ts","../../core/src/capabilities.ts","../../core/src/client.ts","../../core/src/errors.ts","../../core/src/http.ts","../../core/src/redact.ts","../../core/src/confirmation-store.ts","../../core/src/token-cache.ts","../../core/src/credentials.ts","../../core/src/json-input.ts","../../core/src/output.ts","../../core/src/profiles.ts","../src/runner.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { stdin, stdout, stderr } from 'node:process';\nimport { runProgram } from './program.js';\n\nconst exitCode = await runProgram(process.argv.slice(2), {\n stdin,\n stdout,\n stderr,\n env: process.env,\n});\nprocess.exitCode = exitCode;\n","import { Command, CommanderError, Option } from 'commander';\nimport { CliError, commandRegistry, ExitCode, failureEnvelope, requestId } from '@wcs-edu-os/core';\nimport type { CommandOption, CommandSpec, GlobalOptions } from '@wcs-edu-os/core';\nimport { runCommand } from './runner.js';\nimport type { RunnerIo } from './runner.js';\n\nexport function createProgram(io: RunnerIo): Command {\n const program = new Command();\n program\n .name('wcs-edu-os')\n .description('WCS EDU OS 开源管理员命令行工具')\n .addHelpText('after', `\\n首次使用:\\n npm install -g @wcs-edu-os/cli\\n wcs-edu-os guide getting-started\\n wcs-edu-os doctor\\n\\n常用主题:wcs-edu-os guide course | wcs-edu-os guide exam | wcs-edu-os guide write\\n`)\n .showHelpAfterError()\n .exitOverride()\n .option('--profile <name>', '选择 Profile')\n .option('--output <format>', '输出格式: json|jsonl|table')\n .option('--non-interactive', '禁用交互提示')\n .option('--secret-stdin', '从标准输入读取 appSecret')\n .option('--request-id <id>', '请求链路标识')\n .option('--timeout <ms>', '请求超时毫秒数', '10000')\n .option('--no-color', '禁用 ANSI 颜色')\n .option('--debug', '输出脱敏诊断信息到 stderr');\n program\n .option('--dry-run', '仅校验写计划并生成确认令牌')\n .option('--confirm-token <token>', '执行 dry-run 生成的确认令牌')\n .option('--idempotency-key <key>', '写请求幂等键');\n\n for (const spec of commandRegistry) registerSpec(program, spec, io);\n return program;\n}\n\nexport async function runProgram(argv: string[], io: RunnerIo): Promise<number> {\n const program = createProgram(io);\n try {\n await program.parseAsync(argv, { from: 'user' });\n return Number(process.exitCode ?? 0);\n } catch (error) {\n if (error instanceof CommanderError && error.exitCode === 0) return 0;\n const id = requestId();\n const cliError = error instanceof CommanderError\n ? new CliError('VALIDATION_ERROR', error.message, ExitCode.VALIDATION)\n : error;\n const failed = failureEnvelope('cli', id, cliError);\n io.stdout.write(`${JSON.stringify(failed.envelope)}\\n`);\n return failed.error.exitCode;\n }\n}\n\nfunction registerSpec(program: Command, spec: CommandSpec, io: RunnerIo): void {\n let parent = program;\n for (let index = 0; index < spec.segments.length - 1; index += 1) {\n const segment = spec.segments[index] as string;\n let child = parent.commands.find((command) => command.name() === segment);\n if (!child) {\n child = new Command(segment).exitOverride();\n parent.addCommand(child);\n }\n parent = child;\n }\n const leaf = new Command(spec.segments.at(-1) as string).description(spec.description).exitOverride();\n leaf.addHelpText('after', `\\n示例:wcs-edu-os ${spec.segments.join(' ')} --output json\\n`);\n for (const argument of spec.arguments) {\n leaf.argument(argument.required ? `<${argument.name}>` : `[${argument.name}]`, argument.description);\n }\n for (const option of spec.options) addOption(leaf, option);\n leaf.action(async (...values: unknown[]) => {\n const command = values.at(-1) as Command;\n const positional = values.slice(0, spec.arguments.length);\n const input: Record<string, unknown> = { ...command.opts() };\n spec.arguments.forEach((argument, index) => {\n if (positional[index] !== undefined) input[argument.name] = positional[index];\n });\n const globals = command.optsWithGlobals() as GlobalOptions;\n if (globals.output && !['json', 'jsonl', 'table'].includes(globals.output)) {\n throw new CliError('OUTPUT_INVALID', `不支持的输出格式: ${globals.output}`, ExitCode.VALIDATION);\n }\n const result = await runCommand(spec, input, globals, io);\n process.exitCode = result.exitCode;\n });\n parent.addCommand(leaf);\n}\n\nfunction addOption(command: Command, spec: CommandOption): void {\n const option = new Option(spec.flags, spec.description);\n if (spec.collect) {\n option.argParser((value: string, previous: string[] = []) => previous.concat(value));\n option.default([]);\n } else if (spec.defaultValue !== undefined) {\n option.default(spec.defaultValue);\n }\n command.addOption(option);\n}\n","import type {ZodType} from 'zod';\nimport {z} from 'zod';\nimport type {CommandArgument, CommandOption, CommandSpec, EndpointSpec, TableColumn} from './types.js';\n\nconst intOption = (min: number, max: number) => z.coerce.number().int().min(min).max(max);\nconst idSchema = z.string().min(1).describe('资源 ID,始终按字符串处理');\nconst emptySchema = z.object({}).strict();\nconst anyOutput = z.unknown();\nconst requiredText = z.string().trim().min(1);\nconst nonNegativeDecimal = z.string().regex(/^\\d+(?:\\.\\d+)?$/, '必须是非负十进制字符串');\nconst date = z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, '日期格式必须为 yyyy-MM-dd');\nconst dateTime = z.string().regex(/^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$/, '时间格式必须为 yyyy-MM-dd HH:mm:ss');\nconst binary = z.number().int().min(0).max(1);\nconst writeInputSchema = z.object({ input: requiredText }).strict();\nconst writeOptions: CommandOption[] = [{ flags: '--input <path>', description: 'JSON 输入文件,- 表示 stdin' }];\n\nconst pageOptions: CommandOption[] = [\n { flags: '--page <number>', description: '起始页码', defaultValue: 1 },\n { flags: '--size <number>', description: '每页数量', defaultValue: 20 },\n { flags: '--max-items <number>', description: '跨页最多拉取条数', defaultValue: 100 },\n { flags: '--filter <key=value...>', description: '透传后端筛选字段,可重复', collect: true },\n { flags: '--name <name>', description: '名称筛选' },\n { flags: '--keyword <keyword>', description: '关键字筛选' },\n { flags: '--mobile <mobile>', description: '手机号筛选' },\n { flags: '--status-id <statusId>', description: '状态筛选' },\n { flags: '--user-id <userId>', description: '用户 ID' },\n { flags: '--course-id <courseId>', description: '课程 ID' },\n { flags: '--task-id <taskId>', description: '任务 ID' },\n];\n\nconst pageSchema = z.object({\n page: intOption(1, 1_000_000).default(1),\n size: intOption(1, 500).default(20),\n maxItems: intOption(1, 100_000).default(100),\n filter: z.array(z.string()).default([]),\n name: z.string().optional(),\n keyword: z.string().optional(),\n mobile: z.string().optional(),\n statusId: z.string().optional(),\n userId: idSchema.optional(),\n courseId: idSchema.optional(),\n taskId: idSchema.optional(),\n});\n\nconst idInput = z.object({ id: idSchema });\nconst courseInput = z.object({ courseId: idSchema });\n\nconst defaultTable: TableColumn[] = [\n { key: 'id', label: 'ID' },\n { key: 'name', label: '名称' },\n { key: 'statusId', label: '状态' },\n];\n\nfunction endpoint(\n method: EndpointSpec['method'],\n path: string,\n controller: string,\n requestDto: string,\n responseDto: string,\n pagination = false,\n): EndpointSpec {\n return { method, path, controller, requestDto, responseDto, pagination };\n}\n\nfunction spec(value: Omit<CommandSpec, 'risk' | 'readOnly' | 'supportsDryRun' | 'supportsIdempotency' | 'sideEffects' | 'rollback' | 'implemented' | 'outputSchema'>): CommandSpec {\n return {\n ...value,\n risk: 'R0',\n readOnly: true,\n supportsDryRun: false,\n supportsIdempotency: false,\n sideEffects: [],\n rollback: null,\n implemented: true,\n outputSchema: anyOutput,\n };\n}\n\nfunction writeSpec(value: Omit<CommandSpec, 'risk' | 'readOnly' | 'supportsDryRun' | 'supportsIdempotency' | 'sideEffects' | 'rollback' | 'implemented' | 'outputSchema' | 'inputSchema' | 'options'> & {\n payloadSchema: ZodType;\n sideEffects: string[];\n rollback: string | null;\n}): CommandSpec {\n return {\n ...value,\n risk: 'R1',\n readOnly: false,\n supportsDryRun: true,\n supportsIdempotency: true,\n inputSchema: writeInputSchema,\n options: writeOptions,\n implemented: true,\n outputSchema: anyOutput,\n };\n}\n\nconst userCreatePayload = z.object({\n mobile: requiredText.max(11),\n mobilePwd: requiredText,\n userSex: z.number().int().min(1).max(3),\n userHead: requiredText,\n remark: z.string().max(200).optional(),\n userAge: date.optional(),\n school: z.string().optional(),\n realName: z.string().optional(),\n nickname: z.string().optional(),\n tagIds: z.array(idSchema).optional(),\n}).strict();\n\nconst userUpdatePayload = z.object({\n id: idSchema,\n userSex: z.number().int().min(1).max(3).optional(),\n nickname: z.string().optional(),\n realName: z.string().max(20).optional(),\n idCard: z.string().max(18).optional(),\n faceImg: z.string().optional(),\n faceError: z.number().int().min(0).optional(),\n faceStatus: z.boolean().optional(),\n userAge: date.nullable(),\n school: z.string().optional(),\n userHead: z.string().optional(),\n remark: z.string().max(200).optional(),\n tagIds: z.array(idSchema),\n}).strict();\n\nfunction coursePayload(includeId: boolean): ZodType {\n return z.object({\n ...(includeId ? { id: idSchema } : {}),\n lecturerId: idSchema,\n categoryId: idSchema,\n courseName: requiredText.max(120),\n courseLogo: requiredText,\n introduce: z.string().optional(),\n countVirtualStudy: z.number().int().min(0).optional(),\n countVirtualBuy: z.number().int().min(0).optional(),\n linePrice: nonNegativeDecimal,\n price: nonNegativeDecimal,\n publishStatus: binary,\n speedDouble: binary,\n speedDrag: binary,\n checkIn: binary,\n studyMode: z.number().int().min(1).max(2),\n validityDateType: z.number().int().min(1).max(3),\n days: z.number().int().min(1).optional(),\n beginTime: dateTime.optional(),\n endTime: dateTime.optional(),\n courseSell: z.boolean().optional(),\n certSet: z.boolean().optional(),\n certStudyProgress: nonNegativeDecimal.optional(),\n certId: idSchema.optional(),\n }).strict().superRefine(validateValidity);\n}\n\nfunction validateValidity(payload: Record<string, unknown>, context: z.RefinementCtx): void {\n if (payload.validityDateType === 2 && payload.days === undefined) {\n context.addIssue({ code: 'custom', path: ['days'], message: '有效期类型为 2 时必须提供 days' });\n }\n if (payload.validityDateType === 3) {\n if (!payload.beginTime) context.addIssue({ code: 'custom', path: ['beginTime'], message: '有效期类型为 3 时必须提供 beginTime' });\n if (!payload.endTime) context.addIssue({ code: 'custom', path: ['endTime'], message: '有效期类型为 3 时必须提供 endTime' });\n if (typeof payload.beginTime === 'string' && typeof payload.endTime === 'string' && payload.beginTime > payload.endTime) {\n context.addIssue({ code: 'custom', path: ['endTime'], message: 'endTime 不能早于 beginTime' });\n }\n }\n}\n\nconst noArgs: CommandArgument[] = [];\n\nfunction adminPage(\n name: string,\n segments: string[],\n description: string,\n path: string,\n controller: string,\n requestDto: string,\n responseDto: string,\n method: EndpointSpec['method'] = 'GET',\n): CommandSpec {\n return spec({\n name,\n segments,\n description,\n permissionHint: null,\n kind: 'api',\n arguments: noArgs,\n options: pageOptions,\n inputSchema: pageSchema,\n endpoints: [endpoint(method, path, controller, requestDto, responseDto, true)],\n table: defaultTable,\n });\n}\n\nfunction adminGet(\n name: string,\n segments: string[],\n description: string,\n path: string,\n controller: string,\n requestDto: string,\n responseDto: string,\n): CommandSpec {\n return spec({\n name,\n segments,\n description,\n permissionHint: null,\n kind: 'api',\n arguments: [{name: 'id', description: '资源 ID', required: true}],\n options: [],\n inputSchema: idInput,\n endpoints: [endpoint('GET', path, controller, requestDto, responseDto)],\n table: [],\n });\n}\n\nexport const commandRegistry: readonly CommandSpec[] = [\n spec({ name: 'version', segments: ['version'], description: '显示 CLI 版本', permissionHint: null, kind: 'local', arguments: noArgs, options: [], inputSchema: emptySchema, endpoints: [], table: [] }),\n spec({ name: 'guide', segments: ['guide'], description: '查看安装、认证和业务操作引导', permissionHint: null, kind: 'local', arguments: [{ name: 'topic', description: '主题:getting-started|course|exam|write|all', required: false }], options: [], inputSchema: z.object({ topic: z.enum(['getting-started', 'course', 'exam', 'write', 'all']).default('all') }), endpoints: [], table: [{ key: 'title', label: '主题' }, { key: 'summary', label: '说明' }] }),\n spec({ name: 'capabilities', segments: ['capabilities'], description: '列出命令及当前调用能力', permissionHint: null, kind: 'local', arguments: noArgs, options: [], inputSchema: emptySchema, endpoints: [], table: defaultTable }),\n spec({ name: 'schema', segments: ['schema'], description: '输出指定命令的 Zod JSON Schema', permissionHint: null, kind: 'local', arguments: [{ name: 'command', description: '命令名(点号或空格分隔)', required: true }], options: [], inputSchema: z.object({ command: z.string().min(1) }), endpoints: [], table: [] }),\n spec({ name: 'doctor', segments: ['doctor'], description: '检查运行环境、配置、凭据和后端连通性', permissionHint: null, kind: 'local', arguments: noArgs, options: [], inputSchema: emptySchema, endpoints: [], table: [{ key: 'check', label: '检查项' }, { key: 'status', label: '状态' }, { key: 'message', label: '说明' }] }),\n\n spec({ name: 'auth.status', segments: ['auth', 'status'], description: '检查本地认证状态,不访问网络', permissionHint: null, kind: 'local', arguments: noArgs, options: [], inputSchema: emptySchema, endpoints: [], table: [] }),\n spec({ name: 'auth.whoami', segments: ['auth', 'whoami'], description: '获取当前绑定管理员信息', permissionHint: null, kind: 'api', arguments: noArgs, options: [], inputSchema: emptySchema, endpoints: [endpoint('GET', '/base/admin/login/user', 'AdminLoginController', '-', 'AdminLoginUserResp')], table: [] }),\n spec({ name: 'auth.test', segments: ['auth', 'test'], description: '签发并验证 CLI token', permissionHint: null, kind: 'local', arguments: noArgs, options: [], inputSchema: emptySchema, endpoints: [endpoint('POST', '/base/api/cli/token', 'ApiCliTokenController', 'OAuth client_credentials', 'ApiCliTokenResp')], table: [] }),\n spec({ name: 'auth.credential-info', segments: ['auth', 'credential-info'], description: '显示脱敏凭据与 token 信息', permissionHint: null, kind: 'local', arguments: noArgs, options: [], inputSchema: emptySchema, endpoints: [], table: [] }),\n\n spec({ name: 'profile.list', segments: ['profile', 'list'], description: '列出 Profile', permissionHint: null, kind: 'local', arguments: noArgs, options: [], inputSchema: emptySchema, endpoints: [], table: [{ key: 'name', label: '名称' }, { key: 'baseUrl', label: 'Base URL' }, { key: 'current', label: '当前' }] }),\n spec({ name: 'profile.get', segments: ['profile', 'get'], description: '查看 Profile', permissionHint: null, kind: 'local', arguments: [{ name: 'name', description: 'Profile 名称', required: false }], options: [], inputSchema: z.object({ name: z.string().optional() }), endpoints: [], table: [] }),\n spec({ name: 'profile.use', segments: ['profile', 'use'], description: '切换 Profile,可同时创建或更新 base URL', permissionHint: null, kind: 'local', arguments: [{ name: 'name', description: 'Profile 名称', required: true }], options: [{ flags: '--base-url <url>', description: '创建或更新 Profile 的 base URL' }], inputSchema: z.object({ name: z.string().min(1), baseUrl: z.string().url().optional() }), endpoints: [], table: [] }),\n\n spec({ name: 'user.list', segments: ['user', 'list'], description: '分页列出用户', permissionHint: '候选: user:view', kind: 'api', arguments: noArgs, options: pageOptions, inputSchema: pageSchema, endpoints: [endpoint('POST', '/base/admin/users/page', 'AdminUsersController', 'AdminUsersPageReq', 'Page<AdminUsersPageResp>', true)], table: [{ key: 'id', label: 'ID' }, { key: 'realName', label: '姓名' }, { key: 'mobile', label: '手机号' }, { key: 'statusId', label: '状态' }] }),\n spec({ name: 'user.get', segments: ['user', 'get'], description: '查看用户', permissionHint: '候选: user:view', kind: 'api', arguments: [{ name: 'id', description: '用户 ID', required: true }], options: [], inputSchema: idInput, endpoints: [endpoint('GET', '/base/admin/users/view', 'AdminUsersController', 'id', 'AdminUsersViewResp')], table: [] }),\n spec({ name: 'user.situation', segments: ['user', 'situation'], description: '查看用户内容概况', permissionHint: '候选: user:record', kind: 'api', arguments: [{ name: 'id', description: '用户 ID', required: true }], options: [], inputSchema: idInput, endpoints: [endpoint('GET', '/base/admin/users/situation', 'AdminUsersController', 'id', 'AdminUsersSituationResp')], table: [] }),\n spec({ name: 'user.account', segments: ['user', 'account'], description: '查看用户账户', permissionHint: '候选: user:record', kind: 'api', arguments: [{ name: 'id', description: '用户 ID', required: true }], options: [], inputSchema: idInput, endpoints: [endpoint('GET', '/base/admin/users/account', 'AdminUsersController', 'id', 'AdminUsersViewAccountResp')], table: [] }),\n writeSpec({ name: 'user.create', segments: ['user', 'create'], description: '创建用户', permissionHint: 'user:add', kind: 'api', arguments: noArgs, payloadSchema: userCreatePayload, endpoints: [endpoint('POST', '/base/admin/users/save', 'AdminUsersController', 'AdminUsersSaveReq', 'String')], table: [], sideEffects: ['创建用户及关联标签', '保存加密后的登录密码'], rollback: '可通过管理端删除未产生业务记录的用户' }),\n writeSpec({ name: 'user.update', segments: ['user', 'update'], description: '完整更新用户资料', permissionHint: 'user:edit', kind: 'api', arguments: noArgs, payloadSchema: userUpdatePayload, endpoints: [endpoint('PUT', '/base/admin/users/edit', 'AdminUsersController', 'AdminUsersEditReq', 'String')], table: [], sideEffects: ['更新用户资料', '替换全部用户标签', '按 userAge 显式值更新或清空出生日期'], rollback: '需使用变更前数据再次执行 update' }),\n\n spec({ name: 'course.list', segments: ['course', 'list'], description: '分页列出课程', permissionHint: '候选: course:view', kind: 'api', arguments: noArgs, options: pageOptions, inputSchema: pageSchema, endpoints: [endpoint('POST', '/resource/admin/course/page', 'AdminCourseController', 'AdminCoursePageReq', 'Page<AdminCoursePageResp>', true)], table: defaultTable }),\n spec({ name: 'course.get', segments: ['course', 'get'], description: '查看课程', permissionHint: '候选: course:view', kind: 'api', arguments: [{ name: 'id', description: '课程 ID', required: true }], options: [], inputSchema: idInput, endpoints: [endpoint('GET', '/resource/admin/course/view', 'AdminCourseController', 'id', 'AdminCourseViewResp')], table: [] }),\n writeSpec({ name: 'course.create', segments: ['course', 'create'], description: '创建课程', permissionHint: 'course:save', kind: 'api', arguments: noArgs, payloadSchema: coursePayload(false), endpoints: [endpoint('POST', '/resource/admin/course/save', 'AdminCourseController', 'AdminCourseSaveReq', 'String')], table: [], sideEffects: ['创建课程记录'], rollback: '可通过管理端删除未产生关联数据的课程' }),\n writeSpec({ name: 'course.update', segments: ['course', 'update'], description: '完整更新课程', permissionHint: 'course:edit', kind: 'api', arguments: noArgs, payloadSchema: coursePayload(true), endpoints: [endpoint('PUT', '/resource/admin/course/edit', 'AdminCourseController', 'AdminCourseEditReq', 'String')], table: [], sideEffects: ['更新课程配置、价格与有效期'], rollback: '需使用变更前数据再次执行 update' }),\n spec({ name: 'course.chapter.list', segments: ['course', 'chapter', 'list'], description: '列出课程章节', permissionHint: '候选: course:chapter:period', kind: 'api', arguments: [{ name: 'courseId', description: '课程 ID', required: true }], options: [], inputSchema: courseInput, endpoints: [endpoint('GET', '/resource/admin/course/chapter/list', 'AdminCourseChapterController', 'courseId', 'List<AdminCourseChapterListResp>')], table: defaultTable }),\n spec({ name: 'course.chapter.get', segments: ['course', 'chapter', 'get'], description: '查看课程章节', permissionHint: '候选: course:chapter:period', kind: 'api', arguments: [{ name: 'id', description: '章节 ID', required: true }], options: [], inputSchema: idInput, endpoints: [endpoint('GET', '/resource/admin/course/chapter/view', 'AdminCourseChapterController', 'id', 'AdminCourseChapterViewResp')], table: [] }),\n\n spec({ name: 'course-study.list', segments: ['course-study', 'list'], description: '分页列出课程学习记录', permissionHint: '候选: user:course', kind: 'api', arguments: noArgs, options: pageOptions, inputSchema: pageSchema, endpoints: [endpoint('GET', '/resource/admin/course/user/study/page', 'AdminCourseUserStudyController', 'AdminCourseUserStudyPageReq', 'Page<AdminCourseUserStudyPageResp>', true)], table: [{ key: 'id', label: 'ID' }, { key: 'userId', label: '用户 ID' }, { key: 'courseId', label: '课程 ID' }, { key: 'studyProgress', label: '进度' }] }),\n spec({ name: 'course-study.get', segments: ['course-study', 'get'], description: '查看课程学习记录', permissionHint: '候选: user:course', kind: 'api', arguments: [{ name: 'id', description: '学习记录 ID', required: true }], options: [], inputSchema: idInput, endpoints: [endpoint('GET', '/resource/admin/course/user/study/view', 'AdminCourseUserStudyController', 'id', 'AdminCourseUserStudyViewResp')], table: [] }),\n spec({ name: 'statistics.dashboard', segments: ['statistics', 'dashboard'], description: '并行获取管理端仪表盘统计', permissionHint: '候选: dashboard:view', kind: 'dashboard', arguments: noArgs, options: [{ flags: '--dates <days>', description: '趋势窗口,沿用 Admin dates 参数', defaultValue: -14 }], inputSchema: z.object({ dates: z.coerce.number().int().min(-3650).max(3650).default(-14) }), endpoints: [\n endpoint('GET', '/base/admin/dashboard/stat/data', 'AdminDashboardController', '-', 'AdminDashboardDataResp'),\n endpoint('GET', '/base/admin/dashboard/stat/login', 'AdminDashboardController', 'dates', 'AdminDashboardLoginResp'),\n endpoint('GET', '/base/admin/dashboard/stat/order', 'AdminDashboardController', 'dates', 'AdminDashboardOrderResp'),\n ], table: [] }),\n\n // Admin menu read-only coverage. Write operations remain gated until their DTO and risk contract are added.\n adminPage('category.list', ['category', 'list'], '分页列出课程分类', '/resource/admin/category/page', 'AdminCategoryController', 'AdminCategoryPageReq', 'Page<AdminCategoryPageResp>'),\n adminGet('category.get', ['category', 'get'], '查看课程分类', '/resource/admin/category/view', 'AdminCategoryController', 'id', 'AdminCategoryViewResp'),\n adminPage('lecturer.list', ['lecturer', 'list'], '分页列出讲师', '/base/admin/lecturer/page', 'AdminLecturerController', 'AdminLecturerPageReq', 'Page<AdminLecturerPageResp>'),\n adminGet('lecturer.get', ['lecturer', 'get'], '查看讲师', '/base/admin/lecturer/view', 'AdminLecturerController', 'id', 'AdminLecturerViewResp'),\n adminPage('question.list', ['question', 'list'], '分页列出试题', '/resource/admin/question/page', 'AdminQuestionController', 'AdminQuestionPageReq', 'Page<AdminQuestionPageResp>', 'POST'),\n adminGet('question.get', ['question', 'get'], '查看试题', '/resource/admin/question/view', 'AdminQuestionController', 'id', 'AdminQuestionViewResp'),\n adminPage('paper.list', ['paper', 'list'], '分页列出试卷', '/resource/admin/paper/page', 'AdminPaperController', 'AdminPaperPageReq', 'Page<AdminPaperPageResp>'),\n adminGet('paper.get', ['paper', 'get'], '查看试卷', '/resource/admin/paper/view', 'AdminPaperController', 'id', 'AdminPaperViewResp'),\n adminPage('exam.list', ['exam', 'list'], '分页列出考试', '/resource/admin/exam/page', 'AdminExamController', 'AdminExamPageReq', 'Page<AdminExamPageResp>', 'POST'),\n adminGet('exam.get', ['exam', 'get'], '查看考试', '/resource/admin/exam/view', 'AdminExamController', 'id', 'AdminExamViewResp'),\n adminPage('material.list', ['material', 'list'], '分页列出素材', '/resource/admin/material/page', 'AdminMaterialController', 'AdminMaterialPageReq', 'Page<AdminMaterialPageResp>', 'POST'),\n adminGet('material.get', ['material', 'get'], '查看素材', '/resource/admin/material/view', 'AdminMaterialController', 'id', 'AdminMaterialViewResp'),\n] as const;\n\nexport const notImplementedCapabilities = [\n { name: 'statistics.course', reason: '缺少稳定统一后端契约', risk: 'R0', readOnly: true },\n { name: 'statistics.task', reason: '缺少稳定统一后端契约', risk: 'R0', readOnly: true },\n { name: 'statistics.user', reason: '缺少稳定统一后端契约', risk: 'R0', readOnly: true },\n { name: 'job.status', reason: '缺少统一任务状态模型', risk: 'R0', readOnly: true },\n { name: 'job.wait', reason: '缺少统一任务状态模型', risk: 'R0', readOnly: true },\n { name: 'training-task.assign', reason: 'R2 批量指派不在本阶段范围', risk: 'R2', readOnly: false },\n { name: 'user.enable', reason: 'R2 状态操作不在本阶段范围', risk: 'R2', readOnly: false },\n { name: 'user.disable', reason: 'R2 状态操作不在本阶段范围', risk: 'R2', readOnly: false },\n { name: 'course-study.import', reason: 'R2 导入任务不在本阶段范围', risk: 'R2', readOnly: false },\n { name: 'course.publish', reason: 'R2 发布操作不在本阶段范围', risk: 'R2', readOnly: false },\n { name: 'resource.delete', reason: 'R3 删除操作不在本阶段范围', risk: 'R3', readOnly: false },\n] as const;\n\nexport function findCommand(name: string): CommandSpec | undefined {\n const normalized = name.trim().replace(/\\s+/g, '.');\n return commandRegistry.find((item) => item.name === normalized);\n}\n\nexport function assertRegistryValid(registry: readonly CommandSpec[] = commandRegistry): void {\n const names = new Set<string>();\n for (const item of registry) {\n if (names.has(item.name)) throw new Error(`重复命令: ${item.name}`);\n names.add(item.name);\n if (item.name !== item.segments.join('.')) throw new Error(`命令名与路径不一致: ${item.name}`);\n if (item.kind !== 'local' && item.endpoints.length === 0) throw new Error(`API 命令缺少 endpoint: ${item.name}`);\n }\n}\n","import { commandRegistry, notImplementedCapabilities } from './registry.js';\n\nexport function getCapabilities(apis?: string[]): unknown[] {\n return [\n ...commandRegistry.map((spec) => {\n const endpointPaths = spec.endpoints.map((item) => item.path);\n const callable = endpointPaths.length === 0 || !apis\n ? endpointPaths.length === 0 ? true : null\n : endpointPaths.every((path) => apis.some((api) => matchesApi(api, path)));\n return {\n name: spec.name,\n description: spec.description,\n risk: spec.risk,\n readOnly: spec.readOnly,\n implemented: true,\n authenticated: Boolean(apis),\n callable,\n endpoints: endpointPaths,\n permissionHint: spec.permissionHint,\n };\n }),\n ...notImplementedCapabilities.map((item) => ({\n ...item,\n implemented: false,\n callable: false,\n endpoints: [],\n })),\n ];\n}\n\nfunction matchesApi(pattern: string, path: string): boolean {\n if (pattern === path) return true;\n try {\n return new RegExp(`^(?:${pattern})$`).test(path);\n } catch {\n return false;\n }\n}\n\nexport interface TreeNode extends Record<string, unknown> {\n children?: TreeNode[];\n}\n\nexport function buildTree(items: unknown[]): TreeNode[] {\n const nodes = new Map<string, TreeNode>();\n const roots: TreeNode[] = [];\n for (const value of items) {\n if (!isRecord(value) || value.id === undefined) continue;\n nodes.set(String(value.id), { ...value, children: [] });\n }\n for (const node of nodes.values()) {\n const parentId = node.parentId === undefined || node.parentId === null ? '0' : String(node.parentId);\n const parent = nodes.get(parentId);\n if (parent && String(node.id) !== parentId) parent.children?.push(node);\n else roots.push(node);\n }\n return roots;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { z } from 'zod';\nimport { CliError, ExitCode, mapBackendError } from './errors.js';\nimport { HttpClient } from './http.js';\nimport { TokenCache } from './token-cache.js';\nimport type { CommandSpec, NormalizedResult, PageInfo, RequestOptions, TokenResponse } from './types.js';\n\nconst tokenSchema = z.object({\n access_token: z.string().min(1),\n token_type: z.string().min(1),\n expires_in: z.number().int().positive(),\n user_id: z.string().min(1),\n apis: z.array(z.string()),\n});\n\nexport class WcsClient {\n private readonly http: HttpClient;\n\n constructor(\n public readonly baseUrl: string,\n private readonly appKey: string,\n private readonly tokenCache: TokenCache,\n private readonly timeoutMs: number,\n private readonly onDiagnostic?: RequestOptions['onDiagnostic'],\n ) {\n this.http = new HttpClient(baseUrl);\n }\n\n async token(requestId: string, appSecret?: string, force = false): Promise<TokenResponse & { expiresAt: number }> {\n if (!force) {\n const cached = await this.tokenCache.get(this.baseUrl, this.appKey);\n if (cached) return cached;\n }\n if (!appSecret) {\n throw new CliError('APP_SECRET_MISSING', '未提供 appSecret,且没有可用 token 缓存', ExitCode.AUTH, false, {}, [\n '使用 --secret-stdin 从标准输入提供',\n '或设置 WCS_EDU_APP_SECRET',\n ]);\n }\n const response = await this.http.send<unknown>({\n method: 'POST',\n path: '/base/api/cli/token',\n requestId,\n timeoutMs: this.timeoutMs,\n readOnly: false,\n basic: { appKey: this.appKey, appSecret },\n form: { grant_type: 'client_credentials' },\n onDiagnostic: this.onDiagnostic,\n });\n const parsed = tokenSchema.safeParse(response.data);\n if (!parsed.success) {\n throw new CliError('TOKEN_RESPONSE_INVALID', 'token 响应不符合协议', ExitCode.SERVER, false, {\n issues: parsed.error.issues,\n });\n }\n return this.tokenCache.set(this.baseUrl, this.appKey, parsed.data);\n }\n\n async result(\n spec: CommandSpec,\n endpointIndex: number,\n requestId: string,\n token: string,\n input: Record<string, unknown>,\n idempotencyKey?: string,\n ): Promise<NormalizedResult> {\n const endpoint = spec.endpoints[endpointIndex];\n if (!endpoint) throw new CliError('COMMAND_CONTRACT_ERROR', '命令缺少 endpoint', ExitCode.SERVER);\n const payload = buildBackendPayload(input);\n const response = await this.http.send<unknown>({\n method: endpoint.method,\n path: endpoint.path,\n requestId,\n timeoutMs: this.timeoutMs,\n readOnly: spec.readOnly,\n token,\n query: endpoint.method === 'GET' ? payload : undefined,\n body: endpoint.method === 'GET' ? undefined : payload,\n idempotencyKey,\n onDiagnostic: this.onDiagnostic,\n });\n return normalizeBackendResult(response.data);\n }\n\n async pagedResult(\n spec: CommandSpec,\n requestId: string,\n token: string,\n input: Record<string, unknown>,\n ): Promise<NormalizedResult> {\n const startPage = Number(input.page ?? 1);\n const size = Number(input.size ?? 20);\n const maxItems = Number(input.maxItems ?? 100);\n const items: unknown[] = [];\n let current = startPage;\n let finalPage: PageInfo | null = null;\n while (items.length < maxItems) {\n const result = await this.result(spec, 0, requestId, token, { ...input, page: current, size });\n const pageItems = extractItems(result.data);\n items.push(...pageItems.slice(0, maxItems - items.length));\n finalPage = result.page;\n if (!result.page?.hasMore || pageItems.length === 0 || items.length >= maxItems) break;\n current += 1;\n }\n const total = finalPage?.total ?? items.length;\n return {\n data: { items },\n page: { number: startPage, size, total, hasMore: startPage * size < total && items.length < total },\n };\n }\n}\n\nexport function normalizeBackendResult(value: unknown): NormalizedResult {\n if (!isRecord(value) || typeof value.code !== 'number') {\n throw new CliError('BACKEND_INVALID_RESPONSE', '后端响应缺少 Result.code', ExitCode.SERVER);\n }\n if (value.code !== 200) {\n throw mapBackendError(value.code, typeof value.msg === 'string' ? value.msg : '后端业务错误');\n }\n const data = value.data;\n if (isPage(data)) {\n const page: PageInfo = {\n number: numberOr(data.pageCurrent, 1),\n size: numberOr(data.pageSize, 20),\n total: numberOr(data.totalCount, 0),\n hasMore: numberOr(data.pageCurrent, 1) < numberOr(data.totalPage, 0),\n };\n return { data: { items: Array.isArray(data.list) ? data.list : [] }, page };\n }\n return { data, page: null };\n}\n\nexport function buildBackendPayload(input: Record<string, unknown>): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n const filters = Array.isArray(input.filter) ? input.filter : [];\n for (const filter of filters) {\n const separator = String(filter).indexOf('=');\n if (separator <= 0) {\n throw new CliError('FILTER_INVALID', `筛选条件格式错误: ${filter}`, ExitCode.VALIDATION);\n }\n output[String(filter).slice(0, separator)] = String(filter).slice(separator + 1);\n }\n for (const [key, value] of Object.entries(input)) {\n if (['filter', 'maxItems'].includes(key) || value === undefined || value === '') continue;\n if (key === 'page') output.pageCurrent = value;\n else if (key === 'size') output.pageSize = value;\n else output[key] = value;\n }\n return output;\n}\n\nfunction extractItems(data: unknown): unknown[] {\n if (isRecord(data) && Array.isArray(data.items)) return data.items;\n return [];\n}\n\nfunction isPage(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && ('list' in value || 'totalCount' in value) && 'pageCurrent' in value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction numberOr(value: unknown, fallback: number): number {\n const number = Number(value);\n return Number.isFinite(number) ? number : fallback;\n}\n","import type { CliErrorShape } from './types.js';\n\nexport const ExitCode = {\n SUCCESS: 0,\n VALIDATION: 2,\n AUTH: 3,\n PERMISSION: 4,\n NOT_FOUND: 5,\n BUSINESS: 6,\n RATE_LIMIT: 7,\n SERVER: 8,\n NETWORK: 9,\n CONFIRMATION: 10,\n PARTIAL: 11,\n CANCELLED: 130,\n} as const;\n\nexport class CliError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly exitCode: number,\n public readonly retryable = false,\n public readonly details: Record<string, unknown> = {},\n public readonly suggestions: string[] = [],\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = 'CliError';\n }\n\n toJSON(): CliErrorShape {\n return {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n details: this.details,\n suggestions: this.suggestions,\n };\n }\n}\n\nexport function mapHttpError(status: number, data: unknown): CliError {\n const body = isRecord(data) ? data : {};\n const oauthError = typeof body.error === 'string' ? body.error : undefined;\n if (status === 401 && oauthError === 'invalid_client') {\n return new CliError('AUTH_INVALID_CLIENT', 'client authentication failed', ExitCode.AUTH, false);\n }\n if (status === 404) {\n return new CliError('RESOURCE_NOT_FOUND', '请求的资源或接口不存在', ExitCode.NOT_FOUND, false, { httpStatus: status });\n }\n if (status === 429) {\n return new CliError('RATE_LIMITED', '请求过于频繁', ExitCode.RATE_LIMIT, true, { httpStatus: status });\n }\n if (status >= 500) {\n return new CliError('BACKEND_SERVICE_ERROR', '后端服务异常', ExitCode.SERVER, true, { httpStatus: status });\n }\n return new CliError('HTTP_ERROR', `HTTP 请求失败 (${status})`, ExitCode.BUSINESS, false, { httpStatus: status });\n}\n\nexport function mapBackendError(code: number, message: string): CliError {\n const details = { backendCode: code };\n if ([301, 302, 303, 304].includes(code)) {\n return new CliError('AUTH_REQUIRED', message, ExitCode.AUTH, false, details);\n }\n if ([305, 306].includes(code)) {\n return new CliError('ADMIN_PERMISSION_DENIED', message, ExitCode.PERMISSION, false, details);\n }\n if (code === 999) {\n return new CliError('BACKEND_BUSINESS_ERROR', message, ExitCode.BUSINESS, false, details);\n }\n return new CliError('BACKEND_BUSINESS_ERROR', message, ExitCode.BUSINESS, false, details);\n}\n\nexport function toCliError(error: unknown): CliError {\n if (error instanceof CliError) return error;\n if (error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError')) {\n return new CliError('NETWORK_TIMEOUT', '请求超时', ExitCode.NETWORK, true, {}, [], { cause: error });\n }\n const message = error instanceof Error ? error.message : '未知错误';\n return new CliError('NETWORK_ERROR', message, ExitCode.NETWORK, true, {}, [], {\n cause: error instanceof Error ? error : undefined,\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n","import { request } from 'undici';\nimport { CliError, ExitCode, mapHttpError, toCliError } from './errors.js';\nimport { redact } from './redact.js';\nimport type { HttpResponse, RequestOptions } from './types.js';\n\nconst USER_AGENT = '@wcs-edu-os/cli/0.1.1';\n\nexport class HttpClient {\n constructor(private readonly baseUrl: string) {}\n\n async send<T = unknown>(options: RequestOptions): Promise<HttpResponse<T>> {\n const maxAttempts = options.readOnly ? 3 : 1;\n let lastError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n const response = await this.sendOnce<T>(options);\n if (isRetryableStatus(response.status) && attempt < maxAttempts) {\n options.onDiagnostic?.(`请求返回 ${response.status},准备第 ${attempt} 次重试`, redact({ path: options.path }));\n await delay(50 * attempt);\n continue;\n }\n if (response.status < 200 || response.status >= 300) throw mapHttpError(response.status, response.data);\n return response;\n } catch (error) {\n if (error instanceof CliError) {\n if (!error.retryable || attempt >= maxAttempts) throw error;\n } else if (attempt >= maxAttempts || !options.readOnly) {\n throw toCliError(error);\n }\n lastError = error;\n options.onDiagnostic?.(`网络请求失败,准备第 ${attempt} 次重试`, redact({ path: options.path, error }));\n await delay(50 * attempt);\n }\n }\n throw toCliError(lastError);\n }\n\n private async sendOnce<T>(options: RequestOptions): Promise<HttpResponse<T>> {\n const url = new URL(options.path, `${this.baseUrl}/`);\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value === undefined || value === null || value === '') continue;\n if (Array.isArray(value)) value.forEach((item) => url.searchParams.append(key, String(item)));\n else url.searchParams.set(key, String(value));\n }\n const headers: Record<string, string> = {\n accept: 'application/json',\n 'user-agent': USER_AGENT,\n 'x-request-id': options.requestId,\n };\n if (options.token) headers.token = options.token;\n if (options.idempotencyKey) headers['x-idempotency-key'] = options.idempotencyKey;\n if (options.basic) {\n headers.authorization = `Basic ${Buffer.from(`${options.basic.appKey}:${options.basic.appSecret}`, 'utf8').toString('base64')}`;\n }\n let body: string | undefined;\n if (options.form) {\n headers['content-type'] = 'application/x-www-form-urlencoded';\n body = new URLSearchParams(options.form).toString();\n } else if (options.body !== undefined) {\n headers['content-type'] = 'application/json';\n body = JSON.stringify(options.body);\n }\n\n let response;\n try {\n response = await request(url, {\n method: options.method,\n headers,\n body,\n signal: AbortSignal.timeout(options.timeoutMs),\n });\n } catch (error) {\n throw toCliError(error);\n }\n const text = await response.body.text();\n let data: unknown = null;\n if (text) {\n try {\n data = JSON.parse(text);\n } catch (error) {\n throw new CliError('BACKEND_INVALID_RESPONSE', '后端返回了无效 JSON', ExitCode.SERVER, false, {\n httpStatus: response.statusCode,\n }, [], { cause: error instanceof Error ? error : undefined });\n }\n }\n return {\n status: response.statusCode,\n headers: response.headers as Record<string, string | string[]>,\n data: data as T,\n };\n }\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","const SENSITIVE_KEYS = /^(token|access[_-]?token|authorization|password|passwd|secret|appsecret|app_secret|privatekey|private_key|mobile|idcard|id_card|email)$/i;\n\nexport function redact<T>(value: T): T {\n return redactValue(value, new WeakSet<object>()) as T;\n}\n\nfunction redactValue(value: unknown, seen: WeakSet<object>): unknown {\n if (Array.isArray(value)) return value.map((item) => redactValue(item, seen));\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n const output: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n output[key] = SENSITIVE_KEYS.test(key) ? mask(child) : redactValue(child, seen);\n }\n return output;\n}\n\nfunction mask(value: unknown): string {\n const text = String(value ?? '');\n if (text.length <= 4) return '[REDACTED]';\n return `${text.slice(0, 2)}***${text.slice(-2)}`;\n}\n\nexport function maskIdentifier(value: string): string {\n if (!value) return '';\n if (value.length <= 6) return `${value.slice(0, 1)}***`;\n return `${value.slice(0, 3)}***${value.slice(-3)}`;\n}\n\n","import { createHash, randomBytes } from 'node:crypto';\nimport { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { CliError, ExitCode } from './errors.js';\nimport { getCacheDir } from './token-cache.js';\n\nconst CONFIRMATION_TTL_MS = 10 * 60 * 1_000;\n\nexport interface ConfirmationBinding {\n command: string;\n baseUrl: string;\n userId: string;\n payload: unknown;\n endpoint: string;\n risk: string;\n sideEffects: string[];\n rollback: string | null;\n}\n\nexport interface ConfirmationRecord {\n command: string;\n environmentFingerprint: string;\n userId: string;\n payloadHash: string;\n endpoint: string;\n risk: string;\n sideEffects: string[];\n rollback: string | null;\n expiresAt: number;\n}\n\nexport class ConfirmationStore {\n constructor(private readonly env: NodeJS.ProcessEnv = process.env) {}\n\n async create(binding: ConfirmationBinding, now = Date.now()): Promise<{ confirmationCode: string; record: ConfirmationRecord }> {\n const confirmationCode = randomBytes(32).toString('base64url');\n const record = this.bind(binding, now + CONFIRMATION_TTL_MS);\n const path = this.path(confirmationCode);\n await mkdir(this.directory(), { recursive: true });\n await writeFile(path, JSON.stringify(record), { encoding: 'utf8', mode: 0o600 });\n if (process.platform !== 'win32') await chmod(path, 0o600);\n return { confirmationCode, record };\n }\n\n async verify(code: string, binding: ConfirmationBinding, now = Date.now()): Promise<ConfirmationRecord> {\n const path = this.path(code);\n let record: ConfirmationRecord;\n try {\n record = JSON.parse(await readFile(path, 'utf8')) as ConfirmationRecord;\n } catch (error) {\n throw new CliError('CONFIRMATION_INVALID', '确认令牌不存在或已失效', ExitCode.CONFIRMATION, false, {}, [], {\n cause: error instanceof Error ? error : undefined,\n });\n }\n if (record.expiresAt <= now) {\n await rm(path, { force: true });\n throw new CliError('CONFIRMATION_EXPIRED', '确认令牌已过期,请重新执行 dry-run', ExitCode.CONFIRMATION);\n }\n const expected = this.bind(binding, record.expiresAt);\n const mismatches = (['command', 'environmentFingerprint', 'userId', 'payloadHash', 'endpoint', 'risk'] as const)\n .filter((key) => record[key] !== expected[key]);\n if (mismatches.length > 0) {\n throw new CliError('CONFIRMATION_MISMATCH', '请求参数或执行身份与 dry-run 不一致', ExitCode.CONFIRMATION, false, {\n mismatches,\n });\n }\n return record;\n }\n\n async consume(code: string): Promise<void> {\n await rm(this.path(code), { force: true });\n }\n\n private bind(binding: ConfirmationBinding, expiresAt: number): ConfirmationRecord {\n return {\n command: binding.command,\n environmentFingerprint: hash(binding.baseUrl),\n userId: binding.userId,\n payloadHash: hash(stableStringify(binding.payload)),\n endpoint: binding.endpoint,\n risk: binding.risk,\n sideEffects: binding.sideEffects,\n rollback: binding.rollback,\n expiresAt,\n };\n }\n\n private directory(): string {\n return join(getCacheDir(this.env), 'confirmations');\n }\n\n private path(code: string): string {\n return join(this.directory(), `${hash(code)}.json`);\n }\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue);\n if (typeof value !== 'object' || value === null) return value;\n return Object.fromEntries(Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, child]) => [key, sortValue(child)]));\n}\n\nfunction hash(value: string): string {\n return createHash('sha256').update(value).digest('hex');\n}\n","import { createHash } from 'node:crypto';\nimport { chmod, mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { CachedToken, TokenResponse } from './types.js';\n\nexport function getCacheDir(env: NodeJS.ProcessEnv = process.env): string {\n if (env.WCS_EDU_CACHE_DIR) return env.WCS_EDU_CACHE_DIR;\n if (process.platform === 'win32') return join(env.LOCALAPPDATA ?? join(homedir(), 'AppData', 'Local'), 'wcs-edu-os-cli');\n if (process.platform === 'darwin') return join(homedir(), 'Library', 'Caches', 'wcs-edu-os-cli');\n return join(env.XDG_CACHE_HOME ?? join(homedir(), '.cache'), 'wcs-edu-os-cli');\n}\n\nexport function credentialFingerprint(baseUrl: string, appKey: string): string {\n return createHash('sha256').update(`${baseUrl}\\0${appKey}`).digest('hex').slice(0, 16);\n}\n\nexport class TokenCache {\n constructor(private readonly env: NodeJS.ProcessEnv = process.env) {}\n\n private path(baseUrl: string, appKey: string): string {\n return join(getCacheDir(this.env), `token-${credentialFingerprint(baseUrl, appKey)}.json`);\n }\n\n async get(baseUrl: string, appKey: string, now = Date.now()): Promise<CachedToken | null> {\n const path = this.path(baseUrl, appKey);\n try {\n const token = JSON.parse(await readFile(path, 'utf8')) as CachedToken;\n if (!token.access_token || token.expiresAt <= now + 5_000) {\n await rm(path, { force: true });\n return null;\n }\n return token;\n } catch (error) {\n if (error instanceof SyntaxError) await rm(path, { force: true });\n return null;\n }\n }\n\n async set(baseUrl: string, appKey: string, token: TokenResponse, now = Date.now()): Promise<CachedToken> {\n const dir = getCacheDir(this.env);\n const path = this.path(baseUrl, appKey);\n const cached: CachedToken = { ...token, expiresAt: now + token.expires_in * 1_000 };\n await mkdir(dir, { recursive: true });\n await writeFile(path, JSON.stringify(cached), { encoding: 'utf8', mode: 0o600 });\n if (process.platform !== 'win32') await chmod(path, 0o600);\n return cached;\n }\n}\n\n","import { emitKeypressEvents } from 'node:readline';\nimport { createInterface } from 'node:readline/promises';\nimport { stdin as defaultStdin, stderr as defaultStderr } from 'node:process';\nimport type { Readable, Writable } from 'node:stream';\nimport { CliError, ExitCode } from './errors.js';\n\nexport type CredentialSource = 'stdin' | 'prompt' | 'environment' | 'none';\n\nexport interface ResolvedSecret {\n value?: string;\n source: CredentialSource;\n}\n\nexport async function resolveAppSecret(options: {\n secretStdin?: boolean;\n interactive?: boolean;\n env?: NodeJS.ProcessEnv;\n stdin?: Readable;\n stderr?: Writable;\n} = {}): Promise<ResolvedSecret> {\n const env = options.env ?? process.env;\n const input = options.stdin ?? defaultStdin;\n if (options.secretStdin) {\n const value = (await readAll(input)).trimEnd();\n if (!value) throw new CliError('APP_SECRET_MISSING', '标准输入中没有 appSecret', ExitCode.VALIDATION);\n return { value, source: 'stdin' };\n }\n if (options.interactive && 'isTTY' in input && input.isTTY) {\n const output = options.stderr ?? defaultStderr;\n const value = 'setRawMode' in input && typeof input.setRawMode === 'function'\n ? await readHidden(input as Readable & { isRaw?: boolean; setRawMode(mode: boolean): void }, output)\n : await readVisibleFallback(input, output);\n if (value) return { value, source: 'prompt' };\n }\n if (env.WCS_EDU_APP_SECRET) return { value: env.WCS_EDU_APP_SECRET, source: 'environment' };\n return { source: 'none' };\n}\n\nasync function readHidden(\n input: Readable & { isRaw?: boolean; setRawMode(mode: boolean): void },\n output: Writable,\n): Promise<string> {\n output.write('App Secret: ');\n emitKeypressEvents(input);\n const wasRaw = input.isRaw ?? false;\n input.setRawMode(true);\n input.resume();\n return new Promise((resolve, reject) => {\n let value = '';\n const cleanup = () => {\n input.off('keypress', onKeypress);\n input.setRawMode(wasRaw);\n input.pause();\n output.write('\\n');\n };\n const onKeypress = (text: string, key: { name?: string; ctrl?: boolean; meta?: boolean }) => {\n if (key.ctrl && key.name === 'c') {\n cleanup();\n reject(new CliError('USER_CANCELLED', '用户取消输入', ExitCode.CANCELLED));\n } else if (key.name === 'return' || key.name === 'enter') {\n cleanup();\n resolve(value);\n } else if (key.name === 'backspace') {\n value = value.slice(0, -1);\n } else if (!key.ctrl && !key.meta && text) {\n value += text;\n }\n };\n input.on('keypress', onKeypress);\n });\n}\n\nasync function readVisibleFallback(input: Readable, output: Writable): Promise<string> {\n const rl = createInterface({ input, output, terminal: true });\n const value = await rl.question('App Secret: ');\n rl.close();\n return value;\n}\n\nasync function readAll(stream: Readable): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n return Buffer.concat(chunks).toString('utf8');\n}\n","import { readFile } from 'node:fs/promises';\nimport type { Readable } from 'node:stream';\nimport { CliError, ExitCode } from './errors.js';\n\nconst MAX_INPUT_BYTES = 1024 * 1024;\n\nexport async function loadJsonInput(path: string, stdin: Readable): Promise<unknown> {\n let text: string;\n try {\n text = path === '-' ? await readStream(stdin) : await readFile(path, 'utf8');\n } catch (error) {\n if (error instanceof CliError) throw error;\n throw new CliError('INPUT_READ_FAILED', `无法读取输入: ${path}`, ExitCode.VALIDATION, false, {}, [], {\n cause: error instanceof Error ? error : undefined,\n });\n }\n if (Buffer.byteLength(text, 'utf8') > MAX_INPUT_BYTES) {\n throw new CliError('INPUT_TOO_LARGE', '输入 JSON 不能超过 1 MiB', ExitCode.VALIDATION);\n }\n try {\n return JSON.parse(text);\n } catch (error) {\n throw new CliError('INPUT_JSON_INVALID', '输入不是有效 JSON', ExitCode.VALIDATION, false, {}, [], {\n cause: error instanceof Error ? error : undefined,\n });\n }\n}\n\nasync function readStream(stream: Readable): Promise<string> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of stream) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n size += buffer.length;\n if (size > MAX_INPUT_BYTES) {\n throw new CliError('INPUT_TOO_LARGE', '输入 JSON 不能超过 1 MiB', ExitCode.VALIDATION);\n }\n chunks.push(buffer);\n }\n return Buffer.concat(chunks).toString('utf8');\n}\n","import { randomUUID } from 'node:crypto';\nimport { CliError, toCliError } from './errors.js';\nimport { redact } from './redact.js';\nimport type { NormalizedResult, OutputEnvelope } from './types.js';\n\nexport function requestId(value?: string): string {\n return value?.trim() || randomUUID();\n}\n\nexport function successEnvelope(\n command: string,\n id: string,\n result: NormalizedResult,\n meta: Record<string, unknown>,\n warnings: string[] = [],\n): OutputEnvelope {\n return redact({\n schemaVersion: '1.0',\n ok: true,\n command,\n requestId: id,\n data: result.data,\n page: result.page,\n warnings,\n meta,\n error: null,\n });\n}\n\nexport function failureEnvelope(\n command: string,\n id: string,\n error: unknown,\n meta: Record<string, unknown> = {},\n): { envelope: OutputEnvelope; error: CliError } {\n const cliError = toCliError(error);\n return {\n error: cliError,\n envelope: redact({\n schemaVersion: '1.0',\n ok: false,\n command,\n requestId: id,\n data: null,\n page: null,\n warnings: [],\n meta,\n error: cliError.toJSON(),\n }),\n };\n}\n\n","import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport YAML from 'yaml';\nimport { CliError, ExitCode } from './errors.js';\nimport type { ProfileFile, ResolvedProfile } from './types.js';\n\nconst EMPTY_PROFILES: ProfileFile = { profiles: {} };\n\nexport function getConfigDir(env: NodeJS.ProcessEnv = process.env): string {\n if (env.WCS_EDU_CONFIG_DIR) return env.WCS_EDU_CONFIG_DIR;\n if (process.platform === 'win32') return join(env.APPDATA ?? join(homedir(), 'AppData', 'Roaming'), 'wcs-edu-os-cli');\n if (process.platform === 'darwin') return join(homedir(), 'Library', 'Application Support', 'wcs-edu-os-cli');\n return join(env.XDG_CONFIG_HOME ?? join(homedir(), '.config'), 'wcs-edu-os-cli');\n}\n\nexport function getProfilePath(env: NodeJS.ProcessEnv = process.env): string {\n return join(getConfigDir(env), 'profiles.yml');\n}\n\nexport async function loadProfiles(env: NodeJS.ProcessEnv = process.env): Promise<ProfileFile> {\n try {\n const parsed = YAML.parse(await readFile(getProfilePath(env), 'utf8')) as unknown;\n if (!parsed || typeof parsed !== 'object') return structuredClone(EMPTY_PROFILES);\n const value = parsed as Partial<ProfileFile>;\n return { currentProfile: value.currentProfile, profiles: value.profiles ?? {} };\n } catch (error) {\n if (isNotFound(error)) return structuredClone(EMPTY_PROFILES);\n throw new CliError('PROFILE_READ_FAILED', '无法读取 Profile 配置', ExitCode.VALIDATION, false, {}, [], {\n cause: error instanceof Error ? error : undefined,\n });\n }\n}\n\nexport async function saveProfiles(config: ProfileFile, env: NodeJS.ProcessEnv = process.env): Promise<void> {\n const dir = getConfigDir(env);\n const path = getProfilePath(env);\n await mkdir(dir, { recursive: true });\n await writeFile(path, YAML.stringify(config), { encoding: 'utf8', mode: 0o600 });\n if (process.platform !== 'win32') await chmod(path, 0o600);\n}\n\nexport async function useProfile(name: string, baseUrl?: string, env: NodeJS.ProcessEnv = process.env): Promise<ProfileFile> {\n const config = await loadProfiles(env);\n if (baseUrl) config.profiles[name] = { baseUrl: normalizeBaseUrl(baseUrl) };\n if (!config.profiles[name]) {\n throw new CliError('PROFILE_NOT_FOUND', `Profile 不存在: ${name}`, ExitCode.VALIDATION);\n }\n config.currentProfile = name;\n await saveProfiles(config, env);\n return config;\n}\n\nexport async function resolveProfile(\n explicitName?: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<ResolvedProfile> {\n const config = await loadProfiles(env);\n const name = explicitName ?? env.WCS_EDU_PROFILE ?? config.currentProfile ?? 'default';\n const source: ResolvedProfile['source'] = explicitName\n ? 'argument'\n : env.WCS_EDU_PROFILE\n ? 'environment'\n : config.currentProfile\n ? 'current'\n : 'default';\n const baseUrl = env.WCS_EDU_BASE_URL ?? config.profiles[name]?.baseUrl;\n if (!baseUrl) {\n throw new CliError('BASE_URL_MISSING', '未配置 WCS EDU OS base URL', ExitCode.VALIDATION, false, { profile: name }, [\n '设置 WCS_EDU_BASE_URL',\n `或执行 profile use ${name} --base-url <url>`,\n ]);\n }\n return { name, baseUrl: normalizeBaseUrl(baseUrl), source };\n}\n\nexport function normalizeBaseUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new CliError('BASE_URL_INVALID', 'base URL 格式无效', ExitCode.VALIDATION);\n }\n if (!['http:', 'https:'].includes(url.protocol)) {\n throw new CliError('BASE_URL_INVALID', 'base URL 只支持 http 或 https', ExitCode.VALIDATION);\n }\n return url.toString().replace(/\\/$/, '');\n}\n\nfunction isNotFound(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'ENOENT';\n}\n\n","import { createHash } from 'node:crypto';\nimport type { Readable, Writable } from 'node:stream';\nimport { z } from 'zod';\nimport {\n buildTree,\n CliError,\n ConfirmationStore,\n credentialFingerprint,\n ExitCode,\n failureEnvelope,\n findCommand,\n getCapabilities,\n getConfigDir,\n getProfilePath,\n loadProfiles,\n loadJsonInput,\n maskIdentifier,\n redact,\n requestId,\n resolveAppSecret,\n resolveProfile,\n successEnvelope,\n TokenCache,\n useProfile,\n WcsClient,\n} from '@wcs-edu-os/core';\nimport type {\n CommandSpec,\n GlobalOptions,\n NormalizedResult,\n OutputEnvelope,\n OutputFormat,\n ResolvedProfile,\n} from '@wcs-edu-os/core';\nimport Table from 'cli-table3';\n\nexport interface RunnerIo {\n stdin: Readable & { isTTY?: boolean };\n stdout: Writable & { isTTY?: boolean };\n stderr: Writable;\n env: NodeJS.ProcessEnv;\n}\n\nexport interface RunResult {\n exitCode: number;\n envelope: OutputEnvelope;\n}\n\nconst VERSION = '0.1.1';\n\nexport async function runCommand(\n spec: CommandSpec,\n rawInput: Record<string, unknown>,\n globals: GlobalOptions,\n io: RunnerIo,\n): Promise<RunResult> {\n const id = requestId(globals.requestId);\n const started = Date.now();\n let profileName: string | undefined;\n try {\n const parsed = spec.inputSchema.safeParse(rawInput);\n if (!parsed.success) {\n throw new CliError('VALIDATION_ERROR', '命令参数校验失败', ExitCode.VALIDATION, false, {\n issues: parsed.error.issues,\n });\n }\n const input = parsed.data as Record<string, unknown>;\n const result = await execute(spec, input, globals, io, id, (name) => { profileName = name; });\n const envelope = successEnvelope(spec.name, id, result, {\n profile: profileName ?? null,\n durationMs: Date.now() - started,\n });\n writeSuccess(envelope, chooseOutput(globals.output, io.stdout.isTTY), spec, io.stdout);\n return { exitCode: !spec.readOnly && globals.dryRun ? ExitCode.CONFIRMATION : 0, envelope };\n } catch (error) {\n const failed = failureEnvelope(spec.name, id, error, {\n profile: profileName ?? null,\n durationMs: Date.now() - started,\n });\n io.stdout.write(`${JSON.stringify(failed.envelope)}\\n`);\n if (globals.debug) io.stderr.write(`${JSON.stringify(redact({ error }))}\\n`);\n return { exitCode: failed.error.exitCode, envelope: failed.envelope };\n }\n}\n\nasync function execute(\n spec: CommandSpec,\n input: Record<string, unknown>,\n globals: GlobalOptions,\n io: RunnerIo,\n id: string,\n setProfile: (name: string) => void,\n): Promise<NormalizedResult> {\n if (spec.name === 'version') return value({ version: VERSION, node: process.version });\n if (spec.name === 'guide') return value(buildGuide(String(input.topic ?? 'all')));\n if (spec.name.startsWith('profile.')) return executeProfile(spec.name, input, globals, io, setProfile);\n if (spec.name === 'schema') {\n const target = findCommand(String(input.command));\n if (!target) throw new CliError('COMMAND_NOT_FOUND', `未知命令: ${input.command}`, ExitCode.VALIDATION);\n return value({\n command: target.name,\n input: z.toJSONSchema(target.payloadSchema ?? target.inputSchema),\n output: z.toJSONSchema(target.outputSchema),\n endpoints: target.endpoints,\n risk: target.risk,\n readOnly: target.readOnly,\n supportsDryRun: target.supportsDryRun,\n supportsIdempotency: target.supportsIdempotency,\n });\n }\n if (spec.name === 'auth.status') return authStatus(globals, io, setProfile);\n if (spec.name === 'auth.credential-info') return credentialInfo(globals, io, setProfile);\n if (spec.name === 'doctor') return doctor(globals, io, id, setProfile);\n if (spec.name === 'capabilities') return capabilities(globals, io, id, setProfile);\n\n if (!spec.readOnly && globals.dryRun && globals.confirmToken) {\n throw new CliError('CONFIRMATION_OPTION_CONFLICT', 'dry-run 不能同时提供 --confirm-token', ExitCode.VALIDATION);\n }\n if (!spec.readOnly && !globals.dryRun && !globals.confirmToken) {\n throw new CliError('CONFIRMATION_REQUIRED', '写操作必须先执行 --dry-run,再提供 --confirm-token', ExitCode.CONFIRMATION);\n }\n if (!spec.readOnly && !globals.dryRun) {\n const idempotencyKey = globals.idempotencyKey?.trim();\n if (!idempotencyKey || idempotencyKey.length > 128) {\n throw new CliError('IDEMPOTENCY_KEY_REQUIRED', '写操作必须提供 1-128 字符的 --idempotency-key', ExitCode.CONFIRMATION);\n }\n }\n if (!spec.readOnly && input.input === '-' && globals.secretStdin) {\n throw new CliError('STDIN_CONFLICT', '--input - 与 --secret-stdin 不能同时使用', ExitCode.VALIDATION);\n }\n const context = await createContext(globals, io, setProfile);\n const token = await context.client.token(id, context.secret.value, spec.name === 'auth.test');\n if (spec.name === 'auth.test') {\n const whoami = findCommand('auth.whoami');\n if (!whoami) throw new CliError('COMMAND_CONTRACT_ERROR', '缺少 auth.whoami 契约', ExitCode.SERVER);\n await context.client.result(whoami, 0, id, token.access_token, {});\n return value({ valid: true, userId: token.user_id, expiresAt: token.expiresAt, apiCount: token.apis.length });\n }\n if (spec.name === 'statistics.dashboard') return dashboard(spec, input, context.client, token.access_token, id);\n if (!spec.readOnly) {\n return executeWrite(spec, input, globals, io, context.client, context.profile.baseUrl, token, id);\n }\n const endpoint = spec.endpoints[0];\n const result = endpoint?.pagination\n ? await context.client.pagedResult(spec, id, token.access_token, input)\n : await context.client.result(spec, 0, id, token.access_token, input);\n if (spec.name === 'department.tree') {\n return value(buildTree(Array.isArray(result.data) ? result.data : []));\n }\n if (spec.name === 'auth.whoami') {\n return value({ user: result.data, permissions: { count: token.apis.length, apis: token.apis } });\n }\n return result;\n}\n\nasync function executeWrite(\n spec: CommandSpec,\n input: Record<string, unknown>,\n globals: GlobalOptions,\n io: RunnerIo,\n client: WcsClient,\n baseUrl: string,\n token: { access_token: string; user_id: string },\n requestIdValue: string,\n): Promise<NormalizedResult> {\n if (!spec.payloadSchema || !spec.supportsDryRun || !spec.supportsIdempotency) {\n throw new CliError('COMMAND_CONTRACT_ERROR', '写命令缺少安全协议声明', ExitCode.SERVER);\n }\n const inputPath = String(input.input);\n const payloadResult = spec.payloadSchema.safeParse(await loadJsonInput(inputPath, io.stdin));\n if (!payloadResult.success) {\n throw new CliError('PAYLOAD_VALIDATION_ERROR', '输入 JSON 不符合命令契约', ExitCode.VALIDATION, false, {\n issues: payloadResult.error.issues,\n });\n }\n const payload = payloadResult.data as Record<string, unknown>;\n const endpoint = spec.endpoints[0];\n if (!endpoint) throw new CliError('COMMAND_CONTRACT_ERROR', '写命令缺少 endpoint', ExitCode.SERVER);\n const binding = {\n command: spec.name,\n baseUrl,\n userId: token.user_id,\n payload,\n endpoint: endpoint.path,\n risk: spec.risk,\n sideEffects: spec.sideEffects,\n rollback: spec.rollback,\n };\n const confirmations = new ConfirmationStore(io.env);\n if (globals.dryRun) {\n const plan = await confirmations.create(binding);\n return value({\n dryRun: true,\n confirmationCode: plan.confirmationCode,\n expiresAt: plan.record.expiresAt,\n endpoint: endpoint.path,\n method: endpoint.method,\n risk: spec.risk,\n sideEffects: spec.sideEffects,\n rollback: spec.rollback,\n payloadHash: plan.record.payloadHash,\n });\n }\n const confirmationToken = globals.confirmToken as string;\n const idempotencyKey = globals.idempotencyKey?.trim() as string;\n await confirmations.verify(confirmationToken, binding);\n const result = await client.result(spec, 0, requestIdValue, token.access_token, payload, idempotencyKey);\n await confirmations.consume(confirmationToken);\n return result;\n}\n\nasync function executeProfile(\n name: string,\n input: Record<string, unknown>,\n globals: GlobalOptions,\n io: RunnerIo,\n setProfile: (name: string) => void,\n): Promise<NormalizedResult> {\n const config = await loadProfiles(io.env);\n if (name === 'profile.list') {\n return value(Object.entries(config.profiles).map(([profileName, profile]) => ({\n name: profileName,\n baseUrl: profile.baseUrl,\n current: config.currentProfile === profileName,\n })));\n }\n if (name === 'profile.get') {\n const profileName = String(input.name ?? globals.profile ?? io.env.WCS_EDU_PROFILE ?? config.currentProfile ?? 'default');\n const profile = config.profiles[profileName];\n if (!profile) throw new CliError('PROFILE_NOT_FOUND', `Profile 不存在: ${profileName}`, ExitCode.VALIDATION);\n setProfile(profileName);\n return value({ name: profileName, ...profile, current: config.currentProfile === profileName });\n }\n const profileName = String(input.name);\n const updated = await useProfile(profileName, input.baseUrl ? String(input.baseUrl) : undefined, io.env);\n setProfile(profileName);\n return value({ name: profileName, baseUrl: updated.profiles[profileName]?.baseUrl, current: true });\n}\n\nasync function authStatus(\n globals: GlobalOptions,\n io: RunnerIo,\n setProfile: (name: string) => void,\n): Promise<NormalizedResult> {\n const profiles = await loadProfiles(io.env);\n const profileName = globals.profile ?? io.env.WCS_EDU_PROFILE ?? profiles.currentProfile ?? 'default';\n setProfile(profileName);\n const baseUrl = io.env.WCS_EDU_BASE_URL ?? profiles.profiles[profileName]?.baseUrl;\n const appKey = io.env.WCS_EDU_APP_KEY;\n const token = baseUrl && appKey ? await new TokenCache(io.env).get(baseUrl.replace(/\\/$/, ''), appKey) : null;\n return value({\n profile: profileName,\n configPath: getProfilePath(io.env),\n baseUrlConfigured: Boolean(baseUrl),\n appKeyConfigured: Boolean(appKey),\n credentialSource: globals.secretStdin ? 'stdin' : io.env.WCS_EDU_APP_SECRET ? 'environment' : io.stdin.isTTY ? 'prompt' : 'none',\n tokenCached: Boolean(token),\n tokenExpiresAt: token?.expiresAt ?? null,\n });\n}\n\nasync function credentialInfo(\n globals: GlobalOptions,\n io: RunnerIo,\n setProfile: (name: string) => void,\n): Promise<NormalizedResult> {\n const profile = await resolveProfile(globals.profile, io.env);\n setProfile(profile.name);\n const appKey = io.env.WCS_EDU_APP_KEY;\n const token = appKey ? await new TokenCache(io.env).get(profile.baseUrl, appKey) : null;\n return value({\n profile: profile.name,\n baseUrl: profile.baseUrl,\n appKey: appKey ? maskIdentifier(appKey) : null,\n appKeyFingerprint: appKey ? credentialFingerprint(profile.baseUrl, appKey) : null,\n credentialSource: globals.secretStdin ? 'stdin' : io.env.WCS_EDU_APP_SECRET ? 'environment' : io.stdin.isTTY ? 'prompt' : 'none',\n userId: token?.user_id ?? null,\n tokenExpiresAt: token?.expiresAt ?? null,\n });\n}\n\nasync function capabilities(\n globals: GlobalOptions,\n io: RunnerIo,\n id: string,\n setProfile: (name: string) => void,\n): Promise<NormalizedResult> {\n try {\n const context = await createContext(globals, io, setProfile, false);\n const cached = await context.cache.get(context.profile.baseUrl, context.appKey);\n if (cached) return value(getCapabilities(cached.apis));\n if (context.secret.value) {\n const token = await context.client.token(id, context.secret.value);\n return value(getCapabilities(token.apis));\n }\n } catch {\n // 静态能力清单不依赖认证可用性。\n }\n return value(getCapabilities());\n}\n\nasync function doctor(\n globals: GlobalOptions,\n io: RunnerIo,\n id: string,\n setProfile: (name: string) => void,\n): Promise<NormalizedResult> {\n const checks: Array<{ check: string; status: 'pass' | 'fail' | 'skip'; message: string }> = [];\n const nodeMajor = Number(process.versions.node.split('.')[0]);\n checks.push({ check: 'node', status: nodeMajor >= 22 ? 'pass' : 'fail', message: process.version });\n checks.push({ check: 'config', status: 'pass', message: getConfigDir(io.env) });\n let context: Awaited<ReturnType<typeof createContext>> | undefined;\n try {\n context = await createContext(globals, io, setProfile, false);\n checks.push({ check: 'profile', status: 'pass', message: context.profile.name });\n checks.push({ check: 'baseUrl', status: 'pass', message: context.profile.baseUrl });\n checks.push({ check: 'credentials', status: context.secret.value ? 'pass' : 'skip', message: context.secret.source });\n } catch (error) {\n checks.push({ check: 'profile/baseUrl', status: 'fail', message: error instanceof Error ? error.message : String(error) });\n }\n if (context) {\n try {\n const token = await context.client.token(id, context.secret.value);\n checks.push({ check: 'token', status: 'pass', message: `userId=${token.user_id}` });\n const whoami = findCommand('auth.whoami');\n if (!whoami) throw new Error('auth.whoami contract missing');\n await context.client.result(whoami, 0, id, token.access_token, {});\n checks.push({ check: 'currentUser', status: 'pass', message: '/base/admin/login/user' });\n } catch (error) {\n checks.push({ check: 'token/currentUser', status: context.secret.value ? 'fail' : 'skip', message: error instanceof Error ? error.message : String(error) });\n }\n } else {\n checks.push({ check: 'token/currentUser', status: 'skip', message: '缺少可用配置' });\n }\n return value({ items: checks, healthy: checks.every((item) => item.status !== 'fail') });\n}\n\nasync function dashboard(\n spec: CommandSpec,\n input: Record<string, unknown>,\n client: WcsClient,\n token: string,\n id: string,\n): Promise<NormalizedResult> {\n const calls = spec.endpoints.map((endpoint, index) => client.result(\n spec,\n index,\n id,\n token,\n endpoint.path.endsWith('/data') ? {} : { dates: input.dates },\n ));\n const settled = await Promise.allSettled(calls);\n const failed = settled.flatMap((result, index) => result.status === 'rejected'\n ? [{ endpoint: spec.endpoints[index]?.path, error: result.reason instanceof Error ? result.reason.message : String(result.reason) }]\n : []);\n if (failed.length > 0) {\n throw new CliError('DASHBOARD_REQUEST_FAILED', '仪表盘子请求失败', ExitCode.SERVER, false, { failedEndpoints: failed });\n }\n const values = settled.map((result) => result.status === 'fulfilled' ? result.value.data : null);\n return value({ data: values[0], login: values[1], order: values[2] });\n}\n\nasync function createContext(\n globals: GlobalOptions,\n io: RunnerIo,\n setProfile: (name: string) => void,\n allowPrompt = true,\n): Promise<{\n profile: ResolvedProfile;\n appKey: string;\n secret: Awaited<ReturnType<typeof resolveAppSecret>>;\n cache: TokenCache;\n client: WcsClient;\n}> {\n const profile = await resolveProfile(globals.profile, io.env);\n setProfile(profile.name);\n const appKey = io.env.WCS_EDU_APP_KEY;\n if (!appKey) throw new CliError('APP_KEY_MISSING', '未设置 WCS_EDU_APP_KEY', ExitCode.AUTH);\n const secret = await resolveAppSecret({\n secretStdin: globals.secretStdin,\n interactive: allowPrompt && !globals.nonInteractive,\n env: io.env,\n stdin: io.stdin,\n stderr: io.stderr,\n });\n const cache = new TokenCache(io.env);\n const timeoutMs = Number(globals.timeout ?? 10_000);\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new CliError('TIMEOUT_INVALID', 'timeout 必须是正整数', ExitCode.VALIDATION);\n }\n const diagnostic = globals.debug\n ? (message: string, context?: unknown) => io.stderr.write(`${message} ${JSON.stringify(redact(context))}\\n`)\n : undefined;\n return { profile, appKey, secret, cache, client: new WcsClient(profile.baseUrl, appKey, cache, timeoutMs, diagnostic) };\n}\n\nfunction value(data: unknown): NormalizedResult {\n return { data, page: null };\n}\n\nfunction buildGuide(topic: string): Record<string, unknown> {\n const guides: Record<string, Record<string, unknown>> = {\n 'getting-started': {\n title: '首次安装与连接',\n summary: '安装 CLI、配置网关和凭据,然后用 doctor 验证连接。',\n commands: [\n 'npm install -g @wcs-edu-os/cli',\n 'wcs-edu-os version',\n 'wcs-edu-os profile use test --base-url https://edu.example.com',\n 'wcs-edu-os doctor --output table',\n 'wcs-edu-os auth test --non-interactive --output json',\n ],\n environment: ['WCS_EDU_BASE_URL', 'WCS_EDU_APP_KEY', 'WCS_EDU_APP_SECRET 或 --secret-stdin'],\n prompt: '请先运行 wcs-edu-os doctor;如果通过,帮我查看当前管理员身份和可用权限。',\n },\n course: {\n title: '课程管理流程',\n summary: '先查分类和讲师,再查询课程、章节;创建或更新必须先 dry-run。',\n commands: [\n 'wcs-edu-os category list --output table',\n 'wcs-edu-os lecturer list --output table',\n 'wcs-edu-os course list --keyword 关键词 --output table',\n 'wcs-edu-os course get <courseId> --output json',\n 'wcs-edu-os course chapter list <courseId> --output json',\n 'wcs-edu-os course create --input course.json --dry-run --output json',\n ],\n prompt: '请先列出课程分类、讲师和课程,找到目标课程后展示详情与章节;任何写操作先给出 dry-run 计划,不要直接提交。',\n },\n exam: {\n title: '题库与考试查询',\n summary: '按试题、试卷、考试三层查询,先列出资源再查看详情。',\n commands: [\n 'wcs-edu-os question list --output table',\n 'wcs-edu-os paper list --output table',\n 'wcs-edu-os exam list --output table',\n 'wcs-edu-os exam get <examId> --output json',\n ],\n prompt: '请先列出可用试卷和考试,按名称或状态筛选;找到目标后查询详情,并说明当前 CLI 不支持发布、删除和批量指派。',\n },\n write: {\n title: '安全写操作',\n summary: '创建和更新只接受 JSON 输入,必须经过 dry-run、确认令牌和幂等键。',\n commands: [\n 'wcs-edu-os course update --input course.json --dry-run --output json',\n 'wcs-edu-os course update --input course.json --confirm-token <token> --idempotency-key <unique-key> --output json',\n ],\n prompt: '请检查这份 JSON 的字段和目标环境,先执行 dry-run,解释副作用、回滚方式和确认码有效期,等待我确认后再提交。',\n },\n };\n if (topic === 'all') return { topics: Object.values(guides), hint: '使用 wcs-edu-os guide <topic> 查看单个主题。' };\n return guides[topic] ?? guides['getting-started']!;\n}\n\nfunction chooseOutput(explicit: OutputFormat | undefined, isTTY?: boolean): OutputFormat {\n return explicit ?? (isTTY ? 'table' : 'json');\n}\n\nfunction writeSuccess(envelope: OutputEnvelope, format: OutputFormat, spec: CommandSpec, stdout: Writable): void {\n if (format === 'jsonl') {\n stdout.write(`${JSON.stringify(envelope)}\\n`);\n return;\n }\n if (format === 'json') {\n stdout.write(`${JSON.stringify(envelope, null, 2)}\\n`);\n return;\n }\n stdout.write(`${renderTable(envelope.data, spec)}\\n`);\n}\n\nfunction renderTable(data: unknown, spec: CommandSpec): string {\n const items = extractRows(data);\n if (items.length === 0) return '(无数据)';\n const columns = spec.table.length > 0 ? spec.table : inferColumns(items[0]);\n const table = new Table({ head: columns.map((column) => column.label), style: { head: [], border: [] } });\n for (const row of items) table.push(columns.map((column) => formatCell(row[column.key])));\n return table.toString();\n}\n\nfunction extractRows(data: unknown): Record<string, unknown>[] {\n if (Array.isArray(data)) return data.filter(isRecord);\n if (isRecord(data) && Array.isArray(data.items)) return data.items.filter(isRecord);\n if (isRecord(data)) return Object.entries(data).map(([key, val]) => ({ key, value: val }));\n return [{ value: data }];\n}\n\nfunction inferColumns(row?: Record<string, unknown>): Array<{ key: string; label: string }> {\n if (!row) return [];\n return Object.keys(row).slice(0, 8).map((key) => ({ key, label: key }));\n}\n\nfunction formatCell(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function versionFingerprint(): string {\n return createHash('sha256').update(VERSION).digest('hex').slice(0, 8);\n}\n"],"mappings":"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","names":["value","spec","value","z","exitCode","isRecord","value","value","value","z","requestId","spec","endpoint","value","isRecord","createHash","chmod","mkdir","readFile","rm","writeFile","join","mkdir","writeFile","chmod","readFile","rm","join","value","createHash","value","readFile","stdin","readFile","value","chmod","mkdir","readFile","writeFile","homedir","join","join","homedir","readFile","value","mkdir","writeFile","chmod","createHash","z","spec","z","endpoint","profileName","stdout","isRecord","value","spec","value"]}
package/package.json CHANGED
@@ -1,6 +1,45 @@
1
- {
2
- "name": "@wcs-edu-os/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
1
+ {
2
+ "name": "@wcs-edu-os/cli",
3
+ "version": "0.1.1",
4
+ "description": "WCS EDU OS 开源管理员命令行工具,支持安全查询和受保护写操作",
5
+ "keywords": [
6
+ "wcs-edu-os",
7
+ "open-source",
8
+ "cli",
9
+ "education",
10
+ "admin",
11
+ "automation"
12
+ ],
13
+ "license": "AGPL-3.0-only",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://codeup.aliyun.com/qixin/base/opens/wcs-edu.git",
17
+ "directory": "wcs-edu-cli/packages/cli"
18
+ },
19
+ "homepage": "https://codeup.aliyun.com/qixin/base/opens/wcs-edu",
20
+ "type": "module",
21
+ "bin": {
22
+ "wcs-edu-os": "dist/index.js"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsup src/index.ts --format esm --sourcemap --clean"
30
+ },
31
+ "engines": {
32
+ "node": ">=22"
33
+ },
34
+ "dependencies": {
35
+ "cli-table3": "^0.6.5",
36
+ "commander": "^14.0.1",
37
+ "undici": "^7.16.0",
38
+ "yaml": "^2.8.1",
39
+ "zod": "^4.1.11"
40
+ },
41
+ "devDependencies": {
42
+ "@wcs-edu-os/core": "workspace:*",
43
+ "tsup": "^8.5.0"
44
+ }
45
+ }