@freelog-cli/cli2 0.5.0

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,"file":"index.js","names":["redactSensitiveValue","trimStr","stableStringify","FServiceAPI","FServiceAPI","FServiceAPI","FUtil","FServiceAPI","stableStringify","trimStr","FServiceAPI","cliErrorMessage","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FUtil","FServiceAPI","CONFIG_RE","getRecordValue","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","FServiceAPI","versionCommand","policyListCmd","policySetCmd","policyCommand","FServiceAPI","fs","loadManifest","CONFIG_RE","versionCommand","policyCommand","compareCommand","FServiceAPI","FServiceAPI","updateCommand","listCommand","FServiceAPI","pullCommand","FUtil","FServiceAPI","publishCommand","FServiceAPI","searchCommand","updateCommand","FServiceAPI","FServiceAPI","listCommand","publishCommand"],"sources":["../../src/commands/initHelp.ts","../../src/core/jsonEnvelope.ts","../../src/core/command.ts","../../src/config/project/schemaMigration.ts","../../src/config/project/writeLock.ts","../../src/config/project/store.ts","../../src/config/project/projects.ts","../../src/core/cliArgs.ts","../../src/adapters/versionDraftAdapter.ts","../../src/services/shared/platform/fetch.ts","../../src/services/onlineGates.ts","../../src/services/authorizationTree.ts","../../src/core/consoleUrl.ts","../../src/services/shared/publish/fileProperty.ts","../../src/services/resourceName.ts","../../src/services/collection/internal.ts","../../src/services/collection/params.ts","../../src/services/catalogueDraftTracking.ts","../../src/services/shared/listing.ts","../../src/services/shared/owner.ts","../../src/services/collection/owner.ts","../../src/services/validation.ts","../../src/services/resourceTypeTree.ts","../../src/services/typeService.ts","../../src/services/collection/create.ts","../../src/services/sync/owner.ts","../../src/services/sync/pullResource.ts","../../src/services/sync/operationContext.ts","../../src/services/sync/pull.ts","../../src/services/policyService.ts","../../src/services/batch/config.ts","../../src/services/resourceTypeCapabilities.ts","../../src/services/shared/guards/frozenStatus.ts","../../src/services/shared/guards/publishGuards.ts","../../src/services/shared/guards/sha1ReleaseGuard.ts","../../src/core/tty.ts","../../src/services/shared/guards/batchReleaseGuards.ts","../../src/services/storageUpload.ts","../../src/services/coverUpload.ts","../../src/services/coverGenerateService.ts","../../src/services/freelogIgnore.ts","../../src/services/batch/prepare.ts","../../src/services/batch/results.ts","../../src/services/batch/progress.ts","../../src/services/resource/createVersionParams.ts","../../src/services/store/requireVersion.ts","../../src/services/processFile.ts","../../src/services/resource/publishVersion.ts","../../src/services/resourceService.ts","../../src/services/resource/createThenPublish.ts","../../src/services/resource/reuseVersionIntent.ts","../../src/services/resource/sessionPublishIntent.ts","../../src/services/versionPropertyService.ts","../../src/services/depSessionSources.ts","../../src/services/depAuthService.ts","../../src/services/batch/authorization.ts","../../src/services/batch/report.ts","../../src/services/batch/createFromDir.ts","../../src/services/store/exportSessionProject.ts","../../src/services/store/ephemeralStore.ts","../../src/services/store/manifestStateStore.ts","../../src/services/store/projectStore.ts","../../src/services/collection/rssContract.ts","../../src/services/collection/items.ts","../../src/services/collection/maintenance.ts","../../src/services/collection/policy.ts","../../src/services/collection/publish.ts","../../src/services/platformExtra.ts","../../src/services/collection/collectRulesContract.ts","../../src/services/collection/platform.ts","../../src/services/bindService.ts","../../src/commands/bind.ts","../../src/commands/collection/common.ts","../../src/commands/collection/create.ts","../../src/services/shared/fieldConstraints.ts","../../src/commands/collection/item.ts","../../src/services/collectionUpdateWizard.ts","../../src/commands/collection/update.ts","../../src/commands/collection/version.ts","../../src/commands/collection/policy.ts","../../src/commands/collection/properties.ts","../../src/adapters/collectionVersionDraftAdapter.ts","../../src/services/draftService.ts","../../src/services/statusService.ts","../../src/services/validateService.ts","../../src/services/preflightSummary.ts","../../src/commands/collection/publish.ts","../../src/commands/collection/collect-rules.ts","../../src/commands/collection/rss.ts","../../src/commands/collection/logs.ts","../../src/services/init/scaffold.ts","../../src/services/init/catalog.ts","../../src/services/init/prompts.ts","../../src/services/mediaDirScan.ts","../../src/services/init/picker.ts","../../src/services/init/wizard.ts","../../src/services/collectionFolderWizard.ts","../../src/commands/collection/init-from-folder.ts","../../src/commands/collection/index.ts","../../src/core/cliCatalog.ts","../../src/commands/completion.ts","../../src/commands/config.ts","../../src/commands/cover.ts","../../src/services/store/commandStore.ts","../../src/services/store/sessionVersionSeed.ts","../../src/services/createWizard.ts","../../src/commands/create.ts","../../src/services/depVersionRange.ts","../../src/services/depService.ts","../../src/services/scaffoldTemplates.ts","../../src/services/scaffoldInit.ts","../../src/commands/dep.ts","../../src/services/diffService.ts","../../src/commands/diff.ts","../../src/services/collectionDraftService.ts","../../src/commands/draft.ts","../../src/commands/init.ts","../../src/commands/lang.ts","../../src/services/auth/loginFlow.ts","../../src/commands/login.ts","../../src/commands/logout.ts","../../src/services/metaInfoParity.ts","../../src/commands/meta.ts","../../src/services/onlineService.ts","../../src/commands/online.ts","../../src/commands/policy.ts","../../src/services/publishFileHints.ts","../../src/commands/publish.ts","../../src/commands/pull.ts","../../src/services/gitChangelog.ts","../../src/services/versionBumpService.ts","../../src/services/releaseService.ts","../../src/commands/release.ts","../../src/services/batchImportWizard.ts","../../src/services/resourceSearchService.ts","../../src/commands/resource.ts","../../src/services/interactive/context.ts","../../src/services/interactive/ephemeralLogin.ts","../../src/services/updateListingWizard.ts","../../src/services/versionEditService.ts","../../src/services/interactive/interactiveWrite.ts","../../src/services/interactive/runSessionPublishWizard.ts","../../src/services/interactive/sessionActions.ts","../../src/services/interactive/sessionShell.ts","../../src/commands/sessionInteractive.ts","../../src/commands/status.ts","../../src/services/interactive/studioActions.ts","../../src/services/interactive/studioRecovery.ts","../../src/services/interactive/studioPublish.ts","../../src/services/interactive/studioShell.ts","../../src/commands/studio.ts","../../src/commands/template.ts","../../src/commands/type.ts","../../src/commands/update.ts","../../src/commands/validate.ts","../../src/commands/version.ts","../../src/services/workspaceScan.ts","../../src/commands/workspace.ts","../../src/bin/subCommands.ts","../../src/bin/index.ts"],"sourcesContent":["/** init theme|widget|package 预设路由的专用 --help(citty 无法为手动路由生成独立 USAGE) */\n\nimport type { ScaffoldPreset } from '../services/init/index.js';\n\nconst PRESET_HELP: Record<\n ScaffoldPreset,\n { title: string; usage: string; required: string[]; notes: string[] }\n> = {\n theme: {\n title: '创建主题工程',\n usage: 'freelog-cli init theme <dir> [OPTIONS]',\n required: ['<dir> 项目目录', '--runtime 0.4|0.5(非交互必填)', '--template <id>(非交互必填,如 vite-react-ts)'],\n notes: [\n '定稿平台类型树中的「主题」,不问大类;resourceTypeCode 由 preset 解析',\n '非交互示例:freelog-cli init theme my-theme --template vite-react-ts --runtime 0.5 --yes --env dev',\n ],\n },\n widget: {\n title: '创建插件工程',\n usage: 'freelog-cli init widget <dir> [OPTIONS]',\n required: ['<dir> 项目目录', '--runtime 0.4|0.5(非交互必填)', '--template <id>(非交互必填,如 vite-vue-ts)'],\n notes: [\n '定稿平台类型树中的「插件」',\n '非交互示例:freelog-cli init widget my-widget --template vite-vue-ts --runtime 0.5 --yes --env dev',\n ],\n },\n package: {\n title: '创建前端库/软件库工程',\n usage: 'freelog-cli init package <dir> [OPTIONS]',\n required: [\n '<dir> 项目目录',\n '--namespace <npmScope>(非交互必填)',\n '--template 可选;省略时非交互会失败,须显式传或使用交互 init',\n ],\n notes: [\n '定稿「前端库/软件库」类型;scaffold=package',\n '非交互示例:freelog-cli init package my-lib --template package-js --namespace com.example.lib --yes --skip-install --env dev',\n ],\n },\n};\n\nexport function printInitPresetHelp(preset: ScaffoldPreset): void {\n const block = PRESET_HELP[preset];\n process.stdout.write(`\\n${block.title} (${preset})\\n\\n`);\n process.stdout.write(`USAGE ${block.usage}\\n\\n`);\n process.stdout.write('REQUIRED (非交互)\\n\\n');\n for (const line of block.required) {\n process.stdout.write(` ${line}\\n`);\n }\n process.stdout.write('\\nOPTIONS\\n\\n');\n process.stdout.write(\n ' 与 freelog-cli init --help 相同(--cwd --env --yes --json --resource-type --title …)\\n',\n );\n process.stdout.write('\\nNOTES\\n\\n');\n for (const line of block.notes) {\n process.stdout.write(` ${line}\\n`);\n }\n process.stdout.write('\\n');\n}\n\nexport function tryPrintInitPresetHelpFromArgv(argv: string[]): boolean {\n const initIdx = argv.findIndex((a) => a === 'init');\n if (initIdx < 0) return false;\n const next = argv[initIdx + 1];\n if (next !== 'theme' && next !== 'widget' && next !== 'package') return false;\n if (!argv.slice(initIdx + 2).some((a) => a === '--help' || a === '-h')) return false;\n printInitPresetHelp(next);\n return true;\n}\n","import { getCliEnv } from './env.js';\nimport { CliError, toExitCode } from './errors.js';\n\nfunction redactSensitiveValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactSensitiveValue);\n if (!value || typeof value !== 'object') return value;\n\n const output: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n if (/token|password|cookie|authorization/i.test(key)) {\n output[key] = '[redacted]';\n } else {\n output[key] = redactSensitiveValue(item);\n }\n }\n return output;\n}\n\nexport const JSON_SCHEMA_VERSION = 1;\n\nexport interface JsonEnvelopeMeta {\n env: string;\n}\n\nexport interface JsonResultEnvelope {\n schemaVersion: typeof JSON_SCHEMA_VERSION;\n ok: boolean;\n command: string;\n data: Record<string, unknown>;\n warnings: string[];\n meta: JsonEnvelopeMeta;\n}\n\nexport interface JsonErrorBody {\n code: number;\n message: string;\n hint?: string;\n details?: unknown;\n debug?: Record<string, unknown>;\n}\n\nexport interface JsonErrorEnvelope {\n schemaVersion: typeof JSON_SCHEMA_VERSION;\n ok: false;\n command: string;\n error: JsonErrorBody;\n warnings: string[];\n meta: JsonEnvelopeMeta;\n}\n\nfunction buildMeta(): JsonEnvelopeMeta {\n return { env: getCliEnv() };\n}\n\nfunction toJsonData(data: unknown): Record<string, unknown> {\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n return data as Record<string, unknown>;\n }\n return { value: data };\n}\n\nexport function formatJsonSuccess(\n command: string,\n data: unknown,\n opts?: { warnings?: string[]; ok?: boolean },\n): JsonResultEnvelope {\n return {\n schemaVersion: JSON_SCHEMA_VERSION,\n ok: opts?.ok !== false,\n command,\n data: toJsonData(data),\n warnings: opts?.warnings ?? [],\n meta: buildMeta(),\n };\n}\n\nexport function formatJsonFailure(\n command: string,\n error: unknown,\n opts?: { debug?: Record<string, unknown>; warnings?: string[] },\n): JsonErrorEnvelope {\n const code = toExitCode(error);\n const message = error instanceof Error ? error.message : String(error);\n const hint = error instanceof CliError ? error.hint : undefined;\n return {\n schemaVersion: JSON_SCHEMA_VERSION,\n ok: false,\n command,\n error: {\n code,\n message,\n hint,\n details: error instanceof CliError ? redactSensitiveValue(error.details) : undefined,\n debug: opts?.debug,\n },\n warnings: opts?.warnings ?? [],\n meta: buildMeta(),\n };\n}\n\nexport function writeJsonSuccess(\n command: string,\n data: unknown,\n opts?: { warnings?: string[]; ok?: boolean },\n): void {\n process.stdout.write(`${JSON.stringify(formatJsonSuccess(command, data, opts))}\\n`);\n}\n\nexport function writeJsonFailure(\n command: string,\n error: unknown,\n opts?: { debug?: Record<string, unknown>; warnings?: string[] },\n): void {\n process.stdout.write(`${JSON.stringify(formatJsonFailure(command, error, opts))}\\n`);\n}\n\n/** 机器可读结果解包(兼容 envelope 与旧 flat 结构) */\nexport function unwrapCliJson(parsed: unknown): Record<string, unknown> {\n if (!parsed || typeof parsed !== 'object') {\n return {};\n }\n const row = parsed as Record<string, unknown>;\n if (\n row.schemaVersion === JSON_SCHEMA_VERSION &&\n row.data &&\n typeof row.data === 'object' &&\n !Array.isArray(row.data)\n ) {\n return {\n ...(row.data as Record<string, unknown>),\n ok: row.ok,\n schemaVersion: row.schemaVersion,\n command: row.command,\n warnings: row.warnings,\n meta: row.meta,\n error: row.error,\n };\n }\n if (\n row.schemaVersion === JSON_SCHEMA_VERSION &&\n row.error &&\n typeof row.error === 'object' &&\n !Array.isArray(row.error)\n ) {\n const err = row.error as JsonErrorBody;\n const details =\n err.details && typeof err.details === 'object' && !Array.isArray(err.details)\n ? (err.details as Record<string, unknown>)\n : {};\n return {\n ...details,\n ok: false,\n schemaVersion: row.schemaVersion,\n command: row.command,\n code: err.code,\n message: err.message,\n hint: err.hint,\n error: row.error,\n meta: row.meta,\n warnings: row.warnings,\n };\n }\n return row;\n}\n","import { inspect } from 'node:util';\r\nimport { consola } from 'consola';\r\nimport { formatAuthContextLine, resolveCurrentAuth, setAuthResolveCwd } from './auth.js';\r\nimport {\n applyGlobalFlags,\n assertCliEnvEnabled,\n getCliEnv,\n normalizeCliEnvForWriteGuard,\n wasEnvExplicitlySet,\n} from './env.js';\nimport { CliError, toExitCode } from './errors.js';\r\nimport { writeJsonFailure } from './jsonEnvelope.js';\r\n\r\nexport { writeJsonSuccess, unwrapCliJson } from './jsonEnvelope.js';\r\n\r\nlet debugEnabled = process.env.FREELOG_DEBUG === '1' || process.env.FREELOG_DEBUG === 'true';\r\n\r\nfunction assertExplicitEnvForNonInteractive(args?: { test?: boolean; env?: string }): void {\n if (process.env.VITEST === 'true') return;\n assertCliEnvEnabled();\n if (process.stdin.isTTY) return;\r\n if (wasEnvExplicitlySet()) return;\r\n if (args?.test || normalizeCliEnvForWriteGuard(args?.env)) return;\r\n if (getCliEnv() !== 'production') return;\r\n throw new CliError(\r\n '非交互环境未指定 API 环境(当前默认 production,易误操作生产)',\r\n {\r\n code: 4,\r\n hint: 'CI/脚本请传 --env dev|test、--test,或设置 FREELOG_ENV',\n },\r\n );\r\n}\r\n\r\n/** 写 API / 改平台状态的服务入口调用(不依赖命令行 args) */\r\nexport function assertExplicitEnvForWriteOperation(): void {\r\n assertExplicitEnvForNonInteractive();\r\n}\r\n\r\nexport function applyCommandFlags(args: {\r\n test?: boolean;\r\n env?: string;\r\n debug?: boolean;\r\n cwd?: string;\r\n}): void {\r\n applyGlobalFlags(args);\r\n if (args.debug) debugEnabled = true;\r\n setAuthResolveCwd(args.cwd);\r\n}\r\n\r\nfunction shouldShowAuthContext(args?: { json?: boolean; yes?: boolean }): boolean {\r\n if (process.env.VITEST === 'true') return false;\r\n if (args?.json) return false;\r\n if (!process.stdin.isTTY) return false;\r\n return true;\r\n}\r\n\r\n/** 写操作前在交互终端提示当前登录账号,避免多账号误操作。 */\r\nexport function logAuthContextIfInteractive(args?: { json?: boolean; yes?: boolean }): void {\r\n if (!shouldShowAuthContext(args)) return;\r\n const resolved = resolveCurrentAuth();\r\n if (!resolved) return;\r\n consola.info(formatAuthContextLine(resolved));\r\n}\r\n\r\n/** 会改平台或本地项目状态的命令:CI 须显式 --env / --test / FREELOG_ENV 或项目 .freelog/config.json */\r\nexport function applyWriteCommandFlags(args: {\r\n test?: boolean;\r\n env?: string;\r\n debug?: boolean;\r\n json?: boolean;\r\n yes?: boolean;\r\n cwd?: string;\r\n}): void {\r\n applyCommandFlags(args);\r\n assertExplicitEnvForNonInteractive(args);\r\n logAuthContextIfInteractive(args);\r\n}\r\n\r\nexport function isDebugEnabled(): boolean {\r\n return debugEnabled;\r\n}\r\n\r\nexport function redactSensitiveValue(value: unknown): unknown {\r\n if (Array.isArray(value)) return value.map(redactSensitiveValue);\r\n if (!value || typeof value !== 'object') return value;\r\n\r\n const output: Record<string, unknown> = {};\r\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\r\n if (/token|password|cookie|authorization/i.test(key)) {\r\n output[key] = '[redacted]';\r\n } else {\r\n output[key] = redactSensitiveValue(item);\r\n }\r\n }\r\n return output;\r\n}\r\n\r\nfunction debugPayload(error: unknown): Record<string, unknown> {\r\n if (error instanceof CliError) {\r\n return {\r\n name: error.name,\r\n stack: error.stack,\r\n details: redactSensitiveValue(error.details),\r\n cause: redactSensitiveValue(error.cause),\r\n };\r\n }\r\n if (error instanceof Error) {\r\n return {\r\n name: error.name,\r\n stack: error.stack,\r\n cause: redactSensitiveValue(error.cause),\r\n };\r\n }\r\n return { value: redactSensitiveValue(error) };\r\n}\r\n\r\nexport function handleCommandError(error: unknown, json?: boolean, command?: string): never {\r\n const code = toExitCode(error);\r\n const message = error instanceof Error ? error.message : String(error);\r\n const hint = error instanceof CliError ? error.hint : undefined;\r\n const debug = isDebugEnabled() ? debugPayload(error) : undefined;\r\n\r\n if (json) {\r\n writeJsonFailure(command ?? 'unknown', error, { debug });\r\n } else {\r\n consola.error(message);\r\n if (hint) consola.info(`→ ${hint}`);\r\n if (debug) {\r\n process.stderr.write(`${inspect(debug, { depth: 8, colors: process.stderr.isTTY })}\\n`);\r\n }\r\n }\r\n process.exit(code);\r\n}\r\n","import { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\n\nexport const CURRENT_PROJECT_SCHEMA_VERSION = 1 as const;\n\nexport type ProjectDocument = Record<string, unknown>;\ntype ProjectMigration = (document: ProjectDocument) => ProjectDocument;\n\nconst manifestMigrations = new Map<number, ProjectMigration>();\nconst stateMigrations = new Map<number, ProjectMigration>();\n\nfunction assertDocument(value: unknown, label: string): asserts value is ProjectDocument {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw cliError(I18N_KEYS.label_format_invalid, { code: 4, params: { label } });\n }\n}\n\nfunction migrateProjectDocument(\n raw: unknown,\n label: string,\n migrations: ReadonlyMap<number, ProjectMigration>,\n): ProjectDocument {\n assertDocument(raw, label);\n const version = raw.schemaVersion;\n if (typeof version !== 'number' || !Number.isInteger(version) || version < 1) {\n throw cliError(I18N_KEYS.project_schema_invalid, { code: 4, params: { label } });\n }\n if (version > CURRENT_PROJECT_SCHEMA_VERSION) {\n throw cliError(I18N_KEYS.project_schema_unsupported, {\n code: 4,\n params: { label, version, current: CURRENT_PROJECT_SCHEMA_VERSION },\n hint: '请升级 freelog-cli 后重试,不要用旧版本覆盖该项目文件',\n });\n }\n\n let document = raw;\n let currentVersion = version;\n while (currentVersion < CURRENT_PROJECT_SCHEMA_VERSION) {\n const migrate = migrations.get(currentVersion);\n if (!migrate) {\n throw cliError(I18N_KEYS.project_schema_unsupported, {\n code: 4,\n params: { label, version: currentVersion, current: CURRENT_PROJECT_SCHEMA_VERSION },\n hint: '当前 CLI 未提供该版本到下一版本的迁移函数',\n });\n }\n document = migrate(document);\n currentVersion += 1;\n if (document.schemaVersion !== currentVersion) {\n throw cliError(I18N_KEYS.project_schema_invalid, { code: 4, params: { label } });\n }\n }\n return document;\n}\n\n/** Schema migration boundary; add version N -> N+1 functions to manifestMigrations. */\nexport function migrateManifestDocument(raw: unknown): ProjectDocument {\n return migrateProjectDocument(raw, 'freelog.manifest.json', manifestMigrations);\n}\n\n/** Schema migration boundary; add version N -> N+1 functions to stateMigrations. */\nexport function migrateStateDocument(raw: unknown): ProjectDocument {\n return migrateProjectDocument(raw, '.freelog/state.json', stateMigrations);\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\n\nconst heldProjectLocks = new AsyncLocalStorage<ReadonlySet<string>>();\n\nfunction resolveRoot(cwd?: string): string {\n return path.resolve(cwd || process.cwd());\n}\n\nfunction lockPath(root: string): string {\n return path.join(root, '.freelog', 'tmp', 'project-write.lock');\n}\n\nfunction isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code !== 'ESRCH';\n }\n}\n\nfunction removeStaleLock(file: string): boolean {\n let stat: fs.Stats;\n try {\n stat = fs.statSync(file);\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === 'ENOENT';\n }\n\n let pid: number | undefined;\n try {\n const parsed = JSON.parse(fs.readFileSync(file, 'utf8')) as { pid?: unknown };\n const parsedPid = Number(parsed.pid);\n if (Number.isInteger(parsedPid) && parsedPid > 0) pid = parsedPid;\n } catch {\n // An incomplete lock can only be reclaimed after a grace period.\n }\n\n const stale = pid === undefined ? Date.now() - stat.mtimeMs > 30_000 : !isProcessRunning(pid);\n if (!stale) return false;\n try {\n fs.unlinkSync(file);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === 'ENOENT';\n }\n}\n\nfunction lockError(file: string, cause?: unknown) {\n return cliError(I18N_KEYS.project_write_locked, {\n code: 2,\n details: { lockFile: file },\n hint: '请等待其他命令结束后重试;若进程已异常退出,下次写入会自动清理残留锁',\n cause,\n });\n}\n\nfunction acquireProjectLock(root: string): string {\n const file = lockPath(root);\n fs.mkdirSync(path.dirname(file), { recursive: true });\n let acquired = false;\n for (let attempt = 0; attempt < 2; attempt += 1) {\n let fd: number | undefined;\n try {\n fd = fs.openSync(file, 'wx', 0o600);\n fs.writeFileSync(\n fd,\n `${JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() })}\\n`,\n );\n fs.fsyncSync(fd);\n fs.closeSync(fd);\n fd = undefined;\n acquired = true;\n break;\n } catch (error) {\n if (fd !== undefined) fs.closeSync(fd);\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST' || !removeStaleLock(file)) {\n throw lockError(file, error);\n }\n }\n }\n if (!acquired) throw lockError(file);\n return file;\n}\n\nfunction releaseProjectLock(file: string): void {\n try {\n fs.unlinkSync(file);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n }\n}\n\n/** Hold a synchronous, reentrant, cross-process lock for the complete project mutation. */\nexport function withProjectWriteLock<T>(cwd: string | undefined, action: () => T): T {\n const root = resolveRoot(cwd);\n const inherited = heldProjectLocks.getStore();\n if (inherited?.has(root)) return action();\n\n const file = acquireProjectLock(root);\n try {\n return heldProjectLocks.run(new Set([...(inherited || []), root]), action);\n } finally {\n releaseProjectLock(file);\n }\n}\n\n/**\n * Hold the cross-process project lock until an asynchronous mutation settles. Calls made inside\n * the same async operation are reentrant; unrelated same-process operations still contend.\n */\nexport async function withProjectWriteLockAsync<T>(\n cwd: string | undefined,\n action: () => Promise<T>,\n): Promise<T> {\n const root = resolveRoot(cwd);\n const inherited = heldProjectLocks.getStore();\n if (inherited?.has(root)) return action();\n const file = acquireProjectLock(root);\n try {\n return await heldProjectLocks.run(new Set([...(inherited || []), root]), action);\n } finally {\n releaseProjectLock(file);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\r\nimport { atomicWriteFile } from '../atomicWrite.js';\r\nimport { getCliEnv } from '../../core/env.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport {\n CURRENT_PROJECT_SCHEMA_VERSION,\n migrateManifestDocument,\n migrateStateDocument,\n} from './schemaMigration.js';\nimport type { FreelogManifest, FreelogState, ProjectSubject, RuntimeVersion } from './types.js';\nimport { withProjectWriteLock, withProjectWriteLockAsync } from './writeLock.js';\n\nexport {\n CURRENT_PROJECT_SCHEMA_VERSION,\n migrateManifestDocument,\n migrateStateDocument,\n withProjectWriteLock,\n withProjectWriteLockAsync,\n};\n\ninterface ProjectTransactionJournal {\n schemaVersion: 1;\n manifest: string;\n state: string;\n}\n\nexport interface ProjectSnapshot {\n manifestPath: string;\n statePath: string;\n manifest: FreelogManifest;\n state: FreelogState;\n}\n\r\nexport function resolveCwd(cwd?: string): string {\r\n return path.resolve(cwd || process.cwd());\r\n}\r\n\r\nexport function manifestPath(cwd?: string): string {\r\n return path.join(resolveCwd(cwd), 'freelog.manifest.json');\r\n}\r\n\r\nexport function statePath(cwd?: string): string {\n return path.join(resolveCwd(cwd), '.freelog', 'state.json');\n}\n\nfunction projectTransactionPath(cwd?: string): string {\n return path.join(resolveCwd(cwd), '.freelog', 'tmp', 'project-transaction.json');\n}\n\r\nexport function findProjectPath(cwd?: string): string | null {\r\n let dir = resolveCwd(cwd);\r\n while (true) {\r\n const file = path.join(dir, 'freelog.manifest.json');\r\n if (fs.existsSync(file)) return file;\r\n const parent = path.dirname(dir);\r\n if (parent === dir) return null;\r\n dir = parent;\r\n }\r\n}\r\n\r\nexport function findProjectFilePath(_kind: ProjectSubject | 'version', cwd?: string): string | null {\r\n return findProjectPath(cwd);\r\n}\r\n\r\nexport function projectKindLabel(_kind: ProjectSubject | 'version'): string {\r\n return 'freelog.manifest.json';\r\n}\r\n\r\nexport function ensureProjectGitignore(cwd?: string): void {\n withProjectWriteLock(cwd, () => {\n const file = path.join(resolveCwd(cwd), '.gitignore');\n const required = [\n '/.freelog/state.json',\n '/.freelog/cache/',\n '/.freelog/tmp/',\n '/.freelog-auth',\n ];\n const existing = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';\n const managed = new Set(required.flatMap((rule) => [rule, rule.slice(1)]));\n const preserved = existing\n .split(/\\r?\\n/)\n .filter((line) => !managed.has(line.trim()))\n .join('\\n')\n .replace(/\\n+$/, '');\n const desired = `${preserved ? `${preserved}\\n` : ''}${required.join('\\n')}\\n`;\n if (desired === existing) return;\n atomicWriteFile(file, desired);\n });\n}\n\r\nfunction readJsonFile<T>(file: string, label: string): T {\n try {\n return JSON.parse(fs.readFileSync(file, 'utf8')) as T;\n } catch (error) {\n throw cliError(I18N_KEYS.label_not_valid_json, {\n code: 4,\n params: { label, file },\n cause: error,\n });\n }\n}\n\nfunction writeJsonFileUnlocked(file: string, data: unknown): string {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n atomicWriteFile(file, `${JSON.stringify(data, null, 2)}\\n`);\n return file;\n}\n\nfunction assertPlainObject(value: unknown, label: string): asserts value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw cliError(I18N_KEYS.label_format_invalid, { code: 4, params: { label } });\n }\n}\n\nfunction normalizeSubject(value: unknown): ProjectSubject {\n if (value === 'resource' || value === 'collection') return value;\r\n throw cliError(I18N_KEYS.manifest_subject_invalid, { code: 4 });\r\n}\r\n\r\nfunction normalizeManifest(raw: unknown): FreelogManifest {\n const migrated = migrateManifestDocument(raw);\n const subject = normalizeSubject(migrated.subject);\n assertPlainObject(migrated.identity, 'manifest.identity');\n assertPlainObject(migrated.resource, 'manifest.resource');\n if (migrated.version !== undefined && migrated.version !== null) {\n assertPlainObject(migrated.version, 'manifest.version');\n }\n if (migrated.collection !== undefined && migrated.collection !== null) {\n assertPlainObject(migrated.collection, 'manifest.collection');\n }\n const policies = (() => {\n if (migrated.policies === undefined) return undefined;\n if (!Array.isArray(migrated.policies)) {\n throw cliError(I18N_KEYS.label_format_invalid, {\n code: 4,\n params: { label: 'manifest.policies' },\n });\n }\n return migrated.policies.map((policy, index) => {\n const label = `manifest.policies[${index}]`;\n assertPlainObject(policy, label);\n if ('policyId' in policy) {\n throw cliError(I18N_KEYS.label_format_invalid, {\n code: 4,\n params: { label },\n hint: 'policyId 是平台事实,只能保存在 .freelog/state.json',\n });\n }\n const policyName = typeof policy.policyName === 'string' ? policy.policyName.trim() : '';\n const policyText = typeof policy.policyText === 'string' ? policy.policyText : '';\n const status = policy.status === undefined ? undefined : Number(policy.status);\n if (!policyName || !policyText.trim() || (status !== undefined && status !== 0 && status !== 1)) {\n throw cliError(I18N_KEYS.label_format_invalid, { code: 4, params: { label } });\n }\n return { policyName, policyText, ...(status === undefined ? {} : { status: status as 0 | 1 }) };\n });\n })();\n const identityName = String(migrated.identity.name || '').trim();\n const typeCode = String(migrated.resource.typeCode || '').trim();\n const typeName =\n migrated.resource.typeName === undefined\n ? undefined\n : String(migrated.resource.typeName || '').trim();\n const title = String(migrated.resource.title || identityName || '').trim();\n if (!identityName) throw cliError(I18N_KEYS.manifest_identity_name_required, { code: 4 });\r\n if (!typeCode) throw cliError(I18N_KEYS.manifest_type_code_required, { code: 4 });\r\n if (!title) throw cliError(I18N_KEYS.manifest_title_required, { code: 4 });\r\n\r\n return {\n ...(migrated as unknown as FreelogManifest),\n schemaVersion: CURRENT_PROJECT_SCHEMA_VERSION,\n subject,\n identity: { ...(migrated.identity as FreelogManifest['identity']), name: identityName },\n resource: {\n ...(migrated.resource as FreelogManifest['resource']),\n typeCode,\n typeName,\n title,\n intro: typeof migrated.resource.intro === 'string' ? migrated.resource.intro : '',\n tags: Array.isArray(migrated.resource.tags) ? migrated.resource.tags.map(String) : [],\n coverImages: Array.isArray(migrated.resource.coverImages)\n ? migrated.resource.coverImages.map(String)\n : [],\n },\n policies,\n version:\n migrated.version === null\n ? null\n : {\n ...((migrated.version || {}) as NonNullable<FreelogManifest['version']>),\n version: String(\n (migrated.version as { version?: unknown } | undefined)?.version || '1.0.0',\n ),\n filePath: (() => {\n const rawFilePath = (migrated.version as { filePath?: unknown } | undefined)?.filePath;\n if (rawFilePath === '') return '';\n return String(rawFilePath || 'dist');\n })(),\n videoCover:\n (migrated.version as { videoCover?: unknown } | undefined)?.videoCover === undefined\n ? undefined\n : String((migrated.version as { videoCover?: unknown }).videoCover || '').trim(),\n },\n collection:\n migrated.collection === undefined\n ? subject === 'collection'\n ? {}\n : null\n : (migrated.collection as FreelogManifest['collection']),\n };\n}\n\r\nfunction loadManifestUnlocked(cwd?: string): { path: string; data: FreelogManifest } {\n const file = manifestPath(cwd);\n if (!fs.existsSync(file)) {\n throw cliError(I18N_KEYS.manifest_not_found, {\n code: 4,\r\n hint: '先执行 freelog-cli init,或传 --cwd 到资源目录',\r\n });\r\n }\n return { path: file, data: normalizeManifest(readJsonFile(file, 'freelog.manifest.json')) };\n}\n\nfunction tryLoadManifestUnlocked(cwd?: string): { path: string; data: FreelogManifest } | null {\n const file = manifestPath(cwd);\n if (!fs.existsSync(file)) return null;\n return { path: file, data: normalizeManifest(readJsonFile(file, 'freelog.manifest.json')) };\n}\n\nexport function loadManifest(cwd?: string): { path: string; data: FreelogManifest } {\n recoverProjectTransaction(cwd);\n return loadManifestUnlocked(cwd);\n}\n\nexport function tryLoadManifest(cwd?: string): { path: string; data: FreelogManifest } | null {\n recoverProjectTransaction(cwd);\n return tryLoadManifestUnlocked(cwd);\n}\n\r\nexport function saveManifest(data: FreelogManifest, cwd?: string): string {\n return withProjectWriteLock(cwd, () => {\n recoverProjectTransactionUnlocked(cwd);\n return writeJsonFileUnlocked(manifestPath(cwd), normalizeManifest(data));\n });\n}\n\r\nexport function createResourceManifest(opts: {\r\n subject?: ProjectSubject;\r\n resourceName: string;\r\n resourceTypeCode?: string;\r\n resourceTypeName?: string;\r\n resourceTitle?: string;\r\n version?: string;\r\n filePath?: string;\r\n runtimeVersion?: RuntimeVersion;\r\n}): FreelogManifest {\r\n const subject = opts.subject || 'resource';\r\n return {\r\n schemaVersion: 1,\r\n subject,\r\n identity: { name: opts.resourceName },\r\n resource: {\r\n typeCode: opts.resourceTypeCode || '',\r\n typeName: opts.resourceTypeName,\r\n title: opts.resourceTitle || opts.resourceName,\r\n intro: '',\r\n coverImages: [],\r\n tags: [],\r\n },\r\n version:\r\n subject === 'resource'\r\n ? {\r\n version: opts.version || '1.0.0',\r\n filePath: opts.filePath || 'dist',\r\n description: '',\r\n runtimeVersion: opts.runtimeVersion ?? null,\r\n dependencies: [],\r\n baseUpcastResources: [],\r\n authExcludedItems: [],\r\n inputAttrs: [],\r\n customPropertyDescriptors: [],\r\n }\r\n : null,\r\n policies: [],\r\n collection:\r\n subject === 'collection'\r\n ? {\r\n version: opts.version || '1.0.0',\r\n description: '',\r\n display: {},\r\n items: [],\r\n dependencies: [],\r\n baseUpcastResources: [],\r\n authExcludedItems: [],\r\n inputAttrs: [],\r\n customPropertyDescriptors: [],\r\n }\r\n : null,\r\n };\r\n}\r\n\r\nexport function createEmptyState(subject: ProjectSubject = 'resource'): FreelogState {\r\n return {\r\n schemaVersion: 1,\r\n env: null,\r\n resource: {\r\n resourceId: null,\r\n resourceName: null,\r\n resourceType: null,\r\n resourceTypeCode: null,\r\n resourceTypeName: null,\r\n subjectType: subject === 'collection' ? 4 : null,\r\n owner: null,\r\n status: null,\r\n latestVersion: null,\r\n policies: [],\r\n },\r\n version: {\r\n lastPublishedVersion: null,\r\n lastPublishedVersionId: null,\r\n fileSha1: null,\r\n filename: null,\r\n draftSync: null,\r\n },\r\n collection: {\r\n catalogueDraft: [],\r\n catalogueProperty: null,\r\n collectRules: null,\r\n rss: null,\r\n draftSync: null,\r\n },\r\n sync: {\r\n lastPulledAt: null,\r\n listingFingerprint: null,\r\n platformUpdateDate: null,\r\n },\r\n };\r\n}\r\n\r\nfunction normalizeState(raw: unknown, subject: ProjectSubject): FreelogState {\n const migrated = migrateStateDocument(raw);\n for (const section of ['resource', 'version', 'collection', 'sync'] as const) {\n if (migrated[section] === undefined) continue;\n assertPlainObject(migrated[section], `state.${section}`);\n }\n const state = migrated as unknown as Partial<FreelogState>;\n if (state.env && state.env !== getCliEnv()) {\n throw cliError(I18N_KEYS.project_state_env_mismatch, {\r\n code: 2,\r\n details: { stateEnv: state.env, currentEnv: getCliEnv() },\r\n hint: `当前命令使用 ${getCliEnv()},该目录 state 属于 ${state.env};请切换 --env 或重新初始化/清理 .freelog/state.json`,\n });\n }\n const empty = createEmptyState(subject);\n return {\n ...empty,\n ...state,\n schemaVersion: CURRENT_PROJECT_SCHEMA_VERSION,\n resource: { ...empty.resource, ...(state.resource || {}) },\n version: { ...empty.version, ...(state.version || {}) },\n collection: { ...empty.collection, ...(state.collection || {}) },\n sync: { ...empty.sync, ...(state.sync || {}) },\n };\n}\n\nfunction parseProjectTransaction(file: string): ProjectTransactionJournal {\n const raw = readJsonFile<unknown>(file, '.freelog/tmp/project-transaction.json');\n assertPlainObject(raw, '.freelog/tmp/project-transaction.json');\n if (raw.schemaVersion !== 1 || typeof raw.manifest !== 'string' || typeof raw.state !== 'string') {\n throw cliError(I18N_KEYS.label_format_invalid, {\n code: 4,\n params: { label: '.freelog/tmp/project-transaction.json' },\n hint: '事务日志不完整,请保留文件并人工检查后再处理',\n });\n }\n return raw as unknown as ProjectTransactionJournal;\n}\n\nfunction parseJournalDocument(content: string, label: string): unknown {\n try {\n return JSON.parse(content) as unknown;\n } catch (error) {\n throw cliError(I18N_KEYS.label_not_valid_json, {\n code: 4,\n params: { label, file: '.freelog/tmp/project-transaction.json' },\n cause: error,\n });\n }\n}\n\nfunction recoverProjectTransactionUnlocked(cwd?: string): void {\n const journalPath = projectTransactionPath(cwd);\n if (!fs.existsSync(journalPath)) return;\n const journal = parseProjectTransaction(journalPath);\n const manifest = normalizeManifest(parseJournalDocument(journal.manifest, '事务日志 manifest'));\n const state = normalizeState(\n parseJournalDocument(journal.state, '事务日志 state'),\n manifest.subject,\n );\n atomicWriteFile(manifestPath(cwd), `${JSON.stringify(manifest, null, 2)}\\n`);\n atomicWriteFile(statePath(cwd), `${JSON.stringify(state, null, 2)}\\n`);\n fs.unlinkSync(journalPath);\n}\n\n/** Complete an interrupted manifest/state pair before exposing either document to readers. */\nexport function recoverProjectTransaction(cwd?: string): void {\n withProjectWriteLock(cwd, () => recoverProjectTransactionUnlocked(cwd));\n}\n\n/** Read the manifest/state pair while excluding concurrent project writers. */\nexport function loadProjectSnapshot(cwd?: string): ProjectSnapshot {\n return withProjectWriteLock(cwd, () => {\n recoverProjectTransactionUnlocked(cwd);\n const loaded = loadManifestUnlocked(cwd);\n const stateFile = statePath(cwd);\n const state = fs.existsSync(stateFile)\n ? normalizeState(readJsonFile(stateFile, '.freelog/state.json'), loaded.data.subject)\n : createEmptyState(loaded.data.subject);\n return {\n manifestPath: loaded.path,\n statePath: stateFile,\n manifest: loaded.data,\n state,\n };\n });\n}\n\n/** Try to read the manifest/state pair while excluding concurrent project writers. */\nexport function tryLoadProjectSnapshot(cwd?: string): ProjectSnapshot | null {\n return withProjectWriteLock(cwd, () => {\n recoverProjectTransactionUnlocked(cwd);\n const loaded = tryLoadManifestUnlocked(cwd);\n if (!loaded) return null;\n const stateFile = statePath(cwd);\n const state = fs.existsSync(stateFile)\n ? normalizeState(readJsonFile(stateFile, '.freelog/state.json'), loaded.data.subject)\n : createEmptyState(loaded.data.subject);\n return {\n manifestPath: loaded.path,\n statePath: stateFile,\n manifest: loaded.data,\n state,\n };\n });\n}\n\n/**\n * Commit manifest and state as a recoverable pair. A durable journal remains until both atomic\n * replacements succeed; the next read rolls the pair forward after a process interruption.\n */\nexport function saveProjectSnapshot(\n manifest: FreelogManifest,\n state: FreelogState,\n cwd?: string,\n): string {\n return withProjectWriteLock(cwd, () => {\n recoverProjectTransactionUnlocked(cwd);\n const normalizedManifest = normalizeManifest(manifest);\n state.env = state.env || getCliEnv();\n const normalizedState = normalizeState(state, normalizedManifest.subject);\n const manifestContent = `${JSON.stringify(normalizedManifest, null, 2)}\\n`;\n const stateContent = `${JSON.stringify(normalizedState, null, 2)}\\n`;\n const journal: ProjectTransactionJournal = {\n schemaVersion: 1,\n manifest: manifestContent,\n state: stateContent,\n };\n const journalPath = projectTransactionPath(cwd);\n atomicWriteFile(journalPath, `${JSON.stringify(journal)}\\n`);\n atomicWriteFile(manifestPath(cwd), manifestContent);\n atomicWriteFile(statePath(cwd), stateContent);\n fs.unlinkSync(journalPath);\n return manifestPath(cwd);\n });\n}\n\nexport function loadState(cwd?: string, subject?: ProjectSubject): { path: string; data: FreelogState } {\n recoverProjectTransaction(cwd);\n const manifest = subject ? null : tryLoadManifest(cwd);\n const actualSubject = subject || manifest?.data.subject || 'resource';\r\n const file = statePath(cwd);\r\n if (!fs.existsSync(file)) return { path: file, data: createEmptyState(actualSubject) };\r\n return { path: file, data: normalizeState(readJsonFile(file, '.freelog/state.json'), actualSubject) };\r\n}\r\n\r\nexport function saveState(data: FreelogState, cwd?: string): string {\n return withProjectWriteLock(cwd, () => {\n recoverProjectTransactionUnlocked(cwd);\n data.env = data.env || getCliEnv();\n const normalized = normalizeState(data, data.resource.subjectType === 4 ? 'collection' : 'resource');\n return writeJsonFileUnlocked(statePath(cwd), normalized);\n });\n}\n\n/** State-only read-modify-write helper with the project lock held for the complete mutation. */\nexport function updateState(\n cwd: string | undefined,\n subject: ProjectSubject,\n mutate: (state: FreelogState) => void,\n): string {\n return withProjectWriteLock(cwd, () => {\n const state = loadState(cwd, subject).data;\n mutate(state);\n return saveState(state, cwd);\n });\n}\n","import { createHash } from 'node:crypto';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport {\r\n createResourceManifest,\n loadManifest,\n loadProjectSnapshot,\n loadState,\n saveProjectSnapshot,\n saveState,\n statePath,\n tryLoadManifest,\n tryLoadProjectSnapshot,\n withProjectWriteLock,\n} from './store.js';\nimport type {\r\n CollectionProject,\r\n FreelogManifest,\r\n FreelogState,\r\n ProjectSubject,\r\n ResourceProject,\r\n RuntimeVersion,\r\n VersionProject,\r\n} from './types.js';\n\nconst PROJECT_REVISION = Symbol.for('@freelog-cli/project-revision');\n\nexport interface SavePlatformFactsOptions {\n /** The platform mutation already succeeded; merge only platform-owned fields into latest state. */\n remoteWriteConfirmed?: boolean;\n}\n\nfunction projectRevision(manifest: FreelogManifest, state: FreelogState): string {\n return createHash('sha256').update(JSON.stringify([manifest, state])).digest('hex');\n}\n\nfunction attachProjectRevision<T extends object>(\n data: T,\n manifest: FreelogManifest,\n state: FreelogState,\n): T {\n Object.defineProperty(data, PROJECT_REVISION, {\n value: projectRevision(manifest, state),\n enumerable: true,\n writable: true,\n configurable: true,\n });\n return data;\n}\n\nfunction assertProjectRevision(\n data: object,\n manifest: FreelogManifest,\n state: FreelogState,\n): void {\n const expected = (data as Record<symbol, unknown>)[PROJECT_REVISION];\n const actual = projectRevision(manifest, state);\n if (typeof expected !== 'string' || expected === actual) return;\n throw cliError(I18N_KEYS.project_revision_conflict, {\n code: 3,\n details: { expectedRevision: expected, actualRevision: actual },\n hint: '请重新读取项目状态、合并本地意图后重试',\n });\n}\n\n/** Merge a patch while retaining the revision from the fresh snapshot, never from a stale patch. */\nexport function mergeProjectPatch<T extends object>(current: T, patch: Partial<T>): T {\n const merged = { ...current, ...patch };\n const revision = (current as Record<symbol, unknown>)[PROJECT_REVISION];\n if (typeof revision === 'string') {\n Object.defineProperty(merged, PROJECT_REVISION, {\n value: revision,\n enumerable: true,\n writable: true,\n configurable: true,\n });\n }\n return merged;\n}\n\nfunction assertPlatformBinding(data: ResourceProject, state: FreelogState): void {\n const currentResourceId = state.resource.resourceId?.trim();\n const incomingResourceId = data.resourceId?.trim();\n if (!currentResourceId || !incomingResourceId || currentResourceId !== incomingResourceId) {\n throw cliError(I18N_KEYS.project_revision_conflict, {\n code: 3,\n details: { currentResourceId, incomingResourceId },\n hint: '平台写入已完成,但当前目录已绑定到另一资源;请保留现场并人工核对',\n });\n }\n const currentOwner = state.resource.owner?.userId;\n const incomingOwner = data.userId;\n if (\n currentOwner !== null &&\n currentOwner !== undefined &&\n incomingOwner !== undefined &&\n String(currentOwner) !== String(incomingOwner)\n ) {\n throw cliError(I18N_KEYS.project_revision_conflict, {\n code: 3,\n details: { currentOwner, incomingOwner },\n hint: '平台写入已完成,但当前目录 owner 已变化;请保留现场并人工核对',\n });\n }\n}\n\r\nexport function shortName(name: string | undefined, fallback: string): string {\r\n const raw = (name || fallback).trim();\r\n const idx = raw.indexOf('/');\r\n return idx >= 0 ? raw.slice(idx + 1) : raw;\r\n}\r\n\r\nfunction ownerFromState(state: FreelogState): { userId?: number | string; username?: string } {\r\n return {\r\n userId: state.resource.owner?.userId ?? undefined,\r\n username: state.resource.owner?.username ?? undefined,\r\n };\r\n}\r\n\r\nexport function listingFingerprint(\r\n data: Pick<ResourceProject, 'resourceTitle' | 'intro' | 'coverImages' | 'tags'>,\r\n): string {\r\n return JSON.stringify({\r\n title: data.resourceTitle ?? null,\r\n intro: data.intro ?? null,\r\n coverImages: data.coverImages ?? [],\r\n tags: data.tags ?? [],\r\n });\r\n}\r\n\r\nexport function toResourceProject(manifest: FreelogManifest, state: FreelogState): ResourceProject {\r\n const owner = ownerFromState(state);\r\n return {\r\n resourceId: state.resource.resourceId ?? undefined,\r\n resourceName: state.resource.resourceName || manifest.identity.name,\r\n resourceType: state.resource.resourceType || [],\r\n resourceTypeCode: state.resource.resourceTypeCode || manifest.resource.typeCode,\r\n resourceTypeName: state.resource.resourceTypeName || manifest.resource.typeName,\r\n resourceTitle: manifest.resource.title,\r\n intro: manifest.resource.intro,\r\n coverImages: manifest.resource.coverImages,\r\n tags: manifest.resource.tags,\r\n userId: owner.userId,\r\n username: owner.username,\r\n status: state.resource.status ?? undefined,\r\n latestVersion: state.resource.latestVersion ?? undefined,\r\n policies: state.resource.policies || [],\r\n };\r\n}\r\n\r\nexport function toVersionProject(manifest: FreelogManifest, state: FreelogState): VersionProject {\r\n const version = manifest.version || {\r\n version: '1.0.0',\r\n filePath: 'dist',\r\n };\r\n const owner = ownerFromState(state);\r\n return {\r\n resourceId: state.resource.resourceId ?? undefined,\r\n resourceName: state.resource.resourceName ?? undefined,\r\n resourceType: state.resource.resourceType?.join('/') || undefined,\r\n resourceTypeCode: state.resource.resourceTypeCode || manifest.resource.typeCode,\r\n userId: owner.userId,\r\n username: owner.username,\r\n version: version.version,\r\n description: version.description,\r\n videoCover: version.videoCover || undefined,\r\n filePath: version.filePath,\r\n artifactMode: version.artifactMode,\r\n reusePlatformFile: version.reusePlatformFile,\r\n fileSha1: state.version.fileSha1 ?? undefined,\r\n filename: state.version.filename ?? undefined,\r\n versionId: state.version.lastPublishedVersionId ?? undefined,\r\n runtimeVersion: version.runtimeVersion || undefined,\r\n dependencies: version.dependencies || [],\r\n baseUpcastResources: version.baseUpcastResources || [],\r\n authExcludedItems: version.authExcludedItems || [],\r\n batchSignContracts: version.batchSignContracts || [],\r\n inputAttrs: version.inputAttrs || [],\r\n customPropertyDescriptors: version.customPropertyDescriptors || [],\r\n draftSync: state.version.draftSync || null,\r\n };\r\n}\r\n\r\nexport function toCollectionProject(manifest: FreelogManifest, state: FreelogState): CollectionProject {\n const base = toResourceProject(manifest, state);\r\n const collection = manifest.collection || {};\r\n return {\r\n ...base,\r\n catalogueItems: (state.collection.catalogueDraft as unknown[]) || [],\r\n display: collection.display || state.collection.catalogueProperty || {},\r\n collectRules: collection.collectRules ?? state.collection.collectRules,\r\n rssFeedUrl: collection.rssFeedUrl || state.collection.rss?.feedUrl || undefined,\r\n version: collection.version || manifest.version?.version || '1.0.0',\r\n description: collection.description || manifest.version?.description || '',\r\n dependencies: collection.dependencies || [],\r\n baseUpcastResources: collection.baseUpcastResources || [],\r\n authExcludedItems: collection.authExcludedItems || [],\r\n inputAttrs: collection.inputAttrs || [],\r\n customPropertyDescriptors: collection.customPropertyDescriptors || [],\r\n draftSync: state.collection.draftSync || null,\r\n };\n}\n\nfunction applyPlatformResourceState(\n state: FreelogState,\n data: ResourceProject,\n subject: ProjectSubject,\n): void {\n state.resource = {\n ...state.resource,\n resourceId: data.resourceId || state.resource.resourceId || null,\n resourceName: data.resourceName || state.resource.resourceName || null,\n resourceType: data.resourceType || state.resource.resourceType || [],\n resourceTypeCode: data.resourceTypeCode || state.resource.resourceTypeCode || null,\n resourceTypeName: data.resourceTypeName || state.resource.resourceTypeName || null,\n subjectType: subject === 'collection' ? 4 : state.resource.subjectType ?? null,\n owner:\n data.userId !== undefined || data.username !== undefined\n ? { userId: data.userId ?? null, username: data.username ?? null }\n : state.resource.owner ?? null,\n status: data.status ?? state.resource.status ?? null,\n latestVersion: data.latestVersion ?? state.resource.latestVersion ?? null,\n policies: data.policies ?? state.resource.policies ?? [],\n };\n}\n\nfunction applyResourceProject(\n manifest: FreelogManifest,\n state: FreelogState,\n data: ResourceProject,\n subject: ProjectSubject,\n): void {\n manifest.subject = subject;\n manifest.identity.name = shortName(data.resourceName, manifest.identity.name);\n manifest.resource = {\n ...manifest.resource,\n typeCode: data.resourceTypeCode || manifest.resource.typeCode,\n typeName: data.resourceTypeName || manifest.resource.typeName,\n title: data.resourceTitle || manifest.resource.title,\n intro: data.intro ?? manifest.resource.intro,\n coverImages: data.coverImages ?? manifest.resource.coverImages ?? [],\n tags: data.tags ?? manifest.resource.tags ?? [],\n };\n applyPlatformResourceState(state, data, subject);\n state.resource.resourceTypeCode =\n data.resourceTypeCode || state.resource.resourceTypeCode || manifest.resource.typeCode;\n state.resource.resourceTypeName =\n data.resourceTypeName || state.resource.resourceTypeName || manifest.resource.typeName || null;\n}\n\nexport function persistResourceProject(\n data: ResourceProject,\r\n cwd?: string,\r\n subject: ProjectSubject = 'resource',\r\n): string {\n return withProjectWriteLock(cwd, () => {\n const loaded = tryLoadManifest(cwd);\n const manifest =\n loaded?.data ||\n createResourceManifest({\n subject,\n resourceName: shortName(data.resourceName, data.resourceTitle || 'resource'),\n resourceTypeCode: data.resourceTypeCode || '',\n resourceTypeName: data.resourceTypeName,\n resourceTitle: data.resourceTitle || shortName(data.resourceName, 'resource'),\n });\n const state = loadState(cwd, subject).data;\n assertProjectRevision(data, manifest, state);\n applyResourceProject(manifest, state, data, subject);\n const file = saveProjectSnapshot(manifest, state, cwd);\n attachProjectRevision(data, manifest, state);\n return file;\n });\n}\n\r\nexport function loadResourceProject(cwd?: string): { path: string; data: ResourceProject } {\n const { manifestPath: file, manifest, state } = loadProjectSnapshot(cwd);\n if (manifest.subject !== 'resource') {\n throw cliError(I18N_KEYS.not_single_resource_manifest, { code: 4 });\n }\n return {\n path: file,\n data: attachProjectRevision(toResourceProject(manifest, state), manifest, state),\n };\n}\n\r\nexport function tryLoadResourceProject(cwd?: string): { path: string; data: ResourceProject } | null {\n const loaded = tryLoadProjectSnapshot(cwd);\n if (!loaded || loaded.manifest.subject !== 'resource') return null;\n return {\n path: loaded.manifestPath,\n data: attachProjectRevision(\n toResourceProject(loaded.manifest, loaded.state),\n loaded.manifest,\n loaded.state,\n ),\n };\n}\r\n\r\nexport function saveResourceProject(data: ResourceProject, cwd?: string): string {\r\n return persistResourceProject(data, cwd, 'resource');\r\n}\r\n\r\nexport function savePlatformResourceState(\n data: ResourceProject,\n cwd?: string,\n subject: ProjectSubject = 'resource',\n options: SavePlatformFactsOptions = {},\n): string {\n return withProjectWriteLock(cwd, () => {\n const state = loadState(cwd, subject).data;\n const manifest = loadManifest(cwd).data;\n if (options.remoteWriteConfirmed) assertPlatformBinding(data, state);\n else assertProjectRevision(data, manifest, state);\n applyPlatformResourceState(state, data, subject);\n state.sync = {\n ...state.sync,\n lastPulledAt: new Date().toISOString(),\n listingFingerprint: listingFingerprint(data),\n platformUpdateDate:\n (data as { updateDate?: string }).updateDate ?? state.sync.platformUpdateDate ?? null,\n };\n saveState(state, cwd);\n attachProjectRevision(data, manifest, state);\n return statePath(cwd);\n });\n}\n\r\nexport function writeResourceProject(data: ResourceProject, cwd?: string): string {\r\n return saveResourceProject(data, cwd);\r\n}\r\n\r\nexport function createResourceManifestTemplate(opts: {\r\n resourceName: string;\r\n resourceTypeCode?: string;\r\n resourceTypeName?: string;\r\n resourceTypeLabels?: string[];\r\n resourceTitle?: string;\r\n}): ResourceProject {\r\n return {\r\n resourceName: opts.resourceName,\r\n resourceType: opts.resourceTypeLabels?.length ? opts.resourceTypeLabels : [],\r\n resourceTypeCode: opts.resourceTypeCode || '',\r\n resourceTypeName: opts.resourceTypeName,\r\n resourceTitle: opts.resourceTitle || opts.resourceName,\r\n intro: '',\r\n coverImages: [],\r\n tags: [],\r\n };\r\n}\r\n\r\nexport function loadVersionProject(cwd?: string): { path: string; data: VersionProject } {\n const { manifestPath: file, manifest, state } = loadProjectSnapshot(cwd);\n if (manifest.subject !== 'resource') {\n throw cliError(I18N_KEYS.not_single_resource_manifest, { code: 4 });\n }\n return {\n path: file,\n data: attachProjectRevision(toVersionProject(manifest, state), manifest, state),\n };\n}\n\r\nexport function tryLoadVersionProject(cwd?: string): { path: string; data: VersionProject } | null {\n const loaded = tryLoadProjectSnapshot(cwd);\n if (!loaded || loaded.manifest.subject !== 'resource') return null;\n return {\n path: loaded.manifestPath,\n data: attachProjectRevision(\n toVersionProject(loaded.manifest, loaded.state),\n loaded.manifest,\n loaded.state,\n ),\n };\n}\r\n\r\nexport function saveVersionProject(data: VersionProject, cwd?: string): string {\n return withProjectWriteLock(cwd, () => {\n const { data: manifest } = loadManifest(cwd);\n if (manifest.subject !== 'resource') {\n throw cliError(I18N_KEYS.not_single_resource_manifest, { code: 4 });\n }\n const state = loadState(cwd, 'resource').data;\n assertProjectRevision(data, manifest, state);\n const previousVersion = manifest.version?.version;\n const previousFilePath = manifest.version?.filePath;\n const previousArtifactMode = manifest.version?.artifactMode;\n const published = data.published === true;\n const reuseIntent =\n data.reusePlatformFile === true || (!data.filePath?.trim() && !!data.fileSha1?.trim());\n const changedPublishInput =\n (previousVersion !== undefined && data.version !== previousVersion) ||\n (previousFilePath !== undefined && data.filePath !== previousFilePath) ||\n (previousArtifactMode !== undefined && data.artifactMode !== previousArtifactMode);\n manifest.version = {\n ...(manifest.version || { version: '1.0.0', filePath: 'dist' }),\n version: data.version,\n description: data.description ?? '',\n videoCover: data.videoCover || undefined,\n filePath: data.filePath,\n artifactMode: data.artifactMode,\n reusePlatformFile: data.reusePlatformFile || undefined,\n runtimeVersion: data.runtimeVersion ?? null,\n dependencies: data.dependencies || [],\n baseUpcastResources: data.baseUpcastResources || [],\n authExcludedItems: data.authExcludedItems || [],\n batchSignContracts: data.batchSignContracts || [],\n inputAttrs: data.inputAttrs || [],\n customPropertyDescriptors: data.customPropertyDescriptors || [],\n };\n state.resource = {\n ...state.resource,\n resourceId: data.resourceId || state.resource.resourceId || null,\n resourceName: data.resourceName || state.resource.resourceName || null,\n resourceTypeCode:\n data.resourceTypeCode || state.resource.resourceTypeCode || manifest.resource.typeCode,\n owner:\n data.userId !== undefined || data.username !== undefined\n ? { userId: data.userId ?? null, username: data.username ?? null }\n : state.resource.owner ?? null,\n };\n state.version = {\n ...state.version,\n lastPublishedVersion:\n published\n ? data.version\n : data.versionId !== undefined\n ? data.versionId\n ? data.version\n : null\n : changedPublishInput\n ? null\n : state.version.lastPublishedVersion ?? null,\n fileSha1:\n published\n ? data.fileSha1\n : reuseIntent\n ? data.fileSha1 ?? null\n : changedPublishInput\n ? null\n : data.fileSha1 !== undefined\n ? data.fileSha1\n : state.version.fileSha1 ?? null,\n filename:\n published\n ? data.filename\n : reuseIntent\n ? data.filename ?? null\n : changedPublishInput\n ? null\n : data.filename !== undefined\n ? data.filename\n : state.version.filename ?? null,\n lastPublishedVersionId:\n published\n ? data.versionId\n : changedPublishInput\n ? null\n : data.versionId !== undefined\n ? data.versionId\n : state.version.lastPublishedVersionId ?? null,\n draftSync: data.draftSync === undefined ? state.version.draftSync ?? null : data.draftSync,\n };\n if (published || (data.versionId !== undefined && data.versionId)) {\n state.resource.latestVersion = data.version;\n }\n const file = saveProjectSnapshot(manifest, state, cwd);\n attachProjectRevision(data, manifest, state);\n return file;\n });\n}\n\r\nexport function writeVersionProject(data: VersionProject, cwd?: string): string {\r\n return saveVersionProject(data, cwd);\r\n}\r\n\r\nexport function createVersionManifestTemplate(opts: {\r\n resourceName: string;\r\n resourceTypeCode?: string;\r\n resourceTypeName?: string;\r\n version: string;\r\n filePath: string;\r\n artifactMode?: 'file' | 'directory-zip';\r\n runtimeVersion?: RuntimeVersion;\r\n}): VersionProject {\r\n return {\r\n resourceName: opts.resourceName,\r\n resourceTypeCode: opts.resourceTypeCode || '',\r\n version: opts.version,\r\n description: '',\r\n videoCover: undefined,\r\n filePath: opts.filePath,\r\n artifactMode: opts.artifactMode,\r\n runtimeVersion: opts.runtimeVersion,\r\n dependencies: [],\r\n baseUpcastResources: [],\r\n authExcludedItems: [],\r\n inputAttrs: [],\r\n customPropertyDescriptors: [],\r\n draftSync: null,\r\n };\r\n}\r\n\r\nexport function loadCollectionProject(cwd?: string): { path: string; data: CollectionProject } {\n const { manifestPath: file, manifest, state } = loadProjectSnapshot(cwd);\n if (manifest.subject !== 'collection') {\n throw cliError(I18N_KEYS.not_collection_manifest, { code: 4 });\n }\n return {\n path: file,\n data: attachProjectRevision(toCollectionProject(manifest, state), manifest, state),\n };\n}\n\r\nexport function tryLoadCollectionProject(\n cwd?: string,\n): { path: string; data: CollectionProject } | null {\n const loaded = tryLoadProjectSnapshot(cwd);\n if (!loaded || loaded.manifest.subject !== 'collection') return null;\n return {\n path: loaded.manifestPath,\n data: attachProjectRevision(\n toCollectionProject(loaded.manifest, loaded.state),\n loaded.manifest,\n loaded.state,\n ),\n };\n}\r\n\r\nexport function savePlatformCollectionState(\n data: CollectionProject,\n cwd?: string,\n updates: {\r\n catalogueDraft?: unknown[] | null;\r\n catalogueProperty?: Record<string, string> | null;\r\n cataloguePublishedFingerprint?: string | null;\r\n collectRules?: unknown;\n rss?: FreelogState['collection']['rss'];\n } = {},\n options: SavePlatformFactsOptions = {},\n): string {\n return withProjectWriteLock(cwd, () => {\n const state = loadState(cwd, 'collection').data;\n const manifest = loadManifest(cwd).data;\n if (options.remoteWriteConfirmed) assertPlatformBinding(data, state);\n else assertProjectRevision(data, manifest, state);\n applyPlatformResourceState(state, data, 'collection');\n state.sync = {\n ...state.sync,\n lastPulledAt: new Date().toISOString(),\n listingFingerprint: listingFingerprint(data),\n platformUpdateDate:\n (data as { updateDate?: string }).updateDate ?? state.sync.platformUpdateDate ?? null,\n };\n state.collection = {\n ...state.collection,\n catalogueDraft:\n updates.catalogueDraft === undefined\n ? state.collection.catalogueDraft ?? []\n : updates.catalogueDraft,\n catalogueProperty:\n updates.catalogueProperty === undefined\n ? state.collection.catalogueProperty ?? null\n : updates.catalogueProperty,\n cataloguePublishedFingerprint:\n updates.cataloguePublishedFingerprint === undefined\n ? state.collection.cataloguePublishedFingerprint ?? null\n : updates.cataloguePublishedFingerprint,\n collectRules:\n updates.collectRules === undefined\n ? state.collection.collectRules ?? null\n : updates.collectRules,\n rss: updates.rss === undefined ? state.collection.rss ?? null : updates.rss,\n };\n saveState(state, cwd);\n attachProjectRevision(data, manifest, state);\n return statePath(cwd);\n });\n}\n\r\nexport function saveCollectionProject(data: CollectionProject, cwd?: string): string {\n return withProjectWriteLock(cwd, () => {\n const loaded = tryLoadManifest(cwd);\n const manifest =\n loaded?.data ||\n createResourceManifest({\n subject: 'collection',\n resourceName: shortName(data.resourceName, data.resourceTitle || 'collection'),\n resourceTypeCode: data.resourceTypeCode || '',\n resourceTypeName: data.resourceTypeName,\n resourceTitle: data.resourceTitle || shortName(data.resourceName, 'collection'),\n });\n const state = loadState(cwd, 'collection').data;\n assertProjectRevision(data, manifest, state);\n applyResourceProject(manifest, state, data, 'collection');\n manifest.collection = {\n ...(manifest.collection || {}),\n version: data.version || manifest.collection?.version || '1.0.0',\n description: data.description ?? manifest.collection?.description ?? '',\n display: data.display || manifest.collection?.display || {},\n items: manifest.collection?.items || [],\n collectRules: data.collectRules ?? manifest.collection?.collectRules ?? null,\n rssFeedUrl: data.rssFeedUrl || manifest.collection?.rssFeedUrl,\n dependencies: data.dependencies || manifest.collection?.dependencies || [],\n baseUpcastResources: data.baseUpcastResources || manifest.collection?.baseUpcastResources || [],\n authExcludedItems: data.authExcludedItems || manifest.collection?.authExcludedItems || [],\n inputAttrs: data.inputAttrs || manifest.collection?.inputAttrs || [],\n customPropertyDescriptors:\n data.customPropertyDescriptors || manifest.collection?.customPropertyDescriptors || [],\n };\n state.collection = {\n ...state.collection,\n catalogueDraft: data.catalogueItems || state.collection.catalogueDraft || [],\n catalogueProperty: data.display || state.collection.catalogueProperty || {},\n collectRules: data.collectRules ?? state.collection.collectRules,\n rss: data.rssFeedUrl ? { feedUrl: data.rssFeedUrl } : state.collection.rss,\n draftSync: data.draftSync === undefined ? state.collection.draftSync ?? null : data.draftSync,\n };\n const file = saveProjectSnapshot(manifest, state, cwd);\n attachProjectRevision(data, manifest, state);\n return file;\n });\n}\n\r\nexport function writeCollectionProject(data: CollectionProject, cwd?: string): string {\r\n return saveCollectionProject(data, cwd);\r\n}\r\n\r\nexport function createCollectionManifestTemplate(opts: {\r\n resourceName: string;\r\n resourceTypeCode?: string;\r\n resourceTypeName?: string;\r\n resourceTitle?: string;\r\n version: string;\r\n}): CollectionProject {\r\n return {\r\n resourceName: opts.resourceName,\r\n resourceType: [],\r\n resourceTypeCode: opts.resourceTypeCode || '',\r\n resourceTypeName: opts.resourceTypeName,\r\n resourceTitle: opts.resourceTitle || opts.resourceName,\r\n intro: '',\r\n coverImages: [],\r\n tags: [],\r\n catalogueItems: [],\r\n display: {},\r\n version: opts.version,\r\n description: '',\r\n dependencies: [],\r\n baseUpcastResources: [],\r\n authExcludedItems: [],\r\n inputAttrs: [],\r\n customPropertyDescriptors: [],\r\n draftSync: null,\r\n };\r\n}\r\n","/** citty 参数描述真源:与 CLI使用说明 §1 全局参数一致 */\n\nexport const cliEnvArgs = {\n test: { type: 'boolean' as const, description: '等价 --env test' },\n env: {\n type: 'string' as const,\n description: '运行环境:dev/test(production/prod 暂未开放;未指定时会被阻断)',\n },\n};\n\nexport const cliOutputArgs = {\n json: { type: 'boolean' as const, description: 'JSON envelope 输出(含 code/message/hint/details)' },\n debug: { type: 'boolean' as const, description: '脱敏调试信息(或环境变量 FREELOG_DEBUG=1)' },\n lang: { type: 'string' as const, description: '当次语言:zh_CN | en_US' },\n};\n\nexport const cliJsonLinesArg = {\n 'json-lines': {\n type: 'boolean' as const,\n description: '逐行输出 NDJSON 进度(start/ok/fail/skip/done),便于 CI 解析',\n },\n};\n\nexport const cliConfirmArgs = {\n yes: { type: 'boolean' as const, alias: 'y' as const, description: '非交互确认' },\n};\n\nexport const cliCwdArg = {\n cwd: { type: 'string' as const, description: '项目目录(凭据自该目录向上解析)' },\n};\n\nexport const cliNoAutoPullArg = {\n 'no-auto-pull': {\n type: 'boolean' as const,\n description: '写命令前不自动 pull;listing 与平台不一致时直接失败',\n },\n};\n\nexport const cliSessionStoreArgs = {\n session: {\n type: 'boolean' as const,\n description: '会话模式(EphemeralStore,不写 manifest)',\n },\n 'resource-id': {\n type: 'string' as const,\n description: '平台 resourceId(维护/发新版必填;首发 create 除外)',\n },\n 'export-project': {\n type: 'string' as const,\n description: '会话成功后导出工程目录(见 --export-project 规格)',\n },\n};\n\nexport const cliReuseArgs = {\n 'reuse-version': {\n type: 'string' as const,\n description: '从已发版继承 fileSha1/filename(与 --file 互斥)',\n },\n 'no-inherit-deps': {\n type: 'boolean' as const,\n description: 'reuse 时不继承平台 dependencies',\n },\n};\n\nexport const cliSessionArgs = {\n ...cliSessionStoreArgs,\n ...cliReuseArgs,\n};\n\n/** 写 manifest 意图但不须 --yes 的命令(dep add 等) */\nexport const cliSyncWriteArgs = {\n ...cliCwdArg,\n ...cliNoAutoPullArg,\n ...cliEnvArgs,\n json: cliOutputArgs.json,\n debug: cliOutputArgs.debug,\n ...cliSessionStoreArgs,\n};\n\n/** 多数写命令(publish、update、dep auth、version、合集写操作等) */\nexport const cliWriteCommandArgs = {\n ...cliSyncWriteArgs,\n ...cliConfirmArgs,\n ...cliReuseArgs,\n};\n\n/** 只读命令(pull、status、type、validate 等) */\nexport const cliReadCommandArgs = {\n ...cliCwdArg,\n ...cliEnvArgs,\n json: cliOutputArgs.json,\n debug: cliOutputArgs.debug,\n};\n\n/** 根命令 freelog-cli --help 的全局 OPTIONS */\nexport const mainGlobalArgs = {\n ...cliEnvArgs,\n ...cliOutputArgs,\n ...cliConfirmArgs,\n ...cliCwdArg,\n ...cliNoAutoPullArg,\n ...cliSessionArgs,\n};\n","import { createHash } from 'node:crypto';\r\nimport { consola } from 'consola';\r\nimport type {\r\n CustomPropertyDescriptor,\r\n DraftSyncMeta,\r\n VersionProject,\r\n} from '../config/project.js';\r\n\r\n/** ≅ Console IResourceCreateVersionDraftType(独立资源发版草稿) */\nexport interface ResourceVersionDraftData {\r\n versionInput?: string;\r\n selectedFileInfo?: { name: string; sha1: string; from?: string } | null;\r\n descriptionEditorInput?: string;\r\n directDependencies?: Array<{\n id: string;\n name?: string;\n type?: string;\n versionRange?: string;\n }>;\n baseUpcastResources?: Array<{ resourceID: string; resourceName?: string }>;\n authExcludedItems?: Array<{\n resourceId: string;\n excludedType: 'contractId' | 'policyId';\n excludedValue: string;\n }>;\n additionalProperties?: Array<{ key: string; value: string }>;\n customProperties?: Array<{\r\n key: string;\r\n name?: string;\r\n value?: string;\r\n description?: string;\r\n }>;\r\n customConfigurations?: Array<{\r\n key: string;\r\n name?: string;\r\n description?: string;\r\n type: 'input' | 'select';\r\n input?: string;\r\n select?: string[];\r\n }>;\r\n videoCover?: string;\r\n}\r\n\r\ntype CanonicalDraft = {\r\n versionInput: string;\r\n selectedFileInfo: { name: string; sha1: string } | null;\r\n descriptionEditorInput: string;\r\n directDependencies: { id: string; name: string; type: string; versionRange: string }[];\n baseUpcastResources: { resourceID: string; resourceName: string }[];\n authExcludedItems: {\n resourceId: string;\n excludedType: 'contractId' | 'policyId';\n excludedValue: string;\n }[];\n additionalProperties: { key: string; value: string }[];\n customProperties: { key: string; name: string; value: string; description: string }[];\r\n customConfigurations: {\n key: string;\n name: string;\n description: string;\n type: 'input' | 'select';\n input: string;\n select: string[];\n }[];\n videoCover: string;\n};\n\r\nfunction trimStr(v: unknown): string {\r\n return v === undefined || v === null ? '' : String(v).trim();\r\n}\r\n\r\nfunction stableStringify(value: unknown): string {\r\n if (value === null || typeof value !== 'object') {\r\n return JSON.stringify(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return `[${value.map((item) => stableStringify(item)).join(',')}]`;\r\n }\r\n const obj = value as Record<string, unknown>;\r\n const keys = Object.keys(obj).sort();\r\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(',')}}`;\r\n}\r\n\r\nexport function normalizeDraft(d: ResourceVersionDraftData): CanonicalDraft {\r\n const file = d.selectedFileInfo;\r\n const selectedFileInfo =\r\n file && file.name && file.sha1\r\n ? { name: trimStr(file.name), sha1: trimStr(file.sha1) }\r\n : null;\r\n\r\n const directDependencies = [...(d.directDependencies || [])]\r\n .map((x) => ({\r\n id: trimStr(x.id),\r\n name: trimStr(x.name),\r\n type: trimStr(x.type) || 'resource',\r\n versionRange: trimStr(x.versionRange),\r\n }))\r\n .filter((x) => x.id)\r\n .sort((a, b) => a.id.localeCompare(b.id));\r\n\r\n const baseUpcastResources = [...(d.baseUpcastResources || [])]\n .map((x) => ({\r\n resourceID: trimStr(x.resourceID),\r\n resourceName: trimStr(x.resourceName),\r\n }))\r\n .filter((x) => x.resourceID)\n .sort((a, b) => a.resourceID.localeCompare(b.resourceID));\n\n const authExcludedItems = [...(d.authExcludedItems || [])]\n .map((x) => ({\n resourceId: trimStr(x.resourceId),\n excludedType: x.excludedType === 'policyId' ? ('policyId' as const) : ('contractId' as const),\n excludedValue: trimStr(x.excludedValue),\n }))\n .filter((x) => x.resourceId && x.excludedValue)\n .sort((a, b) => {\n const byResource = a.resourceId.localeCompare(b.resourceId);\n if (byResource !== 0) return byResource;\n const byType = a.excludedType.localeCompare(b.excludedType);\n if (byType !== 0) return byType;\n return a.excludedValue.localeCompare(b.excludedValue);\n });\n\n const additionalProperties = [...(d.additionalProperties || [])]\n .map((x) => ({ key: trimStr(x.key), value: String(x.value ?? '') }))\r\n .filter((x) => x.key)\r\n .sort((a, b) => a.key.localeCompare(b.key));\r\n\r\n const customProperties = [...(d.customProperties || [])]\r\n .map((x) => ({\r\n key: trimStr(x.key),\r\n name: trimStr(x.name) || trimStr(x.key),\r\n value: String(x.value ?? ''),\r\n description: trimStr(x.description),\r\n }))\r\n .filter((x) => x.key)\r\n .sort((a, b) => a.key.localeCompare(b.key));\r\n\r\n const customConfigurations = [...(d.customConfigurations || [])]\r\n .map((x) => {\r\n const select = [...(x.select || [])].map((s) => String(s)).sort();\r\n return {\r\n key: trimStr(x.key),\r\n name: trimStr(x.name) || trimStr(x.key),\r\n description: trimStr(x.description),\r\n type: (x.type === 'select' ? 'select' : 'input') as 'input' | 'select',\r\n input: trimStr(x.input),\r\n select,\r\n };\r\n })\r\n .filter((x) => x.key)\r\n .sort((a, b) => a.key.localeCompare(b.key));\r\n\r\n return {\r\n versionInput: trimStr(d.versionInput),\r\n selectedFileInfo,\r\n descriptionEditorInput: trimStr(d.descriptionEditorInput),\n directDependencies,\n baseUpcastResources,\n authExcludedItems,\n additionalProperties,\n customProperties,\n customConfigurations,\n videoCover: trimStr(d.videoCover),\n };\n}\n\r\nexport function fingerprint(d: ResourceVersionDraftData): string {\r\n return createHash('sha256').update(stableStringify(normalizeDraft(d))).digest('hex');\r\n}\r\n\r\nexport function toDraftData(config: VersionProject): ResourceVersionDraftData {\r\n const sha1 = config.fileSha1?.trim();\r\n const filename = config.filename?.trim();\r\n const selectedFileInfo =\r\n sha1 && filename ? { name: filename, sha1, from: 'freelog-cli' } : null;\r\n\r\n const customProperties: NonNullable<ResourceVersionDraftData['customProperties']> = [];\r\n const customConfigurations: NonNullable<ResourceVersionDraftData['customConfigurations']> = [];\r\n let warnedLossy = false;\r\n\r\n for (const desc of config.customPropertyDescriptors || []) {\r\n if (!desc?.key) continue;\r\n const name = desc.name || desc.key;\r\n const description = desc.remark || '';\r\n if (desc.type === 'readonlyText') {\r\n customProperties.push({\r\n key: desc.key,\r\n name,\r\n value: String(desc.defaultValue ?? ''),\r\n description,\r\n });\r\n continue;\r\n }\r\n if (desc.type === 'editableText') {\r\n customConfigurations.push({\r\n key: desc.key,\r\n name,\r\n description,\r\n type: 'input',\r\n input: String(desc.defaultValue ?? ''),\r\n select: [],\r\n });\r\n continue;\r\n }\r\n if (desc.type === 'select' || desc.type === 'radio' || desc.type === 'checkbox') {\r\n if ((desc.type === 'radio' || desc.type === 'checkbox') && !warnedLossy) {\r\n consola.warn('自定义属性 radio/checkbox 推入草稿后将变为 select(有损)');\r\n warnedLossy = true;\r\n }\r\n const select = [...(desc.candidateItems || [])].map(String);\r\n customConfigurations.push({\r\n key: desc.key,\r\n name,\r\n description,\r\n type: 'select',\r\n input: String(desc.defaultValue ?? select[0] ?? ''),\r\n select,\r\n });\r\n continue;\r\n }\r\n consola.warn(`跳过未知 customPropertyDescriptors.type=${desc.type} key=${desc.key}`);\r\n }\r\n\r\n if (\r\n (config.customPropertyDescriptors?.length || 0) > 30 ||\r\n customProperties.length + customConfigurations.length > 30\r\n ) {\r\n consola.warn('自定义属性超过 30 条(草稿仍推送;publish 再严拦)');\r\n }\r\n\r\n return {\r\n versionInput: config.version || '',\n selectedFileInfo,\n descriptionEditorInput: config.description || '',\n videoCover: config.videoCover?.trim() || '',\n directDependencies: (config.dependencies || []).map((d) => ({\n id: d.resourceId,\r\n name: d.resourceName || '',\r\n type: 'resource',\r\n versionRange: d.versionRange || '',\r\n })),\r\n baseUpcastResources: (config.baseUpcastResources || []).map((b) => ({\n resourceID: b.resourceId,\n resourceName: b.resourceName || '',\n })),\n authExcludedItems: (config.authExcludedItems || []).map((a) => ({\n resourceId: a.resourceId,\n excludedType: a.excludedType,\n excludedValue: a.excludedValue,\n })),\n additionalProperties: (config.inputAttrs || []).map((a) => ({\n key: a.key,\r\n value: String(a.value),\r\n })),\r\n customProperties,\r\n customConfigurations,\r\n };\r\n}\r\n\r\nexport function applyDraftToVersionConfig(\r\n config: VersionProject,\r\n draft: ResourceVersionDraftData,\r\n): VersionProject {\r\n const next: VersionProject = { ...config };\r\n\r\n next.version = trimStr(draft.versionInput) || next.version;\n next.description = trimStr(draft.descriptionEditorInput);\n next.videoCover = trimStr(draft.videoCover) || undefined;\n\n if (draft.selectedFileInfo && draft.selectedFileInfo.sha1 && draft.selectedFileInfo.name) {\n next.fileSha1 = draft.selectedFileInfo.sha1;\r\n next.filename = draft.selectedFileInfo.name;\r\n } else {\r\n next.fileSha1 = undefined;\r\n next.filename = undefined;\r\n }\r\n\r\n next.dependencies = [];\r\n for (const dep of draft.directDependencies || []) {\r\n if (dep.type === 'object') {\r\n consola.warn(`跳过 type=object 依赖 id=${dep.id}`);\r\n continue;\r\n }\r\n if (!dep.id) continue;\r\n next.dependencies.push({\r\n resourceId: dep.id,\r\n resourceName: dep.name || '',\r\n versionRange: dep.versionRange || '',\r\n });\r\n }\r\n\r\n next.baseUpcastResources = (draft.baseUpcastResources || [])\n .filter((b) => b.resourceID)\r\n .map((b) => ({\r\n resourceId: b.resourceID,\r\n resourceName: b.resourceName || '',\n }));\n\n next.authExcludedItems = (draft.authExcludedItems || [])\n .filter((a) => a.resourceId && a.excludedValue)\n .map((a) => ({\n resourceId: a.resourceId,\n excludedType: a.excludedType === 'policyId' ? 'policyId' : 'contractId',\n excludedValue: a.excludedValue,\n }));\n\n next.inputAttrs = (draft.additionalProperties || [])\n .filter((a) => a.key)\r\n .map((a) => ({ key: a.key, value: a.value }));\r\n\r\n const descriptors: CustomPropertyDescriptor[] = [];\r\n for (const p of draft.customProperties || []) {\r\n if (!p.key) {\r\n consola.warn('跳过缺 key 的 customProperties 项');\r\n continue;\r\n }\r\n descriptors.push({\r\n type: 'readonlyText',\r\n key: p.key,\r\n name: p.name || p.key,\r\n defaultValue: String(p.value ?? ''),\r\n remark: p.description || '',\r\n });\r\n }\r\n for (const c of draft.customConfigurations || []) {\r\n if (!c.key) {\r\n consola.warn('跳过缺 key 的 customConfigurations 项');\r\n continue;\r\n }\r\n if (c.type === 'input') {\r\n descriptors.push({\r\n type: 'editableText',\r\n key: c.key,\r\n name: c.name || c.key,\r\n defaultValue: String(c.input ?? ''),\r\n remark: c.description || '',\r\n });\r\n } else {\r\n const select = [...(c.select || [])].map(String);\r\n descriptors.push({\r\n type: 'select',\r\n key: c.key,\r\n name: c.name || c.key,\r\n defaultValue: String(c.input ?? select[0] ?? ''),\r\n candidateItems: select,\r\n remark: c.description || '',\r\n });\r\n }\r\n }\r\n next.customPropertyDescriptors = descriptors;\r\n\r\n // filePath / resourceId / userId / resourceName / resourceType 永不改\r\n return next;\r\n}\r\n\r\nexport function buildDraftSync(\r\n draft: ResourceVersionDraftData,\r\n remoteUpdateDate?: string,\r\n pushed = false,\r\n): DraftSyncMeta {\r\n return {\r\n lastFingerprint: fingerprint(draft),\r\n lastRemoteUpdateDate: remoteUpdateDate,\r\n lastPushedAt: pushed ? new Date().toISOString() : undefined,\r\n };\r\n}\r\n\r\nexport type DraftPushDecision =\r\n | { action: 'save'; reason: 'no-remote' | 'force' | 'aligned' | 'fast-forward' | 'first-save' }\r\n | { action: 'conflict'; reason: string; hint: string };\r\n\r\n/** §7 冲突判定(纯函数,供单测) */\r\nexport function decideDraftPush(opts: {\r\n localFp: string;\r\n remote: { draftData: ResourceVersionDraftData; updateDate?: string } | null;\r\n sync?: DraftSyncMeta | null;\r\n force?: boolean;\r\n}): DraftPushDecision {\r\n const { localFp, remote, sync, force } = opts;\r\n\r\n if (!remote) {\r\n return { action: 'save', reason: 'no-remote' };\r\n }\r\n if (force) {\r\n return { action: 'save', reason: 'force' };\r\n }\r\n\r\n const remoteFp = fingerprint(remote.draftData);\r\n if (localFp === remoteFp) {\r\n return { action: 'save', reason: 'aligned' };\r\n }\r\n\r\n if (!sync?.lastFingerprint) {\r\n return {\r\n action: 'conflict',\r\n reason: 'remote-exists-without-sync',\r\n hint: 'freelog-cli draft pull 或 freelog-cli draft push --force',\r\n };\r\n }\r\n\r\n const lastFp = sync.lastFingerprint;\r\n const lastDate = sync.lastRemoteUpdateDate;\r\n const localDirty = localFp !== lastFp;\r\n const remoteDirty =\r\n remoteFp !== lastFp ||\r\n (lastDate != null && remote.updateDate != null && remote.updateDate !== lastDate);\r\n\r\n if (localDirty && remoteDirty) {\r\n return {\r\n action: 'conflict',\r\n reason: 'both-dirty',\r\n hint: 'freelog-cli draft pull 合并后重试,或 --force 覆盖远端',\r\n };\r\n }\r\n if (!localDirty && remoteDirty) {\r\n return {\r\n action: 'conflict',\r\n reason: 'remote-dirty',\r\n hint: 'freelog-cli draft pull 或 --force',\r\n };\r\n }\r\n if (localDirty && !remoteDirty) {\r\n return { action: 'save', reason: 'fast-forward' };\r\n }\r\n return { action: 'save', reason: 'first-save' };\r\n}\r\n","import { cliError } from '../../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../../i18n/bundled.js';\r\nimport { FServiceAPI, unwrapData } from '../../../platform/index.js';\r\nimport { fingerprint, type ResourceVersionDraftData } from '../../../adapters/versionDraftAdapter.js';\r\nimport type { PlatformResourceInfo, PlatformVersionDraft } from './types.js';\r\n\r\nexport async function fetchResourceInfo(resourceIdOrName: string): Promise<PlatformResourceInfo> {\r\n const envelope = await FServiceAPI.Resource.info({\r\n resourceIdOrName,\r\n isLoadPolicyInfo: 1,\r\n isLoadLatestVersionInfo: 1,\r\n });\r\n const data = unwrapData<PlatformResourceInfo>(envelope);\r\n if (!data?.resourceId && !(data as { resourceID?: string })?.resourceID) {\r\n throw cliError(I18N_KEYS.platform_no_resource_info, { code: 1, details: data });\r\n }\r\n const anyData = data as PlatformResourceInfo & { resourceID?: string };\r\n return {\r\n ...data,\r\n resourceId: data.resourceId || anyData.resourceID || resourceIdOrName,\r\n };\r\n}\r\n\r\nexport async function fetchVersionDraft(resourceId: string): Promise<PlatformVersionDraft> {\r\n try {\r\n const envelope = await FServiceAPI.Resource.lookDraft({ resourceId });\r\n const data = unwrapData<Record<string, unknown> | null>(envelope);\r\n if (!data || (typeof data === 'object' && Object.keys(data).length === 0)) {\r\n return { exists: false };\r\n }\r\n\r\n const draftData = (data.draftData ?? data) as ResourceVersionDraftData;\r\n const hasShape =\r\n data.draftData !== undefined ||\r\n draftData.versionInput !== undefined ||\r\n draftData.selectedFileInfo !== undefined ||\r\n draftData.descriptionEditorInput !== undefined ||\r\n Array.isArray(draftData.directDependencies);\r\n\r\n if (!hasShape && !data.updateDate) {\r\n return { exists: false };\r\n }\r\n\r\n return {\r\n exists: true,\r\n updateDate: (data.updateDate || data.updateDateTime || data.modifyDate) as string | undefined,\r\n version: draftData.versionInput,\r\n fingerprint: fingerprint(draftData),\r\n raw: data,\r\n };\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n if (/404|不存在|not\\s*found|无草稿/i.test(msg)) {\r\n return { exists: false };\r\n }\r\n throw error;\r\n }\r\n}\r\n","import type { PlatformResourceInfo } from './sync/index.js';\r\n\r\n/** 对齐 Console 侧栏上架门禁;通过后由调用方执行 status=1 的平台写入。 */\nexport function evaluateOnlineGates(info: PlatformResourceInfo): {\r\n hasLatestVersion: boolean;\r\n enabledPolicyCount: number;\r\n ok: boolean;\r\n} {\r\n const hasLatestVersion = Boolean(info.latestVersion);\r\n const enabledPolicyCount = (info.policies || []).filter((p) => Number(p.status) === 1).length;\r\n return {\r\n hasLatestVersion,\r\n enabledPolicyCount,\r\n ok: hasLatestVersion && enabledPolicyCount >= 1,\r\n };\r\n}\r\n","import { FServiceAPI, unwrapData } from '../platform/index.js';\n\ninterface AuthTreeContractRef {\n contractId?: string;\n policyId?: string;\n}\n\ninterface AuthTreeResourceNode {\n resourceId?: string;\n resourceName?: string;\n contracts?: AuthTreeContractRef[];\n children?: unknown;\n}\n\ntype AuthTreeGroup = AuthTreeResourceNode[];\n\ninterface ContractStatus {\n contractId?: string;\n status?: number;\n authStatus?: number;\n subjectId?: string;\n policyId?: string;\n}\n\nexport interface AuthorizationAssessment {\n resolved: boolean;\n contractIds: string[];\n unresolvedDependencies: unknown[];\n}\n\nfunction collectContractIds(value: unknown, output = new Set<string>()): Set<string> {\n if (Array.isArray(value)) {\n for (const item of value) collectContractIds(item, output);\n return output;\n }\n if (!value || typeof value !== 'object') return output;\n const node = value as AuthTreeResourceNode;\n for (const contract of node.contracts || []) {\n if (contract.contractId) output.add(contract.contractId);\n }\n if (node.children) collectContractIds(node.children, output);\n return output;\n}\n\nfunction asAuthTreeGroups(value: unknown): AuthTreeGroup[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter((group): group is unknown[] => Array.isArray(group))\n .map((group) => group.filter((node): node is AuthTreeResourceNode => Boolean(node && typeof node === 'object')))\n .filter((group) => group.length > 0);\n}\n\nfunction collectGroups(value: unknown, output: AuthTreeGroup[] = []): AuthTreeGroup[] {\n for (const group of asAuthTreeGroups(value)) {\n output.push(group);\n for (const node of group) collectGroups(node.children, output);\n }\n return output;\n}\n\nfunction groupContractIds(group: AuthTreeGroup): string[] {\n return [\n ...new Set(\n group.flatMap((node) => (node.contracts || []).map((contract) => contract.contractId).filter(Boolean) as string[]),\n ),\n ];\n}\n\nfunction declaredResourceIds(dependencies: unknown[]): string[] {\n return [\n ...new Set(\n dependencies\n .map((dependency) =>\n dependency && typeof dependency === 'object' && 'resourceId' in dependency\n ? String((dependency as { resourceId?: unknown }).resourceId || '')\n : '',\n )\n .filter(Boolean),\n ),\n ];\n}\n\n/** 合并 dependencies 与 baseUpcastResources 为 authTree / contracts 预检用的声明列表。 */\nexport function mergeDeclaredAuthSubjects(\n dependencies?: unknown[],\n baseUpcastResources?: unknown[],\n): Array<{ resourceId: string }> {\n const seen = new Set<string>();\n const merged: Array<{ resourceId: string }> = [];\n for (const list of [dependencies, baseUpcastResources]) {\n for (const resourceId of declaredResourceIds(list || [])) {\n if (seen.has(resourceId)) continue;\n seen.add(resourceId);\n merged.push({ resourceId });\n }\n }\n return merged;\n}\n\nexport interface CollectionItemBaseUpcastAssessment {\n resolved: boolean;\n unresolvedItems: Array<{\n childResourceId: string;\n baseUpcastResourceIds: string[];\n missingSubjectIds: string[];\n }>;\n}\n\ninterface BatchInfoResourceRow {\n resourceId?: string;\n baseUpcastResources?: Array<{ resourceId?: string }>;\n}\n\nfunction unwrapContractRows(value: unknown): ContractStatus[] {\n const data = unwrapData<unknown>(value);\n if (Array.isArray(data)) return data as ContractStatus[];\n if (data && typeof data === 'object') {\n const row = data as { dataList?: unknown[]; list?: unknown[] };\n if (Array.isArray(row.dataList)) return row.dataList as ContractStatus[];\n if (Array.isArray(row.list)) return row.list as ContractStatus[];\n }\n return [];\n}\n\nfunction isActiveContract(contract: ContractStatus): boolean {\n return Number(contract.status) === 0 && [1, 2, 3].includes(Number(contract.authStatus));\n}\n\nasync function assessViaLicenseeContracts(\n resourceId: string,\n declaredDependencies: unknown[],\n): Promise<AuthorizationAssessment | null> {\n const declaredIds = declaredResourceIds(declaredDependencies);\n if (declaredIds.length === 0) return null;\n\n const contractEnvelope = await FServiceAPI.Contract.contracts({\n identityType: 1,\n licenseeId: resourceId,\n subjectType: 1,\n licenseeIdentityType: 1,\n limit: 100,\n } as Parameters<typeof FServiceAPI.Contract.contracts>[0]);\n const rows = unwrapContractRows(contractEnvelope);\n if (rows.length === 0) return null;\n\n const activeSubjectIds = new Set(\n rows.filter(isActiveContract).map((row) => row.subjectId).filter(Boolean) as string[],\n );\n const unresolvedDependencies = declaredIds\n .filter((subjectId) => !activeSubjectIds.has(subjectId))\n .map((subjectId) => ({ reason: 'DECLARED_DEPENDENCY_NOT_AUTHORIZED', resourceId: subjectId }));\n\n return {\n resolved: unresolvedDependencies.length === 0,\n contractIds: rows\n .filter(isActiveContract)\n .map((row) => row.contractId)\n .filter(Boolean) as string[],\n unresolvedDependencies,\n };\n}\n\n/**\n * 对齐 Console FMicroAPP_Authorization / step2_isCompleteAuthorization:\n * dependencies 与 baseUpcastResources 均须完整授权。\n */\nexport async function assessDeclaredAuthorization(opts: {\n resourceId: string;\n version?: string;\n dependencies?: unknown[];\n baseUpcastResources?: unknown[];\n}): Promise<AuthorizationAssessment> {\n const declaredDependencies = mergeDeclaredAuthSubjects(opts.dependencies, opts.baseUpcastResources);\n return assessResourceAuthorization({\n resourceId: opts.resourceId,\n version: opts.version,\n declaredDependencies,\n });\n}\n\n/**\n * 对齐 Console FAddResourcesHandleAuth:合集 licensee 对子资源 baseUpcast 须有 contractStatus=0 合同。\n */\nexport async function assessCollectionItemBaseUpcastAuthorization(opts: {\n collectionId: string;\n childResourceIds: string[];\n}): Promise<CollectionItemBaseUpcastAssessment> {\n const childResourceIds = [...new Set(opts.childResourceIds.map((id) => id.trim()).filter(Boolean))];\n if (childResourceIds.length === 0) {\n return { resolved: true, unresolvedItems: [] };\n }\n\n const batchEnvelope = await FServiceAPI.Resource.batchInfo({\n resourceIds: childResourceIds.join(','),\n } as Parameters<typeof FServiceAPI.Resource.batchInfo>[0]);\n const batchData = unwrapData<BatchInfoResourceRow[] | { dataList?: BatchInfoResourceRow[] }>(\n batchEnvelope,\n );\n const rows = Array.isArray(batchData)\n ? batchData\n : Array.isArray(batchData?.dataList)\n ? batchData.dataList\n : [];\n\n const allBaseUpcastIds = [\n ...new Set(\n rows.flatMap((row) =>\n (row.baseUpcastResources || [])\n .map((item) => String(item.resourceId || '').trim())\n .filter(Boolean),\n ),\n ),\n ];\n\n let contractRows: ContractStatus[] = [];\n if (allBaseUpcastIds.length > 0) {\n const contractEnvelope = await FServiceAPI.Contract.batchContracts({\n licenseeId: opts.collectionId,\n subjectIds: allBaseUpcastIds.join(','),\n contractStatus: 0,\n } as Parameters<typeof FServiceAPI.Contract.batchContracts>[0]);\n contractRows = unwrapContractRows(contractEnvelope);\n }\n\n const authorizedSubjectIds = new Set(\n contractRows.map((row) => row.subjectId).filter(Boolean) as string[],\n );\n\n const unresolvedItems = rows\n .map((row) => {\n const childResourceId = String(row.resourceId || '').trim();\n if (!childResourceId) return null;\n const baseUpcastResourceIds = (row.baseUpcastResources || [])\n .map((item) => String(item.resourceId || '').trim())\n .filter(Boolean);\n if (baseUpcastResourceIds.length === 0) return null;\n const missingSubjectIds = baseUpcastResourceIds.filter((id) => !authorizedSubjectIds.has(id));\n if (missingSubjectIds.length === 0) return null;\n return { childResourceId, baseUpcastResourceIds, missingSubjectIds };\n })\n .filter(Boolean) as CollectionItemBaseUpcastAssessment['unresolvedItems'];\n\n return {\n resolved: unresolvedItems.length === 0,\n unresolvedItems,\n };\n}\n\n/**\n * 对齐 Console FGraph_Tree_Authorization_Resource:authTree 返回嵌套资源树,\n * 需要提取 contractIds 后再用 batchContracts 的 status/authStatus 判断最终授权。\n */\nexport async function assessResourceAuthorization(opts: {\n resourceId: string;\n version?: string;\n declaredDependencies: unknown[];\n}): Promise<AuthorizationAssessment> {\n const treeEnvelope = await FServiceAPI.Resource.authTree({\n resourceId: opts.resourceId,\n version: opts.version,\n } as Parameters<typeof FServiceAPI.Resource.authTree>[0]);\n const tree = unwrapData<unknown>(treeEnvelope);\n\n const groups = collectGroups(tree);\n const contractIds = [...collectContractIds(tree)];\n if (contractIds.length === 0) {\n const viaLicensee = await assessViaLicenseeContracts(opts.resourceId, opts.declaredDependencies);\n if (viaLicensee) return viaLicensee;\n return {\n resolved: opts.declaredDependencies.length === 0,\n contractIds,\n unresolvedDependencies: declaredResourceIds(opts.declaredDependencies).map((resourceId) => ({\n reason: 'DECLARED_DEPENDENCY_NOT_AUTHORIZED',\n resourceId,\n })),\n };\n }\n\n const contractEnvelope = await FServiceAPI.Contract.batchContracts({\n contractIds: contractIds.join(','),\n projection: 'authStatus,contractId,status',\n } as Parameters<typeof FServiceAPI.Contract.batchContracts>[0]);\n const rows = unwrapContractRows(contractEnvelope);\n const activeIds = new Set(\n rows.filter(isActiveContract).map((contract) => contract.contractId).filter(Boolean) as string[],\n );\n const unresolvedGroups = groups\n .map((group) => {\n const ids = groupContractIds(group);\n return ids.some((contractId) => activeIds.has(contractId))\n ? null\n : {\n reason: ids.length === 0 ? 'DEPENDENCY_HAS_NO_CONTRACT' : 'CONTRACT_NOT_AUTHORIZED',\n resourceIds: [...new Set(group.map((node) => node.resourceId).filter(Boolean) as string[])],\n contractIds: ids,\n };\n })\n .filter(Boolean) as Array<{ reason: string; resourceIds: string[]; contractIds: string[] }>;\n\n const topLevelGroups = asAuthTreeGroups(tree);\n const missingDeclared = declaredResourceIds(opts.declaredDependencies)\n .filter(\n (resourceId) =>\n !topLevelGroups.some(\n (group) =>\n group.some((node) => node.resourceId === resourceId) &&\n groupContractIds(group).some((contractId) => activeIds.has(contractId)),\n ),\n )\n .map((resourceId) => ({ reason: 'DECLARED_DEPENDENCY_NOT_AUTHORIZED', resourceId }));\n const unresolvedDependencies = [...missingDeclared, ...unresolvedGroups];\n return {\n resolved: unresolvedDependencies.length === 0,\n contractIds,\n unresolvedDependencies,\n };\n}\n","import { getConsoleBaseURL, type FreelogEnv } from './env.js';\n\nexport type ConsoleResourceKind = 'resource' | 'collection';\n\nexport interface ConsoleHandoff {\n reason: string;\n actionUrl: string;\n contractsUrl: string;\n nextCommand: string;\n}\n\nfunction consoleRoute(kind: ConsoleResourceKind, page: 'dependency' | 'contract'): string {\n return kind === 'collection'\n ? `/resource/collectionSidebar/${page}`\n : `/resource/sidebar/${page}`;\n}\n\n/** 与 Console tools-lib/linkTo.ts 的资源、合集侧边栏路由保持一致。 */\nexport function buildConsoleResourceUrls(opts: {\n id: string;\n kind?: ConsoleResourceKind;\n env?: FreelogEnv;\n}): { actionUrl: string; contractsUrl: string } {\n const kind = opts.kind ?? 'resource';\n const encodedId = encodeURIComponent(opts.id);\n const base = getConsoleBaseURL(opts.env);\n return {\n actionUrl: `${base}${consoleRoute(kind, 'dependency')}/${encodedId}`,\n contractsUrl: `${base}${consoleRoute(kind, 'contract')}/${encodedId}`,\n };\n}\n\nexport function buildConsoleHandoff(opts: {\n id: string;\n reason: string;\n nextCommand: string;\n kind?: ConsoleResourceKind;\n env?: FreelogEnv;\n}): ConsoleHandoff {\n return {\n reason: opts.reason,\n ...buildConsoleResourceUrls(opts),\n nextCommand: opts.nextCommand,\n };\n}\n","import { FServiceAPI, FUtil } from '../../../platform/index.js';\r\nimport { CliError } from '../../../core/errors.js';\r\nimport { cliError } from '../../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../../i18n/bundled.js';\r\nimport type { CustomPropertyDescriptor } from '../../../config/project.js';\r\nimport type {\r\n ApiEnvelope,\r\n AttrInfoByKey,\r\n AttrValueConfig,\r\n CreateVersionProperties,\r\n FileListInfoRow,\r\n FilePropertyInheritData,\r\n HandleFilePropertiesResult,\r\n MetaInfoArray,\r\n ParsedFileInfo,\r\n SystemProperty,\r\n} from './types.js';\r\n\r\nconst POLL_DELAY_MS = 500;\r\n\r\nfunction readEnvelope<T>(response: unknown): ApiEnvelope<T> {\r\n if (response && typeof response === 'object') {\r\n return response as ApiEnvelope<T>;\r\n }\r\n return { ret: 0, errCode: 0, data: response as T };\r\n}\r\n\r\nfunction assertApiOk<T>(envelope: ApiEnvelope<T>, label: string): T {\r\n const ret = envelope.ret ?? 0;\r\n const errCode = envelope.errCode ?? envelope.errcode ?? 0;\r\n if (ret !== 0 || errCode !== 0) {\r\n throw cliError(I18N_KEYS.api_label_failed, {\r\n code: 4,\r\n params: { label, msg: envelope.msg || '未知错误' },\r\n details: envelope,\r\n });\r\n }\r\n if (envelope.data === undefined) {\r\n throw cliError(I18N_KEYS.api_label_empty_data, { code: 4, details: envelope });\r\n }\r\n return envelope.data;\r\n}\r\n\r\n/** manifest → Console inheritData(≅ step2 draft 持久化字段) */\r\nexport function inheritDataFromVersionConfig(cfg: {\r\n inputAttrs?: Array<{ key: string; value: string | number | boolean }>;\r\n customPropertyDescriptors?: CustomPropertyDescriptor[];\r\n}): FilePropertyInheritData {\r\n const additionalProperties = (cfg.inputAttrs || [])\r\n .filter((attr) => attr?.key && attr.key !== 'runtimeVersion')\r\n .map((attr) => ({ key: attr.key, value: String(attr.value ?? '') }));\r\n\r\n const customProperties: FilePropertyInheritData['customProperties'] = [];\r\n const customConfigurations: FilePropertyInheritData['customConfigurations'] = [];\r\n\r\n for (const desc of cfg.customPropertyDescriptors || []) {\r\n if (!desc?.key) continue;\r\n const name = desc.name || desc.key;\r\n const description = desc.remark || '';\r\n if (desc.type === 'readonlyText') {\r\n customProperties.push({\r\n key: desc.key,\r\n name,\r\n value: String(desc.defaultValue ?? ''),\r\n description,\r\n });\r\n continue;\r\n }\r\n if (desc.type === 'editableText') {\r\n customConfigurations.push({\r\n key: desc.key,\r\n name,\r\n description,\r\n type: 'input',\r\n input: String(desc.defaultValue ?? ''),\r\n select: [],\r\n });\r\n continue;\r\n }\r\n if (desc.type === 'select') {\r\n customConfigurations.push({\r\n key: desc.key,\r\n name,\r\n description,\r\n type: 'select',\r\n input: '',\r\n select: (desc.candidateItems || []).map(String),\r\n });\r\n }\r\n }\r\n\r\n return { additionalProperties, customProperties, customConfigurations };\r\n}\r\n\r\n/** handleData 结果 → createVersion 字段(≅ step2 submitBtn) */\r\nexport function createVersionPropertiesFromHandleData(\r\n result: HandleFilePropertiesResult,\r\n): CreateVersionProperties {\r\n const inputAttrs = result.systemProperties\r\n .filter((item) => item.type === 'additional')\r\n .map((item) => ({ key: item.key, value: item.value }));\r\n\r\n const customPropertyDescriptors: CustomPropertyDescriptor[] = [\r\n ...result.customProperties.map((item) => ({\r\n type: 'readonlyText',\r\n key: item.key,\r\n name: item.name,\r\n remark: item.description,\r\n defaultValue: item.value,\r\n })),\r\n ...result.customConfigurations.map((item) => {\r\n const isInput = item.type === 'input';\r\n return {\r\n type: isInput ? 'editableText' : 'select',\r\n key: item.key,\r\n name: item.name,\r\n remark: item.description,\r\n defaultValue: isInput ? item.input : item.select[0] || '',\r\n candidateItems: isInput ? undefined : item.select,\r\n };\r\n }),\r\n ];\r\n\r\n return { inputAttrs, customPropertyDescriptors };\r\n}\r\n\r\n/** Node 侧轮询解析(≅ Console getFilesSha1Info / creatorBatch Task,不用浏览器 SSE) */\r\nexport async function pollFilesSha1Info(opts: {\r\n sha1: string[];\r\n resourceTypeCode: string;\r\n delayMs?: number;\r\n}): Promise<{ error: string; result: ParsedFileInfo[] }> {\r\n if (!opts.sha1.length) {\r\n return { error: '', result: [] };\r\n }\r\n\r\n let pending = [...opts.sha1];\r\n const finished: ParsedFileInfo[] = [];\r\n const delayMs = opts.delayMs ?? POLL_DELAY_MS;\r\n\r\n while (pending.length > 0) {\r\n const envelope = readEnvelope<FileListInfoRow[]>(\r\n await FServiceAPI.Storage.filesListInfo({\r\n sha1: pending.join(','),\r\n resourceTypeCode: opts.resourceTypeCode,\r\n }),\r\n );\r\n const ret = envelope.ret ?? 0;\r\n const errCode = envelope.errCode ?? envelope.errcode ?? 0;\r\n if (ret !== 0 || errCode !== 0) {\r\n return { error: envelope.msg || 'filesListInfo 失败', result: finished };\r\n }\r\n\r\n const rows = Array.isArray(envelope.data) ? envelope.data : [];\r\n pending = rows\r\n .filter((row) => row.metaAnalyzeStatus === 0 || row.metaAnalyzeStatus === 1)\r\n .map((row) => row.sha1);\r\n\r\n for (const row of rows) {\r\n if (row.metaAnalyzeStatus === 0 || row.metaAnalyzeStatus === 1) continue;\r\n finished.push({\r\n sha1: row.sha1,\r\n metaAnalyzeStatus: row.metaAnalyzeStatus as ParsedFileInfo['metaAnalyzeStatus'],\r\n fileSize: row.fileSize,\r\n metaInfoArray: row.metaInfoArray || [],\r\n });\r\n }\r\n\r\n if (pending.length === 0) break;\r\n await FUtil.Tool.promiseSleep(delayMs);\r\n }\r\n\r\n return { error: '', result: finished };\r\n}\r\n\r\nasync function getAttrsInfoByKeys(keys: string[]): Promise<AttrInfoByKey[]> {\r\n if (!keys.length) return [];\r\n\r\n const responses = await Promise.all(\r\n keys.map((key) => FServiceAPI.Resource.getAttrsInfoByKey({ key })),\r\n );\r\n\r\n return responses.map((response, index) => {\r\n const data = assertApiOk(\r\n readEnvelope<AttrInfoByKey>(response),\r\n `getAttrsInfoByKey(${keys[index] || index})`,\r\n );\r\n return buildAttrInfoWithValueConfig(data);\r\n });\r\n}\r\n\r\nfunction buildAttrInfoWithValueConfig(raw: Omit<AttrInfoByKey, 'valueConfig'>): AttrInfoByKey {\r\n const valueConfig: AttrValueConfig = {};\r\n const rule = raw.contentRule;\r\n\r\n if (raw.format === 4) {\r\n valueConfig.date = {\r\n nullable: true,\r\n startDate: rule?.startDate || '1000-01-01',\r\n limitDate: rule?.limitDate || '9999-12-31',\r\n };\r\n } else if (raw.format === 5) {\r\n valueConfig.dataTime = {\r\n nullable: true,\r\n startDateTime: rule?.startDateTime || '1000-01-01 00:00:00',\r\n limitDateTime: rule?.limitDateTime || '9999-12-31 23:59:59',\r\n };\r\n } else if (raw.format === 6) {\r\n valueConfig.text = {\r\n nullable: true,\r\n minLength: rule?.minLength || 0,\r\n maxLength: rule?.maxLength || 140,\r\n };\r\n } else if (raw.format === 7) {\r\n valueConfig.textArea = {\r\n nullable: true,\r\n minLength: rule?.minLength || 0,\r\n maxLength: rule?.maxLength || 140,\r\n };\r\n } else if (raw.format === 8) {\r\n valueConfig.integer = {\r\n nullable: true,\r\n min: rule?.min ?? Number.MIN_SAFE_INTEGER,\r\n max: rule?.max ?? Number.MAX_SAFE_INTEGER,\r\n };\r\n } else if (raw.format === 9) {\r\n valueConfig.decimal = {\r\n nullable: true,\r\n minDecimal: rule?.minDecimal ?? Number.MIN_SAFE_INTEGER,\r\n maxDecimal: rule?.maxDecimal ?? Number.MAX_SAFE_INTEGER,\r\n precision: rule?.precision ?? Number.MAX_SAFE_INTEGER,\r\n };\r\n } else if (raw.format === 10) {\r\n valueConfig.configEnum = {\r\n nullable: true,\r\n defaultValue: '',\r\n options: rule?.allowedElements || [],\r\n };\r\n }\r\n\r\n return { ...raw, valueConfig };\r\n}\r\n\r\nasync function loadMetaInfoArray(opts: {\r\n sha1: string;\r\n resourceTypeCode: string;\r\n}): Promise<MetaInfoArray | null> {\r\n if (opts.sha1) {\r\n const { error, result } = await pollFilesSha1Info({\r\n sha1: [opts.sha1],\r\n resourceTypeCode: opts.resourceTypeCode,\r\n });\r\n if (error) {\r\n throw cliError(I18N_KEYS.file_property_parse_failed, { code: 4, details: { sha1: opts.sha1 } });\r\n }\r\n const parsed = result.find((item) => item.sha1 === opts.sha1);\r\n if (!parsed || (parsed.metaAnalyzeStatus !== 2 && parsed.metaAnalyzeStatus !== 3)) {\r\n return null;\r\n }\r\n return parsed.metaInfoArray;\r\n }\r\n\r\n const data = assertApiOk(\r\n readEnvelope<{ metaInfoArray: MetaInfoArray }>(\r\n await FServiceAPI.Storage.filesInfo({ resourceTypeCode: opts.resourceTypeCode }),\r\n ),\r\n 'Storage.filesInfo',\r\n );\r\n return data.metaInfoArray || [];\r\n}\r\n\r\n/** 移植 Console handleData_By_Sha1_And_ResourceTypeCode_And_InheritData2(无 UI) */\r\nexport async function handleFilePropertiesBySha1(opts: {\r\n sha1: string;\r\n resourceTypeCode: string;\r\n inheritData: FilePropertyInheritData;\r\n}): Promise<HandleFilePropertiesResult> {\r\n const { sha1, resourceTypeCode, inheritData } = opts;\r\n const metaInfoArray = await loadMetaInfoArray({ sha1, resourceTypeCode });\r\n\r\n if (metaInfoArray === null) {\r\n return {\r\n sha1,\r\n resourceTypeCode,\r\n state: 'failed',\r\n failedMsg: '文件元信息解析未完成或失败',\r\n systemProperties: [],\r\n customProperties: [],\r\n customConfigurations: [],\r\n };\r\n }\r\n\r\n const additionalKeys = metaInfoArray\r\n .filter((item) => item.insertMode === 2)\r\n .map((item) => item.key);\r\n const attrInfos = await getAttrsInfoByKeys(additionalKeys);\r\n\r\n const systemProperties: SystemProperty[] = metaInfoArray\r\n .map((item) => {\r\n if (item.insertMode === 1) {\r\n return {\r\n key: item.key,\r\n name: item.name,\r\n value: item.valueDisplay,\r\n description: item.remark,\r\n type: 'raw' as const,\r\n valueConfig: {},\r\n };\r\n }\r\n\r\n const attrInfo = attrInfos.find((info) => info.key === item.key);\r\n return {\r\n key: item.key,\r\n name: item.name,\r\n value:\r\n inheritData.additionalProperties.find((ap) => ap.key === item.key)?.value ||\r\n inheritData.customProperties.find((cp) => cp.key === item.key)?.value ||\r\n '',\r\n description: item.remark,\r\n type: 'additional' as const,\r\n valueConfig: attrInfo?.valueConfig,\r\n };\r\n })\r\n .filter((item) => !(item.type === 'raw' && item.value === ''));\r\n\r\n const systemKeys = systemProperties.map((item) => item.key);\r\n const systemNames = systemProperties.map((item) => item.name);\r\n\r\n const customProperties = inheritData.customProperties.filter(\r\n (cp) => !systemKeys.includes(cp.key) && !systemNames.includes(cp.name),\r\n );\r\n const customPropertyKeys = customProperties.map((item) => item.key);\r\n const customPropertyNames = customProperties.map((item) => item.name);\r\n\r\n const customConfigurations = inheritData.customConfigurations.filter(\r\n (cc) =>\r\n !systemKeys.includes(cc.key) &&\r\n !systemNames.includes(cc.name) &&\r\n !customPropertyKeys.includes(cc.key) &&\r\n !customPropertyNames.includes(cc.name),\r\n );\r\n\r\n return {\r\n sha1,\r\n resourceTypeCode,\r\n state: 'success',\r\n failedMsg: '',\r\n systemProperties,\r\n customProperties,\r\n customConfigurations,\r\n };\r\n}\r\n\r\n/** publish / import-dir 共用:上传后解析并产出 createVersion 属性字段 */\r\nexport async function resolveCreateVersionPropertiesFromFile(opts: {\r\n sha1: string;\r\n resourceTypeCode: string;\r\n inheritData: FilePropertyInheritData;\r\n}): Promise<CreateVersionProperties> {\r\n const handleResult = await handleFilePropertiesBySha1(opts);\r\n if (handleResult.state !== 'success') {\r\n if (handleResult.failedMsg) {\r\n throw new CliError(handleResult.failedMsg, {\r\n code: 4,\r\n details: { sha1: opts.sha1, resourceTypeCode: opts.resourceTypeCode },\r\n hint: '确认文件已上传且资源类型支持本地文件;补充属性可写入 manifest inputAttrs / customPropertyDescriptors',\r\n });\r\n }\r\n throw cliError(I18N_KEYS.file_property_parse_failed, {\r\n code: 4,\r\n details: { sha1: opts.sha1, resourceTypeCode: opts.resourceTypeCode },\r\n hint: '确认文件已上传且资源类型支持本地文件;补充属性可写入 manifest inputAttrs / customPropertyDescriptors',\r\n });\r\n }\r\n return createVersionPropertiesFromHandleData(handleResult);\r\n}\r\n\r\n/** 合集壳 / 无文件场景:Storage.filesInfo 类型属性模板(≅ collection Step1 handleData sha1:'') */\r\nexport async function resolveCollectionPropertiesFromType(opts: {\r\n resourceTypeCode: string;\r\n inheritData: FilePropertyInheritData;\r\n}): Promise<CreateVersionProperties> {\r\n const handleResult = await handleFilePropertiesBySha1({\r\n sha1: '',\r\n resourceTypeCode: opts.resourceTypeCode,\r\n inheritData: opts.inheritData,\r\n });\r\n if (handleResult.state !== 'success') {\r\n if (handleResult.failedMsg) {\r\n throw new CliError(handleResult.failedMsg, {\r\n code: 4,\r\n details: { resourceTypeCode: opts.resourceTypeCode },\r\n });\r\n }\r\n throw cliError(I18N_KEYS.collection_type_template_load_failed, {\r\n code: 4,\r\n details: { resourceTypeCode: opts.resourceTypeCode },\r\n });\r\n }\r\n return createVersionPropertiesFromHandleData(handleResult);\r\n}\r\n","import { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\nconst INVALID_RESOURCE_NAME_CHARS =\r\n /(\\\\|\\/|:|\\*|\\?|\"|<|>|\\||\\s|@|\\$|#|([\\p{Emoji_Presentation}\\u200D]+(?:\\p{Emoji}\\uFE0F)?|(?:\\p{Emoji}\\uFE0F)))+/gu;\r\n\r\n/** Match Console Step1's resourceNameOptimized() before Resource.create. */\r\nexport function normalizeCreateName(value: string): string {\r\n const raw = value.trim();\r\n if (raw.includes('/')) {\r\n throw cliError(I18N_KEYS.cli_auth_id_create_hint, {\r\n code: 4,\r\n hint: '例如传 --name my-theme;平台会按当前登录账号创建 username/my-theme',\r\n });\r\n }\r\n\r\n const name = raw.replace(INVALID_RESOURCE_NAME_CHARS, '_');\r\n if (!name) {\r\n throw cliError(I18N_KEYS.cli_auth_id_empty, { code: 4 });\r\n }\r\n if (name.length > 60) {\r\n throw cliError(I18N_KEYS.cli_auth_name_exceeds_60, { code: 4 });\r\n }\r\n return name;\r\n}\r\n\r\n/** Non-throw wrapper: Console allows input then normalizes via resourceNameOptimized. */\r\nexport function validateCreateNameInput(raw: string): { error?: string; normalized: string } {\r\n try {\r\n const normalized = normalizeCreateName(raw);\r\n return { normalized };\r\n } catch (error) {\r\n return {\r\n error: error instanceof Error ? error.message : String(error),\r\n normalized: '',\r\n };\r\n }\r\n}\r\n\r\nexport function requireAuthUsername(username?: string): string {\r\n const value = username?.trim();\r\n if (!value) {\r\n throw cliError(I18N_KEYS.auth_missing_username_for_create, {\r\n code: 2,\r\n hint: 'freelog-cli login 重新登录后重试',\r\n });\r\n }\r\n return value;\r\n}\r\n\r\nexport function toFullResourceName(username: string, name: string): string {\r\n return `${username}/${name}`;\r\n}\r\n\r\n/** 平台标准 RT* 类型 create 时勿传 manifest 展示名,否则叶子节点会被拒。 */\r\nexport function resolveCreateApiResourceTypeName(\r\n typeCode: string,\r\n opts?: { explicit?: string; manifest?: string },\r\n): string | undefined {\r\n if (opts?.explicit !== undefined && opts.explicit !== '') {\r\n return opts.explicit;\r\n }\r\n if (/^RT\\d/.test(typeCode.trim())) {\r\n return undefined;\r\n }\r\n return opts?.manifest;\r\n}\r\n","import fs from 'node:fs';\r\nimport YAML from 'yaml';\r\nimport path from 'node:path';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport {\r\n savePlatformCollectionState,\r\n savePlatformResourceState,\r\n type AuthExcludedItem,\r\n type CollectionProject,\r\n type CustomPropertyDescriptor,\r\n} from '../../config/project.js';\r\nimport { FServiceAPI, unwrapData } from '../../platform/index.js';\r\nimport { fetchResourceInfo } from '../shared/platform/index.js';\r\nimport { loadResourceProject } from '../../config/project.js';\r\nimport { evaluateOnlineGates } from '../onlineGates.js';\r\nimport { assertExplicitEnvForWriteOperation } from '../../core/command.js';\r\nimport { assessCollectionItemBaseUpcastAuthorization } from '../authorizationTree.js';\r\nimport { buildConsoleHandoff } from '../../core/consoleUrl.js';\r\nimport { getCliEnv } from '../../core/env.js';\r\nimport {\r\n inheritDataFromVersionConfig,\r\n resolveCollectionPropertiesFromType,\r\n} from '../fileProperty/index.js';\r\nimport { normalizeCreateName } from '../resourceName.js';\r\nimport type { UpdateCollectionCustomProperty } from './types.js';\r\n\r\nconst COLLECTION_CUSTOM_PROPERTY_TYPES = new Set([\r\n 'editableText',\r\n 'readonlyText',\r\n 'radio',\r\n 'checkbox',\r\n 'select',\r\n]);\r\n\r\nexport function parseAuthExcludedItemsFile(filePath: string, cwd?: string): AuthExcludedItem[] {\r\n const absolute = path.resolve(resolveCwd(cwd), filePath);\r\n if (!fs.existsSync(absolute)) {\r\n throw cliError(I18N_KEYS.auth_excluded_file_not_found, { code: 4 });\r\n }\r\n const rawText = fs.readFileSync(absolute, 'utf8');\r\n const ext = path.extname(absolute).toLowerCase();\r\n let raw: unknown;\r\n try {\r\n raw = ext === '.json' ? JSON.parse(rawText) : YAML.parse(rawText);\r\n } catch (error) {\r\n throw cliError(I18N_KEYS.auth_excluded_parse_failed, {\r\n code: 4,\r\n details: { cause: error instanceof Error ? error.message : String(error) },\r\n });\r\n }\r\n if (!Array.isArray(raw)) {\r\n throw cliError(I18N_KEYS.auth_excluded_must_be_array, { code: 4 });\r\n }\r\n return raw.map((row) => {\r\n if (!row || typeof row !== 'object' || Array.isArray(row)) {\r\n throw cliError(I18N_KEYS.auth_excluded_item_must_be_object, { code: 4 });\r\n }\r\n const item = row as Record<string, unknown>;\r\n const resourceId = String(item.resourceId || '').trim();\r\n const excludedType = item.excludedType;\r\n const excludedValue = String(item.excludedValue || '').trim();\r\n if (!resourceId || !excludedValue) {\r\n throw cliError(I18N_KEYS.auth_excluded_item_missing_fields, { code: 4 });\r\n }\r\n if (excludedType !== 'contractId' && excludedType !== 'policyId') {\r\n throw cliError(I18N_KEYS.auth_excluded_invalid_excluded_type, {\r\n code: 4,\r\n });\r\n }\r\n return { resourceId, excludedType, excludedValue };\r\n });\r\n}\r\n\r\nexport async function hydrateCollectionTypeProperties(\r\n collection: CollectionProject,\r\n): Promise<CollectionProject> {\r\n if (!collection.resourceTypeCode) return collection;\r\n const resolved = await resolveCollectionPropertiesFromType({\r\n resourceTypeCode: collection.resourceTypeCode,\r\n inheritData: inheritDataFromVersionConfig(collection),\r\n });\r\n return {\r\n ...collection,\r\n inputAttrs: resolved.inputAttrs,\r\n customPropertyDescriptors: resolved.customPropertyDescriptors,\r\n };\r\n}\r\n\r\nexport function normalizeCollectionCustomPropertyDescriptors(\r\n descriptors: CustomPropertyDescriptor[] | undefined,\r\n): UpdateCollectionCustomProperty[] | undefined {\r\n if (!descriptors?.length) return undefined;\r\n\r\n return descriptors\r\n .filter((desc) => desc?.key)\r\n .map((desc) => {\r\n if (!COLLECTION_CUSTOM_PROPERTY_TYPES.has(desc.type)) {\r\n throw cliError(I18N_KEYS.custom_property_type_invalid, {\r\n code: 4,\r\n hint: '支持的类型:editableText / readonlyText / radio / checkbox / select',\r\n details: { key: desc.key, type: desc.type },\r\n });\r\n }\r\n return {\r\n key: desc.key,\r\n name: desc.name || desc.key,\r\n defaultValue: String(desc.defaultValue ?? ''),\r\n type: desc.type as UpdateCollectionCustomProperty['type'],\r\n candidateItems: desc.candidateItems?.map(String),\r\n remark: desc.remark,\r\n };\r\n });\r\n}\r\n\r\nexport function resolveCollectionCreateName(opts: {\r\n explicitName?: string;\r\n localName?: string;\r\n title: string;\r\n}): string {\r\n return normalizeCreateName(opts.explicitName || opts.localName || opts.title);\r\n}\r\n\r\nexport function looksLikePath(target: string): boolean {\r\n if (!target) return false;\r\n if (target.includes('/') || target.includes('\\\\')) return true;\r\n if (target.startsWith('.')) return true;\r\n try {\r\n return fs.existsSync(path.resolve(target)) && fs.statSync(path.resolve(target)).isDirectory();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport async function fetchDraftItems(resourceId: string) {\r\n const all: Array<{ itemId?: string; itemTitle?: string; resourceId?: string }> = [];\r\n const limit = 500;\r\n for (let skip = 0; ; skip += limit) {\r\n const envelope = await FServiceAPI.Resource.getCollectionItems_Draft({\r\n resourceId,\r\n skip,\r\n limit,\r\n } as Parameters<typeof FServiceAPI.Resource.getCollectionItems_Draft>[0]);\r\n const data = unwrapData<{\r\n dataList?: Array<{ itemId?: string; itemTitle?: string; resourceId?: string }>;\r\n }>(envelope);\r\n const rows = Array.isArray(data?.dataList)\r\n ? data.dataList\r\n : Array.isArray(data)\r\n ? (data as never[])\r\n : [];\r\n all.push(...rows);\r\n if (rows.length < limit) return all;\r\n }\r\n}\r\n\r\nexport async function refreshCollectionDraftState(collection: CollectionProject, cwd?: string) {\r\n const catalogueDraft = await fetchDraftItems(collection.resourceId!);\r\n savePlatformCollectionState(collection, cwd, {\r\n catalogueDraft,\r\n catalogueProperty: collection.display,\r\n });\r\n return catalogueDraft;\r\n}\r\n\r\nexport async function assertChildCollectionReady(\n resourceId: string,\n childCwd?: string,\n options: { requireOnline?: boolean } = {},\n): Promise<void> {\n const info = await fetchResourceInfo(resourceId);\n const gates = evaluateOnlineGates(info);\n const isOnline = Number(info.status) === 1;\n if (!gates.ok || (options.requireOnline !== false && !isOnline)) {\n throw cliError(I18N_KEYS.collection_item_not_ready, {\r\n code: 4,\r\n details: {\r\n resourceId,\r\n childCwd,\r\n gates: {\r\n hasLatestVersion: gates.hasLatestVersion,\n enabledPolicyCount: gates.enabledPolicyCount,\n isOnline,\n status: info.status,\n },\r\n },\r\n hint: '请依次完成 publish、policy apply 和 online,再加入合集',\r\n });\r\n }\r\n}\r\n\r\n/** 对齐 Console FAddResourcesHandleAuth:子资源 baseUpcast 须在合集 licensee 下已有生效合同。 */\r\nexport async function assertCollectionItemBaseUpcastReady(\r\n collectionId: string,\r\n childResourceIds: string[],\r\n): Promise<void> {\r\n const assessment = await assessCollectionItemBaseUpcastAuthorization({\r\n collectionId,\r\n childResourceIds,\r\n });\r\n if (assessment.resolved) return;\r\n\r\n const authHandoff = buildConsoleHandoff({\r\n id: collectionId,\r\n kind: 'collection',\r\n reason: 'COLLECTION_ITEM_BASE_UPCAST_UNAUTHORIZED',\r\n nextCommand: `freelog-cli dep auth --policy-map ./auth-map.yaml --yes --env ${getCliEnv()}`,\r\n });\r\n throw cliError(I18N_KEYS.collection_item_base_upcast_unauthorized, {\r\n code: 5,\r\n details: {\r\n error: 'COLLECTION_ITEM_BASE_UPCAST_UNAUTHORIZED',\r\n unresolvedItems: assessment.unresolvedItems,\r\n ...authHandoff,\r\n },\r\n hint: '请在 Console 合集目录页完成上抛资源签约,或使用 dep auth 后重试',\r\n });\r\n}\r\n\r\nexport async function onlineImportedChild(childCwd: string): Promise<void> {\r\n assertExplicitEnvForWriteOperation();\r\n const { data: child } = loadResourceProject(childCwd);\r\n if (!child.resourceId) {\r\n throw cliError(I18N_KEYS.child_missing_resource_id, { code: 4, details: { childCwd } });\r\n }\r\n await assertChildCollectionReady(child.resourceId, childCwd, { requireOnline: false });\n const info = await fetchResourceInfo(child.resourceId);\r\n if (Number(info.status) !== 1) {\r\n await FServiceAPI.Resource.update({\r\n resourceId: child.resourceId,\r\n status: 1,\r\n } as Parameters<typeof FServiceAPI.Resource.update>[0]);\r\n }\r\n savePlatformResourceState(\n { ...child, ...info, status: 1 },\n childCwd,\n 'resource',\n { remoteWriteConfirmed: true },\n );\n}\r\n\r\nexport function mapDisplayFlags(flags: {\r\n sort?: string;\r\n title?: string;\r\n no?: string;\r\n image?: string;\r\n descr?: string;\r\n view?: string;\r\n}): Record<string, string> {\r\n const display: Record<string, string> = {};\r\n if (flags.sort) {\r\n const v = flags.sort === 'desc' || flags.sort === 'descending' ? 'descending' : 'ascending';\r\n display.collection_sort_list = v;\r\n }\r\n if (flags.title) {\r\n const map: Record<string, string> = {\r\n rtitle: 'rtitle',\r\n sn: 'sn',\r\n empty: 'empty',\r\n custom: 'custom',\r\n };\r\n display.collection_item_title = map[flags.title] || flags.title;\r\n }\r\n if (flags.no) {\r\n display.collection_item_no_display =\r\n flags.no === 'hide'\r\n ? 'collection_item_no_display_hide'\r\n : 'collection_item_no_display_show';\r\n }\r\n if (flags.image) {\r\n display.collection_item_image_display =\r\n flags.image === 'hide'\r\n ? 'collection_item_image_display_hide'\r\n : 'collection_item_image_display_show';\r\n }\r\n if (flags.descr) {\r\n display.collection_item_descr_display =\r\n flags.descr === 'hide'\r\n ? 'collection_item_descr_display_hide'\r\n : 'collection_item_descr_display_show';\r\n }\r\n if (flags.view) {\r\n display.collection_view =\r\n flags.view === 'card' ? 'collection_view_card' : 'collection_view_list';\r\n }\r\n return display;\r\n}\r\n","import type { CollectionProject } from '../../config/project.js';\r\nimport { normalizeCollectionCustomPropertyDescriptors } from './internal.js';\r\nimport type { UpdateCollectionParams } from './types.js';\r\n\r\nexport function buildCollectionSyncPropertiesParams(opts: {\r\n resourceId: string;\r\n collection: CollectionProject;\r\n}): UpdateCollectionParams {\r\n const { resourceId, collection } = opts;\r\n return {\r\n resourceId,\r\n authExcludedItems: (collection.authExcludedItems || []).map((item) => ({\r\n resourceId: item.resourceId,\r\n excludedType: item.excludedType,\r\n excludedValue: item.excludedValue,\r\n })),\r\n customPropertyDescriptors:\r\n normalizeCollectionCustomPropertyDescriptors(collection.customPropertyDescriptors) ?? [],\r\n };\r\n}\r\n\r\nexport function buildCollectionPublishParams(opts: {\r\n resourceId: string;\r\n collection: CollectionProject;\r\n mergeCatalogueDraft: 0 | 1;\r\n}): UpdateCollectionParams {\r\n const { resourceId, collection, mergeCatalogueDraft } = opts;\r\n\r\n return {\r\n resourceId,\r\n description: collection.description || '',\r\n catalogueProperty: collection.display as UpdateCollectionParams['catalogueProperty'],\r\n isMergeCatalogueDraft: mergeCatalogueDraft,\r\n inputAttrs: collection.inputAttrs?.map((attr) => ({\r\n key: attr.key,\r\n value: String(attr.value ?? ''),\r\n })),\r\n customPropertyDescriptors: normalizeCollectionCustomPropertyDescriptors(\r\n collection.customPropertyDescriptors,\r\n ),\r\n dependencies: collection.dependencies?.map((dep) => ({\r\n resourceId: dep.resourceId,\r\n versionRange: dep.versionRange || '',\r\n })),\r\n baseUpcastResources: collection.baseUpcastResources?.map((resource) => ({\r\n resourceId: resource.resourceId,\r\n })),\r\n authExcludedItems: (collection.authExcludedItems || []).map((item) => ({\r\n resourceId: item.resourceId,\r\n excludedType: item.excludedType,\r\n excludedValue: item.excludedValue,\r\n })),\r\n };\r\n}\r\n","import { createHash } from 'node:crypto';\r\n\r\nexport type CatalogueDraftRow = {\r\n itemId?: string;\r\n itemTitle?: string;\r\n sortId?: number;\r\n resourceId?: string;\r\n mountResourceInfo?: { resourceId?: string };\r\n};\r\n\r\nfunction stableStringify(value: unknown): string {\r\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\r\n if (Array.isArray(value)) {\r\n return `[${value.map((item) => stableStringify(item)).join(',')}]`;\r\n }\r\n const obj = value as Record<string, unknown>;\r\n const keys = Object.keys(obj).sort();\r\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(',')}}`;\r\n}\r\n\r\nfunction trimStr(v: unknown): string {\r\n return v === undefined || v === null ? '' : String(v).trim();\r\n}\r\n\r\n/** 目录草稿指纹(≅ Console collectionItemsChanged 判据:itemId/标题/排序/挂载资源) */\r\nexport function normalizeCatalogueDraftRows(items: unknown[]): CatalogueDraftRow[] {\r\n return items\r\n .map((row) => {\r\n if (!row || typeof row !== 'object') return null;\r\n const item = row as CatalogueDraftRow;\r\n const itemId = trimStr(item.itemId);\r\n if (!itemId) return null;\r\n const mountResourceId = trimStr(item.mountResourceInfo?.resourceId || item.resourceId);\r\n return {\r\n itemId,\r\n itemTitle: trimStr(item.itemTitle),\r\n sortId: Number.isFinite(Number(item.sortId)) ? Number(item.sortId) : 0,\r\n resourceId: mountResourceId,\r\n };\r\n })\r\n .filter((row): row is NonNullable<typeof row> => Boolean(row))\r\n .sort((a, b) => {\r\n const bySort = a.sortId - b.sortId;\r\n if (bySort !== 0) return bySort;\r\n return a.itemId.localeCompare(b.itemId);\r\n });\r\n}\r\n\r\nexport function fingerprintCatalogueDraft(items: unknown[]): string {\r\n const canonical = normalizeCatalogueDraftRows(items);\r\n return createHash('sha256').update(stableStringify(canonical)).digest('hex');\r\n}\r\n\r\n/**\r\n * Console: isMergeCatalogueDraft = collectionItemsChanged ? 1 : 0\r\n * CLI:对比上次发版后的目录指纹与当前草稿指纹。\r\n */\r\nexport function resolveMergeCatalogueDraft(opts: {\r\n currentItems: unknown[];\r\n publishedFingerprint?: string | null;\r\n}): 0 | 1 {\r\n const currentFingerprint = fingerprintCatalogueDraft(opts.currentItems);\r\n const published = trimStr(opts.publishedFingerprint);\r\n if (!published) {\r\n return normalizeCatalogueDraftRows(opts.currentItems).length > 0 ? 1 : 0;\r\n }\r\n return currentFingerprint === published ? 0 : 1;\r\n}\r\n","import { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { listingFingerprint, loadState } from '../../config/project.js';\r\nimport type { ResourceProject } from '../../config/project.js';\r\nimport type { PlatformResourceInfo } from './platform/types.js';\r\n\r\ntype ListingProject = Pick<\r\n ResourceProject,\r\n | 'resourceId'\r\n | 'resourceName'\r\n | 'resourceType'\r\n | 'resourceTypeCode'\r\n | 'resourceTitle'\r\n | 'intro'\r\n | 'coverImages'\r\n | 'tags'\r\n | 'userId'\r\n | 'username'\r\n | 'status'\r\n | 'latestVersion'\r\n | 'policies'\n>;\n\r\n/** 采用平台 listing 展示字段(pull --apply-listing) */\r\nexport function applyOwnerListing<T extends ListingProject>(local: T, info: PlatformResourceInfo): T {\r\n return {\r\n ...local,\r\n resourceId: info.resourceId || local.resourceId,\r\n resourceName: info.resourceName || local.resourceName,\r\n resourceType: info.resourceType || local.resourceType,\r\n resourceTypeCode: info.resourceTypeCode || local.resourceTypeCode,\r\n resourceTitle: info.resourceTitle || local.resourceTitle,\r\n intro: info.intro ?? local.intro,\r\n coverImages: info.coverImages ?? local.coverImages,\r\n tags: info.tags ?? local.tags,\r\n userId: info.userId,\r\n username: info.username,\r\n };\r\n}\r\n\r\n/** 同步平台事实字段(status / latestVersion / policies),不覆盖 listing 展示字段 */\r\nexport function applyPlatformFacts<T extends ListingProject>(local: T, info: PlatformResourceInfo): T {\r\n return {\r\n ...local,\r\n resourceId: info.resourceId || local.resourceId,\r\n resourceName: info.resourceName || local.resourceName,\r\n resourceType: info.resourceType || local.resourceType,\r\n resourceTypeCode: info.resourceTypeCode || local.resourceTypeCode,\r\n userId: info.userId,\r\n username: info.username,\r\n status: info.status,\r\n latestVersion: info.latestVersion,\r\n policies: info.policies || local.policies,\n };\n}\n\r\nexport const applyOwnerToResource = applyOwnerListing;\r\nexport const applyOwnerToCollection = applyOwnerListing;\r\nexport const applyPlatformFactsToResource = applyPlatformFacts;\r\nexport const applyPlatformFactsToCollection = applyPlatformFacts;\r\n\r\nexport function listingDrifted(local: ListingProject, info: PlatformResourceInfo): boolean {\r\n const norm = (v: unknown) => JSON.stringify(v ?? null);\r\n return (\r\n (local.resourceTitle !== undefined &&\r\n info.resourceTitle !== undefined &&\r\n local.resourceTitle !== info.resourceTitle) ||\r\n (local.intro !== undefined && info.intro !== undefined && local.intro !== info.intro) ||\r\n (local.tags !== undefined && info.tags !== undefined && norm(local.tags) !== norm(info.tags)) ||\r\n (local.coverImages !== undefined &&\r\n info.coverImages !== undefined &&\r\n norm(local.coverImages) !== norm(info.coverImages))\r\n );\r\n}\r\n\r\nexport function assertApplyListingAllowed(opts: {\r\n local: ListingProject;\r\n info: PlatformResourceInfo;\r\n cwd?: string;\r\n force?: boolean;\r\n collection?: boolean;\r\n}): void {\r\n if (opts.force) return;\r\n const subject = opts.collection ? 'collection' : 'resource';\r\n const state = loadState(opts.cwd, subject).data;\r\n const baseline = state.sync.listingFingerprint;\r\n const localChangedSinceBaseline = baseline\r\n ? listingFingerprint(opts.local) !== baseline\r\n : listingDrifted(opts.local, opts.info);\r\n const platformChangedSinceBaseline = baseline\r\n ? listingFingerprint(opts.info) !== baseline\r\n : listingDrifted(opts.local, opts.info);\r\n if (localChangedSinceBaseline && platformChangedSinceBaseline) {\r\n throw cliError(I18N_KEYS.listing_and_local_both_changed, {\r\n code: 3,\r\n hint: opts.collection\r\n ? '先手动合并,或确认采用平台 listing 后重试:freelog-cli pull --collection --apply-listing --force'\r\n : '先手动合并,或确认采用平台 listing 后重试:freelog-cli pull --apply-listing --force',\r\n });\r\n }\r\n}\r\n","import { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\n\r\n/** Owner 比较:平台 userId 与当前登录 userId 用 Number 对齐 */\r\nexport function ownersMatch(\r\n authUserId: number | string | undefined,\r\n platformUserId: number | string | undefined,\r\n): boolean {\r\n const a = Number(authUserId);\r\n const b = Number(platformUserId);\r\n return Number.isFinite(a) && Number.isFinite(b) && a === b;\r\n}\r\n\r\nexport function assertOwnerMatch(opts: {\r\n authUserId: number | string | undefined;\r\n authUsername?: string;\r\n platformUserId?: number | string;\r\n platformUsername?: string;\r\n hint?: string;\r\n requireNumericIds?: boolean;\r\n}): void {\r\n const platformUserId = Number(opts.platformUserId);\r\n const authUserId = Number(opts.authUserId);\r\n if (opts.requireNumericIds !== false) {\r\n if (!Number.isFinite(platformUserId) || !Number.isFinite(authUserId)) {\r\n throw cliError(I18N_KEYS.owner_compare_missing_user_id, { code: 2, hint: '重新 login' });\r\n }\r\n }\r\n if (!ownersMatch(opts.authUserId, opts.platformUserId)) {\r\n throw cliError(I18N_KEYS.resource_owner_mismatch, {\r\n code: 2,\r\n params: {\r\n owner: String(opts.platformUsername || opts.platformUserId),\r\n current: String(opts.authUsername || opts.authUserId),\r\n },\r\n hint: opts.hint ?? '切换账号或更换目录',\r\n });\r\n }\r\n}\r\n","import { consola } from 'consola';\r\nimport { requireAuth } from '../../core/auth.js';\r\nimport {\r\n loadCollectionProject,\r\n saveCollectionProject,\r\n savePlatformCollectionState,\r\n} from '../../config/project.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { FServiceAPI, unwrapData } from '../../platform/index.js';\r\nimport { fingerprintCatalogueDraft } from '../catalogueDraftTracking.js';\r\nimport {\r\n assertApplyListingAllowed,\r\n applyOwnerToCollection,\r\n applyPlatformFactsToCollection,\r\n listingDrifted,\r\n} from '../shared/listing.js';\r\nimport { assertOwnerMatch, ownersMatch } from '../shared/owner.js';\r\nimport { fetchResourceInfo } from '../shared/platform/index.js';\r\nimport { fetchDraftItems } from './internal.js';\r\nimport type { EnsureCollectionOwnerResult } from './types.js';\r\n\r\nexport async function ensureCollectionOwner(opts: {\n cwd?: string;\n allowCreateWithoutId?: boolean;\n readOnly?: boolean;\n}): Promise<EnsureCollectionOwnerResult> {\n const auth = requireAuth();\r\n const { data: collection } = loadCollectionProject(opts.cwd);\r\n const resourceId = collection.resourceId?.trim();\r\n\r\n if (!resourceId) {\r\n if (opts.allowCreateWithoutId) {\r\n return { auth, collection, info: { resourceId: '' } };\r\n }\r\n throw cliError(I18N_KEYS.no_collection_resource_id, {\r\n code: 4,\r\n });\r\n }\r\n\r\n const info = await fetchResourceInfo(resourceId);\r\n assertOwnerMatch({\r\n authUserId: auth.userId,\r\n authUsername: auth.username,\r\n platformUserId: info.userId,\r\n platformUsername: info.username,\r\n hint: '请切换到该合集的拥有者账号',\n });\r\n\r\n const next = {\n ...applyPlatformFactsToCollection(collection, info),\n rssFeedUrl: info.feedUrl || collection.rssFeedUrl,\n };\n if (info.username && collection.username && info.username !== collection.username) {\r\n consola.warn(`检测到 username 已变化:${collection.username} → ${info.username}`);\n }\r\n if (!opts.readOnly) {\n savePlatformCollectionState(next, opts.cwd, {\n rss: info.feedUrl ? { feedUrl: info.feedUrl } : undefined,\n });\n }\n return { auth, collection: next, info };\r\n}\r\n\r\nexport async function pullCollection(opts: {\r\n cwd?: string;\r\n applyListing?: boolean;\r\n force?: boolean;\r\n}) {\r\n const auth = requireAuth();\r\n const { data: collection } = loadCollectionProject(opts.cwd);\r\n const id = collection.resourceId?.trim() || collection.resourceName;\r\n if (!id) {\r\n throw cliError(I18N_KEYS.collection_pull_missing_id, { code: 4 });\r\n }\r\n const info = await fetchResourceInfo(id);\r\n if (\r\n Number.isFinite(Number(auth.userId)) &&\r\n Number.isFinite(Number(info.userId)) &&\r\n !ownersMatch(auth.userId, info.userId)\r\n ) {\r\n throw cliError(I18N_KEYS.collection_pull_owner_denied, { code: 2 });\r\n }\r\n\r\n const catalogueItems = await fetchDraftItems(info.resourceId);\r\n\r\n const rulesEnv = await FServiceAPI.Resource.getCollectionCollectRules({\n resourceId: info.resourceId,\n } as Parameters<typeof FServiceAPI.Resource.getCollectionCollectRules>[0]);\n const collectRules = unwrapData(rulesEnv);\n\r\n const withDraft = { ...collection, catalogueItems, collectRules };\r\n const next = opts.applyListing\r\n ? applyOwnerToCollection(withDraft, info)\r\n : applyPlatformFactsToCollection(withDraft, info);\r\n if (opts.applyListing) {\r\n assertApplyListingAllowed({\r\n local: collection,\r\n info,\r\n cwd: opts.cwd,\r\n force: opts.force,\r\n collection: true,\r\n });\r\n saveCollectionProject(next, opts.cwd);\r\n } else {\r\n savePlatformCollectionState(next, opts.cwd, {\r\n catalogueDraft: catalogueItems,\r\n catalogueProperty: next.display,\r\n cataloguePublishedFingerprint: fingerprintCatalogueDraft(catalogueItems),\r\n collectRules,\r\n });\r\n }\r\n return { collection: next, info, catalogueItems, collectRules };\r\n}\r\n\r\nexport async function ensureCollectionSynced(opts: {\n cwd?: string;\n noAutoPull?: boolean;\n owner?: EnsureCollectionOwnerResult;\n readOnly?: boolean;\n}): Promise<EnsureCollectionOwnerResult> {\n const owner =\n opts.owner || (await ensureCollectionOwner({ cwd: opts.cwd, readOnly: opts.readOnly }));\n if (!owner.info.resourceId) return owner;\r\n\r\n if (listingDrifted(owner.collection, owner.info)) {\n if (opts.readOnly) {\n throw cliError(I18N_KEYS.collection_info_mismatch, {\n code: 3,\n hint: '先执行 freelog-cli pull --collection;dry-run 不会自动回写本地状态',\n });\n }\n if (opts.noAutoPull) {\n throw cliError(I18N_KEYS.collection_info_mismatch, {\r\n code: 3,\r\n hint: 'freelog-cli pull --collection --apply-listing --no-auto-pull',\r\n });\r\n }\r\n const pulled = await pullCollection({ cwd: opts.cwd });\r\n return {\r\n ...owner,\r\n collection: pulled.collection,\r\n info: pulled.info,\r\n };\r\n }\r\n return owner;\r\n}\r\n","import { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport semver from 'semver';\r\n\r\n/** 字段约束 → docs/新方案/开发/CLI字段账本.md;文案与 Console i18n 同源 */\r\nexport const FIELD_LIMITS = {\r\n resourceTitleMax: 100,\r\n collectionItemTitleMax: 100,\r\n introMax: 200,\r\n tagsMaxCount: 20,\r\n tagMaxLength: 20,\r\n policyNameMin: 2,\r\n policyNameMax: 20,\r\n} as const;\r\n\r\nfunction cliErrorMessage(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error);\r\n}\r\n\r\n/** Non-throw wrapper for @clack/prompts validate callbacks. */\r\nexport function validateResourceTitleInput(\r\n value: string | undefined,\r\n required = true,\r\n): string | undefined {\r\n try {\r\n assertResourceTitle(value, required);\r\n return undefined;\r\n } catch (error) {\r\n return cliErrorMessage(error);\r\n }\r\n}\r\n\r\nexport function validateIntroInput(value: string | undefined): string | undefined {\r\n try {\r\n assertIntro(value);\r\n return undefined;\r\n } catch (error) {\r\n return cliErrorMessage(error);\r\n }\r\n}\r\n\r\nexport function validateTagsInput(tags: string[] | undefined): string | undefined {\r\n try {\r\n assertTags(tags);\r\n return undefined;\r\n } catch (error) {\r\n return cliErrorMessage(error);\r\n }\r\n}\r\n\r\nexport function validateTagsCsvInput(raw: string | undefined): string | undefined {\r\n if (raw === undefined || raw.trim() === '') return undefined;\r\n const tags = raw\r\n .split(',')\r\n .map((t) => t.trim())\r\n .filter(Boolean);\r\n return validateTagsInput(tags);\r\n}\r\n\r\nexport function validateCollectionItemTitleInput(\r\n value: string | undefined,\r\n required = false,\r\n): string | undefined {\r\n try {\r\n assertCollectionItemTitle(value, required);\r\n return undefined;\r\n } catch (error) {\r\n return cliErrorMessage(error);\r\n }\r\n}\r\n\r\nexport function validatePolicyNameInput(value: string | undefined): string | undefined {\r\n try {\r\n assertPolicyName(value);\r\n return undefined;\r\n } catch (error) {\r\n return cliErrorMessage(error);\r\n }\r\n}\r\n\r\nexport function assertResourceTitle(title: string | undefined, required = false): void {\r\n if (title === undefined || title === '') {\r\n if (required) {\r\n throw cliError(I18N_KEYS.naming_convention_resource_title_required, { code: 4 });\r\n }\r\n return;\r\n }\r\n const trimmed = title.trim();\r\n if (!trimmed) {\r\n throw cliError(I18N_KEYS.naming_convention_resource_title_required, { code: 4 });\r\n }\r\n if (trimmed.length > FIELD_LIMITS.resourceTitleMax) {\r\n throw cliError(I18N_KEYS.cli_title_exceeds_100_chars, {\r\n code: 4,\r\n details: { length: trimmed.length, max: FIELD_LIMITS.resourceTitleMax },\r\n });\r\n }\r\n}\r\n\r\nexport function assertTags(tags: string[] | undefined): void {\r\n if (!tags) return;\r\n if (tags.length > FIELD_LIMITS.tagsMaxCount) {\r\n throw cliError(I18N_KEYS.tags_count_exceeds_max, {\r\n code: 4,\r\n details: { count: tags.length, max: FIELD_LIMITS.tagsMaxCount },\r\n });\r\n }\r\n for (const tag of tags) {\r\n if (!tag || !tag.trim()) {\r\n throw cliError(I18N_KEYS.tag_empty, { code: 4 });\r\n }\r\n if (tag.length > FIELD_LIMITS.tagMaxLength) {\r\n throw cliError(I18N_KEYS.tag_length_exceeds_max, {\r\n code: 4,\r\n details: { tag, max: FIELD_LIMITS.tagMaxLength },\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function assertIntro(intro: string | undefined): void {\r\n if (intro !== undefined && intro.length > FIELD_LIMITS.introMax) {\r\n throw cliError(I18N_KEYS.intro_max_200, {\r\n code: 4,\r\n details: { length: intro.length, max: FIELD_LIMITS.introMax },\r\n });\r\n }\r\n}\r\n\r\nexport function assertCollectionItemTitle(title: string | undefined, required = false): void {\r\n if (title === undefined || title.trim() === '') {\r\n if (required) throw cliError(I18N_KEYS.missing_title_flag, { code: 4 });\r\n return;\r\n }\r\n if (title.trim().length > FIELD_LIMITS.collectionItemTitleMax) {\r\n throw cliError(I18N_KEYS.collection_item_title_exceeds_100, {\r\n code: 4,\r\n details: { length: title.trim().length, max: FIELD_LIMITS.collectionItemTitleMax },\r\n });\r\n }\r\n}\r\n\r\nexport function assertPolicyName(name: string | undefined): void {\r\n const value = name?.trim() || '';\r\n if (!value) throw cliError(I18N_KEYS.policy_name_required, { code: 4 });\r\n if (value.length < FIELD_LIMITS.policyNameMin || value.length > FIELD_LIMITS.policyNameMax) {\r\n throw cliError(I18N_KEYS.policy_name_length_2_20, {\r\n code: 4,\r\n details: {\r\n length: value.length,\r\n min: FIELD_LIMITS.policyNameMin,\r\n max: FIELD_LIMITS.policyNameMax,\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport function assertSemverLike(version: string): void {\r\n if (!/^\\d+\\.\\d+\\.\\d+([.-][\\w.-]+)?$/.test(version)) {\r\n throw cliError(I18N_KEYS.freelog_versioning, {\r\n code: 4,\r\n params: { version },\r\n hint: '使用 semver,如 1.0.0',\r\n });\r\n }\r\n}\r\n\r\n/** dep add/update:versionRange 须为 semver 可解析范围(含 *、^、>= 等) */\r\nexport function assertValidVersionRange(range: string | undefined): void {\r\n if (!range?.trim()) {\r\n throw cliError(I18N_KEYS.missing_version_range, { code: 4 });\r\n }\r\n const trimmed = range.trim();\r\n if (!semver.validRange(trimmed)) {\r\n throw cliError(I18N_KEYS.invalid_version_range, {\r\n code: 4,\r\n params: { range: trimmed },\r\n hint: '如 *、^1.0.0、>=1.0.0',\r\n });\r\n }\r\n}\r\n","/** 平台 listSimpleByGroup 返回的资源类型节点(树形) */\nexport interface ResourceTypeNode {\n code: string;\n name: string;\n parentCode?: string;\n category?: number;\n children?: ResourceTypeNode[];\n [key: string]: unknown;\n}\n\nfunction nodeCode(row: Record<string, unknown>): string {\n return String(row.code || row.resourceTypeCode || row.typeCode || '').trim();\n}\n\nfunction nodeName(row: Record<string, unknown>): string {\n return String(row.name || row.resourceTypeName || row.title || row.typeName || '').trim();\n}\n\n/** 从 API 响应 flatten 或保留顶层树 */\nexport function parseResourceTypeForest(value: unknown): ResourceTypeNode[] {\n const roots: ResourceTypeNode[] = [];\n\n const toNode = (raw: Record<string, unknown>): ResourceTypeNode | null => {\n const code = nodeCode(raw);\n if (!code) return null;\n const childrenRaw = raw.children ?? raw.childNodes ?? raw.dataList;\n let children: ResourceTypeNode[] | undefined;\n if (Array.isArray(childrenRaw) && childrenRaw.length) {\n children = childrenRaw\n .map((item) => (item && typeof item === 'object' ? toNode(item as Record<string, unknown>) : null))\n .filter((item): item is ResourceTypeNode => Boolean(item));\n if (!children.length) children = undefined;\n }\n return {\n ...raw,\n code,\n name: nodeName(raw) || code,\n parentCode: raw.parentCode ? String(raw.parentCode) : undefined,\n children,\n };\n };\n\n const visit = (node: unknown) => {\n if (!node || typeof node !== 'object') return;\n if (Array.isArray(node)) {\n for (const item of node) visit(item);\n return;\n }\n const record = node as Record<string, unknown>;\n if (nodeCode(record)) {\n const parsed = toNode(record);\n if (parsed) roots.push(parsed);\n return;\n }\n for (const key of ['children', 'childNodes', 'dataList', 'list', 'data']) {\n visit(record[key]);\n }\n };\n\n visit(value);\n return dedupeRoots(roots);\n}\n\nfunction dedupeRoots(nodes: ResourceTypeNode[]): ResourceTypeNode[] {\n const seen = new Set<string>();\n const out: ResourceTypeNode[] = [];\n for (const node of nodes) {\n if (seen.has(node.code)) continue;\n seen.add(node.code);\n out.push(node);\n }\n return out;\n}\n\nexport function flattenResourceTypes(nodes: ResourceTypeNode[]): ResourceTypeNode[] {\n const out: ResourceTypeNode[] = [];\n const walk = (list: ResourceTypeNode[]) => {\n for (const node of list) {\n out.push(node);\n if (node.children?.length) walk(node.children);\n }\n };\n walk(nodes);\n return out;\n}\n\nexport function findTypePath(\n target: ResourceTypeNode,\n roots: ResourceTypeNode[],\n): ResourceTypeNode[] | null {\n const path: ResourceTypeNode[] = [];\n const dfs = (nodes: ResourceTypeNode[]): boolean => {\n for (const node of nodes) {\n path.push(node);\n if (node.code === target.code) return true;\n if (node.children?.length && dfs(node.children)) return true;\n path.pop();\n }\n return false;\n };\n return dfs(roots) ? [...path] : null;\n}\n\nexport function isLeafType(node: ResourceTypeNode): boolean {\n return !node.children?.length;\n}\n\nexport function formatTypePath(path: ResourceTypeNode[]): string {\n return path.map((n) => n.name).join(' > ');\n}\n\n/** manifest.resourceType 数组采用叶子名在前、祖先名在后的稳定顺序。 */\nexport function buildResourceTypeLabels(path: ResourceTypeNode[]): string[] {\n if (!path.length) return [];\n const labels = [path[path.length - 1]!.name];\n for (let i = 0; i < path.length - 1; i++) {\n labels.push(path[i]!.name);\n }\n return labels;\n}\n\nexport function searchResourceTypes(all: ResourceTypeNode[], keyword: string): ResourceTypeNode[] {\n const kw = keyword.trim().toLowerCase();\n if (!kw) return [];\n return flattenResourceTypes(all).filter(\n (node) => node.name.toLowerCase().includes(kw) || node.code.toLowerCase().includes(kw),\n );\n}\n\n/** 按展示名筛选类型候选,不写死环境相关 type code。 */\nexport type ScaffoldPreset = 'theme' | 'widget' | 'package';\n\nexport const SCAFFOLD_RESOURCE_TYPE_NAMES: Record<ScaffoldPreset, string[]> = {\n theme: ['主题'],\n widget: ['插件'],\n package: ['前端库', '软件库'],\n};\n\nexport const SCAFFOLD_RESOURCE_TYPE_CODE_HINTS: Record<ScaffoldPreset, string[]> = {\n theme: ['theme'],\n widget: ['widget'],\n package: ['package', 'library', 'lib', 'software'],\n};\n\nexport const PACKAGE_TEMPLATE_RESOURCE_TYPE_NAMES: Record<string, string[]> = {\n 'package-js': ['JS工具包'],\n 'package-react': ['组件库'],\n 'package-vue': ['组件库'],\n};\n\nfunction codeMatchesHint(code: string, hints: string[]): boolean {\n const c = code.trim().toLowerCase();\n return hints.some((hint) => {\n const h = hint.toLowerCase();\n return c === h || c.includes(h);\n });\n}\n\nfunction narrowCandidates(\n candidates: ResourceTypeNode[],\n hints: string[],\n): ResourceTypeNode[] {\n if (candidates.length <= 1) return candidates;\n\n const leaves = candidates.filter(isLeafType);\n if (leaves.length === 1) return leaves;\n if (leaves.length > 1) candidates = leaves;\n\n if (candidates.length <= 1) return candidates;\n\n const hinted = candidates.filter((node) => codeMatchesHint(node.code, hints));\n if (hinted.length === 1) return hinted;\n if (hinted.length > 1) return hinted;\n\n return candidates;\n}\n\nfunction findCandidatesByName(all: ResourceTypeNode[], name: string): ResourceTypeNode[] {\n return all.filter((node) => node.name === name);\n}\n\nfunction resolvePackageLeafCandidates(\n roots: ResourceTypeNode[],\n templateId?: string,\n): ResourceTypeNode[] {\n const leaves = roots.flatMap((root) => flattenResourceTypes([root])).filter(isLeafType);\n if (!templateId) {\n if (leaves.length > 1) {\n throw new Error(\n `平台类型树中存在多个 package 叶子候选,须通过模板或 --resource-type 明确定稿:${leaves\n .map((node) => `${node.name} (${node.code})`)\n .join(';')}`,\n );\n }\n return leaves;\n }\n\n const preferredNames = PACKAGE_TEMPLATE_RESOURCE_TYPE_NAMES[templateId];\n if (!preferredNames) {\n throw new Error(\n `package 模板 ${templateId} 未声明对应的平台叶子类型,请显式传 --resource-type <code>`,\n );\n }\n\n const matched = leaves.filter((node) => preferredNames.includes(node.name));\n if (!matched.length) {\n throw new Error(\n `平台类型树中未找到 package 模板 ${templateId} 对应的叶子类型「${preferredNames.join('/')}」`,\n );\n }\n return matched;\n}\n\n/** 从平台类型树解析主题/插件/前端库定稿类型(唯一匹配才返回) */\nexport function resolveScaffoldResourceTypeFromForest(\n forest: ResourceTypeNode[],\n preset: ScaffoldPreset,\n opts?: { templateId?: string },\n): { node: ResourceTypeNode; path: ResourceTypeNode[] } {\n const names = SCAFFOLD_RESOURCE_TYPE_NAMES[preset];\n const hints = SCAFFOLD_RESOURCE_TYPE_CODE_HINTS[preset];\n const all = flattenResourceTypes(forest);\n\n // package 入口优先“前端库”,其次“软件库”。\n for (const name of names) {\n let candidates = findCandidatesByName(all, name);\n if (!candidates.length) continue;\n if (preset === 'package') {\n candidates = resolvePackageLeafCandidates(candidates, opts?.templateId);\n }\n candidates = narrowCandidates(candidates, hints);\n if (candidates.length === 1) {\n const node = candidates[0]!;\n const path = findTypePath(node, forest) || [node];\n return { node, path };\n }\n if (candidates.length > 1) {\n const detail = candidates\n .map((node) => {\n const path = findTypePath(node, forest);\n return path ? `${formatTypePath(path)} (${node.code})` : `${node.name} (${node.code})`;\n })\n .join(';');\n throw new Error(`平台类型树中存在多个「${name}」候选,无法自动定稿:${detail}`);\n }\n }\n\n const codeCandidates = all.filter((node) => codeMatchesHint(node.code, hints));\n const narrowed = narrowCandidates(codeCandidates, hints);\n if (narrowed.length === 1) {\n const node = narrowed[0]!;\n const path = findTypePath(node, forest) || [node];\n return { node, path };\n }\n\n const presetLabel = names.join('/');\n if (!codeCandidates.length) {\n throw new Error(\n `平台类型树中未找到「${presetLabel}」对应资源类型,请先 freelog-cli login --env dev 后重试`,\n );\n }\n if (narrowed.length > 1) {\n const detail = narrowed\n .map((node) => {\n const path = findTypePath(node, forest);\n return path ? `${formatTypePath(path)} (${node.code})` : `${node.name} (${node.code})`;\n })\n .join(';');\n throw new Error(\n `平台类型树中存在多个「${presetLabel}」候选,无法自动定稿:${detail}`,\n );\n }\n\n throw new Error(\n `平台类型树中未找到「${presetLabel}」对应资源类型,请先 freelog-cli login --env dev 后重试`,\n );\n}\n\nexport function findTypeInForestByCode(\n forest: ResourceTypeNode[],\n code: string,\n): { node: ResourceTypeNode; path: ResourceTypeNode[] } | null {\n const trimmed = code.trim();\n if (!trimmed) return null;\n const node = flattenResourceTypes(forest).find((item) => item.code === trimmed);\n if (!node) return null;\n const path = findTypePath(node, forest) || [node];\n return { node, path };\n}\n","import { FServiceAPI, unwrapData } from '../platform/index.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport {\r\n findTypeInForestByCode,\r\n isLeafType,\r\n parseResourceTypeForest,\r\n resolveScaffoldResourceTypeFromForest,\r\n type ResourceTypeNode,\r\n type ScaffoldPreset,\r\n} from './resourceTypeTree.js';\r\n\r\nexport async function assertResourceTypeCode(code: string): Promise<unknown> {\r\n if (!code?.trim()) {\r\n throw cliError(I18N_KEYS.missing_resource_type_code, { code: 4 });\r\n }\r\n const envelope = await FServiceAPI.Resource.getResourceTypeInfoByCode({\r\n code: code.trim(),\r\n } as Parameters<typeof FServiceAPI.Resource.getResourceTypeInfoByCode>[0]);\r\n const data = unwrapData<unknown>(envelope);\r\n if (data === null || data === undefined || data === '') {\r\n throw cliError(I18N_KEYS.unknown_resource_type_code, {\r\n code: 4,\r\n hint: 'freelog-cli 使用平台 resourceTypes 返回的 code',\r\n });\r\n }\r\n return data;\r\n}\r\n\r\nfunction collectScaffoldPresetCodes(forest: ResourceTypeNode[]): Set<string> {\r\n const codes = new Set<string>();\r\n for (const preset of ['theme', 'widget', 'package'] as ScaffoldPreset[]) {\r\n try {\r\n const { node } = resolveScaffoldResourceTypeFromForest(forest, preset);\r\n codes.add(node.code);\r\n } catch {\r\n // 当前环境无该定稿类型时跳过\r\n }\r\n }\r\n return codes;\r\n}\r\n\r\n/** create / import 路径:禁止脚本传入非叶子类型(平台主题/插件定稿 code 除外)。 */\nexport async function assertLeafResourceTypeCode(code: string): Promise<unknown> {\r\n const typeInfo = await assertResourceTypeCode(code);\r\n const trimmed = code.trim();\r\n const typeRecord =\r\n typeInfo && typeof typeInfo === 'object' ? (typeInfo as Record<string, unknown>) : null;\r\n if (typeRecord?.category === 2) {\r\n throw cliError(I18N_KEYS.resource_type_custom_parent, {\r\n code: 4,\r\n params: { code: trimmed, name: String(typeRecord.name || trimmed) },\r\n hint: '请选 category=1 的基础叶子类型(如 type search 文章)',\r\n });\r\n }\r\n let forest: ResourceTypeNode[] = [];\r\n try {\r\n const envelope = await listResourceTypes({ status: 1 });\r\n forest = parseResourceTypeForest(envelope);\r\n } catch {\r\n return typeInfo;\r\n }\r\n if (!forest.length) return typeInfo;\r\n\r\n const presetCodes = collectScaffoldPresetCodes(forest);\r\n if (presetCodes.has(trimmed)) return typeInfo;\r\n\r\n const found = findTypeInForestByCode(forest, trimmed);\r\n if (found && !isLeafType(found.node)) {\r\n throw cliError(I18N_KEYS.resource_type_not_leaf, {\r\n code: 4,\r\n params: { code: trimmed, name: found.node.name },\r\n hint: '交互 init / type pick 会选到叶子;脚本请 type info 确认无 children',\r\n });\r\n }\r\n return typeInfo;\r\n}\r\n\r\nexport async function listResourceTypes(opts?: {\r\n codeOrName?: string;\r\n category?: 1 | 2;\r\n isMine?: boolean;\r\n status?: 0 | 1;\r\n supportCreateBatch?: 1 | 2;\r\n subjectType?: 1 | 4 | 5;\r\n}) {\r\n const envelope = await FServiceAPI.Resource.resourceTypes(\r\n (opts || {}) as Parameters<typeof FServiceAPI.Resource.resourceTypes>[0],\r\n );\r\n return unwrapData<unknown>(envelope);\r\n}\r\n","import { resolveCwd } from '../../config/project.js';\r\nimport {\r\n loadCollectionProject,\r\n writeCollectionProject,\r\n type CollectionProject,\r\n} from '../../config/project.js';\r\nimport { requireAuth } from '../../core/auth.js';\nimport { assertExplicitEnvForWriteOperation } from '../../core/command.js';\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { FServiceAPI, unwrapData } from '../../platform/index.js';\r\nimport { assertResourceTitle } from '../validation.js';\r\nimport { assertResourceTypeCode } from '../typeService.js';\r\nimport {\r\n requireAuthUsername,\r\n resolveCreateApiResourceTypeName,\r\n toFullResourceName,\r\n} from '../resourceName.js';\r\nimport { hydrateCollectionTypeProperties, resolveCollectionCreateName } from './internal.js';\r\n\r\nexport async function createCollection(opts: {\n title?: string;\r\n typeCode?: string;\r\n resourceTypeName?: string;\r\n name?: string;\r\n cwd?: string;\r\n}) {\n assertExplicitEnvForWriteOperation();\n const auth = requireAuth();\n const username = requireAuthUsername(auth.username);\r\n\r\n const cwd = resolveCwd(opts.cwd);\r\n let local: CollectionProject = {\r\n resourceName: '',\r\n resourceType: [],\r\n };\r\n try {\r\n local = loadCollectionProject(cwd).data;\r\n } catch {\r\n // 无本地合集配置时写新壳\r\n }\r\n if (local.resourceId?.trim()) {\r\n throw cliError(I18N_KEYS.collection_already_exists, { code: 4 });\r\n }\r\n\r\n const title = (opts.title || local.resourceTitle || local.resourceName || '').trim();\r\n const typeCode = (opts.typeCode || local.resourceTypeCode || '').trim();\r\n const resourceTypeName = resolveCreateApiResourceTypeName(typeCode, {\r\n explicit: opts.resourceTypeName,\r\n manifest: local.resourceTypeName,\r\n });\r\n if (!title) {\r\n throw cliError(I18N_KEYS.collection_title_required, {\r\n code: 4,\r\n hint: '传 --title,或在 freelog.manifest.json 写 resource.title',\r\n });\r\n }\r\n if (!typeCode) {\r\n throw cliError(I18N_KEYS.naming_convention_resource_type_required, {\r\n code: 4,\r\n hint: '传 --type,或在 freelog.manifest.json 写 resource.typeCode',\r\n });\r\n }\r\n assertResourceTitle(title, true);\r\n await assertResourceTypeCode(typeCode);\r\n\r\n const name = resolveCollectionCreateName({\r\n explicitName: opts.name,\r\n localName: local.resourceName,\r\n title,\r\n });\r\n\r\n const existing = unwrapData(\r\n await FServiceAPI.Resource.info({\r\n resourceIdOrName: toFullResourceName(username, name),\r\n }),\r\n );\r\n if (existing) {\r\n throw cliError(I18N_KEYS.resource_name_exist, {\r\n code: 4,\r\n params: { authID: toFullResourceName(username, name) },\r\n hint: '传 --name 指定其他短授权标识',\r\n });\r\n }\r\n\r\n const envelope = await FServiceAPI.Resource.create({\r\n name,\r\n subjectType: 4,\r\n resourceTypeCode: typeCode,\r\n resourceTypeName,\r\n resourceTitle: title,\r\n } as Parameters<typeof FServiceAPI.Resource.create>[0]);\r\n\r\n const data = unwrapData<{\r\n resourceId: string;\r\n resourceName: string;\r\n resourceType?: string[];\r\n resourceTypeCode?: string;\r\n resourceTypeName?: string;\r\n userId?: number | string;\r\n username?: string;\r\n }>(envelope);\r\n\r\n if (!data?.resourceId) {\r\n throw cliError(I18N_KEYS.collection_create_missing_resource_id, { code: 1, details: data });\r\n }\r\n\r\n const next: CollectionProject = {\r\n ...local,\r\n resourceId: data.resourceId,\r\n resourceName: data.resourceName || toFullResourceName(username, name),\r\n resourceType: data.resourceType || [],\r\n resourceTypeCode: data.resourceTypeCode || typeCode,\r\n resourceTypeName: data.resourceTypeName || resourceTypeName,\r\n resourceTitle: title,\r\n userId: data.userId ?? auth.userId,\r\n username: data.username ?? auth.username,\r\n };\r\n writeCollectionProject(next, cwd);\r\n const hydrated = await hydrateCollectionTypeProperties(next);\n writeCollectionProject(hydrated, cwd);\r\n return hydrated;\r\n}\r\n","import { consola } from 'consola';\r\nimport { requireAuth } from '../../core/auth.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport type { VersionProject } from '../../config/project.js';\r\nimport type { ProjectStore } from '../store/types.js';\r\nimport { assertOwnerMatch } from '../shared/owner.js';\r\nimport { applyPlatformFactsToResource } from '../shared/listing.js';\r\nimport { fetchResourceInfo } from './fetch.js';\r\nimport type { EnsureOwnerResult } from './types.js';\r\n\r\nexport async function ensureOwner(opts: {\r\n store: ProjectStore;\r\n allowCreateWithoutId?: boolean;\r\n}): Promise<EnsureOwnerResult> {\r\n const store = opts.store;\r\n const auth = requireAuth();\r\n const resource = store.loadResource();\r\n const resourceId = resource.resourceId?.trim();\r\n\r\n if (!resourceId) {\r\n if (opts.allowCreateWithoutId) {\r\n return {\r\n auth,\r\n resource,\r\n info: { resourceId: '' },\r\n };\r\n }\r\n throw cliError(I18N_KEYS.no_local_resource_id, {\r\n code: 4,\r\n hint: '新目录先执行 freelog-cli init <name> --resource-type <code>,再执行 freelog-cli create',\r\n });\r\n }\r\n\r\n const info = await fetchResourceInfo(resourceId);\r\n assertOwnerMatch({\r\n authUserId: auth.userId,\r\n authUsername: auth.username,\r\n platformUserId: info.userId,\r\n platformUsername: info.username,\r\n hint: '切换账号或更换目录',\r\n });\r\n\r\n const nextResource = applyPlatformFactsToResource(resource, info);\r\n if (info.username && resource.username && info.username !== resource.username) {\r\n consola.warn(`username 已以平台为准更新: ${resource.username} → ${info.username}`);\r\n }\r\n store.savePlatformFacts(nextResource);\r\n\r\n let version: VersionProject | undefined;\r\n const versionLoaded = store.tryLoadVersion();\r\n if (versionLoaded) {\r\n version = {\r\n ...versionLoaded,\r\n resourceId: info.resourceId,\r\n resourceName: info.resourceName || versionLoaded.resourceName,\r\n resourceTypeCode: info.resourceTypeCode || versionLoaded.resourceTypeCode,\r\n userId: info.userId,\r\n username: info.username,\r\n };\r\n }\r\n\r\n return { auth, resource: nextResource, info, version };\r\n}\r\n","import { requireAuth } from '../../core/auth.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport type { ResourceProject, VersionProject } from '../../config/project.js';\nimport type { ProjectStore } from '../store/types.js';\nimport { ownersMatch } from '../shared/owner.js';\nimport {\n applyOwnerToResource,\n applyPlatformFactsToResource,\n assertApplyListingAllowed,\n} from '../shared/listing.js';\nimport { fetchResourceInfo } from './fetch.js';\nimport type { PlatformResourceInfo } from './types.js';\n\nexport async function pullResourceToLocal(opts: {\n store: ProjectStore;\n version?: string;\n applyListing?: boolean;\n force?: boolean;\n}): Promise<{\n resource: ResourceProject;\n version?: VersionProject;\n info: PlatformResourceInfo;\n}> {\n const store = opts.store;\n const auth = requireAuth();\n const resource = store.loadResource();\n const id = resource.resourceId?.trim() || resource.resourceName;\n if (!id) {\n throw cliError(I18N_KEYS.pull_missing_id, { code: 4 });\n }\n const info = await fetchResourceInfo(id);\n if (\n Number.isFinite(Number(auth.userId)) &&\n Number.isFinite(Number(info.userId)) &&\n !ownersMatch(auth.userId, info.userId)\n ) {\n throw cliError(I18N_KEYS.pull_owner_denied, { code: 2 });\n }\n\n const nextResource = opts.applyListing\n ? applyOwnerToResource(resource, info)\n : applyPlatformFactsToResource(resource, info);\n if (opts.applyListing) {\n assertApplyListingAllowed({ local: resource, info, cwd: store.rootDir(), force: opts.force });\n store.saveResource(nextResource);\n } else {\n store.savePlatformFacts(nextResource);\n }\n\n let version: VersionProject | undefined;\n const versionLoaded = store.tryLoadVersion();\n const targetVersion = opts.version || versionLoaded?.version || info.latestVersion;\n if (versionLoaded) {\n version = {\n ...versionLoaded,\n resourceId: info.resourceId,\n resourceName: info.resourceName || versionLoaded.resourceName,\n resourceTypeCode: info.resourceTypeCode || versionLoaded.resourceTypeCode,\n userId: info.userId,\n username: info.username,\n version: opts.version || versionLoaded.version,\n };\n if (opts.version) {\n store.saveVersion(version);\n }\n } else if (targetVersion) {\n version = {\n resourceId: info.resourceId,\n resourceName: info.resourceName,\n resourceTypeCode: info.resourceTypeCode,\n version: targetVersion,\n filePath: 'dist',\n userId: info.userId,\n username: info.username,\n };\n if (opts.version) {\n store.saveVersion(version);\n }\n }\n\n return { resource: nextResource, version, info };\n}\n","import { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport type { ResourceProject, VersionProject } from '../../config/project.js';\nimport { applyPlatformFactsToResource, listingDrifted } from '../shared/listing.js';\nimport { ensureOwner } from './owner.js';\nimport { fetchResourceInfo } from './fetch.js';\nimport { pullResourceToLocal } from './pullResource.js';\nimport type { OperationContext } from './types.js';\nimport type { ProjectStore } from '../store/types.js';\n\nexport async function ensureOperationContext(opts: {\n store: ProjectStore;\n noAutoPull?: boolean;\n dryRun?: boolean;\n allowCreateWithoutId?: boolean;\n}): Promise<OperationContext> {\n const owner = await ensureOwner({\n store: opts.store,\n allowCreateWithoutId: opts.allowCreateWithoutId,\n });\n\n let resource: ResourceProject = { ...opts.store.loadResource(), ...owner.resource };\n let platform = owner.info;\n let listingWasDrifted = false;\n\n if (opts.store.supportsListingSync()) {\n listingWasDrifted = listingDrifted(resource, platform);\n if (listingWasDrifted) {\n if (opts.noAutoPull || opts.dryRun) {\n throw cliError(I18N_KEYS.resource_info_mismatch, {\n code: 3,\n hint: 'freelog-cli pull 或去掉 --no-auto-pull',\n });\n }\n const pulled = await pullResourceToLocal({ store: opts.store });\n resource = pulled.resource;\n platform = pulled.info;\n listingWasDrifted = false;\n }\n } else if (opts.store.resolveResourceId()) {\n platform = await fetchResourceInfo(opts.store.resolveResourceId()!);\n resource = applyPlatformFactsToResource(resource, platform);\n if (!opts.dryRun) {\n opts.store.savePlatformFacts(resource);\n }\n }\n\n const versionLoaded = opts.store.tryLoadVersion();\n let version: VersionProject | undefined;\n if (versionLoaded) {\n version = {\n ...versionLoaded,\n resourceId: platform.resourceId || versionLoaded.resourceId,\n resourceName: platform.resourceName || versionLoaded.resourceName,\n resourceTypeCode: platform.resourceTypeCode || versionLoaded.resourceTypeCode,\n userId: platform.userId,\n username: platform.username,\n };\n }\n\n return {\n mode: opts.store.mode(),\n auth: owner.auth,\n resource,\n version,\n platform,\n listingDrifted: listingWasDrifted,\n };\n}\n","import type { ProjectStore } from '../store/types.js';\r\nimport { ensureOperationContext } from './operationContext.js';\r\nimport type { EnsureOwnerResult } from './types.js';\r\n\r\nexport { ownersMatch } from '../shared/owner.js';\r\nexport { pullResourceToLocal } from './pullResource.js';\r\n\r\nexport async function ensureSynced(opts: {\r\n store: ProjectStore;\r\n noAutoPull?: boolean;\r\n owner?: EnsureOwnerResult;\r\n}): Promise<EnsureOwnerResult> {\r\n const store = opts.store;\r\n const ctx = await ensureOperationContext({\r\n store,\r\n noAutoPull: opts.noAutoPull,\r\n });\r\n return {\r\n auth: ctx.auth,\r\n resource: ctx.resource,\r\n info: ctx.platform,\r\n version: ctx.version,\r\n };\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { z } from 'zod';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { assertExplicitEnvForWriteOperation } from '../core/command.js';\r\nimport { FServiceAPI } from '../platform/index.js';\r\nimport { ensureOwner, ensureSynced, fetchResourceInfo } from './sync/index.js';\r\nimport type { ProjectStore } from './store/types.js';\r\nimport type { PlatformResourceInfo } from './sync/index.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\nconst PolicyItemSchema = z.object({\r\n policyName: z.string().min(2).max(20),\r\n policyText: z.string().min(1),\r\n status: z.union([z.literal(0), z.literal(1)]).optional().default(1),\r\n});\r\n\r\nconst PolicyFileSchema = z.union([PolicyItemSchema, z.array(PolicyItemSchema).min(1)]);\r\n\r\nexport type PolicyFileItem = z.infer<typeof PolicyItemSchema>;\r\n\r\nexport function resolvePolicyFilePath(fromFile: string, cwd?: string): string {\r\n if (path.isAbsolute(fromFile)) return fromFile;\r\n return path.resolve(resolveCwd(cwd), fromFile);\r\n}\r\n\r\nexport function parsePolicyFile(filePath: string) {\r\n if (!fs.existsSync(filePath)) {\r\n throw cliError(I18N_KEYS.policy_file_not_found, { code: 4 });\r\n }\r\n let raw: unknown;\r\n try {\r\n raw = JSON.parse(fs.readFileSync(filePath, 'utf8'));\r\n } catch (error) {\r\n throw cliError(I18N_KEYS.policy_json_invalid, { code: 4, cause: error });\r\n }\r\n const parsed = PolicyFileSchema.safeParse(raw);\r\n if (!parsed.success) {\r\n throw cliError(I18N_KEYS.policy_json_validation_failed, {\r\n code: 4,\r\n details: parsed.error.flatten(),\r\n });\r\n }\r\n return Array.isArray(parsed.data) ? parsed.data : [parsed.data];\r\n}\r\n\r\nexport function buildPolicyUpdatePayload(items: PolicyFileItem[]) {\r\n return {\r\n addPolicies: items.map((p) => ({\r\n policyName: p.policyName,\r\n policyText: encodeURIComponent(p.policyText),\r\n status: p.status ?? 1,\r\n })),\r\n };\r\n}\r\n\r\nexport function assertNewPoliciesUnique(\r\n existing: Array<{ policyName?: string; policyText?: string }>,\r\n items: PolicyFileItem[],\r\n): void {\r\n const names = new Set(\r\n existing.map((p) => (p.policyName || '').trim().toLowerCase()).filter(Boolean),\r\n );\r\n const texts = new Set(\r\n existing\r\n .map((p) => {\r\n const raw = p.policyText || '';\r\n try {\r\n return decodeURIComponent(raw).trim();\r\n } catch {\r\n return raw.trim();\r\n }\r\n })\r\n .filter(Boolean),\r\n );\r\n for (const item of items) {\r\n const nameKey = item.policyName.trim().toLowerCase();\r\n if (names.has(nameKey)) {\r\n throw cliError(I18N_KEYS.cli_policy_name_duplicate, { code: 4 });\r\n }\r\n const textKey = item.policyText.trim();\r\n if (texts.has(textKey)) {\r\n throw cliError(I18N_KEYS.cli_policy_code_duplicate, { code: 4 });\r\n }\r\n }\r\n}\r\n\r\nexport function assertPolicySyntaxForAppend(\r\n items: PolicyFileItem[],\r\n existingPolicyCount: number,\r\n): void {\r\n if (existingPolicyCount <= 0) return;\r\n for (const item of items) {\r\n const text = item.policyText.trim();\r\n const upper = text.toUpperCase();\r\n if (!upper.includes('FOR PUBLIC') || !/\\bINITIAL\\b/i.test(text)) {\r\n throw cliError(I18N_KEYS.policy_append_syntax_invalid, {\r\n code: 4,\r\n hint: '示例:\\\\nFOR PUBLIC\\\\n\\\\nInitial:\\\\n\\\\tterminate',\r\n details: { policyName: item.policyName },\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport async function policyApplyFromFile(opts: {\r\n store: ProjectStore;\r\n fromFile: string;\r\n noAutoPull?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n const store = opts.store;\r\n const ctx = await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const items = parsePolicyFile(resolvePolicyFilePath(opts.fromFile, store.rootDir()));\r\n const existing = ctx.info.policies || [];\r\n assertNewPoliciesUnique(existing, items);\r\n assertPolicySyntaxForAppend(items, existing.length);\r\n await FServiceAPI.Resource.update({\r\n resourceId: ctx.resource.resourceId!,\r\n ...buildPolicyUpdatePayload(items),\r\n });\r\n const info = await fetchResourceInfo(ctx.resource.resourceId!);\r\n store.savePlatformFacts(\n { ...ctx.resource, ...info },\n { remoteWriteConfirmed: true },\n );\n return items;\r\n}\r\n\r\nexport async function policyList(opts: { store: ProjectStore }) {\r\n const store = opts.store;\r\n const ctx = await ensureOwner({ store });\r\n const info = await fetchResourceInfo(ctx.resource.resourceId!);\r\n return info.policies || [];\r\n}\r\n\r\nexport async function policySetStatus(opts: {\r\n store: ProjectStore;\r\n policyId: string;\r\n status: 0 | 1;\r\n noAutoPull?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n const store = opts.store;\r\n const ctx = await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n assertPolicyStatusChangeAllowed(ctx.info, opts.policyId, opts.status);\r\n await FServiceAPI.Resource.update({\r\n resourceId: ctx.resource.resourceId!,\r\n updatePolicies: [{ policyId: opts.policyId, status: opts.status }],\r\n });\r\n const info = await fetchResourceInfo(ctx.resource.resourceId!);\r\n store.savePlatformFacts(\n { ...ctx.resource, ...info },\n { remoteWriteConfirmed: true },\n );\n}\r\n\r\nexport function assertPolicyStatusChangeAllowed(\r\n info: PlatformResourceInfo,\r\n policyId: string,\r\n status: 0 | 1,\r\n): void {\r\n if (status !== 0 || Number(info.status) !== 1) return;\r\n const enabled = (info.policies || []).filter((p) => Number(p.status) === 1);\r\n const targetIsEnabled = enabled.some((p) => p.policyId === policyId);\r\n if (targetIsEnabled && enabled.length <= 1) {\r\n throw cliError(I18N_KEYS.cannot_disable_last_policy, {\r\n code: 4,\r\n details: {\r\n error: 'LAST_ENABLED_POLICY_REQUIRED',\r\n policyId,\r\n enabledPolicyCount: enabled.length,\r\n platformStatus: info.status,\r\n },\r\n hint: '先添加或启用另一条策略,或先 offline 后再停用',\r\n });\r\n }\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport YAML from 'yaml';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport type {\r\n AuthExcludedItem,\r\n BaseUpcastResource,\r\n BatchSignContract,\r\n CustomPropertyDescriptor,\r\n ManifestPolicy,\r\n VersionDependency,\r\n} from '../../config/project.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { parsePolicyFile } from '../policyService.js';\nimport { normalizeCreateName } from '../resourceName.js';\nimport {\n assertCollectionItemTitle,\n assertIntro,\n assertPolicyName,\n assertResourceTitle,\n assertTags,\n} from '../validation.js';\nimport type {\r\n BatchResourceConfig,\r\n BatchResourceConfigDefaults,\r\n BatchResourceConfigItem,\r\n} from './types.js';\r\n\r\nfunction asObject(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw cliError(I18N_KEYS.label_must_be_object, { code: 4, params: { label } });\n }\r\n return value as Record<string, unknown>;\r\n}\r\n\r\nfunction toStringList(value: unknown, label: string): string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value)) {\n throw cliError(I18N_KEYS.label_must_be_string_array, { code: 4, params: { label } });\n }\n return value.map((item) => String(item).trim()).filter(Boolean);\r\n}\r\n\r\nfunction toPolicyList(value: unknown, label: string): ManifestPolicy[] | undefined {\r\n if (value === undefined) return undefined;\r\n const rows = Array.isArray(value) ? value : [value];\r\n return rows.map((row, index) => {\r\n const item = asObject(row, `${label}[${index}]`);\r\n const policyName = String(item.policyName || '').trim();\n const policyText = String(item.policyText || '');\n if (!policyName || !policyText) {\r\n throw cliError(I18N_KEYS.label_item_missing_policy_fields, { code: 4 });\r\n }\n assertPolicyName(policyName);\n const status = item.status === undefined ? 1 : Number(item.status);\r\n if (status !== 0 && status !== 1) {\r\n throw cliError(I18N_KEYS.label_item_status_invalid, { code: 4 });\r\n }\r\n return { policyName, policyText, status: status as 0 | 1 };\r\n });\r\n}\r\n\r\nfunction normalizeBatchSignContractsFromRaw(value: unknown, label: string): BatchSignContract[] | undefined {\r\n if (value === undefined) return undefined;\r\n if (!Array.isArray(value)) throw cliError(I18N_KEYS.label_must_be_array, { code: 4 });\r\n return value.map((row, index) => {\r\n const item = asObject(row, `${label}[${index}]`);\r\n const resourceId = String(item.resourceId || '').trim();\r\n const policyIds = toStringList(item.policyIds, `${label}[${index}].policyIds`);\r\n if (!resourceId || !policyIds?.length) {\r\n throw cliError(I18N_KEYS.label_item_missing_dep_fields, { code: 4 });\r\n }\r\n return {\r\n resourceId,\r\n policyIds,\r\n subjectType: item.subjectType === undefined ? undefined : String(item.subjectType),\r\n };\r\n });\r\n}\r\n\r\nfunction normalizeConfigDefaults(\n value: unknown,\n label: string,\n): BatchResourceConfigDefaults {\n if (value === undefined) return {};\n const raw = asObject(value, label);\n const intro = raw.intro === undefined ? undefined : String(raw.intro);\n const tagsInput = toStringList(raw.tags, `${label}.tags`);\n const tags = tagsInput ? [...new Set(tagsInput)] : undefined;\n assertIntro(intro);\n assertTags(tags);\n return {\n resourceTypeCode:\r\n raw.resourceTypeCode === undefined ? undefined : String(raw.resourceTypeCode).trim(),\r\n resourceTypeName:\r\n raw.resourceTypeName === undefined ? undefined : String(raw.resourceTypeName).trim(),\r\n version: raw.version === undefined ? undefined : String(raw.version).trim(),\r\n description: raw.description === undefined ? undefined : String(raw.description),\r\n intro,\n coverImages: toStringList(raw.coverImages, `${label}.coverImages`),\r\n tags,\n policies: toPolicyList(raw.policies, `${label}.policies`),\r\n policyFile: raw.policyFile === undefined ? undefined : String(raw.policyFile).trim(),\r\n dependencies: Array.isArray(raw.dependencies)\r\n ? (raw.dependencies as VersionDependency[])\r\n : undefined,\r\n baseUpcastResources: Array.isArray(raw.baseUpcastResources)\r\n ? (raw.baseUpcastResources as BaseUpcastResource[])\r\n : undefined,\r\n authExcludedItems: Array.isArray(raw.authExcludedItems)\r\n ? (raw.authExcludedItems as AuthExcludedItem[])\r\n : undefined,\r\n batchSignContracts: normalizeBatchSignContractsFromRaw(raw.batchSignContracts, `${label}.batchSignContracts`),\r\n inputAttrs: Array.isArray(raw.inputAttrs)\r\n ? (raw.inputAttrs as Array<{ key: string; value: string | number | boolean }>)\r\n : undefined,\r\n customPropertyDescriptors: Array.isArray(raw.customPropertyDescriptors)\r\n ? (raw.customPropertyDescriptors as CustomPropertyDescriptor[])\r\n : undefined,\r\n };\r\n}\r\n\r\nfunction normalizeConfigItem(value: unknown, index: number): BatchResourceConfigItem {\n const raw = asObject(value, `items[${index}]`);\r\n const defaults = normalizeConfigDefaults(raw, `items[${index}]`);\n const filePath = String(raw.filePath || '').trim();\n if (!filePath) throw cliError(I18N_KEYS.batch_item_filepath_required, { code: 4 });\n const resourceTitle =\n raw.resourceTitle === undefined ? undefined : String(raw.resourceTitle).trim();\n const itemTitle = raw.itemTitle === undefined ? undefined : String(raw.itemTitle).trim();\n if (resourceTitle !== undefined) assertResourceTitle(resourceTitle, true);\n if (itemTitle !== undefined) assertCollectionItemTitle(itemTitle, true);\n return {\n ...defaults,\r\n filePath,\r\n name: raw.name === undefined ? undefined : normalizeCreateName(String(raw.name)),\n resourceTitle,\n itemTitle,\n skip: Boolean(raw.skip),\r\n };\r\n}\r\n\r\nexport function parseBatchConfig(raw: unknown): BatchResourceConfig {\r\n const root = asObject(raw, 'batch config');\r\n if (!Array.isArray(root.items)) {\r\n throw cliError(I18N_KEYS.batch_items_must_be_array, { code: 4 });\r\n }\r\n const items = root.items\r\n .map((item, index) => normalizeConfigItem(item, index))\r\n .filter((item) => !item.skip);\r\n if (!items.length) {\r\n throw cliError(I18N_KEYS.batch_items_empty, { code: 4 });\r\n }\r\n return {\r\n defaults: normalizeConfigDefaults(root.defaults, 'defaults'),\r\n items,\r\n };\r\n}\r\n\r\nexport function readBatchConfig(configFile: string): BatchResourceConfig {\r\n if (!fs.existsSync(configFile)) {\r\n throw cliError(I18N_KEYS.batch_config_not_found, { code: 4 });\r\n }\r\n const rawText = fs.readFileSync(configFile, 'utf8');\r\n let raw: unknown;\r\n try {\r\n raw = /\\.(ya?ml)$/i.test(configFile) ? YAML.parse(rawText) : JSON.parse(rawText);\r\n } catch (error) {\r\n throw cliError(I18N_KEYS.batch_config_invalid, { code: 4, cause: error });\r\n }\r\n return parseBatchConfig(raw);\r\n}\r\n\r\nexport function resolveConfigPath(cwd: string | undefined, dir: string, configFile?: string): string | undefined {\r\n if (!configFile?.trim()) {\r\n const json = path.join(dir, 'freelog.batch.json');\r\n const yaml = path.join(dir, 'freelog.batch.yaml');\r\n if (fs.existsSync(json)) return json;\r\n if (fs.existsSync(yaml)) return yaml;\r\n return undefined;\r\n }\r\n const fromCwd = path.resolve(resolveCwd(cwd), configFile);\r\n if (fs.existsSync(fromCwd)) return fromCwd;\r\n return path.resolve(dir, configFile);\r\n}\r\n\r\nexport function loadPoliciesFromFile(configBaseDir: string, policyFile?: string): ManifestPolicy[] | undefined {\r\n if (!policyFile) return undefined;\r\n return parsePolicyFile(path.resolve(configBaseDir, policyFile));\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport type { CustomPropertyDescriptor } from '../config/project.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\ntype RecordValue = Record<string, unknown>;\r\n\r\nfunction asRecord(value: unknown): RecordValue | null {\r\n return value && typeof value === 'object' && !Array.isArray(value)\r\n ? (value as RecordValue)\r\n : null;\r\n}\r\n\r\nfunction firstRecord(...values: unknown[]): RecordValue {\r\n for (const value of values) {\r\n const record = asRecord(value);\r\n if (record) return record;\r\n }\r\n return {};\r\n}\r\n\r\nfunction pickConfig(typeInfo: unknown): RecordValue {\r\n const record = asRecord(typeInfo) || {};\r\n return {\r\n ...record,\r\n ...firstRecord(record.resourceConfig),\r\n ...firstRecord(record.fileConfig),\r\n ...firstRecord(record.versionConfig),\r\n };\r\n}\r\n\r\nfunction toStringArray(value: unknown): string[] {\r\n if (Array.isArray(value)) return value.map(String).map((item) => item.trim()).filter(Boolean);\r\n if (typeof value === 'string') {\r\n return value\r\n .split(/[,,]/)\r\n .map((item) => item.trim())\r\n .filter(Boolean);\r\n }\r\n return [];\r\n}\r\n\r\nfunction includesLocalUploadMode(value: unknown): boolean {\r\n if (value === undefined || value === null || value === '') return true;\r\n const modes = Array.isArray(value) ? value : [value];\r\n return modes.some((mode) => {\r\n if (mode === 1 || mode === '1') return true;\r\n const numeric = Number(mode);\r\n if (Number.isFinite(numeric) && (numeric & 1) === 1) return true;\r\n const text = String(mode).toLowerCase();\r\n return text.includes('upload') || text.includes('file') || text.includes('local');\r\n });\r\n}\r\n\r\nexport function isCreateBatchSupported(typeInfo: unknown): boolean {\r\n const config = pickConfig(typeInfo);\r\n const support = config.supportCreateBatch;\r\n return support === undefined || support === null || support === '' || support === 2 || support === '2' || support === true;\r\n}\r\n\r\n/** Console resourceConfig.autoGenerateCover === 2 → batch Handle 自动封面 */\r\nexport function isAutoGenerateCoverEnabled(typeInfo: unknown): boolean {\r\n const config = pickConfig(typeInfo);\r\n const v = config.autoGenerateCover;\r\n return v === 2 || v === '2' || v === true;\r\n}\r\n\r\nfunction bytesFromLimit(size: unknown, unit: unknown): number | null {\r\n const numeric = Number(size);\r\n if (!Number.isFinite(numeric) || numeric <= 0) return null;\r\n if (unit === undefined || unit === null || unit === '') return numeric;\r\n const text = String(unit).trim().toLowerCase();\r\n if (unit === 0 || text === '0' || text === 'b' || text === 'byte' || text === 'bytes') {\r\n return numeric;\r\n }\r\n if (unit === 1 || text === '1' || text === 'm' || text === 'mb') return numeric * 1024 * 1024;\r\n if (unit === 2 || text === '2' || text === 'g' || text === 'gb') return numeric * 1024 * 1024 * 1024;\r\n if (unit === 3 || text === '3' || text === 'k' || text === 'kb') return numeric * 1024;\r\n return numeric;\r\n}\r\n\r\nfunction formatSizeUnit(unit: unknown): string {\r\n if (unit === 2 || unit === '2') return 'GB';\r\n if (unit === 1 || unit === '1') return 'MB';\r\n if (unit === 3 || unit === '3') return 'KB';\r\n return 'B';\r\n}\r\n\r\n/** TTY publish / version set:类型文件大小上限说明(来自 capability,非写死) */\r\nexport function describeTypeFileSizeLimit(typeInfo: unknown): string | undefined {\r\n const config = pickConfig(typeInfo);\r\n const maxBytes = bytesFromLimit(config.fileMaxSize, config.fileMaxSizeUnit);\r\n if (maxBytes === null || config.fileMaxSize === undefined || config.fileMaxSize === '') {\r\n return undefined;\r\n }\r\n const unit = formatSizeUnit(config.fileMaxSizeUnit);\r\n return `该资源类型文件大小上限:${config.fileMaxSize}${unit}`;\r\n}\r\n\r\nfunction normalizedExt(filename: string): string {\r\n return path.extname(filename).toLowerCase();\r\n}\r\n\r\nfunction mimeFromExt(ext: string): string | null {\r\n const map: Record<string, string> = {\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.png': 'image/png',\r\n '.gif': 'image/gif',\r\n '.webp': 'image/webp',\r\n '.svg': 'image/svg+xml',\r\n '.mp4': 'video/mp4',\r\n '.mov': 'video/quicktime',\r\n '.m4v': 'video/x-m4v',\r\n '.webm': 'video/webm',\r\n '.zip': 'application/zip',\r\n };\r\n return map[ext] || null;\r\n}\r\n\r\n/** Console Task 硬上限:视频 1GB / 其它 200MB(叠加上类型 fileMaxSize) */\r\nexport const TASK_VIDEO_MAX_BYTES = 1024 * 1024 * 1024;\r\nexport const TASK_DEFAULT_MAX_BYTES = 200 * 1024 * 1024;\r\n\r\nfunction isVideoFileContext(typeInfo: unknown, filename: string): boolean {\r\n const record = asRecord(typeInfo) || {};\r\n const config = pickConfig(typeInfo);\r\n const code = String(record.code || record.resourceTypeCode || config.code || '').trim();\r\n if (/^RT006/i.test(code)) return true;\r\n const labels = [\r\n String(record.name || record.resourceTypeName || config.name || ''),\r\n ...toStringArray(record.resourceType ?? config.resourceType),\r\n ]\r\n .join(' ')\r\n .toLowerCase();\r\n if (labels.includes('视频') || labels.includes('video')) return true;\r\n const mime = mimeFromExt(normalizedExt(filename));\r\n return Boolean(mime?.startsWith('video/'));\r\n}\r\n\r\nexport function assertTaskFileSizeLimit(opts: {\r\n typeInfo?: unknown;\r\n filePath: string;\r\n filename: string;\r\n}): void {\r\n const size = fs.statSync(opts.filePath).size;\r\n const isVideo = isVideoFileContext(opts.typeInfo, opts.filename);\r\n const maxBytes = isVideo ? TASK_VIDEO_MAX_BYTES : TASK_DEFAULT_MAX_BYTES;\r\n if (size > maxBytes) {\r\n throw cliError(\r\n isVideo ? I18N_KEYS.cli_file_size_video_1gb : I18N_KEYS.cli_file_size_default_200mb,\r\n { code: 4, details: { size, maxBytes, isVideo } },\r\n );\r\n }\r\n}\r\n\r\nfunction formatMatches(filename: string, formats: string[]): boolean {\r\n if (!formats.length) return true;\r\n const ext = normalizedExt(filename);\r\n const mime = mimeFromExt(ext);\r\n return formats.some((format) => {\r\n const f = format.trim().toLowerCase();\r\n if (!f) return false;\r\n if (f === '*' || f === '*/*') return true;\r\n if (f.startsWith('.')) return f === ext;\r\n if (!f.includes('/')) return `.${f}` === ext;\r\n if (mime && f.endsWith('/*')) return mime.startsWith(f.slice(0, -1));\r\n return Boolean(mime && f === mime);\r\n });\r\n}\r\n\r\nexport function shouldCompressFromTypeInfo(typeInfo: unknown): boolean | null {\r\n const mode = artifactModeFromTypeInfo(typeInfo);\r\n return mode === null ? null : mode === 'directory-zip';\r\n}\r\n\r\nexport type ArtifactMode = 'file' | 'directory-zip';\r\n\r\nfunction artifactModeValueFromTypeInfo(typeInfo: unknown): unknown {\r\n const config = pickConfig(typeInfo);\r\n return (\r\n config.artifactMode ??\r\n config.compress ??\r\n config.needCompress ??\r\n config.isCompress ??\r\n config.packageMode ??\r\n config.filePackageMode\r\n );\r\n}\r\n\r\n/**\r\n * Read only an explicit platform capability. Resource type names and codes are\r\n * labels/identifiers, not a packaging contract, so they must never be guessed.\r\n */\r\nexport function artifactModeFromTypeInfo(typeInfo: unknown): ArtifactMode | null {\r\n const value = artifactModeValueFromTypeInfo(typeInfo);\r\n if (typeof value === 'boolean') return value ? 'directory-zip' : 'file';\r\n if (value === 1 || value === '1') return 'directory-zip';\r\n if (value === 0 || value === '0') return 'file';\r\n if (typeof value !== 'string') return null;\r\n const normalized = value.trim().toLowerCase().replace(/_/g, '-');\r\n if (['directory-zip', 'directory', 'zip', 'archive', 'compress'].includes(normalized)) {\r\n return 'directory-zip';\r\n }\r\n if (['file', 'single-file', 'raw', 'none'].includes(normalized)) return 'file';\r\n return null;\r\n}\r\n\r\nexport function resolveArtifactMode(opts: {\r\n typeInfo?: unknown;\r\n manifestArtifactMode?: ArtifactMode;\r\n}): ArtifactMode {\r\n const capabilityValue = artifactModeValueFromTypeInfo(opts.typeInfo);\r\n const capabilityMode = artifactModeFromTypeInfo(opts.typeInfo);\r\n const manifestMode = opts.manifestArtifactMode;\r\n if (\r\n capabilityMode === null &&\r\n capabilityValue !== undefined &&\r\n capabilityValue !== null &&\r\n capabilityValue !== ''\r\n ) {\r\n throw cliError(I18N_KEYS.artifact_mode_invalid, {\r\n code: 4,\r\n details: { source: 'platform', value: capabilityValue, supported: ['file', 'directory-zip'] },\r\n hint: '平台返回了无法识别的打包能力;请修正资源类型配置后重试',\r\n });\r\n }\r\n if (capabilityMode && manifestMode && capabilityMode !== manifestMode) {\r\n throw cliError(I18N_KEYS.artifact_mode_capability_conflict, {\r\n code: 4,\r\n details: { capabilityMode, manifestMode },\r\n hint: '平台资源类型能力优先;请把 manifest.version.artifactMode 调整为一致值',\r\n });\r\n }\r\n if (capabilityMode) return capabilityMode;\r\n if (manifestMode) return manifestMode;\r\n throw cliError(I18N_KEYS.artifact_mode_invalid, {\r\n code: 4,\r\n details: { reason: 'missing', supported: ['file', 'directory-zip'] },\r\n hint: '平台未返回打包能力;请在 manifest.version.artifactMode 中显式设置 file 或 directory-zip',\r\n });\r\n}\r\n\r\nexport function assertOptionalConfigAllowed(opts: {\r\n typeInfo: unknown;\r\n inputAttrs?: unknown[];\r\n customPropertyDescriptors?: CustomPropertyDescriptor[];\r\n}): void {\r\n const config = pickConfig(opts.typeInfo);\r\n const support = config.supportOptionalConfig;\r\n const allowed =\r\n support === undefined ||\r\n support === null ||\r\n support === '' ||\r\n support === true ||\r\n support === 2 ||\r\n support === '2';\r\n if (allowed) return;\r\n if (opts.customPropertyDescriptors?.length) {\r\n throw cliError(I18N_KEYS.type_no_custom_properties, {\r\n code: 4,\r\n details: {\r\n customPropertyDescriptors: opts.customPropertyDescriptors?.length || 0,\r\n },\r\n hint: '移除 manifest 中的 customPropertyDescriptors 后重试;文件解析出的系统属性仍会自动提交',\r\n });\r\n }\r\n}\r\n\r\nexport function assertLocalFileAllowedByType(opts: {\r\n typeInfo: unknown;\r\n filePath: string;\r\n filename: string;\r\n}): void {\r\n const config = pickConfig(opts.typeInfo);\r\n if (!includesLocalUploadMode(config.fileCommitMode)) {\r\n throw cliError(I18N_KEYS.type_no_local_upload, {\r\n code: 4,\r\n details: { fileCommitMode: config.fileCommitMode },\r\n hint: '请选择支持本地文件提交的资源类型,或回 Console 使用该类型支持的提交方式',\r\n });\r\n }\r\n\r\n const formats = toStringArray(config.formats || config.format || config.fileFormats);\r\n if (!formatMatches(opts.filename, formats)) {\r\n throw cliError(I18N_KEYS.file_format_not_allowed, {\r\n code: 4,\r\n details: { formats },\r\n hint: `允许格式: ${formats.join(', ')}`,\r\n });\r\n }\r\n\r\n const maxBytes = bytesFromLimit(config.fileMaxSize, config.fileMaxSizeUnit);\r\n if (maxBytes !== null) {\r\n const size = fs.statSync(opts.filePath).size;\r\n if (size > maxBytes) {\r\n throw cliError(I18N_KEYS.file_size_exceeds_type_limit, {\r\n code: 4,\r\n details: { size, maxBytes, fileMaxSize: config.fileMaxSize, fileMaxSizeUnit: config.fileMaxSizeUnit },\r\n hint: `文件大小不能超过 ${config.fileMaxSize}${config.fileMaxSizeUnit === 2 || config.fileMaxSizeUnit === '2' ? 'GB' : config.fileMaxSizeUnit === 1 || config.fileMaxSizeUnit === '1' ? 'MB' : ''}`,\r\n });\r\n }\r\n }\r\n\r\n assertTaskFileSizeLimit({\r\n typeInfo: opts.typeInfo,\r\n filePath: opts.filePath,\r\n filename: opts.filename,\r\n });\r\n}\r\n","/** Console / CLI 共用:资源冻结状态 (status & 2) === 2 */\r\nexport function isFrozenStatus(status: number | undefined): boolean {\r\n if (status === undefined || status === null) return false;\r\n const n = Number(status);\r\n return n === 2 || (n & 2) === 2;\r\n}\r\n","import semver from 'semver';\r\nimport { tryLoadCollectionProject } from '../../../config/project.js';\r\nimport { cliError } from '../../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../../i18n/bundled.js';\r\nimport { assertSemverLike } from '../../validation.js';\r\n\r\n/** 纯版本比较:新版本须 > latest(latest 无效时跳过 gt) */\r\nexport function assertVersionGreaterThanLatest(version: string, latestVersion?: string): void {\r\n assertSemverLike(version);\r\n if (!latestVersion || !semver.valid(latestVersion) || !semver.valid(version)) return;\r\n if (!semver.gt(version, latestVersion)) {\r\n throw cliError(I18N_KEYS.freelog_versioning, {\r\n code: 4,\r\n hint: `当前意图 ${version}`,\r\n });\r\n }\r\n}\r\n\r\n/** Console versionCreator:合集目录不能走独立资源 publish */\r\nexport function assertPublishNotCollectionCwd(cwd?: string): void {\r\n if (tryLoadCollectionProject(cwd)) {\r\n throw cliError(I18N_KEYS.create_new_version_error_unknowsubject, { code: 4 });\r\n }\r\n}\r\n\r\n/** publish 前 version / filePath 门禁(可单测) */\r\nexport function assertPublishVersionReady(versionCfg: {\r\n version?: string;\r\n filePath?: string;\r\n fileSha1?: string | null;\r\n reusePlatformFile?: boolean;\r\n}): void {\r\n if (!versionCfg.version) {\r\n throw cliError(I18N_KEYS.manifest_version_missing, {\r\n code: 4,\r\n hint: 'freelog-cli version set --version <版本号> 或 publish --bump',\r\n });\r\n }\r\n const reuse =\r\n versionCfg.reusePlatformFile === true ||\r\n (!versionCfg.filePath?.trim() && !!versionCfg.fileSha1?.trim());\r\n if (!reuse && !versionCfg.filePath?.trim()) {\r\n throw cliError(I18N_KEYS.manifest_filepath_missing, { code: 4 });\r\n }\r\n}\r\n","import { requireAuth } from '../../../core/auth.js';\r\nimport { CliError } from '../../../core/errors.js';\r\nimport { FServiceAPI, unwrapData } from '../../../platform/index.js';\r\nimport { cliError } from '../../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../../i18n/bundled.js';\r\nimport { ownersMatch } from '../owner.js';\r\n\r\n/**\r\n * Console FLocalUpload:SHA1 已被发行时拦截(同源 i18n key)。\r\n * 404 / 空 data → 允许继续。\r\n */\r\nexport async function assertSha1PublishAllowed(sha1: string): Promise<void> {\r\n try {\r\n const envelope = await FServiceAPI.Resource.getResourceBySha1({ fileSha1: sha1 });\r\n const data = unwrapData<{\r\n resourceId?: string;\r\n userId?: number | string;\r\n ownerId?: number | string;\r\n } | null>(envelope);\r\n if (!data?.resourceId) return;\r\n\r\n const auth = requireAuth();\r\n const ownerId = data.userId ?? data.ownerId;\r\n if (ownersMatch(ownerId, auth.userId)) {\r\n throw cliError(I18N_KEYS.submitresource_err_resourceexist_sameuser, { code: 4 });\r\n }\r\n throw cliError(I18N_KEYS.submitresource_err_resourceexist_otheruser, { code: 4 });\r\n } catch (error) {\r\n if (error instanceof CliError) throw error;\r\n // 平台无绑定资源 → 允许\r\n }\r\n}\r\n","export function isInteractive(yes?: boolean): boolean {\r\n if (yes) return false;\r\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\r\n}\r\n\r\nexport function wantsJson(json?: boolean): boolean {\r\n return Boolean(json);\r\n}\r\n","import { consola } from 'consola';\r\nimport * as p from '@clack/prompts';\r\nimport { cliError } from '../../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../../i18n/bundled.js';\r\nimport { t } from '../../../i18n/index.js';\r\nimport { isInteractive } from '../../../core/tty.js';\r\n\r\n/** 与 Console creatorBatch 单次 UI 上限一致 */\r\nexport const CREATE_BATCH_CHUNK_SIZE = 20;\r\n\r\n/** Console 合集 Step2 单次添加目录项上限 */\nexport const COLLECTION_ITEM_ADD_LIMIT = 100;\r\n\r\nexport function assertBatchFileCount(count: number, strictBatchLimit?: boolean): void {\r\n if (strictBatchLimit && count > CREATE_BATCH_CHUNK_SIZE) {\r\n throw cliError(I18N_KEYS.brr_submitresource_alert_limitation, { code: 4 });\r\n }\r\n}\r\n\r\nexport function warnBatchChunkingIfNeeded(total: number): void {\r\n if (total <= CREATE_BATCH_CHUNK_SIZE) return;\r\n consola.warn(t(I18N_KEYS.brr_submitresource_alert_limitation));\r\n consola.warn(\r\n t(I18N_KEYS.cli_batch_chunk_warn, {\r\n limit: String(CREATE_BATCH_CHUNK_SIZE),\r\n batches: String(Math.ceil(total / CREATE_BATCH_CHUNK_SIZE)),\r\n }),\r\n );\r\n}\r\n\r\nexport function assertCollectionItemAddCount(count: number): void {\r\n if (count > COLLECTION_ITEM_ADD_LIMIT) {\r\n throw cliError(I18N_KEYS.additem_alert_qtylimit, { code: 4 });\r\n }\r\n}\r\n\r\nexport async function confirmBatchReleaseWithoutPolicies(opts: {\r\n withoutPolicyCount: number;\r\n yes?: boolean;\r\n}): Promise<void> {\r\n const { withoutPolicyCount, yes } = opts;\r\n if (withoutPolicyCount <= 0) return;\r\n\r\n const message = t(I18N_KEYS.brr_resourcelisting_complete_confirm_msg, {\r\n qty: String(withoutPolicyCount),\r\n });\r\n\r\n if (yes) return;\r\n\r\n if (isInteractive(yes)) {\r\n const ok = await p.confirm({ message });\r\n if (p.isCancel(ok) || !ok) {\r\n throw cliError(I18N_KEYS.cancelled, { code: 4 });\r\n }\r\n return;\r\n }\r\n\r\n throw cliError(I18N_KEYS.cli_non_interactive_needs_yes, {\r\n code: 4,\r\n hint: message,\r\n });\r\n}\r\n\r\nexport function countPreparedWithoutPolicies<T extends { policies?: unknown[] }>(\r\n items: T[],\r\n): number {\r\n return items.filter((item) => !(item.policies?.length)).length;\r\n}\r\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { File } from 'node:buffer';\nimport { FServiceAPI, getSHA1Hash, unwrapData } from '../platform/index.js';\nimport { assertExplicitEnvForWriteOperation } from '../core/command.js';\n\nexport function fileAlreadyExists(payload: unknown): boolean {\n if (payload === true) return true;\n if (Array.isArray(payload)) {\n return payload.some((item) => fileAlreadyExists(item));\n }\n return (\n typeof payload === 'object' &&\n payload !== null &&\n Boolean((payload as { isExisting?: boolean }).isExisting)\n );\n}\n\n/** 只读检查:dry-run 可用它判断属性解析是否具备平台文件前提。 */\nexport async function fileExistsOnPlatform(sha1: string): Promise<boolean> {\n const existEnv = await FServiceAPI.Storage.fileIsExist({ sha1 });\n return fileAlreadyExists(unwrapData(existEnv));\n}\n\n/** sha1 不存在则 multipart 上传(≅ Console Storage 链) */\nexport async function uploadFileIfNeeded(\n absolutePath: string,\n sha1: string,\n): Promise<'uploaded' | 'reused'> {\n assertExplicitEnvForWriteOperation();\n if (await fileExistsOnPlatform(sha1)) return 'reused';\n\r\n const buf = fs.readFileSync(absolutePath);\n const file = new File([buf], path.basename(absolutePath));\n await FServiceAPI.Storage.uploadFile({ file }, {\n timeout: 300_000,\n });\n return 'uploaded';\n}\n\n/** 命令层使用的文件准备入口:计算 SHA1 并确保文件已进入平台存储。 */\nexport async function prepareLocalFileForPlatform(absolutePath: string): Promise<string> {\n const sha1 = await getSHA1Hash(absolutePath);\n await uploadFileIfNeeded(absolutePath, sha1);\n return sha1;\n}\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { File } from 'node:buffer';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { FServiceAPI, unwrapData } from '../platform/index.js';\nimport { assertExplicitEnvForWriteOperation } from '../core/command.js';\nimport { resolveCwd } from '../config/project.js';\r\n\r\nconst COVER_MAX_BYTES = 5 * 1024 * 1024;\r\nconst COVER_EXT = new Set(['.jpg', '.jpeg', '.png', '.gif']);\r\n\r\nexport function looksLikeRemoteCoverUrl(value: string): boolean {\r\n return /^https?:\\/\\//i.test(value.trim());\r\n}\r\n\r\nexport function readImageDimensions(buf: Buffer, ext: string): { width: number; height: number } | null {\r\n const lower = ext.toLowerCase();\r\n if (lower === '.png') {\r\n if (buf.length < 24 || buf.readUInt32BE(0) !== 0x89504e47) {\r\n throw cliError(I18N_KEYS.png_dimensions_unreadable, { code: 4 });\r\n }\r\n return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) };\r\n }\r\n if (lower === '.gif') {\r\n if (buf.length < 10 || buf.toString('ascii', 0, 3) !== 'GIF') {\r\n throw cliError(I18N_KEYS.gif_dimensions_unreadable, { code: 4 });\r\n }\r\n return { width: buf.readUInt16LE(6), height: buf.readUInt16LE(8) };\r\n }\r\n if (lower === '.jpg' || lower === '.jpeg') {\r\n let i = 2;\r\n while (i < buf.length) {\r\n if (buf[i] !== 0xff) break;\r\n const marker = buf[i + 1];\r\n if (marker === 0xc0 || marker === 0xc2) {\r\n return { height: buf.readUInt16BE(i + 5), width: buf.readUInt16BE(i + 7) };\r\n }\r\n const len = buf.readUInt16BE(i + 2);\r\n i += 2 + len;\r\n }\r\n throw cliError(I18N_KEYS.jpeg_dimensions_unreadable, { code: 4 });\r\n }\r\n throw cliError(I18N_KEYS.unsupported_cover_format, { code: 4, params: { ext } });\r\n}\r\n\r\n/** GIF89a:统计 0x21 0xf9 Graphic Control Extension,>1 视为动画 */\r\nexport function isAnimatedGif(buf: Buffer): boolean {\r\n if (buf.length < 6 || buf.toString('ascii', 0, 3) !== 'GIF') return false;\r\n let count = 0;\r\n for (let i = 0; i < buf.length - 1; i++) {\r\n if (buf[i] === 0x21 && buf[i + 1] === 0xf9) count++;\r\n if (count > 1) return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function assertLocalCoverFile(absolutePath: string): void {\r\n if (!fs.existsSync(absolutePath)) {\r\n throw cliError(I18N_KEYS.cli_cover_file_missing, {\r\n code: 4,\r\n params: { path: absolutePath },\r\n });\r\n }\r\n const stat = fs.statSync(absolutePath);\r\n if (!stat.isFile()) {\r\n throw cliError(I18N_KEYS.cli_cover_not_file, {\r\n code: 4,\r\n params: { path: absolutePath },\r\n });\r\n }\r\n if (stat.size > COVER_MAX_BYTES) {\r\n throw cliError(I18N_KEYS.limit_resource_image_size, { code: 4 });\r\n }\r\n const ext = path.extname(absolutePath).toLowerCase();\r\n if (!COVER_EXT.has(ext)) {\r\n throw cliError(I18N_KEYS.cli_cover_format_unsupported, {\r\n code: 4,\r\n hint: '使用 .jpg/.jpeg/.png/.gif',\r\n });\r\n }\r\n\r\n const buf = fs.readFileSync(absolutePath);\r\n if (ext === '.gif' && isAnimatedGif(buf)) {\r\n throw cliError(I18N_KEYS.cli_cover_gif_no_animation, { code: 4 });\r\n }\r\n}\r\n\r\n/** 本地路径 → uploadImage → URL;已是 http(s) 则原样返回 */\r\nexport async function resolveCoverImageUrl(cover: string, cwd?: string): Promise<string> {\r\n const trimmed = cover.trim();\r\n if (!trimmed) throw cliError(I18N_KEYS.cli_cover_empty, { code: 4 });\r\n if (looksLikeRemoteCoverUrl(trimmed)) return trimmed;\r\n\r\n const absolute = path.resolve(resolveCwd(cwd), trimmed);\n assertLocalCoverFile(absolute);\n assertExplicitEnvForWriteOperation();\n\r\n const buf = fs.readFileSync(absolute);\r\n const file = new File([buf], path.basename(absolute), {\r\n type:\r\n path.extname(absolute).toLowerCase() === '.png'\r\n ? 'image/png'\r\n : path.extname(absolute).toLowerCase() === '.gif'\r\n ? 'image/gif'\r\n : 'image/jpeg',\r\n });\r\n const result = await FServiceAPI.Storage.uploadImage({ file }, {\r\n timeout: 120_000,\r\n });\r\n const data = unwrapData<string | { url?: string; fileUrl?: string }>(result);\r\n const url =\r\n typeof data === 'string'\r\n ? data\r\n : data && typeof data === 'object'\r\n ? data.url || data.fileUrl\r\n : undefined;\r\n if (!url) {\r\n throw cliError(I18N_KEYS.cli_cover_upload_no_url, { code: 1, details: result });\r\n }\r\n return url;\r\n}\r\n","import { getCurrentAuth } from '../core/auth.js';\r\nimport { FServiceAPI, FUtil } from '../platform/index.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\ntype ApiEnvelope<T> = {\r\n ret?: number;\r\n errCode?: number;\r\n errcode?: number;\r\n msg?: string;\r\n data?: T;\r\n};\r\n\r\nconst IMAGE_EXT = new Set(['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp']);\r\n\r\nexport function isImageFilename(filename: string): boolean {\r\n const ext = filename.slice(filename.lastIndexOf('.')).toLowerCase();\r\n return IMAGE_EXT.has(ext);\r\n}\r\n\r\nfunction buildCoverAuthHeaders(): Record<string, string> {\r\n const auth = getCurrentAuth();\r\n if (!auth) {\r\n throw cliError(I18N_KEYS.cover_sse_login_required, { code: 2, hint: 'freelog-cli login' });\r\n }\r\n const headers: Record<string, string> = {\r\n Accept: 'text/event-stream',\r\n 'Content-Type': 'application/json',\r\n };\r\n if (auth.cookie) headers.Cookie = auth.cookie;\r\n const authorization =\r\n auth.authorization || (auth.token ? `Bearer ${auth.token}` : undefined);\r\n if (authorization) headers.Authorization = authorization;\r\n return headers;\r\n}\r\n\r\nfunction parseCoverSsePayload(raw: string): { sha1: string; url: string } | undefined {\r\n try {\r\n const data = JSON.parse(raw) as { sha1?: string; url?: string };\r\n if (data.sha1 && data.url?.trim()) return { sha1: data.sha1, url: data.url.trim() };\r\n } catch {\r\n /* ignore malformed chunk */\r\n }\r\n return undefined;\r\n}\r\n\r\n/** Console CoverGenerator.generateCoverPromise 等价(SSE) */\r\nexport async function generateCoverUrlsViaSse(\r\n sha1s: string[],\r\n timeoutMs = 120_000,\r\n): Promise<string[]> {\r\n if (!sha1s.length) return [];\r\n\r\n const base = FUtil.Format.completeUrlByDomain('api');\r\n const url = `${base}/v2/storages/files/generateCoverImageSSE`;\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\r\n\r\n const urls: string[] = [];\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: buildCoverAuthHeaders(),\r\n body: JSON.stringify({ sha1Array: sha1s }),\r\n signal: controller.signal,\r\n });\r\n if (!response.ok) {\r\n throw cliError(I18N_KEYS.cover_sse_http_error, { code: 1 });\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n if (!reader) throw cliError(I18N_KEYS.cover_sse_body_unreadable, { code: 1 });\r\n\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n buffer += decoder.decode(value, { stream: true });\r\n const parts = buffer.split('\\n\\n');\r\n buffer = parts.pop() || '';\r\n for (const part of parts) {\r\n for (const line of part.split('\\n')) {\r\n if (!line.startsWith('data:')) continue;\r\n const row = parseCoverSsePayload(line.slice(5).trim());\r\n if (row?.url) urls.push(row.url);\r\n }\r\n }\r\n }\r\n return urls;\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\n/** Console CoverGenerator SSE 的 Node 等价:同步 generateCoverImage API */\r\nexport async function generateCoverUrlFromSha1(sha1: string): Promise<string | undefined> {\r\n try {\r\n const response = (await FServiceAPI.Storage.generateCoverImage({ sha1 })) as ApiEnvelope<\r\n string | { url?: string; fileUrl?: string; coverUrl?: string }\r\n >;\r\n const ret = response.ret ?? 0;\r\n const errCode = response.errCode ?? response.errcode ?? 0;\r\n if (ret !== 0 || errCode !== 0) return undefined;\r\n\r\n const data = response.data;\r\n if (typeof data === 'string' && data.trim()) return data.trim();\r\n if (data && typeof data === 'object') {\r\n const url = data.url || data.fileUrl || data.coverUrl;\r\n if (url?.trim()) return url.trim();\r\n }\r\n return undefined;\r\n } catch {\r\n // dev 偶发「文件异常」等封面服务错误:与 Console 一致,封面可选,不阻断发版\r\n return undefined;\r\n }\r\n}\r\n\r\nexport async function compareCoverSyncAndSse(sha1: string): Promise<{\r\n ok: boolean;\r\n syncUrl?: string;\r\n sseUrls: string[];\r\n error?: string;\r\n}> {\r\n const sseUrls = await generateCoverUrlsViaSse([sha1]);\r\n const syncUrl = await generateCoverUrlFromSha1(sha1);\r\n const sseUrl = sseUrls[0];\r\n if (!syncUrl && !sseUrl) {\r\n return { ok: false, syncUrl, sseUrls, error: '同步与 SSE 均未返回封面 URL' };\r\n }\r\n if (!syncUrl || !sseUrl) {\r\n return {\r\n ok: false,\r\n syncUrl,\r\n sseUrls,\r\n error: `仅一侧有 URL(sync=${syncUrl || '(none)'} sse=${sseUrl || '(none)'})`,\r\n };\r\n }\r\n return { ok: syncUrl === sseUrl, syncUrl, sseUrls };\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\n\r\nconst DEFAULT_PATTERNS = [\n '.freelog/',\n '.freelog-auth',\n '.git/',\n '.hg/',\n '.svn/',\n 'node_modules/',\n '.cache/',\n '.turbo/',\n '.vite/',\n 'coverage/',\n '.DS_Store',\n 'Thumbs.db',\r\n 'desktop.ini',\r\n '*.tmp',\r\n '~$*',\r\n '.freelogignore',\n 'freelog.*.config',\n 'freelog.batch.json',\n 'freelog.batch.yaml',\r\n 'freelog.batch.yml',\r\n];\r\n\r\nfunction normalizeRelativePath(value: string): string {\n return value.replace(/\\\\/g, '/').replace(/^\\.\\//, '').replace(/^\\/+|\\/+$/g, '');\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n let source = '';\n for (let index = 0; index < pattern.length; index += 1) {\n const char = pattern[index];\n if (char === '*') {\n if (pattern[index + 1] === '*') {\n if (pattern[index + 2] === '/') {\n source += '(?:.*/)?';\n index += 2;\n } else {\n source += '.*';\n index += 1;\n }\n } else {\n source += '[^/]*';\n }\n } else if (char === '?') {\n source += '[^/]';\n } else {\n source += char.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n }\n return new RegExp(`^${source}$`, 'i');\n}\n\nfunction matchesPattern(relativePath: string, pattern: string, isDirectory: boolean): boolean {\n const normalizedPath = normalizeRelativePath(relativePath);\n const directoryPattern = pattern.endsWith('/');\n const normalizedPattern = normalizeRelativePath(pattern);\n if (!normalizedPattern) return false;\n\n const pathCandidates = normalizedPattern.includes('/')\n ? [normalizedPath]\n : normalizedPath.split('/');\n const matcher = globToRegExp(normalizedPattern);\n if (directoryPattern) {\n const segments = normalizedPath.split('/');\n if (!normalizedPattern.includes('/')) {\n return segments.some((segment) => matcher.test(segment));\n }\n return segments.some((_, index) => matcher.test(segments.slice(0, index + 1).join('/'))) ||\n (isDirectory && pathCandidates.some((candidate) => matcher.test(candidate)));\n }\n return pathCandidates.some((candidate) => matcher.test(candidate));\n}\n\r\nexport function parseFreelogIgnoreContent(content: string): string[] {\n const patterns = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'));\n const unsupported = patterns.find((pattern) => pattern.startsWith('!'));\n if (unsupported) {\n throw new Error(`.freelogignore v1 不支持反选规则: ${unsupported}`);\n }\n return patterns;\n}\r\n\r\nexport function loadFreelogIgnorePatterns(dir: string): string[] {\r\n const resolved = path.resolve(dir);\r\n const patterns = [...DEFAULT_PATTERNS];\r\n const candidates = [\r\n path.join(resolved, '.freelogignore'),\r\n path.join(resolved, '.freelog', 'ignore'),\r\n ];\r\n for (const file of candidates) {\r\n if (!fs.existsSync(file)) continue;\r\n patterns.push(...parseFreelogIgnoreContent(fs.readFileSync(file, 'utf8')));\r\n }\r\n return [...new Set(patterns)];\r\n}\r\n\r\nexport function isIgnoredFilename(name: string, patterns: string[]): boolean {\n return isIgnoredPath(name, false, patterns);\n}\n\nexport function isIgnoredPath(\n relativePath: string,\n isDirectory: boolean,\n patterns: string[],\n): boolean {\n return patterns.some((pattern) => matchesPattern(relativePath, pattern, isDirectory));\n}\n\r\nexport function filterIgnoredFiles(files: string[], patterns: string[]): string[] {\r\n return files.filter((file) => !isIgnoredFilename(file, patterns));\r\n}\r\n\r\nexport const DEFAULT_FREELOGIGNORE = `# freelog ignore — 批量扫描与目录压缩共用(项目根相对 glob)\n.DS_Store\r\nThumbs.db\r\ndesktop.ini\r\n*.tmp\r\n~$*\r\n`;\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport type {\r\n AuthExcludedItem,\r\n BaseUpcastResource,\r\n BatchSignContract,\r\n CustomPropertyDescriptor,\r\n VersionDependency,\r\n} from '../../config/project.js';\r\nimport { ensureProjectGitignore, writeResourceProject, writeVersionProject, tryLoadResourceProject, tryLoadVersionProject } from '../../config/project.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { FServiceAPI, getSHA1Hash, unwrapData } from '../../platform/index.js';\r\nimport { uploadFileIfNeeded } from '../storageUpload.js';\r\nimport {\r\n inheritDataFromVersionConfig,\r\n resolveCreateVersionPropertiesFromFile,\r\n} from '../fileProperty/index.js';\r\nimport { assertLeafResourceTypeCode } from '../typeService.js';\r\nimport { assertLocalFileAllowedByType, isAutoGenerateCoverEnabled } from '../resourceTypeCapabilities.js';\r\nimport { resolveCoverImageUrl } from '../coverUpload.js';\r\nimport { generateCoverUrlFromSha1 } from '../coverGenerateService.js';\r\nimport { assertSha1PublishAllowed } from '../shared/guards/index.js';\r\nimport { resolveCreateApiResourceTypeName } from '../resourceName.js';\r\nimport { loadFreelogIgnorePatterns, filterIgnoredFiles } from '../freelogIgnore.js';\r\nimport { loadPoliciesFromFile, readBatchConfig, resolveConfigPath } from './config.js';\r\nimport type { FromDirCreatedItem, PreparedFile } from './types.js';\r\n\r\nconst CONFIG_RE = /^freelog\\..*\\.config/i;\r\n\r\nfunction sanitizeBasename(name: string): string {\r\n const base = path.parse(name).name || 'file';\r\n const cleaned = base\r\n .replace(/[\\\\/:*?\"<>|\\s@$#]+/g, '_')\r\n .replace(/_+/g, '_')\r\n .replace(/^_|_$/g, '');\r\n return cleaned || 'file';\r\n}\r\n\r\n/** Console creatorBatch:文件名推导 name 先截 50 字,再 generateResourceNames;显式 name 仍受 60 字 HARD 限制。 */\r\nexport function resolveInitialBatchResourceName(explicitName: string | undefined, safeDir: string): string {\r\n const trimmed = explicitName?.trim();\r\n if (trimmed) return trimmed.slice(0, 60);\r\n return safeDir.slice(0, 50);\r\n}\r\n\r\nfunction listFlatFiles(dir: string): string[] {\r\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\r\n throw cliError(I18N_KEYS.directory_not_found, { code: 4 });\r\n }\r\n const entries = fs.readdirSync(dir, { withFileTypes: true });\r\n const files: string[] = [];\r\n for (const ent of entries) {\r\n if (!ent.isFile()) continue;\r\n if (CONFIG_RE.test(ent.name)) continue;\r\n files.push(path.join(dir, ent.name));\r\n }\r\n files.sort((a, b) => path.basename(a).localeCompare(path.basename(b)));\r\n const patterns = loadFreelogIgnorePatterns(dir);\r\n const filtered = filterIgnoredFiles(files, patterns);\r\n if (filtered.length === 0) {\r\n throw cliError(I18N_KEYS.no_flat_files_in_dir, {\r\n code: 4,\r\n hint: patterns.length ? '检查 .freelogignore 是否排除了全部文件' : undefined,\r\n });\r\n }\r\n return filtered;\r\n}\r\n\r\nexport function resolveUniqueSubdir(parent: string, safeName: string): string {\r\n let candidate = path.join(parent, safeName);\r\n if (!fs.existsSync(candidate)) return candidate;\r\n let i = 2;\r\n while (fs.existsSync(path.join(parent, `${safeName}_${i}`))) i += 1;\r\n return path.join(parent, `${safeName}_${i}`);\r\n}\r\n\r\n/** 同目录重跑 import-dir:已存在相同 SHA1 的子目录则复用,避免重复 create */\r\nexport function resolveExistingImportBySha1(\r\n parent: string,\r\n item: PreparedFile,\r\n): FromDirCreatedItem | null {\r\n if (!fs.existsSync(parent)) return null;\r\n for (const name of fs.readdirSync(parent)) {\r\n const subdir = path.join(parent, name);\r\n try {\r\n if (!fs.statSync(subdir).isDirectory()) continue;\r\n const resource = tryLoadResourceProject(subdir);\r\n const version = tryLoadVersionProject(subdir);\r\n if (!resource?.data.resourceId || !version?.data.fileSha1) continue;\r\n if (version.data.fileSha1 !== item.sha1) continue;\r\n return {\r\n subdir: path.relative(parent, subdir) || name,\r\n resourceId: resource.data.resourceId,\r\n resourceName: resource.data.resourceName || item.name,\r\n resourceTitle: resource.data.resourceTitle || item.resourceTitle,\r\n itemTitle: item.itemTitle,\r\n authExcludedItems: version.data.authExcludedItems,\r\n };\r\n } catch {\r\n continue;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function writeItemConfigs(opts: {\r\n subdir: string;\r\n sourceFile: string;\r\n resourceId: string;\r\n resourceName: string;\r\n resourceTypeCode: string;\r\n resourceTypeName?: string;\r\n resourceTitle: string;\r\n fileSha1: string;\r\n filename: string;\r\n version: string;\r\n description: string;\r\n intro?: string;\r\n coverImages?: string[];\r\n tags?: string[];\r\n dependencies?: VersionDependency[];\r\n baseUpcastResources?: BaseUpcastResource[];\r\n authExcludedItems?: AuthExcludedItem[];\r\n batchSignContracts?: BatchSignContract[];\r\n inputAttrs?: Array<{ key: string; value: string | number | boolean }>;\r\n customPropertyDescriptors?: CustomPropertyDescriptor[];\r\n versionId?: string;\r\n userId?: number | string;\r\n username?: string;\r\n}) {\r\n fs.mkdirSync(opts.subdir, { recursive: true });\r\n const destName = path.basename(opts.sourceFile);\r\n const destFile = path.join(opts.subdir, destName);\r\n if (path.resolve(opts.sourceFile) !== path.resolve(destFile)) {\r\n fs.copyFileSync(opts.sourceFile, destFile);\r\n }\r\n\r\n writeResourceProject(\r\n {\r\n resourceId: opts.resourceId,\r\n resourceName: opts.resourceName,\r\n resourceType: [],\r\n resourceTypeCode: opts.resourceTypeCode,\r\n resourceTypeName: opts.resourceTypeName,\r\n resourceTitle: opts.resourceTitle,\r\n intro: opts.intro,\r\n coverImages: opts.coverImages,\r\n tags: opts.tags,\r\n userId: opts.userId,\r\n username: opts.username,\r\n },\r\n opts.subdir,\r\n );\r\n writeVersionProject(\r\n {\r\n resourceId: opts.resourceId,\r\n resourceName: opts.resourceName,\r\n resourceTypeCode: opts.resourceTypeCode,\r\n version: opts.version,\r\n filePath: destName,\r\n fileSha1: opts.fileSha1,\r\n filename: opts.filename,\r\n description: opts.description,\r\n versionId: opts.versionId,\r\n published: true,\r\n userId: opts.userId,\r\n username: opts.username,\r\n dependencies: opts.dependencies,\r\n baseUpcastResources: opts.baseUpcastResources,\r\n authExcludedItems: opts.authExcludedItems,\r\n inputAttrs: opts.inputAttrs,\r\n customPropertyDescriptors: opts.customPropertyDescriptors,\r\n },\r\n opts.subdir,\r\n );\r\n ensureProjectGitignore(opts.subdir);\r\n}\r\n\r\nexport function normalizeBatchSignContracts(\r\n entries: BatchSignContract[] | undefined,\r\n): Array<{ resourceId: string; policyIds: string[]; subjectType?: string }> | undefined {\r\n if (!entries?.length) return undefined;\r\n return entries.map((entry) => ({\r\n resourceId: entry.resourceId,\r\n policyIds: entry.policyIds,\r\n ...(entry.subjectType ? { subjectType: entry.subjectType } : {}),\r\n }));\r\n}\r\n\r\n/** authExcluded 单条 createVersion 已走 batchSetContracts;勿再传 batchSignContracts(平台格式校验失败)。 */\r\nfunction createVersionBatchSignContracts(item: PreparedFile) {\r\n if (item.authExcludedItems?.length) return undefined;\r\n return normalizeBatchSignContracts(item.batchSignContracts);\r\n}\r\n\r\nexport async function prepareFiles(opts: {\r\n dir: string;\r\n typeCode?: string;\r\n resourceTypeName?: string;\r\n titlePrefix?: string;\r\n username: string;\r\n cwd?: string;\r\n configFile?: string;\r\n}): Promise<PreparedFile[]> {\r\n const configPath = resolveConfigPath(opts.cwd, opts.dir, opts.configFile);\r\n const config = configPath ? readBatchConfig(configPath) : null;\r\n const configBaseDir = configPath ? path.dirname(configPath) : opts.dir;\r\n const defaults = config?.defaults || {};\r\n const defaultPolicies =\r\n defaults.policies || loadPoliciesFromFile(configBaseDir, defaults.policyFile);\r\n const rows = config\r\n ? config.items.map((item) => ({\r\n absolutePath: path.resolve(configBaseDir, item.filePath),\r\n item,\r\n }))\r\n : listFlatFiles(opts.dir).map((absolutePath) => ({ absolutePath, item: null }));\r\n const prepared: PreparedFile[] = [];\r\n\r\n for (const { absolutePath, item } of rows) {\r\n if (!fs.existsSync(absolutePath) || !fs.statSync(absolutePath).isFile()) {\r\n throw cliError(I18N_KEYS.batch_file_not_found, { code: 4 });\r\n }\r\n const filename = path.basename(absolutePath);\r\n const sha1 = await getSHA1Hash(absolutePath);\r\n await assertSha1PublishAllowed(sha1);\r\n await uploadFileIfNeeded(absolutePath, sha1);\r\n const safeDir = sanitizeBasename(filename);\r\n const resourceTypeCode = item?.resourceTypeCode || defaults.resourceTypeCode || opts.typeCode;\r\n if (!resourceTypeCode?.trim()) {\r\n throw cliError(I18N_KEYS.batch_missing_resource_type, {\r\n code: 4,\r\n hint: '传 --resource-type,或在 freelog.batch.json 的 defaults.resourceTypeCode / item.resourceTypeCode 中声明',\r\n });\r\n }\r\n const typeInfo = await assertLeafResourceTypeCode(resourceTypeCode);\r\n const name = resolveInitialBatchResourceName(item?.name, safeDir);\r\n const resourceTitle = (\r\n item?.resourceTitle ||\r\n `${opts.titlePrefix || ''}${path.parse(filename).name}`\r\n ).slice(0, 100);\r\n assertLocalFileAllowedByType({\r\n typeInfo,\r\n filePath: absolutePath,\r\n filename,\r\n });\r\n const coverImagesInput = item?.coverImages ?? defaults.coverImages;\r\n let coverImages = coverImagesInput\r\n ? await Promise.all(coverImagesInput.map((cover) => resolveCoverImageUrl(cover, configBaseDir)))\r\n : undefined;\r\n if (!coverImages?.length && isAutoGenerateCoverEnabled(typeInfo)) {\r\n const generatedCover = await generateCoverUrlFromSha1(sha1);\r\n if (generatedCover) coverImages = [generatedCover];\r\n }\r\n const policies =\r\n item?.policies ||\r\n loadPoliciesFromFile(configBaseDir, item?.policyFile) ||\r\n defaultPolicies;\r\n const manifestAttrs = {\r\n inputAttrs: item?.inputAttrs ?? defaults.inputAttrs ?? [],\r\n customPropertyDescriptors:\r\n item?.customPropertyDescriptors ?? defaults.customPropertyDescriptors ?? [],\r\n };\r\n const resolvedProperties = await resolveCreateVersionPropertiesFromFile({\r\n sha1,\r\n resourceTypeCode,\r\n inheritData: inheritDataFromVersionConfig(manifestAttrs),\r\n });\r\n prepared.push({\r\n absolutePath,\r\n filename,\r\n sha1,\r\n name,\r\n resourceTitle,\r\n resourceTypeCode,\r\n resourceTypeName: item?.resourceTypeName || defaults.resourceTypeName || opts.resourceTypeName,\r\n safeDir,\r\n version: item?.version || defaults.version || '1.0.0',\r\n description: item?.description ?? defaults.description ?? '',\r\n intro: item?.intro ?? defaults.intro,\r\n coverImages,\r\n tags: item?.tags ?? defaults.tags,\r\n policies,\r\n dependencies: item?.dependencies ?? defaults.dependencies ?? [],\r\n baseUpcastResources: item?.baseUpcastResources ?? defaults.baseUpcastResources ?? [],\r\n authExcludedItems: item?.authExcludedItems ?? defaults.authExcludedItems ?? [],\r\n batchSignContracts: item?.batchSignContracts ?? defaults.batchSignContracts ?? [],\r\n inputAttrs: resolvedProperties.inputAttrs,\r\n customPropertyDescriptors: resolvedProperties.customPropertyDescriptors,\r\n itemTitle: item?.itemTitle,\r\n });\r\n }\r\n return prepared;\r\n}\r\n\r\nfunction getRecordValue<T = unknown>(value: unknown, key: string): T | undefined {\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\r\n return (value as Record<string, T>)[key];\r\n}\r\n\r\nfunction normalizeGeneratedResourceNames(data: unknown, expectedCount: number): string[] {\r\n const rows = Array.isArray(data)\r\n ? data\r\n : Array.isArray(getRecordValue<unknown[]>(data, 'dataList'))\r\n ? getRecordValue<unknown[]>(data, 'dataList')!\r\n : null;\r\n if (!rows || rows.length !== expectedCount) {\r\n throw cliError(I18N_KEYS.generate_names_response_invalid, { code: 1, details: data });\r\n }\r\n return rows.map((row) => {\r\n const next =\r\n getRecordValue<string>(row, 'newResourceName') ||\r\n getRecordValue<string>(row, 'resourceName') ||\r\n getRecordValue<string>(row, 'name');\r\n if (!next) {\r\n throw cliError(I18N_KEYS.generate_names_missing_name, {\r\n code: 1,\r\n details: row,\r\n });\r\n }\r\n return next;\r\n });\r\n}\r\n\r\nexport async function applyGeneratedResourceNames(prepared: PreparedFile[]): Promise<PreparedFile[]> {\r\n const envelope = await FServiceAPI.Resource.generateResourceNames({\r\n resourceNames: prepared.map((p) => p.name),\r\n });\r\n const names = normalizeGeneratedResourceNames(unwrapData(envelope), prepared.length);\r\n return prepared.map((item, index) => ({\r\n ...item,\r\n name: names[index] || item.name,\r\n }));\r\n}\r\n\r\nexport async function createOneResource(\r\n item: PreparedFile,\r\n onResourceCreated?: (created: { resourceId: string; resourceName: string }) => void,\r\n): Promise<{ resourceId: string; resourceName: string; versionId?: string }> {\r\n const createEnv = await FServiceAPI.Resource.create({\r\n name: item.name,\r\n resourceTypeCode: item.resourceTypeCode,\r\n resourceTypeName: resolveCreateApiResourceTypeName(item.resourceTypeCode, {\r\n manifest: item.resourceTypeName,\r\n }),\r\n resourceTitle: item.resourceTitle,\r\n intro: item.intro,\r\n coverImages: item.coverImages,\r\n tags: item.tags,\r\n policies: item.policies,\r\n } as Parameters<typeof FServiceAPI.Resource.create>[0]);\r\n const created = unwrapData<{ resourceId?: string; resourceName?: string }>(createEnv);\r\n if (!created?.resourceId) {\r\n throw cliError(I18N_KEYS.batch_create_failed, { code: 1, details: created });\r\n }\r\n onResourceCreated?.({\r\n resourceId: created.resourceId,\r\n resourceName: created.resourceName || item.name,\r\n });\r\n const versionEnv = await FServiceAPI.Resource.createVersion({\r\n resourceId: created.resourceId,\r\n version: item.version,\r\n fileSha1: item.sha1,\r\n filename: item.filename,\r\n description: item.description,\r\n dependencies: item.dependencies || [],\r\n baseUpcastResources: item.baseUpcastResources || [],\r\n authExcludedItems: item.authExcludedItems || [],\r\n batchSignContracts: createVersionBatchSignContracts(item),\r\n inputAttrs: item.inputAttrs,\r\n customPropertyDescriptors: item.customPropertyDescriptors,\r\n } as Parameters<typeof FServiceAPI.Resource.createVersion>[0]);\r\n const versionData = unwrapData<{ versionId?: string }>(versionEnv);\r\n return {\r\n resourceId: created.resourceId,\r\n resourceName: created.resourceName || item.name,\r\n versionId: versionData?.versionId,\r\n };\r\n}\r\n\r\nfunction isDuplicateVersionError(error: unknown): boolean {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n return /版本.*已存在|version.*exist/i.test(msg);\r\n}\r\n\r\nasync function resourceHasVersion(resourceId: string, version: string): Promise<boolean> {\r\n const listEnv = await FServiceAPI.Resource.getVersionListByResourceID({\r\n resourceId,\r\n } as Parameters<typeof FServiceAPI.Resource.getVersionListByResourceID>[0]);\r\n const list = unwrapData<Array<{ version?: string }> | { dataList?: Array<{ version?: string }> }>(\r\n listEnv,\r\n );\r\n const rows = Array.isArray(list)\r\n ? list\r\n : Array.isArray((list as { dataList?: unknown[] })?.dataList)\r\n ? (list as { dataList: Array<{ version?: string }> }).dataList\r\n : [];\r\n return rows.some((row) => row.version === version);\r\n}\r\n\r\nexport async function ensureVersionAfterCreateBatch(\r\n item: PreparedFile,\r\n resourceId: string,\r\n): Promise<{ versionId?: string }> {\r\n try {\r\n if (await resourceHasVersion(resourceId, item.version)) return {};\r\n } catch {\r\n // 版本列表只是优化查询;创建版本本身仍是最终确认点。\r\n }\r\n\r\n try {\r\n const versionEnv = await FServiceAPI.Resource.createVersion({\r\n resourceId,\r\n version: item.version,\r\n fileSha1: item.sha1,\r\n filename: item.filename,\r\n description: item.description,\r\n dependencies: item.dependencies || [],\r\n baseUpcastResources: item.baseUpcastResources || [],\r\n authExcludedItems: item.authExcludedItems || [],\r\n batchSignContracts: createVersionBatchSignContracts(item),\r\n inputAttrs: item.inputAttrs,\r\n customPropertyDescriptors: item.customPropertyDescriptors,\r\n } as Parameters<typeof FServiceAPI.Resource.createVersion>[0]);\r\n const versionData = unwrapData<{ versionId?: string }>(versionEnv);\r\n return { versionId: versionData?.versionId };\r\n } catch (error) {\r\n if (isDuplicateVersionError(error)) return {};\r\n throw error;\r\n }\r\n}\r\n","import { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport type { CreateBatchResultItem } from './types.js';\r\n\r\nfunction getRecordValue<T = unknown>(value: unknown, key: string): T | undefined {\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\r\n return (value as Record<string, T>)[key];\r\n}\nfunction extractArrayItems(data: unknown): CreateBatchResultItem[] | null {\r\n if (Array.isArray(data)) return data as CreateBatchResultItem[];\r\n const dataList = getRecordValue<CreateBatchResultItem[]>(data, 'dataList');\r\n if (Array.isArray(dataList)) return dataList;\r\n const resources = getRecordValue<CreateBatchResultItem[]>(data, 'resources');\r\n if (Array.isArray(resources)) return resources;\r\n return null;\r\n}\r\n\r\nexport function normalizeCreateBatchResults(\r\n data: unknown,\r\n resourceNames: string[],\r\n): CreateBatchResultItem[] {\r\n const arrayItems = extractArrayItems(data);\r\n if (arrayItems) return arrayItems;\r\n\r\n if (!data || typeof data !== 'object' || Array.isArray(data)) {\r\n throw cliError(I18N_KEYS.create_batch_response_invalid, { code: 1, details: data });\r\n }\r\n\r\n const record = data as Record<string, unknown>;\r\n const hasConsoleShape = resourceNames.some((name) =>\r\n Object.prototype.hasOwnProperty.call(record, name),\r\n );\r\n if (!hasConsoleShape) {\r\n throw cliError(I18N_KEYS.create_batch_response_invalid, { code: 1, details: data });\r\n }\r\n\r\n return resourceNames.map((name) => {\r\n const item = record[name];\r\n const payload = getRecordValue<CreateBatchResultItem | null>(item, 'data');\r\n if (payload && typeof payload === 'object') {\r\n return {\r\n name,\r\n ...payload,\r\n };\r\n }\r\n return { name };\r\n });\n}\n","export type BatchImportProgressEvent =\r\n | { event: 'start'; total: number }\r\n | {\r\n event: 'skip';\r\n index: number;\r\n file: string;\r\n resourceId: string;\r\n subdir: string;\r\n reason: 'sha1-reuse';\r\n }\r\n | {\r\n event: 'ok';\r\n index: number;\r\n file: string;\r\n resourceId: string;\r\n resourceName: string;\r\n subdir: string;\r\n }\r\n | { event: 'fail'; index: number; file: string; error: string }\r\n | { event: 'done'; ok: number; fail: number; total: number };\r\n\r\nexport function emitBatchProgress(\r\n sink: ((event: BatchImportProgressEvent) => void) | undefined,\r\n event: BatchImportProgressEvent,\r\n): void {\r\n sink?.(event);\r\n}\r\n\r\nexport interface BatchProgressFormatter {\r\n (event: BatchImportProgressEvent): string;\r\n}\r\n\r\n/** NDJSON 进度行(DESIGN schemaVersion + seq + event + data) */\r\nexport function createBatchProgressFormatter(command: string): BatchProgressFormatter {\r\n let seq = 0;\r\n return (event: BatchImportProgressEvent) => {\r\n seq += 1;\r\n const { event: eventName, ...data } = event;\r\n return `${JSON.stringify({\r\n schemaVersion: 1,\r\n command,\r\n seq,\r\n event: eventName,\r\n data,\r\n })}\\n`;\r\n };\r\n}\r\n\r\nexport function formatBatchProgressLine(\r\n event: BatchImportProgressEvent,\r\n opts?: { command?: string; seq?: number },\r\n): string {\r\n const { event: eventName, ...data } = event;\r\n return `${JSON.stringify({\r\n schemaVersion: 1,\r\n command: opts?.command ?? 'resource import-dir',\r\n seq: opts?.seq ?? 1,\r\n event: eventName,\r\n data,\r\n })}\\n`;\r\n}\r\n","import { FServiceAPI } from '../../platform/index.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport type { CustomPropertyDescriptor, VersionProject } from '../../config/project.js';\r\n\r\nexport type CreateVersionParams = Parameters<typeof FServiceAPI.Resource.createVersion>[0];\r\ntype CreateVersionInputAttrs = NonNullable<CreateVersionParams['inputAttrs']>;\r\ntype CreateVersionCustomProperty = NonNullable<CreateVersionParams['customPropertyDescriptors']>[number];\r\n\r\nconst CUSTOM_PROPERTY_TYPES = new Set<CreateVersionCustomProperty['type']>([\r\n 'editableText',\r\n 'readonlyText',\r\n 'radio',\r\n 'checkbox',\r\n 'select',\r\n]);\r\n\r\nexport function buildCreateVersionInputAttrs(versionCfg: VersionProject): CreateVersionInputAttrs | undefined {\r\n const inputAttrs = (versionCfg.inputAttrs || [])\r\n .filter((a) => a?.key && a.key !== 'runtimeVersion')\r\n .map((a) => ({ key: a.key, value: String(a.value ?? '') }));\r\n\r\n if (versionCfg.runtimeVersion) {\r\n inputAttrs.push({ key: 'runtimeVersion', value: String(versionCfg.runtimeVersion) });\r\n }\r\n\r\n return inputAttrs.length ? inputAttrs : undefined;\r\n}\r\n\r\nexport function normalizeCustomPropertyDescriptors(\r\n descriptors: CustomPropertyDescriptor[] | undefined,\r\n): CreateVersionCustomProperty[] | undefined {\r\n if (!descriptors?.length) return undefined;\r\n\r\n return descriptors\r\n .filter((desc) => desc?.key)\r\n .map((desc) => {\r\n if (!CUSTOM_PROPERTY_TYPES.has(desc.type as CreateVersionCustomProperty['type'])) {\r\n throw cliError(I18N_KEYS.custom_property_type_invalid, {\r\n code: 4,\r\n hint: '允许值:editableText / readonlyText / radio / checkbox / select',\r\n details: { key: desc.key, type: desc.type },\r\n });\r\n }\r\n return {\r\n key: desc.key,\r\n name: desc.name || desc.key,\r\n defaultValue: String(desc.defaultValue ?? ''),\r\n type: desc.type as CreateVersionCustomProperty['type'],\r\n candidateItems: desc.candidateItems?.map(String),\r\n remark: desc.remark,\r\n };\r\n });\r\n}\r\n\r\nexport function buildCreateVersionParams(opts: {\r\n resourceId: string;\r\n versionCfg: VersionProject;\r\n fileSha1: string;\r\n filename: string;\r\n}): CreateVersionParams {\r\n const { resourceId, versionCfg, fileSha1, filename } = opts;\r\n const dependencies = (versionCfg.dependencies || []).map((d) => ({\r\n resourceId: d.resourceId,\r\n versionRange: d.versionRange || '',\r\n }));\r\n\r\n return {\r\n resourceId,\r\n version: versionCfg.version,\r\n fileSha1,\r\n filename,\r\n description: versionCfg.description || '',\r\n videoCover: versionCfg.videoCover?.trim() || undefined,\r\n dependencies,\r\n baseUpcastResources: (versionCfg.baseUpcastResources || []).map((r) => ({\r\n resourceId: r.resourceId,\r\n })),\r\n authExcludedItems: (versionCfg.authExcludedItems || []).map((a) => ({\r\n resourceId: a.resourceId,\r\n excludedType: a.excludedType,\r\n excludedValue: a.excludedValue,\r\n })),\r\n batchSignContracts:\r\n versionCfg.batchSignContracts && versionCfg.batchSignContracts.length > 0\r\n ? versionCfg.batchSignContracts.map((entry) => ({\r\n resourceId: entry.resourceId,\r\n policyIds: entry.policyIds,\r\n ...(entry.subjectType ? { subjectType: entry.subjectType } : {}),\r\n }))\r\n : undefined,\r\n inputAttrs: buildCreateVersionInputAttrs(versionCfg),\r\n customPropertyDescriptors: normalizeCustomPropertyDescriptors(\r\n versionCfg.customPropertyDescriptors,\r\n ),\r\n };\r\n}\r\n","import { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport type { VersionProject } from '../../config/project/types.js';\nimport type { ProjectStore } from './types.js';\n\nexport function requireVersionProject(store: ProjectStore): VersionProject {\n const version = store.loadVersion();\n if (!version) {\n throw cliError(I18N_KEYS.manifest_version_missing, {\n code: 4,\n hint: 'freelog-cli version set --version <ver> --file <path>',\n });\n }\n return version;\n}\n","import fs from 'node:fs';\r\nimport os from 'node:os';\r\nimport path from 'node:path';\r\nimport AdmZip from 'adm-zip';\r\nimport { getSHA1Hash } from '../platform/index.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport type { VersionProject } from '../config/project.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport {\r\n assertLocalFileAllowedByType,\r\n resolveArtifactMode,\r\n} from './resourceTypeCapabilities.js';\r\nimport { assertSha1PublishAllowed } from './shared/guards/index.js';\r\nimport { isIgnoredPath, loadFreelogIgnorePatterns } from './freelogIgnore.js';\r\n\r\nconst STABLE_DOS_TIMESTAMP = 0x00210000; // 1980-01-01 00:00:00, stored without Date/TZ conversion\r\nconst TEMP_DIR_PREFIX = 'freelog-publish-';\r\n\r\nexport async function compressDirectory(\r\n buildPath: string,\r\n outputPath: string,\r\n filename: string,\r\n options: { ignoreRoot?: string } = {},\r\n): Promise<string> {\r\n const zip = new AdmZip();\r\n const ignoreRoot = path.resolve(options.ignoreRoot || buildPath);\r\n const patterns = loadFreelogIgnorePatterns(ignoreRoot);\r\n\r\n const addDirectory = (absoluteDir: string, archiveDir = ''): void => {\r\n const entries = fs.readdirSync(absoluteDir, { withFileTypes: true })\r\n .sort((left, right) => left.name.localeCompare(right.name, 'en'));\r\n for (const entry of entries) {\r\n const absolutePath = path.join(absoluteDir, entry.name);\r\n const archivePath = archiveDir ? `${archiveDir}/${entry.name}` : entry.name;\r\n const projectPath = normalizeArchivePath(path.relative(ignoreRoot, absolutePath));\r\n if (isIgnoredPath(projectPath, entry.isDirectory(), patterns)) continue;\r\n if (entry.isSymbolicLink()) {\r\n throw new Error(`压缩目录不支持符号链接: ${projectPath}`);\r\n }\r\n if (entry.isDirectory()) {\r\n addDirectory(absolutePath, archivePath);\r\n continue;\r\n }\r\n if (!entry.isFile()) continue;\r\n zip.addFile(normalizeArchivePath(archivePath), fs.readFileSync(absolutePath));\r\n const added = zip.getEntries().at(-1);\r\n if (added) {\r\n (added.header as typeof added.header & { timeval: number }).timeval = STABLE_DOS_TIMESTAMP;\r\n added.header.attr = 0;\r\n }\r\n }\r\n }\r\n addDirectory(buildPath);\r\n fs.mkdirSync(outputPath, { recursive: true });\r\n const zipPath = path.join(outputPath, filename);\r\n zip.writeZip(zipPath);\r\n return zipPath;\r\n}\r\n\r\nexport interface ProcessFileResult {\r\n filePath: string;\r\n filename: string;\r\n fileSha1: string;\r\n isTempFile: boolean;\r\n}\r\n\r\nfunction normalizeArchivePath(value: string): string {\r\n return value.replace(/\\\\/g, '/');\r\n}\r\n\r\nfunction isReusePlatformFile(versionConfig: VersionProject): boolean {\r\n if (versionConfig.reusePlatformFile === true) return true;\r\n return !versionConfig.filePath?.trim() && !!versionConfig.fileSha1?.trim();\r\n}\r\n\r\nasync function resolveReusePlatformFile(\r\n versionConfig: VersionProject,\r\n): Promise<ProcessFileResult> {\r\n const fileSha1 = versionConfig.fileSha1?.trim();\r\n const filename = versionConfig.filename?.trim();\r\n if (!fileSha1 || !filename) {\r\n throw cliError(I18N_KEYS.config_missing_filename_and_filepath, { code: 4 });\r\n }\r\n await assertSha1PublishAllowed(fileSha1);\r\n return { filePath: '', filename, fileSha1, isTempFile: false };\r\n}\r\n\r\nexport interface DryRunProcessFileResult extends ProcessFileResult {\r\n requiresCompression: boolean;\r\n unresolved: string[];\r\n}\r\n\r\n/**\r\n * Resolve and validate the local publish input without creating an archive.\r\n * A directory-backed release cannot have a final SHA1 until the archive exists,\r\n * so dry-run reports that value explicitly as unresolved.\r\n */\r\nexport async function planFileForPublish(opts: {\r\n versionConfig: VersionProject;\r\n resourceName: string;\r\n resourceType?: string | string[];\r\n resourceTypeCode?: string;\r\n resourceTypeInfo?: unknown;\r\n cwd?: string;\r\n}): Promise<DryRunProcessFileResult> {\r\n const { versionConfig, resourceName } = opts;\r\n if (isReusePlatformFile(versionConfig)) {\r\n const reused = await resolveReusePlatformFile(versionConfig);\r\n return {\r\n ...reused,\r\n requiresCompression: false,\r\n unresolved: [],\r\n };\r\n }\r\n const root = resolveCwd(opts.cwd);\r\n const requiresCompression = resolveArtifactMode({\r\n typeInfo: opts.resourceTypeInfo,\r\n manifestArtifactMode: versionConfig.artifactMode,\r\n }) === 'directory-zip';\r\n\r\n if (!requiresCompression) {\r\n const processed = await processFileForPublish(opts);\r\n return {\r\n ...processed,\r\n requiresCompression: false,\r\n unresolved: [],\r\n };\r\n }\r\n\r\n if (!versionConfig.filePath?.trim()) {\r\n throw cliError(I18N_KEYS.config_missing_filepath_compress, { code: 4 });\r\n }\r\n const absolute = path.resolve(root, versionConfig.filePath);\r\n if (!fs.existsSync(absolute)) {\r\n throw cliError(I18N_KEYS.version_filepath_not_found, { code: 4 });\r\n }\r\n if (!fs.statSync(absolute).isDirectory()) {\r\n throw cliError(I18N_KEYS.filepath_must_be_directory, {\r\n code: 4,\r\n params: { path: versionConfig.filePath },\r\n hint: '指向构建产物目录,如 dist',\r\n });\r\n }\r\n\r\n const safeName = (resourceName || 'resource').replace(/[^\\w.-]+/g, '_');\r\n return {\r\n filePath: absolute,\r\n filename: `${safeName}-${versionConfig.version}.zip`,\r\n fileSha1: 'unresolved',\r\n isTempFile: false,\r\n requiresCompression: true,\r\n unresolved: [\r\n 'fileSha1',\r\n 'createVersionParams.fileSha1',\r\n 'createVersionParams.inputAttrs',\r\n 'createVersionParams.customPropertyDescriptors',\r\n ],\r\n };\r\n}\r\n\r\n/**\r\n * 根据 artifactMode 处理正式发行物:\r\n * - directory-zip:filePath 须为目录 → 确定性 zip 临时文件\r\n * - file:filePath 须为单文件\r\n */\r\nexport async function processFileForPublish(opts: {\r\n versionConfig: VersionProject;\r\n resourceName: string;\r\n resourceType?: string | string[];\r\n resourceTypeCode?: string;\r\n resourceTypeInfo?: unknown;\r\n cwd?: string;\r\n}): Promise<ProcessFileResult> {\r\n const { versionConfig, resourceName } = opts;\r\n if (isReusePlatformFile(versionConfig)) {\r\n return resolveReusePlatformFile(versionConfig);\r\n }\r\n const root = resolveCwd(opts.cwd);\r\n const needCompress = resolveArtifactMode({\r\n typeInfo: opts.resourceTypeInfo,\r\n manifestArtifactMode: versionConfig.artifactMode,\r\n }) === 'directory-zip';\r\n\r\n let filePath: string;\r\n let filename: string;\r\n let isTempFile = false;\r\n let ownedTempDir: string | undefined;\r\n\r\n try {\r\n if (needCompress) {\r\n if (!versionConfig.filePath?.trim()) {\r\n throw cliError(I18N_KEYS.config_missing_filepath_compress, { code: 4 });\r\n }\r\n const absolute = path.resolve(root, versionConfig.filePath);\r\n if (!fs.existsSync(absolute)) {\r\n throw cliError(I18N_KEYS.version_filepath_not_found, { code: 4 });\r\n }\r\n const stats = fs.statSync(absolute);\r\n if (!stats.isDirectory()) {\r\n throw cliError(I18N_KEYS.filepath_must_be_directory, {\r\n code: 4,\r\n params: { path: versionConfig.filePath },\r\n hint: '指向构建产物目录,如 dist',\r\n });\r\n }\r\n const safeName = (resourceName || 'resource').replace(/[^\\w.-]+/g, '_');\r\n filename = `${safeName}-${versionConfig.version}.zip`;\r\n ownedTempDir = fs.mkdtempSync(path.join(os.tmpdir(), TEMP_DIR_PREFIX));\r\n filePath = await compressDirectory(absolute, ownedTempDir, filename, { ignoreRoot: root });\r\n isTempFile = true;\r\n } else {\r\n if (!versionConfig.filePath?.trim()) {\r\n if (!versionConfig.filename) {\r\n throw cliError(I18N_KEYS.config_missing_filename_and_filepath, { code: 4 });\r\n }\r\n filename = versionConfig.filename;\r\n filePath = path.resolve(root, filename);\r\n } else {\r\n const absolute = path.resolve(root, versionConfig.filePath);\r\n if (!fs.existsSync(absolute)) {\r\n throw cliError(I18N_KEYS.version_filepath_not_found, { code: 4 });\r\n }\r\n const stats = fs.statSync(absolute);\r\n if (stats.isFile()) {\r\n filePath = absolute;\r\n filename = versionConfig.filename || path.basename(absolute);\r\n } else {\r\n if (!versionConfig.filename) {\r\n throw cliError(I18N_KEYS.filepath_dir_needs_filename, {\r\n code: 4,\r\n hint: '或把 filePath 指到具体文件',\r\n });\r\n }\r\n filename = versionConfig.filename;\r\n filePath = path.resolve(absolute, filename);\r\n }\r\n }\r\n if (!fs.existsSync(filePath)) {\r\n throw cliError(I18N_KEYS.file_not_found, { code: 4 });\r\n }\r\n if (!fs.statSync(filePath).isFile()) {\r\n throw cliError(I18N_KEYS.filepath_must_be_file, {\r\n code: 4,\r\n });\r\n }\r\n }\r\n\r\n if (opts.resourceTypeInfo !== undefined) {\r\n assertLocalFileAllowedByType({\r\n typeInfo: opts.resourceTypeInfo,\r\n filePath,\r\n filename,\r\n });\r\n }\r\n\r\n const fileSha1 = await getSHA1Hash(filePath);\r\n await assertSha1PublishAllowed(fileSha1);\r\n return { filePath, filename, fileSha1, isTempFile };\r\n } catch (error) {\r\n if (ownedTempDir) cleanupOwnedTempDirectory(ownedTempDir);\r\n throw error;\r\n }\r\n}\r\n\r\nexport function cleanupTempFile(filePath: string | null | undefined): void {\r\n if (!filePath) return;\r\n try {\r\n if (fs.existsSync(filePath)) fs.unlinkSync(filePath);\r\n const parent = path.dirname(path.resolve(filePath));\r\n if (isOwnedTempDirectory(parent) && fs.existsSync(parent)) fs.rmdirSync(parent);\r\n } catch {\r\n // ignore\r\n }\r\n}\r\n\r\nfunction isOwnedTempDirectory(directory: string): boolean {\r\n const resolved = path.resolve(directory);\r\n return (\r\n path.dirname(resolved) === path.resolve(os.tmpdir()) &&\r\n path.basename(resolved).startsWith(TEMP_DIR_PREFIX)\r\n );\r\n}\r\n\r\nfunction cleanupOwnedTempDirectory(directory: string): void {\r\n if (!isOwnedTempDirectory(directory)) return;\r\n try {\r\n fs.rmSync(directory, { recursive: true, force: true });\r\n } catch {\r\n // ignore cleanup failures; preserve the original publish error\r\n }\r\n}\r\n","import { assertExplicitEnvForWriteOperation } from '../../core/command.js';\r\nimport semver from 'semver';\r\nimport { CliError } from '../../core/errors.js';\r\nimport { requireAuth } from '../../core/auth.js';\r\nimport { FServiceAPI, unwrapData } from '../../platform/index.js';\r\nimport { ensureSynced, fetchResourceInfo } from '../sync/index.js';\r\nimport { requireVersionProject } from '../store/requireVersion.js';\r\nimport type { ProjectStore } from '../store/types.js';\r\nimport { assertSemverLike } from '../validation.js';\r\nimport { fileExistsOnPlatform, uploadFileIfNeeded } from '../storageUpload.js';\r\nimport {\r\n cleanupTempFile,\r\n planFileForPublish,\r\n processFileForPublish,\r\n} from '../processFile.js';\r\nimport { assertResourceTypeCode } from '../typeService.js';\r\nimport { assertOptionalConfigAllowed } from '../resourceTypeCapabilities.js';\r\nimport {\r\n assertLocalCoverFile,\r\n looksLikeRemoteCoverUrl,\r\n resolveCoverImageUrl,\r\n} from '../coverUpload.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport {\r\n inheritDataFromVersionConfig,\r\n resolveCreateVersionPropertiesFromFile,\r\n} from '../fileProperty/index.js';\r\nimport {\r\n assertPublishNotCollectionCwd,\r\n assertPublishVersionReady,\r\n assertVersionGreaterThanLatest,\r\n isFrozenStatus,\r\n} from '../shared/guards/index.js';\r\nimport {\r\n buildCreateVersionParams,\r\n type CreateVersionParams,\r\n} from './createVersionParams.js';\r\nimport { assertOwnerMatch } from '../shared/owner.js';\r\nimport {\r\n applyPlatformFactsToResource,\r\n listingDrifted,\r\n} from '../shared/listing.js';\r\nimport type { ArtifactPipelineStages } from '../artifactPipeline.js';\r\nimport { assessDeclaredAuthorization, mergeDeclaredAuthSubjects } from '../authorizationTree.js';\r\nimport { buildConsoleHandoff } from '../../core/consoleUrl.js';\r\nimport path from 'node:path';\r\nimport { getCliEnv } from '../../core/env.js';\r\n\r\nfunction needsRuntimeVersion(resourceType: string[] | undefined, code: string | undefined): boolean {\r\n const joined = [...(resourceType || []), code || ''].join(' ').toLowerCase();\r\n return (\r\n joined.includes('主题') ||\r\n joined.includes('插件') ||\r\n joined.includes('theme') ||\r\n joined.includes('widget') ||\r\n joined.includes('plugin')\r\n );\r\n}\r\n\r\n/** --bump 基于平台 latestVersion 递增 patch;无有效 latestVersion 时从 1.0.0 开始。 */\r\nexport function computeBumpedVersion(latestVersion?: string): string {\r\n if (!latestVersion || !semver.valid(latestVersion)) return '1.0.0';\r\n const next = semver.inc(latestVersion, 'patch');\r\n if (!next) {\r\n throw cliError(I18N_KEYS.bump_version_compute_failed, { code: 4 });\r\n }\r\n return next;\r\n}\r\n\r\nasync function assertPublishableVersion(resourceId: string, version: string, latestVersion?: string) {\r\n assertSemverLike(version);\r\n\r\n const listEnv = await FServiceAPI.Resource.getVersionListByResourceID({\r\n resourceId,\r\n } as Parameters<typeof FServiceAPI.Resource.getVersionListByResourceID>[0]);\r\n const list = unwrapData<Array<{ version?: string }> | { dataList?: Array<{ version?: string }> }>(\r\n listEnv,\r\n );\r\n const versions = Array.isArray(list)\r\n ? list\r\n : Array.isArray((list as { dataList?: unknown[] })?.dataList)\r\n ? (list as { dataList: Array<{ version?: string }> }).dataList\r\n : [];\r\n if (versions.some((item) => item.version === version)) {\r\n throw cliError(I18N_KEYS.version_already_exists, {\r\n code: 4,\r\n hint: 'freelog-cli version set --version <新版本号>',\r\n });\r\n }\r\n\r\n assertVersionGreaterThanLatest(version, latestVersion);\r\n}\r\n\r\nexport interface PublishResult {\r\n resourceId: string;\r\n version: string;\r\n fileSha1: string;\r\n filename: string;\r\n versionId?: string;\r\n createVersionParams?: CreateVersionParams | Record<string, unknown>;\r\n dryRun?: boolean;\r\n unresolved?: string[];\r\n stages: ArtifactPipelineStages;\r\n}\r\n\r\nexport async function ensureSyncedReadOnly(opts: { store: ProjectStore }) {\r\n const store = opts.store;\r\n const auth = requireAuth();\r\n const localResource = store.loadResource();\r\n const resourceId = localResource.resourceId?.trim();\r\n if (!resourceId) {\r\n throw cliError(I18N_KEYS.no_local_resource_id, { code: 4 });\r\n }\r\n\r\n const info = await fetchResourceInfo(resourceId);\r\n assertOwnerMatch({\r\n authUserId: auth.userId,\r\n authUsername: auth.username,\r\n platformUserId: info.userId,\r\n platformUsername: info.username,\r\n hint: '切换账号或更换目录',\r\n });\r\n if (listingDrifted(localResource, info)) {\r\n throw cliError(I18N_KEYS.resource_info_mismatch, {\r\n code: 3,\r\n hint: '先执行 freelog-cli pull;dry-run 不会自动回写本地状态',\r\n });\r\n }\r\n\r\n return {\r\n auth,\r\n resource: applyPlatformFactsToResource(localResource, info),\r\n info,\r\n };\r\n}\r\n\r\nexport async function publishVersion(opts: {\r\n store: ProjectStore;\r\n noAutoPull?: boolean;\r\n bump?: boolean;\r\n dryRun?: boolean;\r\n debug?: boolean;\r\n versionOverride?: string;\r\n descriptionOverride?: string;\r\n}): Promise<PublishResult> {\r\n if (!opts.dryRun) assertExplicitEnvForWriteOperation();\r\n const store = opts.store;\r\n assertPublishNotCollectionCwd(store.rootDir());\r\n const projectRoot = store.rootDir();\r\n const ctx = opts.dryRun\r\n ? await ensureSyncedReadOnly({ store })\r\n : await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const resourceId = ctx.resource.resourceId!;\r\n let versionCfg = requireVersionProject(store);\r\n\r\n if (opts.versionOverride || opts.descriptionOverride !== undefined) {\r\n versionCfg = {\r\n ...versionCfg,\r\n ...(opts.versionOverride ? { version: opts.versionOverride } : {}),\r\n ...(opts.descriptionOverride !== undefined\r\n ? { description: opts.descriptionOverride }\r\n : {}),\r\n };\r\n }\r\n\r\n if (opts.bump) {\r\n const bumped = computeBumpedVersion(ctx.info.latestVersion);\r\n versionCfg = { ...versionCfg, version: bumped };\r\n if (!opts.dryRun) store.saveVersion(versionCfg);\r\n }\r\n\r\n assertPublishVersionReady(versionCfg);\r\n if (versionCfg.videoCover?.trim()) {\r\n if (opts.dryRun && !looksLikeRemoteCoverUrl(versionCfg.videoCover)) {\r\n assertLocalCoverFile(path.resolve(projectRoot, versionCfg.videoCover));\r\n } else {\r\n versionCfg = {\r\n ...versionCfg,\r\n videoCover: await resolveCoverImageUrl(versionCfg.videoCover, projectRoot),\r\n };\r\n if (!opts.dryRun) store.saveVersion(versionCfg);\r\n }\r\n }\r\n\r\n if (isFrozenStatus(ctx.info.status)) {\r\n throw cliError(I18N_KEYS.resource_frozen_cannot_publish, {\r\n code: 4,\r\n details: { status: ctx.info.status },\r\n });\r\n }\r\n\r\n const requireRt = needsRuntimeVersion(ctx.resource.resourceType, ctx.resource.resourceTypeCode);\r\n if (requireRt && !versionCfg.runtimeVersion) {\r\n throw cliError(I18N_KEYS.theme_widget_runtime_required, {\r\n code: 4,\r\n hint: '运行 freelog-cli version set --runtime 0.5,或设置 freelog.manifest.json 中的 version.runtimeVersion',\r\n });\r\n }\r\n\r\n await assertPublishableVersion(resourceId, versionCfg.version, ctx.info.latestVersion);\r\n const typeInfo = ctx.resource.resourceTypeCode\r\n ? await assertResourceTypeCode(ctx.resource.resourceTypeCode)\r\n : undefined;\r\n assertOptionalConfigAllowed({\r\n typeInfo,\r\n customPropertyDescriptors: versionCfg.customPropertyDescriptors,\r\n });\r\n\r\n const deps = (versionCfg.dependencies as Array<{ resourceId: string }> | undefined) || [];\r\n const baseUpcast =\r\n (versionCfg.baseUpcastResources as Array<{ resourceId: string }> | undefined) || [];\r\n if (deps.length > 0 || baseUpcast.length > 0) {\r\n const authHandoff = buildConsoleHandoff({\r\n id: resourceId,\r\n reason: 'DEPENDENCY_AUTH_INCOMPLETE',\r\n nextCommand: `freelog-cli dep auth --policy-map ./auth-map.yaml --yes --env ${getCliEnv()}`,\r\n });\r\n let unresolved: unknown[] = mergeDeclaredAuthSubjects(deps, baseUpcast);\r\n try {\r\n const assessment = await assessDeclaredAuthorization({\r\n resourceId,\r\n version: versionCfg.version,\r\n dependencies: deps,\r\n baseUpcastResources: baseUpcast,\r\n });\r\n unresolved = assessment.unresolvedDependencies;\r\n } catch (error) {\r\n if (error instanceof CliError && error.code === 5) throw error;\r\n throw cliError(I18N_KEYS.publish_dep_auth_tree_failed, {\r\n code: 5,\r\n details: {\r\n unresolvedDependencies: mergeDeclaredAuthSubjects(deps, baseUpcast),\r\n ...authHandoff,\r\n cause: error instanceof Error ? error.message : String(error),\r\n },\r\n hint: '请在 Console 中确认依赖授权,或修正 freelog.manifest.json 中的 version.dependencies / version.baseUpcastResources 后重试',\r\n });\r\n }\r\n if (unresolved.length > 0) {\r\n throw cliError(I18N_KEYS.cli_dependency_unauthorized, {\r\n code: 5,\r\n details: {\r\n unresolvedDependencies: unresolved,\r\n ...authHandoff,\r\n },\r\n hint: '请先在 Console 中完成依赖授权后重试',\r\n });\r\n }\r\n }\r\n\r\n if (opts.dryRun) {\r\n const planned = await planFileForPublish({\r\n versionConfig: versionCfg,\r\n resourceName: ctx.resource.resourceName || versionCfg.resourceName || 'resource',\r\n resourceType: ctx.resource.resourceType || versionCfg.resourceType,\r\n resourceTypeCode: ctx.resource.resourceTypeCode,\r\n resourceTypeInfo: typeInfo,\r\n cwd: projectRoot,\r\n });\r\n const unresolved = [...planned.unresolved];\r\n const resourceTypeCode = ctx.resource.resourceTypeCode;\r\n if (!resourceTypeCode) {\r\n throw cliError(I18N_KEYS.missing_type_for_file_properties, { code: 4 });\r\n }\r\n\r\n let plannedVersionCfg = versionCfg;\r\n if (versionCfg.videoCover?.trim() && !looksLikeRemoteCoverUrl(versionCfg.videoCover)) {\r\n plannedVersionCfg = { ...plannedVersionCfg, videoCover: 'unresolved' };\r\n unresolved.push('createVersionParams.videoCover');\r\n }\r\n\r\n let propertiesResolved =\r\n planned.fileSha1 !== 'unresolved' && (await fileExistsOnPlatform(planned.fileSha1));\r\n if (!propertiesResolved) {\r\n unresolved.push(\r\n 'createVersionParams.inputAttrs',\r\n 'createVersionParams.customPropertyDescriptors',\r\n );\r\n }\r\n if (propertiesResolved) {\r\n try {\r\n const resolvedProperties = await resolveCreateVersionPropertiesFromFile({\r\n sha1: planned.fileSha1,\r\n resourceTypeCode,\r\n inheritData: inheritDataFromVersionConfig(versionCfg),\r\n });\r\n plannedVersionCfg = {\r\n ...plannedVersionCfg,\r\n inputAttrs: resolvedProperties.inputAttrs,\r\n customPropertyDescriptors: resolvedProperties.customPropertyDescriptors,\r\n };\r\n } catch {\r\n propertiesResolved = false;\r\n unresolved.push(\r\n 'createVersionParams.inputAttrs',\r\n 'createVersionParams.customPropertyDescriptors',\r\n );\r\n }\r\n }\r\n\r\n const createVersionParams: Record<string, unknown> = buildCreateVersionParams({\r\n resourceId,\r\n versionCfg: plannedVersionCfg,\r\n fileSha1: planned.fileSha1,\r\n filename: planned.filename,\r\n }) as unknown as Record<string, unknown>;\r\n if (!propertiesResolved) {\r\n createVersionParams.inputAttrs = 'unresolved';\r\n createVersionParams.customPropertyDescriptors = 'unresolved';\r\n }\r\n\r\n return {\r\n resourceId,\r\n version: plannedVersionCfg.version,\r\n fileSha1: planned.fileSha1,\r\n filename: planned.filename,\r\n createVersionParams,\r\n dryRun: true,\r\n unresolved: Array.from(new Set(unresolved)),\r\n stages: {\r\n package: planned.requiresCompression ? 'planned' : 'skipped',\r\n upload: 'planned',\r\n properties: 'planned',\r\n platformWrite: 'planned',\r\n },\r\n };\r\n }\r\n\r\n const processed = await processFileForPublish({\r\n versionConfig: versionCfg,\r\n resourceName: ctx.resource.resourceName || versionCfg.resourceName || 'resource',\r\n resourceType: ctx.resource.resourceType || versionCfg.resourceType,\r\n resourceTypeCode: ctx.resource.resourceTypeCode,\r\n resourceTypeInfo: typeInfo,\r\n cwd: store.rootDir(),\r\n });\r\n\r\n const stages: ArtifactPipelineStages = {\r\n package: processed.isTempFile ? 'completed' : 'skipped',\r\n upload: 'planned',\r\n properties: 'planned',\r\n platformWrite: 'planned',\r\n };\r\n let activeStage: keyof ArtifactPipelineStages = 'upload';\r\n\r\n try {\r\n const uploadResult = await uploadFileIfNeeded(processed.filePath, processed.fileSha1);\r\n stages.upload = uploadResult === 'uploaded' ? 'completed' : 'reused';\r\n\r\n const resourceTypeCode = ctx.resource.resourceTypeCode;\r\n if (!resourceTypeCode) {\r\n throw cliError(I18N_KEYS.missing_type_for_file_properties, { code: 4 });\r\n }\r\n\r\n activeStage = 'properties';\r\n const resolvedProperties = await resolveCreateVersionPropertiesFromFile({\r\n sha1: processed.fileSha1,\r\n resourceTypeCode,\r\n inheritData: inheritDataFromVersionConfig(versionCfg),\r\n });\r\n versionCfg = {\r\n ...versionCfg,\r\n inputAttrs: resolvedProperties.inputAttrs,\r\n customPropertyDescriptors: resolvedProperties.customPropertyDescriptors,\r\n };\r\n store.saveVersion(versionCfg);\r\n\r\n const createVersionParams = buildCreateVersionParams({\r\n resourceId,\r\n versionCfg,\r\n fileSha1: processed.fileSha1,\r\n filename: processed.filename,\r\n });\r\n\r\n stages.properties = 'completed';\r\n activeStage = 'platformWrite';\r\n const envelope = await FServiceAPI.Resource.createVersion(createVersionParams);\r\n const data = unwrapData<{ versionId?: string; version?: string }>(envelope);\r\n\r\n store.saveVersion({\r\n ...versionCfg,\r\n resourceId,\r\n userId: ctx.resource.userId,\r\n username: ctx.resource.username,\r\n fileSha1: processed.fileSha1,\r\n filename: processed.filename,\r\n versionId: data?.versionId,\r\n published: true,\r\n });\r\n\r\n return {\r\n resourceId,\r\n version: data?.version || versionCfg.version,\r\n fileSha1: processed.fileSha1,\r\n filename: processed.filename,\r\n versionId: data?.versionId,\r\n stages: { ...stages, platformWrite: 'completed' },\r\n ...(opts.debug || opts.dryRun ? { createVersionParams } : {}),\r\n };\r\n } catch (error) {\r\n stages[activeStage] = 'failed';\r\n if (error instanceof CliError) {\r\n throw new CliError(error.message, {\r\n code: error.code,\r\n hint: error.hint,\r\n details: { original: error.details, stages },\r\n cause: error,\r\n });\r\n }\r\n throw new CliError(error instanceof Error ? error.message : String(error), {\r\n code: 1,\r\n details: { stages },\r\n cause: error,\r\n });\r\n } finally {\r\n if (processed.isTempFile) cleanupTempFile(processed.filePath);\r\n }\r\n}\r\n","import { consola } from 'consola';\r\nimport { requireAuth } from '../core/auth.js';\r\nimport { assertExplicitEnvForWriteOperation } from '../core/command.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { t } from '../i18n/index.js';\r\nimport { FServiceAPI, unwrapData } from '../platform/index.js';\r\nimport { ensureOwner, ensureSynced } from './sync/index.js';\r\nimport type { ProjectStore } from './store/types.js';\r\nimport { assertIntro, assertResourceTitle, assertTags } from './validation.js';\r\nimport { resolveCoverImageUrl } from './coverUpload.js';\r\nimport { assertLeafResourceTypeCode } from './typeService.js';\r\nimport {\r\n normalizeCreateName,\r\n requireAuthUsername,\r\n resolveCreateApiResourceTypeName,\r\n toFullResourceName,\r\n} from './resourceName.js';\r\n\r\nexport interface CreateResourceOptions {\r\n store: ProjectStore;\r\n title?: string;\r\n typeCode?: string;\r\n name?: string;\r\n resourceTypeName?: string;\r\n}\r\n\r\nfunction resolveCreateName(opts: {\r\n explicitName?: string;\r\n localName?: string;\r\n title: string;\r\n}): string {\r\n return normalizeCreateName(opts.explicitName || opts.localName || opts.title);\r\n}\r\n\r\nexport async function createResource(opts: CreateResourceOptions) {\r\n assertExplicitEnvForWriteOperation();\r\n const store = opts.store;\r\n const auth = requireAuth();\r\n const username = requireAuthUsername(auth.username);\r\n const owner = await ensureOwner({ store, allowCreateWithoutId: true });\r\n const local = owner.resource;\r\n if (local.resourceId?.trim()) {\r\n throw cliError(I18N_KEYS.resource_already_exists, {\r\n code: 4,\r\n hint: '换目录或先清空 resourceId',\r\n });\r\n }\r\n\r\n const title = (opts.title || local.resourceTitle || local.resourceName || '').trim();\r\n const typeCode = (opts.typeCode || local.resourceTypeCode || '').trim();\r\n const resourceTypeName = resolveCreateApiResourceTypeName(typeCode, {\r\n explicit: opts.resourceTypeName,\r\n manifest: local.resourceTypeName,\r\n });\r\n if (!title) {\r\n throw cliError(I18N_KEYS.naming_convention_resource_title_required, {\r\n code: 4,\r\n hint: '传 --title,或在 freelog.manifest.json 写 resource.title',\r\n });\r\n }\r\n if (!typeCode) {\r\n throw cliError(I18N_KEYS.naming_convention_resource_type_required, {\r\n code: 4,\r\n hint: '传 --type,或在 freelog.manifest.json 写 resource.typeCode',\r\n });\r\n }\r\n assertResourceTitle(title, true);\r\n await assertLeafResourceTypeCode(typeCode);\r\n\r\n const nameSource = opts.name || local.resourceName || title;\r\n const name = resolveCreateName({\r\n explicitName: opts.name,\r\n localName: local.resourceName,\r\n title,\r\n });\r\n if (!opts.name && !local.resourceName && nameSource.trim() !== name) {\r\n consola.info(t(I18N_KEYS.input_resourceauthid_automodified_msg, { authid: name }));\r\n }\r\n\r\n const existing = unwrapData(\r\n await FServiceAPI.Resource.info({\r\n resourceIdOrName: toFullResourceName(username, name),\r\n }),\r\n );\r\n if (existing) {\r\n throw cliError(I18N_KEYS.resource_auth_id_exists, {\r\n code: 4,\r\n params: { resourceName: toFullResourceName(username, name) },\r\n hint: '传 --name 指定其他短授权标识',\r\n });\r\n }\r\n\r\n const envelope = await FServiceAPI.Resource.create({\r\n name,\r\n resourceTypeCode: typeCode,\r\n resourceTypeName,\r\n resourceTitle: title,\r\n });\r\n const data = unwrapData<{\r\n resourceId: string;\r\n resourceName: string;\r\n resourceType: string[];\r\n resourceTypeCode: string;\r\n resourceTypeName?: string;\r\n userId?: number | string;\r\n username?: string;\r\n }>(envelope);\r\n\r\n if (!data?.resourceId) {\r\n throw cliError(I18N_KEYS.create_missing_resource_id, { code: 1, details: data });\r\n }\r\n\r\n const next = {\r\n ...local,\r\n resourceId: data.resourceId,\r\n resourceName: data.resourceName || toFullResourceName(username, name),\r\n resourceType: data.resourceType || local.resourceType || [],\r\n resourceTypeCode: data.resourceTypeCode || typeCode,\r\n resourceTypeName: data.resourceTypeName || resourceTypeName,\r\n resourceTitle: title,\r\n userId: data.userId ?? auth.userId,\r\n username: data.username ?? auth.username,\r\n };\r\n store.saveResource(next);\r\n\r\n const version = store.tryLoadVersion();\r\n if (version) {\r\n store.saveVersion({\r\n ...version,\r\n resourceId: data.resourceId,\r\n resourceName: next.resourceName,\r\n resourceTypeCode: next.resourceTypeCode,\r\n userId: next.userId,\r\n username: next.username,\r\n });\r\n }\r\n\r\n return next;\r\n}\r\n\r\nexport async function updateListing(opts: {\r\n store: ProjectStore;\r\n title?: string;\r\n intro?: string;\r\n cover?: string;\r\n tags?: string[];\r\n noAutoPull?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n if (opts.title !== undefined) assertResourceTitle(opts.title, true);\r\n if (opts.intro !== undefined) assertIntro(opts.intro);\r\n assertTags(opts.tags);\r\n\r\n const store = opts.store;\r\n const ctx = await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const resourceId = ctx.resource.resourceId!;\r\n let coverUrl: string | undefined;\r\n if (opts.cover !== undefined) {\r\n coverUrl = await resolveCoverImageUrl(opts.cover, store.rootDir());\r\n }\r\n\r\n const params: Record<string, unknown> = { resourceId };\r\n if (opts.title !== undefined) params.resourceTitle = opts.title.trim();\r\n if (opts.intro !== undefined) params.intro = opts.intro;\r\n if (coverUrl !== undefined) params.coverImages = [coverUrl];\r\n if (opts.tags !== undefined) params.tags = [...new Set(opts.tags.map((t) => t.trim()))];\r\n\r\n await FServiceAPI.Resource.update(\r\n params as unknown as Parameters<typeof FServiceAPI.Resource.update>[0],\r\n );\r\n\r\n const next = {\r\n ...ctx.resource,\r\n resourceTitle: opts.title ?? ctx.resource.resourceTitle,\r\n intro: opts.intro ?? ctx.resource.intro,\r\n coverImages: coverUrl ? [coverUrl] : ctx.resource.coverImages,\r\n tags: opts.tags ?? ctx.resource.tags,\r\n };\r\n store.saveResource(next);\r\n return next;\r\n}\r\n","import type { ArtifactMode, RuntimeVersion } from '../../config/project/types.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { createResource } from '../resourceService.js';\nimport type { ProjectStore } from '../store/types.js';\nimport { computeBumpedVersion, publishVersion, type PublishResult } from './publishVersion.js';\n\nexport async function createThenPublish(opts: {\n store: ProjectStore;\n title?: string;\n typeCode?: string;\n name?: string;\n resourceTypeName?: string;\n file?: string;\n version?: string;\n bump?: boolean;\n description?: string;\n videoCover?: string;\n artifactMode?: ArtifactMode;\n runtime?: RuntimeVersion;\n noAutoPull?: boolean;\n dryRun?: boolean;\n debug?: boolean;\n}): Promise<PublishResult> {\n if (opts.store.resolveResourceId()) {\n throw cliError(I18N_KEYS.session_first_publish_no_resource_id, {\n code: 4,\n hint: '已有 resourceId 时请走 applySessionPublishIntent + publishVersion',\n });\n }\n if (!opts.file?.trim()) {\n throw cliError(I18N_KEYS.session_first_publish_file_required, { code: 4 });\n }\n if (!opts.title?.trim()) {\n throw cliError(I18N_KEYS.naming_convention_resource_title_required, { code: 4 });\n }\n if (!opts.typeCode?.trim()) {\n throw cliError(I18N_KEYS.naming_convention_resource_type_required, { code: 4 });\n }\n\n await createResource({\n store: opts.store,\n title: opts.title,\n typeCode: opts.typeCode,\n name: opts.name,\n resourceTypeName: opts.resourceTypeName,\n });\n\n const version = opts.bump\n ? computeBumpedVersion(undefined)\n : (opts.version?.trim() || '1.0.0');\n\n opts.store.saveVersion({\n version,\n filePath: opts.file.trim(),\n description: opts.description,\n videoCover: opts.videoCover,\n artifactMode: opts.artifactMode,\n runtimeVersion: opts.runtime,\n dependencies: [],\n authExcludedItems: [],\n });\n\n return publishVersion({\n store: opts.store,\n noAutoPull: opts.noAutoPull,\n dryRun: opts.dryRun,\n debug: opts.debug,\n });\n}\n","import type { RuntimeVersion, VersionProject } from '../../config/project/types.js';\nimport { fetchResourceInfo } from '../sync/fetch.js';\nimport type { ProjectStore } from '../store/types.js';\nimport { fetchReleasedVersionSnapshot } from '../versionPropertyService.js';\n\nexport async function applyReuseVersionIntent(opts: {\n store: ProjectStore;\n resourceId: string;\n resourceName?: string;\n resourceTypeCode?: string;\n userId?: number | string;\n username?: string;\n reuseVersion: string;\n targetVersion: string;\n description?: string;\n videoCover?: string;\n runtime?: RuntimeVersion;\n noInheritDeps?: boolean;\n}): Promise<VersionProject> {\n const snapshot = await fetchReleasedVersionSnapshot({\n resourceId: opts.resourceId,\n version: opts.reuseVersion,\n resourceTypeCode: opts.resourceTypeCode,\n });\n const platform = await fetchResourceInfo(opts.resourceId);\n const next: VersionProject = {\n version: opts.targetVersion,\n resourceId: opts.resourceId,\n resourceName: opts.resourceName,\n resourceTypeCode: opts.resourceTypeCode,\n userId: opts.userId,\n username: opts.username,\n filePath: '',\n fileSha1: snapshot.fileSha1,\n filename: snapshot.filename,\n reusePlatformFile: true,\n description: opts.description ?? snapshot.description,\n dependencies: opts.noInheritDeps ? [] : snapshot.dependencies ?? [],\n inputAttrs: snapshot.inputAttrs,\n customPropertyDescriptors: snapshot.customPropertyDescriptors,\n baseUpcastResources: (platform.baseUpcastResources || []).map((item) => ({\n resourceId: item.resourceId,\n resourceName: item.resourceName,\n })),\n videoCover: opts.videoCover,\n runtimeVersion: opts.runtime,\n authExcludedItems: [],\n } satisfies VersionProject;\n opts.store.saveVersion(next);\n return next;\n}\n","import type { ArtifactMode, RuntimeVersion, VersionProject } from '../../config/project/types.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { ensureOperationContext } from '../sync/operationContext.js';\nimport type { ProjectStore } from '../store/types.js';\nimport { computeBumpedVersion } from './publishVersion.js';\nimport { applyReuseVersionIntent } from './reuseVersionIntent.js';\n\nexport async function applySessionPublishIntent(opts: {\n store: ProjectStore;\n file?: string;\n reuseVersion?: string;\n version?: string;\n bump?: boolean;\n description?: string;\n videoCover?: string;\n artifactMode?: ArtifactMode;\n runtime?: RuntimeVersion;\n noInheritDeps?: boolean;\n}): Promise<VersionProject> {\n const resourceId = opts.store.resolveResourceId();\n if (!resourceId) {\n throw cliError(I18N_KEYS.session_resource_id_required, {\n code: 4,\n hint: '首发请省略 --resource-id,由 createThenPublish 创建资源',\n });\n }\n if (opts.reuseVersion && opts.file) {\n throw cliError(I18N_KEYS.session_reuse_file_mutex, { code: 4 });\n }\n if (!opts.reuseVersion && !opts.file?.trim()) {\n throw cliError(I18N_KEYS.session_publish_file_or_reuse, { code: 4 });\n }\n\n const ctx = await ensureOperationContext({ store: opts.store });\n let version = opts.version?.trim();\n if (opts.bump) {\n version = computeBumpedVersion(ctx.platform.latestVersion);\n }\n if (!version) {\n throw cliError(I18N_KEYS.manifest_version_missing, {\n code: 4,\n hint: '传 --version 或 --bump',\n });\n }\n\n const base: Partial<VersionProject> = {\n version,\n resourceId,\n resourceName: ctx.resource.resourceName,\n resourceTypeCode: ctx.resource.resourceTypeCode,\n userId: ctx.resource.userId,\n username: ctx.resource.username,\n authExcludedItems: [],\n };\n\n if (opts.reuseVersion) {\n return applyReuseVersionIntent({\n store: opts.store,\n resourceId,\n resourceName: ctx.resource.resourceName,\n resourceTypeCode: ctx.resource.resourceTypeCode,\n userId: ctx.resource.userId,\n username: ctx.resource.username,\n reuseVersion: opts.reuseVersion,\n targetVersion: version,\n description: opts.description,\n videoCover: opts.videoCover,\n runtime: opts.runtime,\n noInheritDeps: opts.noInheritDeps,\n });\n }\n\n const next: VersionProject = {\n ...base,\n version,\n filePath: opts.file!.trim(),\n description: opts.description,\n videoCover: opts.videoCover,\n artifactMode: opts.artifactMode,\n runtimeVersion: opts.runtime,\n dependencies: opts.store.tryLoadVersion()?.dependencies ?? [],\n baseUpcastResources: opts.store.tryLoadVersion()?.baseUpcastResources ?? [],\n authExcludedItems: [],\n } satisfies VersionProject;\n opts.store.saveVersion(next);\n return next;\n}\n","import type { CustomPropertyDescriptor } from '../config/project.js';\r\nimport { FServiceAPI, unwrapData } from '../platform/index.js';\r\nimport {\r\n buildCreateVersionInputAttrs,\r\n normalizeCustomPropertyDescriptors,\r\n} from './resource/index.js';\r\nimport type { VersionProject } from '../config/project.js';\r\nimport { assertResourceTypeCode } from './typeService.js';\r\n\r\ntype ReleasedVersionInfo = {\r\n fileSha1?: string;\r\n filename?: string;\r\n description?: string;\r\n dependencies?: Array<{\r\n resourceId?: string;\r\n resourceName?: string;\r\n versionRange?: string;\r\n }>;\r\n systemPropertyDescriptors?: Array<{\r\n key?: string;\r\n insertMode?: number;\r\n valueDisplay?: string;\r\n }>;\r\n customPropertyDescriptors?: CustomPropertyDescriptor[];\r\n inputAttrs?: Array<{ key?: string; value?: string | number | boolean }>;\r\n};\r\n\r\nexport type ReleasedVersionSnapshot = Pick<\r\n VersionProject,\r\n | 'fileSha1'\r\n | 'filename'\r\n | 'description'\r\n | 'dependencies'\r\n | 'inputAttrs'\r\n | 'customPropertyDescriptors'\r\n>;\r\n\r\nfunction pickSupportOptionalConfig(typeInfo: unknown): unknown {\r\n if (!typeInfo || typeof typeInfo !== 'object') return undefined;\r\n const record = typeInfo as Record<string, unknown>;\r\n const resourceConfig =\r\n record.resourceConfig && typeof record.resourceConfig === 'object'\r\n ? (record.resourceConfig as Record<string, unknown>)\r\n : undefined;\r\n return resourceConfig?.supportOptionalConfig ?? record.supportOptionalConfig;\r\n}\r\n\r\nfunction isSupportOptionalConfigEnabled(support: unknown): boolean {\r\n return support === 2 || support === '2';\r\n}\r\n\r\nfunction mapPlatformInputAttrs(info: ReleasedVersionInfo) {\r\n const systemDescriptors = (info.systemPropertyDescriptors || []).filter((sp) => sp?.key);\r\n if (systemDescriptors.length > 0) {\r\n return systemDescriptors\r\n .filter((sp) => Number(sp.insertMode) === 2)\r\n .map((sp) => ({\r\n key: String(sp.key),\r\n value: String(sp.valueDisplay ?? ''),\r\n }));\r\n }\r\n\r\n return (info.inputAttrs || [])\r\n .filter((a) => a?.key)\r\n .map((a) => ({ key: String(a.key), value: String(a.value ?? '') }));\r\n}\r\n\r\nfunction mapPlatformCustomPropertyDescriptors(\r\n info: ReleasedVersionInfo,\r\n supportOptionalConfig?: unknown,\r\n): CustomPropertyDescriptor[] {\r\n const optionalEnabled =\r\n supportOptionalConfig === undefined || isSupportOptionalConfigEnabled(supportOptionalConfig);\r\n\r\n return (info.customPropertyDescriptors || [])\r\n .filter((desc) => desc?.key)\r\n .filter((desc) => desc.type === 'readonlyText' || optionalEnabled)\r\n .map((desc) => ({\r\n type: desc.type,\r\n key: desc.key,\r\n name: desc.name || desc.key,\r\n defaultValue: String(desc.defaultValue ?? ''),\r\n candidateItems: desc.candidateItems?.map(String),\r\n remark: desc.remark,\r\n }));\r\n}\r\n\r\nasync function resolveSupportOptionalConfig(resourceTypeCode?: string): Promise<unknown> {\r\n if (!resourceTypeCode?.trim()) return undefined;\r\n const typeInfo = await assertResourceTypeCode(resourceTypeCode.trim());\r\n return pickSupportOptionalConfig(typeInfo);\r\n}\r\n\r\nfunction mapReleasedVersionFields(\r\n info: ReleasedVersionInfo,\r\n supportOptionalConfig?: unknown,\r\n) {\r\n return {\r\n inputAttrs: mapPlatformInputAttrs(info),\r\n customPropertyDescriptors: mapPlatformCustomPropertyDescriptors(info, supportOptionalConfig),\r\n };\r\n}\r\n\r\n/** 读取平台已发版属性(≅ Console resourceVersionEditorPage fetchDataSource) */\r\nexport async function fetchReleasedVersionProperties(opts: {\r\n resourceId: string;\r\n version: string;\r\n resourceTypeCode?: string;\r\n}) {\r\n const info = await loadReleasedVersionInfo(opts);\r\n const supportOptionalConfig = await resolveSupportOptionalConfig(opts.resourceTypeCode);\r\n return mapReleasedVersionFields(info, supportOptionalConfig);\r\n}\r\n\r\nasync function loadReleasedVersionInfo(opts: { resourceId: string; version: string }) {\r\n const envelope = await FServiceAPI.Resource.resourceVersionInfo1({\r\n resourceId: opts.resourceId,\r\n version: opts.version,\r\n });\r\n return unwrapData<ReleasedVersionInfo>(envelope);\r\n}\r\n\r\n/** 读取平台已发版完整快照(≅ Console versionCreator「上个版本」resourceVersionInfo1) */\r\nexport async function fetchReleasedVersionSnapshot(opts: {\r\n resourceId: string;\r\n version: string;\r\n resourceTypeCode?: string;\r\n}): Promise<ReleasedVersionSnapshot> {\r\n const info = await loadReleasedVersionInfo(opts);\r\n const supportOptionalConfig = await resolveSupportOptionalConfig(opts.resourceTypeCode);\r\n const mapped = mapReleasedVersionFields(info, supportOptionalConfig);\r\n const fileSha1 = info.fileSha1?.trim();\r\n const filename = info.filename?.trim();\r\n if (!fileSha1 || !filename) {\r\n throw new Error(\r\n `resourceVersionInfo1 missing fileSha1/filename for ${opts.resourceId}@${opts.version}`,\r\n );\r\n }\r\n return {\r\n fileSha1,\r\n filename,\r\n description: info.description,\r\n dependencies: (info.dependencies || [])\r\n .filter((dep) => dep?.resourceId)\r\n .map((dep) => ({\r\n resourceId: String(dep.resourceId),\r\n resourceName: dep.resourceName,\r\n versionRange: dep.versionRange,\r\n })),\r\n inputAttrs: mapped.inputAttrs,\r\n customPropertyDescriptors: mapped.customPropertyDescriptors,\r\n };\r\n}\r\n\r\n/**\r\n * sync-properties:以平台当前属性为底,manifest 同 key 覆盖(避免 manifest 不完整时丢字段)。\r\n */\r\nexport function mergeVersionPropertiesForSync(opts: {\r\n platform: {\r\n inputAttrs: Array<{ key: string; value: string }>;\r\n customPropertyDescriptors: CustomPropertyDescriptor[];\r\n };\r\n manifest: Pick<VersionProject, 'inputAttrs' | 'customPropertyDescriptors' | 'runtimeVersion'>;\r\n}) {\r\n const inputMap = new Map(\r\n opts.platform.inputAttrs.map((attr) => [attr.key, attr.value] as const),\r\n );\r\n for (const attr of opts.manifest.inputAttrs || []) {\r\n if (!attr?.key || attr.key === 'runtimeVersion') continue;\r\n inputMap.set(attr.key, String(attr.value ?? ''));\r\n }\r\n if (opts.manifest.runtimeVersion) {\r\n inputMap.set('runtimeVersion', String(opts.manifest.runtimeVersion));\r\n }\r\n\r\n const customMap = new Map(\r\n opts.platform.customPropertyDescriptors\r\n .filter((desc) => desc?.key)\r\n .map((desc) => [desc.key, desc] as const),\r\n );\r\n for (const desc of opts.manifest.customPropertyDescriptors || []) {\r\n if (!desc?.key) continue;\r\n customMap.set(desc.key, desc);\r\n }\r\n\r\n const versionCfg: VersionProject = {\r\n version: '',\r\n filePath: '',\r\n inputAttrs: [...inputMap.entries()].map(([key, value]) => ({ key, value })),\r\n customPropertyDescriptors: [...customMap.values()],\r\n runtimeVersion: opts.manifest.runtimeVersion,\r\n };\r\n\r\n return {\r\n inputAttrs: buildCreateVersionInputAttrs(versionCfg) || [],\r\n customPropertyDescriptors: normalizeCustomPropertyDescriptors(\r\n versionCfg.customPropertyDescriptors,\r\n ) || [],\r\n };\r\n}\r\n\r\nexport async function inspectReleasedVersion(opts: {\r\n resourceId: string;\r\n version: string;\r\n}) {\r\n const properties = await fetchReleasedVersionProperties(opts);\r\n return {\r\n resourceId: opts.resourceId,\r\n version: opts.version,\r\n ...properties,\r\n };\r\n}\r\n","import type { BaseUpcastResource, VersionDependency } from '../config/project/types.js';\nimport { cliError } from '../i18n/cliError.js';\nimport { I18N_KEYS } from '../i18n/bundled.js';\nimport { fetchResourceInfo } from './sync/fetch.js';\nimport { fetchReleasedVersionSnapshot } from './versionPropertyService.js';\n\n/** 会话 dep auth 声明 deps 真源(§22):resourceVersionInfo1 + fetchResourceInfo.baseUpcast。 */\nexport async function fetchSessionDeclaredAuthSubjects(opts: {\n resourceId: string;\n version?: string;\n}): Promise<{\n dependencies: VersionDependency[];\n baseUpcastResources: BaseUpcastResource[];\n authTreeVersion: string;\n}> {\n const info = await fetchResourceInfo(opts.resourceId);\n const authTreeVersion = opts.version?.trim() || info.latestVersion?.trim();\n if (!authTreeVersion) {\n throw cliError(I18N_KEYS.session_dep_auth_no_published_version, {\n code: 4,\n hint: '资源尚无正式版;请传 --version 或先 publish',\n });\n }\n\n const snapshot = await fetchReleasedVersionSnapshot({\n resourceId: opts.resourceId,\n version: authTreeVersion,\n });\n\n return {\n dependencies: snapshot.dependencies ?? [],\n baseUpcastResources: (info.baseUpcastResources ?? []).map((item) => ({\n resourceId: item.resourceId,\n resourceName: item.resourceName,\n })),\n authTreeVersion,\n };\n}\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport YAML from 'yaml';\r\nimport { z } from 'zod';\r\nimport { CliError } from '../core/errors.js';\r\nimport { FServiceAPI, unwrapData } from '../platform/index.js';\r\nimport { loadManifest, tryLoadVersionProject } from '../config/project.js';\r\nimport { ensureSynced } from './sync/index.js';\r\nimport { ensureOperationContext } from './sync/operationContext.js';\r\nimport type { ProjectStore } from './store/types.js';\r\nimport { fetchSessionDeclaredAuthSubjects } from './depSessionSources.js';\r\nimport { ensureCollectionSynced } from './collection/owner.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { buildConsoleHandoff, type ConsoleHandoff } from '../core/consoleUrl.js';\r\nimport { getCliEnv } from '../core/env.js';\r\nimport { assessDeclaredAuthorization, mergeDeclaredAuthSubjects } from './authorizationTree.js';\r\n\r\nconst AuthMapSchema = z.object({\r\n contracts: z\r\n .array(\r\n z.object({\r\n resourceId: z.string().min(1),\r\n policyIds: z.array(z.string().min(1)).min(1),\r\n }),\r\n )\r\n .min(1, 'contracts 不能为空'),\r\n});\r\n\r\nexport type AuthMap = z.infer<typeof AuthMapSchema>;\r\n\r\ntype DependencyLike = { resourceId: string };\r\ntype ResourcePolicy = {\r\n policyId?: string;\r\n policyID?: string;\r\n policyText?: string;\r\n status?: number;\r\n};\r\n\r\nconst PAYMENT_EVENT_PATTERN = /freelog\\s*\\.\\s*TransactionEvent\\s*\\(/i;\r\n\r\nfunction getPolicyId(policy: ResourcePolicy): string {\r\n return String(policy.policyId || policy.policyID || '');\r\n}\r\n\r\nexport function isPaymentPolicy(policyText: string | undefined): boolean {\r\n if (!policyText) return false;\r\n let text = policyText;\r\n try {\r\n text = decodeURIComponent(policyText);\r\n } catch {\r\n // 非 URI 编码策略仍按原文检查。\r\n }\r\n return PAYMENT_EVENT_PATTERN.test(text);\r\n}\r\n\r\nexport function assertAuthMapMatchesDependencies(\r\n map: AuthMap,\r\n dependencies: DependencyLike[],\r\n): void {\r\n const dependencyIds = new Set(dependencies.map((item) => item.resourceId));\r\n const seenResources = new Set<string>();\r\n\r\n for (const entry of map.contracts) {\r\n if (!dependencyIds.has(entry.resourceId)) {\r\n throw cliError(I18N_KEYS.policy_map_undeclared_dep, {\r\n code: 4,\r\n params: { resourceId: entry.resourceId },\r\n hint: '先执行 dep add <resourceId>,或从 policy-map 删除该项',\r\n });\r\n }\r\n if (seenResources.has(entry.resourceId)) {\r\n throw cliError(I18N_KEYS.policy_map_duplicate_dep, {\r\n code: 4,\r\n params: { resourceId: entry.resourceId },\r\n });\r\n }\r\n seenResources.add(entry.resourceId);\r\n\r\n const policyIds = new Set<string>();\r\n for (const policyId of entry.policyIds) {\r\n if (policyIds.has(policyId)) {\r\n throw cliError(I18N_KEYS.policy_map_duplicate_policy, {\r\n code: 4,\r\n params: { resourceId: entry.resourceId, policyId },\r\n });\r\n }\r\n policyIds.add(policyId);\r\n }\r\n }\r\n}\r\n\r\nexport function buildBatchSetContractsParams(opts: {\r\n licenseeResourceId: string;\r\n subjectId: string;\r\n policyId: string;\r\n version: string;\r\n subjectType?: 1 | 2 | 3;\r\n}): Parameters<typeof FServiceAPI.Resource.batchSetContracts>[0] {\r\n return {\r\n resourceId: opts.licenseeResourceId,\r\n subjects: [\r\n {\r\n subjectId: opts.subjectId,\r\n subjectType: opts.subjectType ?? 1,\r\n versions: [{ version: opts.version, policyId: opts.policyId, operation: 1 }],\r\n },\r\n ] as unknown as Parameters<typeof FServiceAPI.Resource.batchSetContracts>[0]['subjects'],\r\n };\r\n}\r\n\r\n/** @deprecated 仅 createVersion 内嵌 batchSignContracts 使用;dep auth 走 batchSetContracts。 */\r\nexport function buildBatchSignContractsParams(opts: {\r\n licenseeResourceId: string;\r\n subjectId: string;\r\n policyId: string;\r\n subjectType?: 1 | 2 | 3;\r\n}): Parameters<typeof FServiceAPI.Contract.batchCreateContracts>[0] {\r\n const subjectType = opts.subjectType ?? 1;\r\n return {\r\n licenseeId: opts.licenseeResourceId,\r\n licenseeIdentityType: 1,\r\n subjectType,\r\n subjects: [{ subjectId: opts.subjectId, policyId: opts.policyId, subjectType }] as unknown as Parameters<\r\n typeof FServiceAPI.Contract.batchCreateContracts\r\n >[0]['subjects'],\r\n };\r\n}\r\n\r\nasync function resolveDependencyApplyVersion(resourceId: string): Promise<string> {\r\n const resource = unwrapData<{ latestVersion?: string | null }>(\r\n await FServiceAPI.Resource.info({\r\n resourceIdOrName: resourceId,\r\n isLoadPolicyInfo: 0,\r\n }),\r\n );\r\n const latest = resource?.latestVersion?.trim();\r\n if (!latest) {\r\n throw cliError(I18N_KEYS.cli_dependency_unauthorized, {\r\n code: 4,\r\n params: { resourceId },\r\n hint: '依赖资源须先 publish 并产生 latestVersion,再执行 dep auth',\r\n });\r\n }\r\n return latest;\r\n}\r\n\r\nasync function assertPoliciesAreFreeAndEnabled(\r\n map: AuthMap,\r\n handoff: Omit<ConsoleHandoff, 'reason'>,\r\n): Promise<void> {\r\n for (const entry of map.contracts) {\r\n const resource = unwrapData<{ policies?: ResourcePolicy[] }>(\r\n await FServiceAPI.Resource.info({\r\n resourceIdOrName: entry.resourceId,\r\n isLoadPolicyInfo: 1,\r\n }),\r\n );\r\n const policies = resource?.policies || [];\r\n\r\n for (const policyId of entry.policyIds) {\r\n const policy = policies.find((item) => getPolicyId(item) === policyId);\r\n if (!policy) {\r\n throw cliError(I18N_KEYS.dep_policy_not_found, {\r\n code: 5,\r\n params: { resourceId: entry.resourceId, policyId },\r\n hint: '执行 dep auth 前先用 Console 或资源 API 确认 policyId',\r\n });\r\n }\r\n if (Number(policy.status) !== 1) {\r\n throw cliError(I18N_KEYS.dep_policy_not_enabled, {\r\n code: 5,\r\n params: { resourceId: entry.resourceId, policyId },\r\n hint: '请让资源作者启用该策略,或选择已启用的免费策略',\r\n });\r\n }\r\n if (!policy.policyText) {\r\n throw cliError(I18N_KEYS.dep_policy_payment_unknown, {\r\n code: 5,\r\n params: { resourceId: entry.resourceId, policyId },\r\n details: {\r\n error: 'DEPENDENCY_POLICY_UNVERIFIABLE',\r\n reason: 'DEPENDENCY_POLICY_UNVERIFIABLE',\r\n resourceId: entry.resourceId,\r\n policyId,\r\n ...handoff,\r\n },\r\n hint: `请在 Console 查看策略并完成必要交互;CLI 不会执行支付:${handoff.actionUrl}`,\r\n });\r\n }\r\n if (isPaymentPolicy(policy.policyText)) {\r\n throw cliError(I18N_KEYS.dep_policy_payment_required, {\r\n code: 5,\r\n params: { resourceId: entry.resourceId, policyId },\r\n details: {\r\n error: 'DEPENDENCY_PAYMENT_REQUIRED',\r\n reason: 'DEPENDENCY_PAYMENT_REQUIRED',\r\n resourceId: entry.resourceId,\r\n policyId,\r\n ...handoff,\r\n },\r\n hint: `选择免费策略,或到 Console 完成支付/签约后再重试:${handoff.actionUrl}`,\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function parsePolicyMapFile(filePath: string): AuthMap {\r\n if (!fs.existsSync(filePath)) {\r\n throw cliError(I18N_KEYS.policy_map_not_found, {\r\n code: 4,\r\n params: { path: filePath },\r\n });\r\n }\r\n const rawText = fs.readFileSync(filePath, 'utf8');\r\n const ext = path.extname(filePath).toLowerCase();\r\n let raw: unknown;\r\n try {\r\n raw = ext === '.json' ? JSON.parse(rawText) : YAML.parse(rawText);\r\n } catch (error) {\r\n throw cliError(I18N_KEYS.policy_map_parse_failed, {\r\n code: 4,\r\n details: { cause: error instanceof Error ? error.message : String(error) },\r\n });\r\n }\r\n const parsed = AuthMapSchema.safeParse(raw);\r\n if (!parsed.success) {\r\n throw cliError(I18N_KEYS.policy_map_schema_invalid, {\r\n code: 4,\r\n details: parsed.error.flatten(),\r\n hint: 'contracts: [{ resourceId, policyIds: [...] }]',\r\n });\r\n }\r\n return parsed.data;\r\n}\r\n\r\nexport async function depAuthFromMap(opts: {\r\n store: ProjectStore;\r\n policyMap: string;\r\n noAutoPull?: boolean;\r\n /** 会话模式:读 resourceVersionInfo1 的目标已发版;默认 latestVersion */\r\n version?: string;\r\n}): Promise<{\r\n ok: boolean;\r\n succeeded: Array<{ resourceId: string; policyId: string }>;\r\n failed: Array<{ resourceId: string; policyId: string; message: string }>;\r\n}> {\r\n const store = opts.store;\r\n const mapPath = path.resolve(store.rootDir(), opts.policyMap);\r\n const map = parsePolicyMapFile(mapPath);\r\n\r\n let subject: 'resource' | 'collection';\r\n let licenseeResourceId: string | undefined;\r\n let localDeps: Array<{ resourceId: string }> = [];\r\n let localBaseUpcast: Array<{ resourceId: string }> = [];\r\n let authTreeVersion: string | undefined;\r\n\r\n if (store.mode() === 'session') {\r\n subject = 'resource';\r\n await ensureOperationContext({ store, noAutoPull: opts.noAutoPull });\r\n licenseeResourceId = store.resolveResourceId();\r\n if (!licenseeResourceId) {\r\n throw cliError(I18N_KEYS.session_resource_id_required, { code: 4 });\r\n }\r\n const declared = await fetchSessionDeclaredAuthSubjects({\r\n resourceId: licenseeResourceId,\r\n version: opts.version,\r\n });\r\n localDeps = declared.dependencies;\r\n localBaseUpcast = declared.baseUpcastResources;\r\n authTreeVersion = declared.authTreeVersion;\r\n } else {\r\n const projectCwd = store.rootDir();\r\n subject = loadManifest(projectCwd).data.subject;\r\n const collectionCtx =\r\n subject === 'collection'\r\n ? await ensureCollectionSynced({ cwd: projectCwd, noAutoPull: opts.noAutoPull })\r\n : null;\r\n const resourceCtx = collectionCtx\r\n ? null\r\n : await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const versionCfg = resourceCtx\r\n ? tryLoadVersionProject(projectCwd)?.data || resourceCtx.version\r\n : undefined;\r\n localDeps = (collectionCtx?.collection.dependencies || versionCfg?.dependencies || []) as Array<{\r\n resourceId: string;\r\n }>;\r\n localBaseUpcast = (collectionCtx?.collection.baseUpcastResources ||\r\n versionCfg?.baseUpcastResources ||\r\n []) as Array<{ resourceId: string }>;\r\n licenseeResourceId = collectionCtx?.collection.resourceId || resourceCtx?.resource.resourceId;\r\n authTreeVersion =\r\n collectionCtx?.collection.version ||\r\n collectionCtx?.info.latestVersion ||\r\n versionCfg?.version ||\r\n resourceCtx?.info.latestVersion;\r\n }\r\n\r\n const declaredAuthSubjects = mergeDeclaredAuthSubjects(localDeps, localBaseUpcast);\r\n assertAuthMapMatchesDependencies(map, declaredAuthSubjects);\r\n if (!licenseeResourceId) {\r\n throw cliError(\r\n subject === 'collection' ? I18N_KEYS.no_collection_resource_id : I18N_KEYS.no_local_resource_id,\r\n { code: 4 },\r\n );\r\n }\r\n const env = getCliEnv();\r\n const policyMapArg = /\\s/.test(opts.policyMap) ? JSON.stringify(opts.policyMap) : opts.policyMap;\r\n const nextCommand = `freelog-cli dep auth --policy-map ${policyMapArg} --yes --env ${env}`;\r\n const consoleHandoff = buildConsoleHandoff({\r\n id: licenseeResourceId,\r\n kind: subject,\r\n reason: 'DEPENDENCY_AUTH_INCOMPLETE',\r\n nextCommand,\r\n env,\r\n });\r\n const consoleUrls: Omit<ConsoleHandoff, 'reason'> = {\r\n actionUrl: consoleHandoff.actionUrl,\r\n contractsUrl: consoleHandoff.contractsUrl,\r\n nextCommand: consoleHandoff.nextCommand,\r\n };\r\n\r\n // Console 可能已经完成付费或复杂签约。先验证平台最终授权状态,\r\n // 已全部解决时直接幂等成功,避免重新按策略正文进入支付接力循环。\r\n if (declaredAuthSubjects.length > 0) {\r\n try {\r\n const assessment = await assessDeclaredAuthorization({\r\n resourceId: licenseeResourceId,\r\n version: authTreeVersion,\r\n dependencies: localDeps,\r\n baseUpcastResources: localBaseUpcast,\r\n });\r\n if (assessment.resolved) {\r\n return { ok: true, succeeded: [], failed: [] };\r\n }\r\n } catch {\r\n // 预检不可达时继续执行既有免费签约流程,并在签约后做强制验证。\r\n }\r\n }\r\n await assertPoliciesAreFreeAndEnabled(map, consoleUrls);\r\n\r\n const succeeded: Array<{ resourceId: string; policyId: string }> = [];\r\n const failed: Array<{ resourceId: string; policyId: string; message: string }> = [];\r\n\r\n for (const entry of map.contracts) {\r\n const applyVersion = await resolveDependencyApplyVersion(entry.resourceId);\r\n for (const policyId of entry.policyIds) {\r\n try {\r\n await FServiceAPI.Contract.batchCreateContracts(\r\n buildBatchSignContractsParams({\r\n licenseeResourceId,\r\n subjectId: entry.resourceId,\r\n policyId,\r\n }),\r\n );\r\n try {\r\n await FServiceAPI.Resource.batchSetContracts(\r\n buildBatchSetContractsParams({\r\n licenseeResourceId,\r\n subjectId: entry.resourceId,\r\n policyId,\r\n version: applyVersion,\r\n }),\r\n );\r\n } catch {\r\n // 首版发行前 authTree/resolveResources 可能为空,batchSet 会报 invalidVersions;\r\n // batchCreate 已建合同时由 assessResourceAuthorization 的 contracts 回退验证。\r\n }\r\n succeeded.push({ resourceId: entry.resourceId, policyId });\r\n } catch (error) {\r\n failed.push({\r\n resourceId: entry.resourceId,\r\n policyId,\r\n message: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (declaredAuthSubjects.length > 0 && failed.length === 0) {\r\n try {\r\n const assessment = await assessDeclaredAuthorization({\r\n resourceId: licenseeResourceId,\r\n version: authTreeVersion,\r\n dependencies: localDeps,\r\n baseUpcastResources: localBaseUpcast,\r\n });\r\n if (!assessment.resolved) {\r\n throw cliError(I18N_KEYS.dep_auth_incomplete, {\r\n code: 5,\r\n details: {\r\n error: 'DEPENDENCY_AUTH_INCOMPLETE',\r\n reason: 'DEPENDENCY_AUTH_INCOMPLETE',\r\n unresolvedDependencies: assessment.unresolvedDependencies,\r\n succeeded,\r\n ...consoleUrls,\r\n },\r\n hint: `检查 policyIds,或在 Console 完成签约后执行:${nextCommand}\\n${consoleUrls.actionUrl}`,\r\n });\r\n }\r\n } catch (error) {\r\n if (error instanceof CliError && error.code === 5) throw error;\r\n throw cliError(I18N_KEYS.dep_auth_verify_failed, {\r\n code: 5,\r\n details: {\r\n error: 'DEPENDENCY_AUTH_UNVERIFIABLE',\r\n reason: 'DEPENDENCY_AUTH_UNVERIFIABLE',\r\n unresolvedDependencies: declaredAuthSubjects,\r\n cause: error instanceof Error ? error.message : String(error),\r\n ...consoleUrls,\r\n },\r\n hint: `请在 Console 确认签约状态后重试;CLI 不会执行支付:${consoleUrls.actionUrl}`,\r\n });\r\n }\r\n }\r\n\r\n if (failed.length > 0) {\r\n throw cliError(I18N_KEYS.dep_sign_partial_failed, {\r\n code: 5,\r\n details: {\r\n error: 'DEPENDENCY_AUTH_INCOMPLETE',\r\n reason: 'DEPENDENCY_SIGN_PARTIAL_FAILED',\r\n succeeded,\r\n failed,\r\n unresolvedDependencies: failed.map((f) => ({\r\n resourceId: f.resourceId,\r\n policyId: f.policyId,\r\n })),\r\n ...consoleUrls,\r\n },\r\n hint: `检查失败项,或在 Console 完成签约后执行:${nextCommand}\\n${consoleUrls.actionUrl}`,\r\n });\r\n }\r\n\r\n return { ok: true, succeeded, failed };\r\n}\r\n","import { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { mergeDeclaredAuthSubjects } from '../authorizationTree.js';\nimport { assertAuthMapMatchesDependencies } from '../depAuthService.js';\nimport type { PreparedFile } from './types.js';\n\n/** 对齐 Console creatorBatch Card:isCompleteAuthorization + batchSignContracts。 */\nexport function assertBatchItemAuthorizationReady(item: PreparedFile): void {\n const declared = mergeDeclaredAuthSubjects(item.dependencies, item.baseUpcastResources);\n if (declared.length === 0) return;\n\n const batchSign = item.batchSignContracts || [];\n if (!batchSign.length) {\n throw cliError(I18N_KEYS.batch_authorization_incomplete, {\n code: 5,\n details: {\n filename: item.filename,\n name: item.name,\n resourceTitle: item.resourceTitle,\n missingSubjectIds: declared.map((row) => row.resourceId),\n },\n hint: '在 freelog.batch.json 为该条目声明 batchSignContracts(含 dependencies 与 baseUpcastResources 的全部 resourceId)',\n });\n }\n\n assertAuthMapMatchesDependencies(\n {\n contracts: batchSign.map((entry) => ({\n resourceId: entry.resourceId,\n policyIds: entry.policyIds,\n })),\n },\n declared,\n );\n}\n\nexport function assertPreparedBatchAuthorization(prepared: PreparedFile[]): void {\n const unresolved: Array<{\n filename: string;\n name: string;\n resourceTitle: string;\n missingSubjectIds: string[];\n reason: string;\n }> = [];\n\n for (const item of prepared) {\n const declared = mergeDeclaredAuthSubjects(item.dependencies, item.baseUpcastResources);\n if (declared.length === 0) continue;\n\n const batchSign = item.batchSignContracts || [];\n if (!batchSign.length) {\n unresolved.push({\n filename: item.filename,\n name: item.name,\n resourceTitle: item.resourceTitle,\n missingSubjectIds: declared.map((row) => row.resourceId),\n reason: 'BATCH_SIGN_CONTRACTS_MISSING',\n });\n continue;\n }\n\n try {\n assertAuthMapMatchesDependencies(\n {\n contracts: batchSign.map((entry) => ({\n resourceId: entry.resourceId,\n policyIds: entry.policyIds,\n })),\n },\n declared,\n );\n } catch (error) {\n const missingSubjectIds = declared\n .map((row) => row.resourceId)\n .filter((resourceId) => !batchSign.some((entry) => entry.resourceId === resourceId));\n unresolved.push({\n filename: item.filename,\n name: item.name,\n resourceTitle: item.resourceTitle,\n missingSubjectIds,\n reason:\n error instanceof Error && /undeclared|duplicate|policy/i.test(error.message)\n ? 'BATCH_SIGN_CONTRACTS_INVALID'\n : 'BATCH_SIGN_CONTRACTS_INCOMPLETE',\n });\n }\n }\n\n if (unresolved.length === 0) return;\n\n throw cliError(I18N_KEYS.batch_authorization_incomplete, {\n code: 5,\n details: { unresolvedItems: unresolved },\n hint: '对齐 Console 批量发行:每项 dependencies/baseUpcastResources 须在 batchSignContracts 中完整列出 policyIds',\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { createHash, randomUUID } from 'node:crypto';\nimport { atomicWriteFile } from '../../config/atomicWrite.js';\nimport { getCliEnv, type FreelogEnv } from '../../core/env.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport type { FromDirCreatedItem, PreparedFile } from './types.js';\n\nexport const BATCH_REPORT_SCHEMA_VERSION = 1 as const;\n\nexport type BatchReportCommand = 'resource import-dir' | 'studio publish';\n\nfunction batchReportError(message: string, details?: unknown) {\n return cliError(I18N_KEYS.batch_report_error, { code: 4, params: { message }, details });\n}\n\nexport type BatchReportResult =\n | 'pending'\n | 'passed'\n | 'failed'\n | 'skipped'\n | 'remote_outcome_unknown'\n | 'remote_succeeded_local_pending';\n\nexport type BatchReportStage = 'prepared' | 'remote-requested' | 'remote-created' | 'local-written';\n\nexport interface BatchReportItem {\n idempotencyKey: string;\n relativePath: string;\n prepared: PreparedFile;\n stage: BatchReportStage;\n result: BatchReportResult;\n attempts: number;\n resourceId?: string;\n resourceName?: string;\n versionId?: string;\n subdir?: string;\n error?: string;\n cleanup: { status: 'not-required' | 'pending' | 'complete' | 'failed'; error?: string };\n}\n\nexport interface BatchReport {\n schemaVersion: typeof BATCH_REPORT_SCHEMA_VERSION;\n runId: string;\n command: BatchReportCommand;\n env: FreelogEnv;\n actor?: { userId: number | string; username: string };\n input: { directory: string; fingerprint: string };\n config: { path?: string; fingerprint: string };\n startedAt: string;\n finishedAt?: string;\n reportPath: string;\n recovery?: { mode: 'resume' | 'retry'; sourceReport: string };\n items: BatchReportItem[];\n summary: {\n passed: number;\n failed: number;\n skipped: number;\n remotePending: number;\n remoteUnknown: number;\n pending: number;\n };\n}\n\nfunction stable(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stable).join(',')}]`;\n if (value && typeof value === 'object') {\n return `{${Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, item]) => `${JSON.stringify(key)}:${stable(item)}`)\n .join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nfunction sha256(value: string): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction hashFile(filePath: string, algorithm: 'sha1' | 'sha256'): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = createHash(algorithm);\n const stream = fs.createReadStream(filePath);\n stream.on('data', (chunk) => hash.update(chunk));\n stream.on('error', reject);\n stream.on('end', () => resolve(hash.digest('hex')));\n });\n}\n\nexport function batchIdempotencyKey(parent: string, item: PreparedFile): string {\n const normalizedPath = path.relative(parent, item.absolutePath).replace(/\\\\/g, '/');\n const relativePath = process.platform === 'win32' ? normalizedPath.toLowerCase() : normalizedPath;\n return sha256([relativePath, item.sha1, item.resourceTypeCode, item.name].join('\\0'));\n}\n\nexport function summarizeBatchReport(items: BatchReportItem[]): BatchReport['summary'] {\n return {\n passed: items.filter((item) => item.result === 'passed').length,\n failed: items.filter((item) => item.result === 'failed').length,\n skipped: items.filter((item) => item.result === 'skipped').length,\n remotePending: items.filter((item) => item.result === 'remote_succeeded_local_pending').length,\n remoteUnknown: items.filter((item) => item.result === 'remote_outcome_unknown').length,\n pending: items.filter((item) => item.result === 'pending').length,\n };\n}\n\nfunction reportsDir(parent: string): string {\n return path.join(parent, '.freelog', 'reports');\n}\n\nfunction writeLatest(parent: string, reportPath: string, command: BatchReportCommand): void {\n const relative = path.relative(parent, reportPath).replace(/\\\\/g, '/');\n atomicWriteFile(\n path.join(reportsDir(parent), command === 'studio publish' ? 'studio-latest.json' : 'latest.json'),\n `${JSON.stringify({ schemaVersion: BATCH_REPORT_SCHEMA_VERSION, report: relative }, null, 2)}\\n`,\n );\n}\n\nexport function persistBatchReport(report: BatchReport): void {\n report.summary = summarizeBatchReport(report.items);\n atomicWriteFile(report.reportPath, `${JSON.stringify(report, null, 2)}\\n`);\n writeLatest(report.input.directory, report.reportPath, report.command);\n}\n\nexport function createBatchReport(opts: {\n parent: string;\n prepared: PreparedFile[];\n command?: BatchReportCommand;\n actor?: { userId: number | string; username: string };\n configPath?: string;\n configFingerprintSource: unknown;\n}): BatchReport {\n const runId = `${new Date().toISOString().replace(/[:.]/g, '-')}-${randomUUID().slice(0, 8)}`;\n const reportPath = path.join(reportsDir(opts.parent), `${runId}.json`);\n const items = opts.prepared.map<BatchReportItem>((item) => ({\n idempotencyKey: batchIdempotencyKey(opts.parent, item),\n relativePath: path.relative(opts.parent, item.absolutePath).replace(/\\\\/g, '/'),\n prepared: item,\n stage: 'prepared',\n result: 'pending',\n attempts: 1,\n cleanup: { status: 'not-required' },\n }));\n const report: BatchReport = {\n schemaVersion: BATCH_REPORT_SCHEMA_VERSION,\n runId,\n command: opts.command || 'resource import-dir',\n env: getCliEnv(),\n ...(opts.actor ? { actor: opts.actor } : {}),\n input: {\n directory: opts.parent,\n fingerprint: sha256(stable(items.map((item) => [item.relativePath, item.prepared.sha1]))),\n },\n config: {\n ...(opts.configPath ? { path: opts.configPath } : {}),\n fingerprint:\n opts.configPath && fs.existsSync(opts.configPath)\n ? sha256(fs.readFileSync(opts.configPath, 'utf8'))\n : sha256(stable(opts.configFingerprintSource)),\n },\n startedAt: new Date().toISOString(),\n reportPath,\n items,\n summary: summarizeBatchReport(items),\n };\n persistBatchReport(report);\n return report;\n}\n\nfunction isBatchReport(value: unknown): value is BatchReport {\n const row = value as Partial<BatchReport> | null;\n return Boolean(\n row &&\n row.schemaVersion === BATCH_REPORT_SCHEMA_VERSION &&\n (row.command === 'resource import-dir' || row.command === 'studio publish') &&\n typeof row.runId === 'string' &&\n row.input &&\n typeof row.input.directory === 'string' &&\n Array.isArray(row.items),\n );\n}\n\nexport function loadBatchReport(inputPath: string, cwd?: string): BatchReport {\n let reportPath = path.resolve(cwd || process.cwd(), inputPath);\n const readReportJson = (filePath: string): unknown => {\n try {\n return JSON.parse(fs.readFileSync(filePath, 'utf8')) as unknown;\n } catch (error) {\n throw batchReportError(`无法读取批量报告: ${filePath}`, {\n cause: error instanceof Error ? error.message : String(error),\n });\n }\n };\n const parsed = readReportJson(reportPath);\n if (!isBatchReport(parsed)) {\n const latest = parsed as { schemaVersion?: number; report?: string };\n if (latest.schemaVersion === BATCH_REPORT_SCHEMA_VERSION && latest.report) {\n reportPath = path.resolve(path.dirname(path.dirname(path.dirname(reportPath))), latest.report);\n const target = readReportJson(reportPath);\n if (!isBatchReport(target)) throw batchReportError(`无效批量报告: ${reportPath}`);\n target.reportPath = reportPath;\n return target;\n }\n throw batchReportError(`无效批量报告: ${reportPath}`);\n }\n parsed.reportPath = reportPath;\n return parsed;\n}\n\nexport async function prepareBatchRecovery(opts: {\n reportPath: string;\n mode: 'resume' | 'retry';\n cwd?: string;\n}): Promise<{ report: BatchReport; prepared: PreparedFile[] }> {\n const report = loadBatchReport(opts.reportPath, opts.cwd);\n if (report.command !== 'resource import-dir') {\n throw batchReportError(`报告 ${report.reportPath} 属于 ${report.command},不能用于 import-dir 恢复`);\n }\n if (report.env !== getCliEnv()) {\n throw batchReportError(`批量报告环境为 ${report.env},当前环境为 ${getCliEnv()},拒绝跨环境恢复`);\n }\n if (report.config.path) {\n if (!fs.existsSync(report.config.path)) {\n throw batchReportError(`批量配置已不存在,拒绝从旧报告恢复: ${report.config.path}`);\n }\n const currentConfigFingerprint = await hashFile(report.config.path, 'sha256');\n if (currentConfigFingerprint !== report.config.fingerprint) {\n throw batchReportError(`批量配置已变化,拒绝从旧报告恢复: ${report.config.path}`);\n }\n }\n const accepted =\n opts.mode === 'retry'\n ? new Set<BatchReportResult>(['failed'])\n : new Set<BatchReportResult>(['pending', 'failed', 'remote_succeeded_local_pending']);\n const unknown = report.items.filter((item) => item.result === 'remote_outcome_unknown');\n if (unknown.length) {\n throw batchReportError(\n `批量报告有 ${unknown.length} 项远端结果未知,禁止 ${opts.mode} 自动恢复以避免重复创建;请先在 Console 按授权名/版本核对: ${unknown\n .map((item) => item.prepared.name)\n .join(', ')}`,\n { result: 'remote_outcome_unknown' },\n );\n }\n const selected = report.items.filter((item) => accepted.has(item.result));\n for (const item of selected) {\n if (!fs.existsSync(item.prepared.absolutePath)) {\n throw batchReportError(`恢复输入文件不存在: ${item.prepared.absolutePath}`);\n }\n const currentSha1 = await hashFile(item.prepared.absolutePath, 'sha1');\n if (currentSha1 !== item.prepared.sha1) {\n throw batchReportError(`恢复输入文件内容已变化: ${item.prepared.absolutePath}`);\n }\n item.attempts += 1;\n item.error = undefined;\n if (item.result !== 'remote_succeeded_local_pending') item.result = 'pending';\n }\n report.finishedAt = undefined;\n report.recovery = { mode: opts.mode, sourceReport: report.reportPath };\n persistBatchReport(report);\n return { report, prepared: selected.map((item) => item.prepared) };\n}\n\nexport function findReportItem(report: BatchReport, parent: string, item: PreparedFile): BatchReportItem {\n const key = batchIdempotencyKey(parent, item);\n const row = report.items.find((entry) => entry.idempotencyKey === key);\n if (!row) throw batchReportError(`批量报告缺少输入项: ${item.filename}`);\n return row;\n}\n\nexport function markReportRemote(\n report: BatchReport,\n parent: string,\n item: PreparedFile,\n remote: { resourceId: string; resourceName?: string; versionId?: string },\n): void {\n const row = findReportItem(report, parent, item);\n row.stage = 'remote-created';\n row.result = 'remote_succeeded_local_pending';\n row.resourceId = remote.resourceId;\n row.resourceName = remote.resourceName || item.name;\n if (remote.versionId) row.versionId = remote.versionId;\n row.error = undefined;\n persistBatchReport(report);\n}\n\nexport function markReportRemoteOutcomeUnknown(\n report: BatchReport,\n parent: string,\n items: PreparedFile[],\n): void {\n for (const item of items) {\n const row = findReportItem(report, parent, item);\n row.stage = 'remote-requested';\n row.result = 'remote_outcome_unknown';\n row.error = '远端写请求已发出,结果尚未安全持久化';\n }\n persistBatchReport(report);\n}\n\nexport function markReportRemoteRequestNotApplied(\n report: BatchReport,\n parent: string,\n items: PreparedFile[],\n): void {\n for (const item of items) {\n const row = findReportItem(report, parent, item);\n row.stage = 'prepared';\n row.result = 'pending';\n row.error = undefined;\n }\n persistBatchReport(report);\n}\n\nexport function markReportBatchRemote(\n report: BatchReport,\n parent: string,\n entries: Array<{\n item: PreparedFile;\n resourceId?: string;\n resourceName?: string;\n versionId?: string;\n }>,\n): void {\n if (entries.some((entry) => !entry.resourceId)) {\n throw batchReportError('批量创建响应缺少 resourceId,远端结果保持 unknown,禁止自动恢复');\n }\n for (const entry of entries) {\n const row = findReportItem(report, parent, entry.item);\n row.stage = 'remote-created';\n row.result = 'remote_succeeded_local_pending';\n row.resourceId = entry.resourceId;\n row.resourceName = entry.resourceName || entry.item.name;\n if (entry.versionId) row.versionId = entry.versionId;\n row.error = undefined;\n }\n // 整批映射只持久化一次;atomicWriteFile 保证不会留下半份 JSON。\n persistBatchReport(report);\n}\n\nexport function markReportComplete(\n report: BatchReport,\n parent: string,\n item: PreparedFile,\n result: FromDirCreatedItem,\n versionId?: string,\n): void {\n const row = findReportItem(report, parent, item);\n row.stage = 'local-written';\n row.result = 'passed';\n row.resourceId = result.resourceId;\n row.resourceName = result.resourceName;\n row.versionId = versionId || row.versionId;\n row.subdir = result.subdir;\n row.error = undefined;\n row.cleanup = { status: 'not-required' };\n persistBatchReport(report);\n}\n\nexport function markReportLocalWritePlanned(\n report: BatchReport,\n parent: string,\n item: PreparedFile,\n subdir: string,\n): void {\n const row = findReportItem(report, parent, item);\n row.subdir = path.relative(parent, subdir).replace(/\\\\/g, '/');\n row.cleanup = { status: 'not-required' };\n persistBatchReport(report);\n}\n\nexport function markReportSkipped(\n report: BatchReport,\n parent: string,\n item: PreparedFile,\n result: FromDirCreatedItem,\n): void {\n const row = findReportItem(report, parent, item);\n row.stage = 'local-written';\n row.result = 'skipped';\n row.resourceId = result.resourceId;\n row.resourceName = result.resourceName;\n row.subdir = result.subdir;\n row.error = 'sha1-reuse';\n persistBatchReport(report);\n}\n\nexport function markReportFailure(\n report: BatchReport,\n parent: string,\n item: PreparedFile,\n error: string,\n): void {\n const row = findReportItem(report, parent, item);\n if (row.result !== 'remote_outcome_unknown') {\n row.result = row.resourceId ? 'remote_succeeded_local_pending' : 'failed';\n }\n row.error = error;\n persistBatchReport(report);\n}\n\nexport function finishBatchReport(report: BatchReport): void {\n report.finishedAt = new Date().toISOString();\n persistBatchReport(report);\n}\n","import path from 'node:path';\r\nimport { requireAuth } from '../../core/auth.js';\r\nimport { assertExplicitEnvForWriteOperation } from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { FServiceAPI, unwrapData } from '../../platform/index.js';\r\nimport { assertResourceTypeCode } from '../typeService.js';\r\nimport { isCreateBatchSupported } from '../resourceTypeCapabilities.js';\r\nimport {\r\n assertBatchFileCount,\r\n confirmBatchReleaseWithoutPolicies,\r\n countPreparedWithoutPolicies,\r\n CREATE_BATCH_CHUNK_SIZE,\r\n warnBatchChunkingIfNeeded,\r\n} from '../shared/guards/index.js';\r\nimport { resolveCreateApiResourceTypeName } from '../resourceName.js';\r\nimport {\r\n applyGeneratedResourceNames,\r\n createOneResource,\r\n ensureVersionAfterCreateBatch,\r\n normalizeBatchSignContracts,\r\n prepareFiles,\r\n resolveExistingImportBySha1,\r\n resolveUniqueSubdir,\r\n writeItemConfigs,\r\n} from './prepare.js';\r\nimport { normalizeCreateBatchResults } from './results.js';\nimport { emitBatchProgress, type BatchImportProgressEvent } from './progress.js';\r\nimport type { CreateBatchResultItem, FromDirCreatedItem, PreparedFile } from './types.js';\r\nimport { resolveConfigPath } from './config.js';\r\nimport { assertPreparedBatchAuthorization } from './authorization.js';\r\nimport {\r\n createBatchReport,\r\n findReportItem,\r\n finishBatchReport,\r\n markReportBatchRemote,\r\n markReportComplete,\r\n markReportFailure,\r\n markReportLocalWritePlanned,\r\n markReportRemote,\n markReportRemoteOutcomeUnknown,\n markReportSkipped,\n prepareBatchRecovery,\r\n} from './report.js';\r\n\r\nexport type { BatchImportProgressEvent };\r\n\r\nexport async function createFromDir(opts: {\r\n dir: string;\r\n typeCode?: string;\r\n resourceTypeName?: string;\r\n titlePrefix?: string;\r\n configFile?: string;\r\n cwd?: string;\r\n yes?: boolean;\r\n strictBatchLimit?: boolean;\r\n onProgress?: (event: BatchImportProgressEvent) => void;\r\n onReportCreated?: (reportPath: string) => void;\r\n resumeReport?: string;\r\n retryReport?: string;\r\n}): Promise<FromDirCreatedItem[]> {\r\n assertExplicitEnvForWriteOperation();\r\n const auth = requireAuth();\r\n if (!auth.username) {\r\n throw cliError(I18N_KEYS.auth_missing_username, { code: 2, hint: '重新 login' });\r\n }\r\n if (opts.resumeReport && opts.retryReport) {\r\n throw new Error('--resume 与 --retry 不能同时使用');\r\n }\r\n const requestedParent = path.resolve(opts.dir || opts.cwd || resolveCwd());\r\n const recoveryPath = opts.resumeReport || opts.retryReport;\r\n const recovery = recoveryPath\r\n ? await prepareBatchRecovery({\r\n reportPath: recoveryPath,\r\n mode: opts.retryReport ? 'retry' : 'resume',\r\n cwd: opts.cwd,\r\n })\r\n : undefined;\r\n const parent = recovery?.report.input.directory || requestedParent;\r\n const prepared = recovery\r\n ? recovery.prepared\r\n : await applyGeneratedResourceNames(\r\n await prepareFiles({\r\n dir: parent,\r\n typeCode: opts.typeCode,\r\n resourceTypeName: opts.resourceTypeName,\r\n titlePrefix: opts.titlePrefix,\r\n username: auth.username,\r\n cwd: opts.cwd,\r\n configFile: opts.configFile,\r\n }),\r\n );\r\n const configPath = recovery\r\n ? recovery.report.config.path\r\n : resolveConfigPath(opts.cwd, parent, opts.configFile);\r\n const report =\r\n recovery?.report ||\r\n createBatchReport({\r\n parent,\r\n prepared,\r\n configPath: configPath || undefined,\r\n configFingerprintSource: {\r\n configPath: configPath || null,\r\n typeCode: opts.typeCode || null,\r\n resourceTypeName: opts.resourceTypeName || null,\r\n titlePrefix: opts.titlePrefix || null,\r\n items: prepared.map((item) => ({\r\n name: item.name,\r\n resourceTitle: item.resourceTitle,\r\n resourceTypeCode: item.resourceTypeCode,\r\n version: item.version,\r\n description: item.description,\r\n policies: item.policies,\r\n dependencies: item.dependencies,\r\n })),\r\n },\r\n });\r\n opts.onReportCreated?.(report.reportPath);\r\n\r\n assertBatchFileCount(prepared.length, opts.strictBatchLimit);\r\n warnBatchChunkingIfNeeded(prepared.length);\r\n await confirmBatchReleaseWithoutPolicies({\r\n withoutPolicyCount: countPreparedWithoutPolicies(prepared),\r\n yes: opts.yes,\r\n });\r\n assertPreparedBatchAuthorization(prepared);\r\n\r\n emitBatchProgress(opts.onProgress, { event: 'start', total: prepared.length });\r\n\r\n const created: FromDirCreatedItem[] = [];\r\n const failures: Array<{ file: string; error: string }> = [];\r\n const batchResults = new Map<PreparedFile, CreateBatchResultItem>();\r\n const existingResults = new Map<PreparedFile, FromDirCreatedItem>();\r\n\r\n for (const item of prepared) {\r\n const reportItem = findReportItem(report, parent, item);\r\n if (reportItem.result === 'remote_succeeded_local_pending' && reportItem.resourceId) continue;\r\n const existing = resolveExistingImportBySha1(parent, item);\r\n if (existing) existingResults.set(item, existing);\r\n }\r\n\r\n const groups = new Map<string, PreparedFile[]>();\r\n for (const item of prepared) {\r\n const reportItem = findReportItem(report, parent, item);\r\n if (existingResults.has(item) || (reportItem.result === 'remote_succeeded_local_pending' && reportItem.resourceId)) {\r\n continue;\r\n }\r\n const key = `${item.resourceTypeCode}\\u0000${item.resourceTypeName || ''}`;\r\n const rows = groups.get(key) || [];\r\n rows.push(item);\r\n groups.set(key, rows);\r\n }\r\n\r\n for (const rows of groups.values()) {\n const typeInfo = await assertResourceTypeCode(rows[0]!.resourceTypeCode);\n if (!isCreateBatchSupported(typeInfo)) continue;\n if (typeof FServiceAPI.Resource.createBatch !== 'function') continue;\n const batchable = rows.filter((item) => !(item.authExcludedItems || []).length);\n if (!batchable.length) continue;\r\n\r\n for (let offset = 0; offset < batchable.length; offset += CREATE_BATCH_CHUNK_SIZE) {\r\n const chunk = batchable.slice(offset, offset + CREATE_BATCH_CHUNK_SIZE);\n markReportRemoteOutcomeUnknown(report, parent, chunk);\n let rowsData: CreateBatchResultItem[];\n try {\n const envelope = await FServiceAPI.Resource.createBatch({\n resourceTypeCode: chunk[0]!.resourceTypeCode,\n resourceTypeName: resolveCreateApiResourceTypeName(chunk[0]!.resourceTypeCode, {\n manifest: chunk[0]!.resourceTypeName,\n }),\n createResourceObjects: chunk.map((p) => ({\n name: p.name,\n resourceTitle: p.resourceTitle,\n intro: p.intro,\n coverImages: p.coverImages,\n tags: p.tags,\n policies: p.policies,\n version: p.version,\n fileSha1: p.sha1,\n filename: p.filename,\n description: p.description,\n dependencies: p.dependencies,\n baseUpcastResources: p.baseUpcastResources,\n inputAttrs: p.inputAttrs,\n customPropertyDescriptors: p.customPropertyDescriptors,\n batchSignContracts: normalizeBatchSignContracts(p.batchSignContracts),\n })),\n } as Parameters<typeof FServiceAPI.Resource.createBatch>[0]);\n rowsData = normalizeCreateBatchResults(\n unwrapData(envelope),\n chunk.map((p) => p.name),\n );\n } catch (error) {\n finishBatchReport(report);\n throw cliError(I18N_KEYS.create_batch_remote_outcome_unknown, {\n code: 4,\n params: { count: chunk.length },\n details: {\n reportFile: report.reportPath,\n resourceNames: chunk.map((item) => item.name),\n },\n cause: error,\n hint: '禁止自动逐项重试;请先在 Console 按授权名、版本和 owner 对账,再处理恢复报告',\n });\n }\n markReportBatchRemote(\n report,\n parent,\n chunk.map((item, index) => {\n const row = rowsData[index]!;\n return {\n item,\n resourceId: row.resourceId,\n resourceName: row.resourceName || row.name || item.name,\n };\n }),\n );\n chunk.forEach((item, index) => batchResults.set(item, rowsData[index]!));\n }\n }\n\r\n for (let i = 0; i < prepared.length; i += 1) {\r\n const item = prepared[i]!;\r\n try {\r\n const existing = existingResults.get(item);\r\n if (existing) {\r\n created.push(existing);\r\n markReportSkipped(report, parent, item, existing);\r\n emitBatchProgress(opts.onProgress, {\r\n event: 'skip',\r\n index: i,\r\n file: item.filename,\r\n resourceId: existing.resourceId,\r\n subdir: existing.subdir,\r\n reason: 'sha1-reuse',\r\n });\r\n continue;\r\n }\r\n\r\n let resourceId: string | undefined;\r\n let resourceName: string | undefined;\r\n let versionId: string | undefined;\r\n const reportItem = findReportItem(report, parent, item);\r\n\r\n if (reportItem.result === 'remote_succeeded_local_pending' && reportItem.resourceId) {\r\n resourceId = reportItem.resourceId;\r\n resourceName = reportItem.resourceName || item.name;\r\n const versionMeta = await ensureVersionAfterCreateBatch(item, resourceId);\r\n versionId = versionMeta.versionId || reportItem.versionId;\r\n markReportRemote(report, parent, item, { resourceId, resourceName, versionId });\r\n } else if (batchResults.has(item)) {\r\n const row = batchResults.get(item);\r\n resourceId = row?.resourceId;\r\n resourceName = row?.resourceName || row?.name || item.name;\r\n if (!resourceId) {\r\n throw cliError(I18N_KEYS.create_batch_missing_resource_id, {\r\n code: 1,\r\n details: row,\r\n });\r\n }\r\n const versionMeta = await ensureVersionAfterCreateBatch(item, resourceId);\r\n versionId = versionMeta.versionId;\r\n markReportRemote(report, parent, item, { resourceId, resourceName, versionId });\r\n } else {\r\n markReportRemoteOutcomeUnknown(report, parent, [item]);\r\n const one = await createOneResource(item, (remote) => {\r\n markReportRemote(report, parent, item, remote);\r\n });\r\n resourceId = one.resourceId;\r\n resourceName = one.resourceName;\r\n versionId = one.versionId;\r\n markReportRemote(report, parent, item, { resourceId, resourceName, versionId });\r\n }\r\n\r\n const savedSubdir = reportItem.subdir ? path.resolve(parent, reportItem.subdir) : undefined;\r\n if (savedSubdir) {\r\n const relativeSavedSubdir = path.relative(parent, savedSubdir);\r\n if (\r\n !relativeSavedSubdir ||\r\n relativeSavedSubdir.startsWith('..') ||\r\n path.isAbsolute(relativeSavedSubdir)\r\n ) {\r\n throw new Error(`批量报告包含越界子目录: ${reportItem.subdir}`);\r\n }\r\n }\r\n const subdir = savedSubdir || resolveUniqueSubdir(parent, item.safeDir);\r\n markReportLocalWritePlanned(report, parent, item, subdir);\r\n writeItemConfigs({\r\n subdir,\r\n sourceFile: item.absolutePath,\r\n resourceId,\r\n resourceName: resourceName || item.name,\r\n resourceTypeCode: item.resourceTypeCode,\r\n resourceTypeName: item.resourceTypeName,\r\n resourceTitle: item.resourceTitle,\r\n fileSha1: item.sha1,\r\n filename: item.filename,\r\n version: item.version,\r\n description: item.description,\r\n intro: item.intro,\r\n coverImages: item.coverImages,\r\n tags: item.tags,\r\n dependencies: item.dependencies,\r\n baseUpcastResources: item.baseUpcastResources,\r\n authExcludedItems: item.authExcludedItems,\r\n inputAttrs: item.inputAttrs,\r\n customPropertyDescriptors: item.customPropertyDescriptors,\r\n versionId,\r\n userId: auth.userId,\r\n username: auth.username,\r\n });\r\n const createdItem: FromDirCreatedItem = {\r\n subdir: path.relative(parent, subdir) || path.basename(subdir),\r\n resourceId,\r\n resourceName: resourceName || item.name,\r\n resourceTitle: item.resourceTitle,\r\n itemTitle: item.itemTitle,\r\n authExcludedItems: item.authExcludedItems,\r\n };\r\n created.push(createdItem);\r\n markReportComplete(report, parent, item, createdItem, versionId);\r\n emitBatchProgress(opts.onProgress, {\r\n event: 'ok',\r\n index: i,\r\n file: item.filename,\r\n resourceId,\r\n resourceName: resourceName || item.name,\r\n subdir: path.relative(parent, subdir) || path.basename(subdir),\r\n });\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n failures.push({\r\n file: item.filename,\r\n error: message,\r\n });\r\n markReportFailure(report, parent, item, message);\r\n emitBatchProgress(opts.onProgress, {\r\n event: 'fail',\r\n index: i,\r\n file: item.filename,\r\n error: message,\r\n });\r\n }\r\n }\r\n\r\n emitBatchProgress(opts.onProgress, {\r\n event: 'done',\r\n ok: created.length,\r\n fail: failures.length,\r\n total: prepared.length,\r\n });\r\n finishBatchReport(report);\r\n\r\n if (failures.length > 0) {\r\n const unknownCount = report.summary.remoteUnknown;\r\n throw cliError(I18N_KEYS.import_dir_partial_failed, {\r\n code: 4,\r\n params: { success: created.length, total: prepared.length },\r\n details: {\r\n created,\r\n failures,\r\n reportFile: report.reportPath,\r\n remoteOutcomeUnknown: unknownCount,\r\n },\n hint: unknownCount\n ? `${unknownCount} 项远端结果未知,禁止 --resume/--retry 自动恢复;请先在 Console 按授权名/版本核对后再决定后续操作。`\n : `正式报告 ${report.reportPath};请 freelog-cli resource import-dir --retry \"${report.reportPath}\" --yes`,\n });\r\n }\r\n\r\n if (report.summary.remoteUnknown > 0) {\r\n throw cliError(I18N_KEYS.import_dir_partial_failed, {\r\n code: 4,\r\n params: { success: created.length, total: report.items.length },\r\n details: {\r\n created,\r\n reportFile: report.reportPath,\r\n remoteOutcomeUnknown: report.summary.remoteUnknown,\r\n },\r\n hint: `${report.summary.remoteUnknown} 项远端结果未知,当前运行不能标记成功;请先在 Console 按授权名/版本核对`,\r\n });\r\n }\r\n\r\n return created;\r\n}\r\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport {\n createEmptyState,\n ensureProjectGitignore,\n saveProjectSnapshot,\n} from '../../config/project/index.js';\nimport { shortName } from '../../config/project/projects.js';\nimport type { FreelogManifest, FreelogState } from '../../config/project/types.js';\nimport { getCliEnv } from '../../core/env.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport type { EphemeralStore } from './ephemeralStore.js';\n\nfunction assertExportTargetEmpty(targetDir: string): void {\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n return;\n }\n const entries = fs.readdirSync(targetDir).filter((name) => name !== '.git');\n if (entries.length > 0) {\n throw cliError(I18N_KEYS.export_project_dir_not_empty, {\n code: 4,\n params: { path: targetDir },\n hint: '目标目录须为空或仅含 .git',\n });\n }\n}\n\n/** 会话成功结束后写出最小工程(§9);Console 无等价 — CLI 独有落盘能力。 */\nexport function exportSessionProject(store: EphemeralStore, targetDir: string): string {\n const resolved = path.resolve(targetDir);\n assertExportTargetEmpty(resolved);\n\n const resource = store.loadResource();\n const version = store.tryLoadVersion();\n const memoryState = store.loadState();\n const resourceId = resource.resourceId?.trim();\n const resourceName = resource.resourceName?.trim();\n if (!resourceId && !resourceName) {\n throw cliError(I18N_KEYS.export_project_missing_resource, {\n code: 4,\n hint: '先完成 create/publish 或传入 --resource-id',\n });\n }\n\n const identityName = resourceName || resourceId || 'resource';\n const manifest: FreelogManifest = {\n schemaVersion: 1,\n subject: 'resource',\n identity: { name: identityName },\n resource: {\n typeCode: resource.resourceTypeCode || '',\n typeName: resource.resourceTypeName,\n title: resource.resourceTitle || shortName(resourceName, identityName),\n intro: resource.intro || '',\n tags: resource.tags || [],\n coverImages: resource.coverImages || [],\n },\n // Session only knows platform policy facts (id/status), not reusable policy source text.\n // Exporting empty policyText would create a false local intent, so facts stay in state only.\n policies: [],\n version: version\n ? {\n version: version.version,\n filePath: version.filePath || 'dist',\n artifactMode: version.artifactMode,\n description: version.description ?? '',\n videoCover: version.videoCover,\n runtimeVersion: version.runtimeVersion ?? null,\n dependencies: version.dependencies || [],\n baseUpcastResources: version.baseUpcastResources || [],\n authExcludedItems: version.authExcludedItems || [],\n inputAttrs: version.inputAttrs || [],\n customPropertyDescriptors: version.customPropertyDescriptors || [],\n }\n : null,\n collection: null,\n };\n\n const exportState: FreelogState = {\n ...createEmptyState('resource'),\n env: memoryState.env || getCliEnv(),\n resource: {\n resourceId: resourceId || memoryState.resource.resourceId || null,\n resourceName: resourceName || memoryState.resource.resourceName || identityName,\n resourceType: resource.resourceType?.length\n ? resource.resourceType\n : memoryState.resource.resourceType,\n resourceTypeCode: resource.resourceTypeCode || memoryState.resource.resourceTypeCode || null,\n resourceTypeName: resource.resourceTypeName || memoryState.resource.resourceTypeName || null,\n subjectType: memoryState.resource.subjectType ?? null,\n owner: memoryState.resource.owner ?? null,\n status: resource.status ?? memoryState.resource.status ?? null,\n latestVersion: resource.latestVersion ?? memoryState.resource.latestVersion ?? null,\n policies: resource.policies ?? memoryState.resource.policies ?? [],\n },\n version: {\n lastPublishedVersion:\n memoryState.version.lastPublishedVersion ??\n (version?.published ? version.version : null),\n lastPublishedVersionId:\n memoryState.version.lastPublishedVersionId ?? version?.versionId ?? null,\n fileSha1: memoryState.version.fileSha1 ?? version?.fileSha1 ?? null,\n filename: memoryState.version.filename ?? version?.filename ?? null,\n draftSync: null,\n },\n sync: memoryState.sync,\n };\n\n ensureProjectGitignore(resolved);\n saveProjectSnapshot(manifest, exportState, resolved);\n return resolved;\n}\n","import { createEmptyState, listingFingerprint, resolveCwd } from '../../config/project/index.js';\nimport type { FreelogState, ResourceProject, VersionProject } from '../../config/project/types.js';\nimport { getCliEnv } from '../../core/env.js';\nimport { exportSessionProject } from './exportSessionProject.js';\nimport type { ProjectStore, ProjectStoreFactoryOpts } from './types.js';\n\nconst EMPTY_RESOURCE: ResourceProject = {\n resourceName: '',\n resourceType: [],\n};\n\ninterface EphemeralMemory {\n resource: ResourceProject;\n version: VersionProject | null;\n state: FreelogState;\n}\n\nfunction cloneResource(resource: ResourceProject): ResourceProject {\n return {\n ...resource,\n resourceType: [...(resource.resourceType || [])],\n coverImages: resource.coverImages ? [...resource.coverImages] : undefined,\n tags: resource.tags ? [...resource.tags] : undefined,\n policies: resource.policies ? [...resource.policies] : undefined,\n };\n}\n\nfunction cloneVersion(version: VersionProject | null): VersionProject | null {\n if (!version) return null;\n return {\n ...version,\n dependencies: version.dependencies ? [...version.dependencies] : undefined,\n baseUpcastResources: version.baseUpcastResources ? [...version.baseUpcastResources] : undefined,\n authExcludedItems: version.authExcludedItems ? [...version.authExcludedItems] : undefined,\n batchSignContracts: version.batchSignContracts ? [...version.batchSignContracts] : undefined,\n inputAttrs: version.inputAttrs ? [...version.inputAttrs] : undefined,\n customPropertyDescriptors: version.customPropertyDescriptors\n ? [...version.customPropertyDescriptors]\n : undefined,\n };\n}\n\n/** 会话模式内存 Store;平台事实由 ensureOperationContext lazy fetch,构造时不触网。 */\nexport class EphemeralStore implements ProjectStore {\n private readonly memory: EphemeralMemory;\n private readonly cwd?: string;\n\n constructor(opts: ProjectStoreFactoryOpts = {}) {\n this.cwd = opts.cwd;\n const state = createEmptyState('resource');\n state.env = getCliEnv();\n\n const seededResource: ResourceProject = {\n ...EMPTY_RESOURCE,\n ...opts.seed?.resource,\n ...(opts.resourceId ? { resourceId: opts.resourceId } : {}),\n };\n\n this.memory = {\n resource: seededResource,\n version: opts.seed?.version\n ? {\n version: opts.seed.version.version ?? '1.0.0',\n filePath: opts.seed.version.filePath ?? '',\n ...opts.seed.version,\n }\n : null,\n state,\n };\n }\n\n mode() {\n return 'session' as const;\n }\n\n rootDir() {\n return resolveCwd(this.cwd);\n }\n\n subject() {\n return 'resource' as const;\n }\n\n loadResource() {\n return cloneResource(this.memory.resource);\n }\n\n loadVersion() {\n return cloneVersion(this.memory.version);\n }\n\n tryLoadVersion() {\n return cloneVersion(this.memory.version);\n }\n\n loadState() {\n return structuredClone(this.memory.state);\n }\n\n resolveResourceId() {\n return this.memory.resource.resourceId?.trim() || undefined;\n }\n\n saveResource(patch: Partial<ResourceProject>) {\n this.memory.resource = { ...this.memory.resource, ...patch };\n }\n\n saveVersion(patch: Partial<VersionProject>) {\n const current =\n this.memory.version ??\n ({\n version: patch.version ?? '1.0.0',\n filePath: patch.filePath ?? '',\n } satisfies VersionProject);\n this.memory.version = { ...current, ...patch };\n }\n\n savePlatformFacts(resource: ResourceProject) {\n this.memory.resource = { ...this.memory.resource, ...resource };\n const state = this.memory.state;\n state.resource = {\n ...state.resource,\n resourceId: resource.resourceId || state.resource.resourceId || null,\n resourceName: resource.resourceName || state.resource.resourceName || null,\n resourceType: resource.resourceType || state.resource.resourceType || [],\n resourceTypeCode: resource.resourceTypeCode || state.resource.resourceTypeCode || null,\n resourceTypeName: resource.resourceTypeName || state.resource.resourceTypeName || null,\n owner:\n resource.userId !== undefined || resource.username !== undefined\n ? { userId: resource.userId ?? null, username: resource.username ?? null }\n : state.resource.owner ?? null,\n status: resource.status ?? state.resource.status ?? null,\n latestVersion: resource.latestVersion ?? state.resource.latestVersion ?? null,\n policies: resource.policies ?? state.resource.policies ?? [],\n };\n state.sync = {\n ...state.sync,\n lastPulledAt: new Date().toISOString(),\n listingFingerprint: listingFingerprint(resource),\n platformUpdateDate:\n (resource as { updateDate?: string }).updateDate ?? state.sync.platformUpdateDate ?? null,\n };\n }\n\n saveVersionFacts(patch: Partial<FreelogState['version']>) {\n this.memory.state.version = { ...this.memory.state.version, ...patch };\n }\n\n persist() {\n // 会话模式不写盘。\n }\n\n exportProject(targetDir: string) {\n return exportSessionProject(this, targetDir);\n }\n\n supportsListingSync() {\n return false;\n }\n}\n","import { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport type { FreelogState, ResourceProject, VersionProject } from '../../config/project/types.js';\nimport {\n loadResourceProject,\n loadVersionProject,\n mergeProjectPatch,\n tryLoadVersionProject,\n saveResourceProject,\n savePlatformResourceState,\n saveVersionProject,\n} from '../../config/project/projects.js';\nimport {\n loadState,\n resolveCwd,\n updateState,\n withProjectWriteLock,\n} from '../../config/project/store.js';\nimport type { ProjectStore, SavePlatformFactsOptions } from './types.js';\n\nexport class ManifestStateStore implements ProjectStore {\n constructor(private readonly cwd?: string) {}\n\n mode() {\n return 'project' as const;\n }\n\n rootDir() {\n return resolveCwd(this.cwd);\n }\n\n subject() {\n return 'resource' as const;\n }\n\n loadResource() {\n return loadResourceProject(this.cwd).data;\n }\n\n loadVersion() {\n return loadVersionProject(this.cwd).data;\n }\n\n tryLoadVersion() {\n return tryLoadVersionProject(this.cwd)?.data ?? null;\n }\n\n loadState() {\n return loadState(this.cwd, 'resource').data;\n }\n\n resolveResourceId() {\n return this.loadResource().resourceId?.trim() || undefined;\n }\n\n saveResource(patch: Partial<ResourceProject>) {\n withProjectWriteLock(this.cwd, () => {\n const current = this.loadResource();\n saveResourceProject(mergeProjectPatch(current, patch), this.cwd);\n });\n }\n\n saveVersion(patch: Partial<VersionProject>) {\n withProjectWriteLock(this.cwd, () => {\n const current = this.loadVersion();\n saveVersionProject(mergeProjectPatch(current, patch), this.cwd);\n });\n }\n\n savePlatformFacts(resource: ResourceProject, options?: SavePlatformFactsOptions) {\n savePlatformResourceState(resource, this.cwd, 'resource', options);\n }\n\n saveVersionFacts(patch: Partial<FreelogState['version']>) {\n updateState(this.cwd, 'resource', (state) => {\n state.version = { ...state.version, ...patch };\n });\n }\n\n persist() {\n // 工程模式:save* 已原子写 manifest/state;显式 persist 为 no-op。\n }\n\n exportProject(_targetDir: string): string {\n throw cliError(I18N_KEYS.export_project_session_only, { code: 4 });\n }\n\n supportsListingSync() {\n return true;\n }\n}\n","import { EphemeralStore } from './ephemeralStore.js';\nimport { ManifestStateStore } from './manifestStateStore.js';\nimport type { ProjectStore, ProjectStoreFactoryOpts } from './types.js';\n\nexport type { ProjectMode, ProjectStore, ProjectStoreFactoryOpts } from './types.js';\n\nexport function createProjectStore(opts: ProjectStoreFactoryOpts = {}): ProjectStore {\n if (opts.session) {\n return new EphemeralStore(opts);\n }\n return new ManifestStateStore(opts.cwd);\n}\n\n/** 工程模式 Store;由命令层注入 service。 */\nexport function projectStoreFromCwd(cwd?: string): ProjectStore {\n return new ManifestStateStore(cwd);\n}\n","import { cliError } from '../../i18n/cliError.js';\n\nexport const RSS_EPISODE_LIMIT = 15;\nexport const RSS_IMPORTING_STATUSES = new Set(['', 'pending', 'running']);\nexport const RSS_FAILURE_STATUSES = new Set(['partial_failed', 'failed', 'error']);\n\nexport interface RssPreviewData {\n errorCode?: string;\n resourceId?: string;\n matchedItemCount?: number;\n audioItemCount?: number;\n itemCount?: number;\n feedData?: {\n channel?: {\n title?: string;\n imageUrl?: string;\n author?: string;\n ownerEmail?: string;\n };\n };\n}\n\nexport interface RssCompareData {\n oldFeedItemCount?: number;\n newFeedItemCount?: number;\n guidMatchedCount?: number;\n}\n\nexport function maskRssOwnerEmail(email: string): string {\n const [name, domain] = email.split('@');\n if (!domain) return email;\n return `${name.slice(0, Math.min(3, name.length))}***@${domain}`;\n}\n\nexport function summarizeRssPreview(data: RssPreviewData) {\n const channel = data.feedData?.channel;\n return {\n title: channel?.title || '',\n cover: channel?.imageUrl || '',\n author: channel?.author || '',\n episodeCount: Number(data.audioItemCount ?? data.itemCount ?? 0),\n matchedItemCount:\n data.matchedItemCount === undefined ? undefined : Number(data.matchedItemCount),\n maskedEmail: channel?.ownerEmail ? maskRssOwnerEmail(channel.ownerEmail) : undefined,\n errorCode: data.errorCode,\n existingResourceId: data.resourceId,\n };\n}\n\nexport function assertRssPreviewCanContinue(data: RssPreviewData): void {\n const channel = data.feedData?.channel;\n if (!channel) throw cliError('RSS 地址无效,请检查后重新输入', { code: 4 });\n if (!channel.ownerEmail) {\n throw cliError('RSS feed 缺少所有者电子邮箱,无法验证播客所有权', { code: 4 });\n }\n if (data.errorCode === 'submitpodcastwrss_error_alreadyexists02') {\n throw cliError('此播客已被其他资源绑定', {\n code: 3,\n details: data.resourceId ? { resourceId: data.resourceId } : undefined,\n });\n }\n}\n\nexport function assertRssEpisodeRange(\n data: RssPreviewData,\n pubStartDate?: string,\n pubEndDate?: string,\n): void {\n const count = Number(data.matchedItemCount ?? data.audioItemCount ?? data.itemCount);\n if (Number.isFinite(count) && count > RSS_EPISODE_LIMIT && (!pubStartDate || !pubEndDate)) {\n throw cliError(`RSS 可导入单集超过 ${RSS_EPISODE_LIMIT} 条,必须同时提供发布时间范围`, {\n code: 4,\n hint: '使用 --pub-start <date> --pub-end <date>,与 Console 的单集数量弹窗一致',\n details: { matchedItemCount: count },\n });\n }\n}\n\nexport function assertRssDateRange(pubStartDate?: string, pubEndDate?: string): void {\n if ((pubStartDate && !pubEndDate) || (!pubStartDate && pubEndDate)) {\n throw cliError('发布时间范围必须同时提供开始和结束日期', { code: 4 });\n }\n if (!pubStartDate || !pubEndDate) return;\n const start = Date.parse(pubStartDate);\n const end = Date.parse(pubEndDate);\n if (!Number.isFinite(start) || !Number.isFinite(end)) {\n throw cliError('发布时间范围不是有效日期', { code: 4 });\n }\n if (start > end) throw cliError('发布时间开始日期不能晚于结束日期', { code: 4 });\n}\n\nexport function isGuidMassMismatch(data: RssCompareData): boolean {\n const oldCount = Number(data.oldFeedItemCount);\n const newCount = Number(data.newFeedItemCount);\n const matched = Number(data.guidMatchedCount);\n if (![oldCount, newCount, matched].every(Number.isFinite)) return false;\n return Math.max(oldCount, newCount) - matched > Math.abs(newCount - oldCount);\n}\n\nexport function isRssRelatedResource(info: {\n feedUrl?: unknown;\n rssGuid?: unknown;\n rssPubDate?: unknown;\n}): boolean {\n return [info.feedUrl, info.rssGuid, info.rssPubDate].some(\n (value) => typeof value === 'string' && value.trim() !== '',\n );\n}\n\nexport function assertRssManagedContentEditable(\n info: { feedUrl?: unknown; rssGuid?: unknown; rssPubDate?: unknown },\n operation: string,\n): void {\n if (!isRssRelatedResource(info)) return;\n throw cliError(`RSS 合集内容由 feed 管理,不能执行:${operation}`, {\n code: 4,\n hint: '可使用 collection rss inspect/bind/sync 管理订阅源;RSS 托管期间不能手工修改内容或标签',\n });\n}\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport {\r\n loadResourceProject,\r\n tryLoadResourceProject,\r\n tryLoadVersionProject,\r\n type AuthExcludedItem,\r\n} from '../../config/project.js';\r\nimport { requireAuth } from '../../core/auth.js';\r\nimport { assertExplicitEnvForWriteOperation } from '../../core/command.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { FServiceAPI, unwrapData } from '../../platform/index.js';\r\nimport { fetchResourceInfo, ownersMatch } from '../sync/index.js';\r\nimport { createFromDir, type FromDirCreatedItem } from '../batch/index.js';\r\nimport { policyApplyFromFile } from '../policyService.js';\r\nimport { projectStoreFromCwd } from '../store/projectStore.js';\r\nimport { assertCollectionItemTitle } from '../validation.js';\r\nimport {\n assertCollectionItemAddCount,\n COLLECTION_ITEM_ADD_LIMIT,\n} from '../shared/guards/index.js';\nimport { ensureCollectionSynced } from './owner.js';\r\nimport { assertRssManagedContentEditable } from './rssContract.js';\r\nimport {\r\n looksLikePath,\r\n onlineImportedChild,\n parseAuthExcludedItemsFile,\n fetchDraftItems,\n refreshCollectionDraftState,\r\n assertChildCollectionReady,\r\n assertCollectionItemBaseUpcastReady,\r\n} from './internal.js';\n\nexport function splitCollectionItemBatches<T>(items: T[]): T[][] {\n const chunks: T[][] = [];\n for (let offset = 0; offset < items.length; offset += COLLECTION_ITEM_ADD_LIMIT) {\n chunks.push(items.slice(offset, offset + COLLECTION_ITEM_ADD_LIMIT));\n }\n return chunks;\n}\n\r\nexport async function itemAdd(opts: {\r\n target: string;\r\n title?: string;\r\n authExcludedFile?: string;\r\n cwd?: string;\r\n noAutoPull?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\r\n assertRssManagedContentEditable(ctx.info, '添加合集目录项');\r\n const collectionId = ctx.collection.resourceId!;\r\n let resourceId = opts.target.trim();\r\n let itemTitle = opts.title;\r\n if (itemTitle !== undefined) assertCollectionItemTitle(itemTitle);\r\n\r\n let authExcludedItems: AuthExcludedItem[] = [];\r\n\r\n if (looksLikePath(opts.target)) {\r\n const itemCwd = path.resolve(resolveCwd(opts.cwd), opts.target);\r\n authExcludedItems = tryLoadVersionProject(itemCwd)?.data.authExcludedItems || [];\r\n const loaded = tryLoadResourceProject(itemCwd) || loadResourceProject(itemCwd);\r\n const auth = requireAuth();\r\n if (!ownersMatch(auth.userId, loaded.data.userId)) {\r\n if (loaded.data.resourceId) {\r\n const info = await fetchResourceInfo(loaded.data.resourceId);\r\n if (!ownersMatch(auth.userId, info.userId)) {\r\n throw cliError(I18N_KEYS.path_resource_not_owned, { code: 2 });\r\n }\r\n } else {\r\n throw cliError(I18N_KEYS.path_resource_invalid, { code: 4 });\r\n }\r\n }\r\n if (!loaded.data.resourceId) {\r\n throw cliError(I18N_KEYS.path_dir_missing_resource_id, { code: 4 });\r\n }\r\n resourceId = loaded.data.resourceId;\r\n itemTitle = itemTitle || loaded.data.resourceTitle;\r\n }\r\n\r\n if (opts.authExcludedFile?.trim()) {\r\n authExcludedItems = parseAuthExcludedItemsFile(opts.authExcludedFile, opts.cwd);\r\n }\r\n\r\n assertCollectionItemAddCount(1);\r\n\r\n await assertChildCollectionReady(resourceId, looksLikePath(opts.target) ? opts.target : undefined);\r\n await assertCollectionItemBaseUpcastReady(collectionId, [resourceId]);\r\n\r\n const envelope = await FServiceAPI.Resource.addResourceItems_Draft({\r\n resourceId: collectionId,\r\n addCollectionItems: [{ resourceId, itemTitle, authExcludedItems }],\r\n isPublish: 0,\r\n } as Parameters<typeof FServiceAPI.Resource.addResourceItems_Draft>[0]);\r\n assertAddCollectionItemsResult(envelope, 1);\r\n\r\n await refreshCollectionDraftState(ctx.collection, opts.cwd);\r\n return { collectionId, resourceId, itemTitle };\r\n}\r\n\r\nexport async function itemImportDir(opts: {\r\n dir: string;\r\n resourceTypeCode?: string;\r\n resourceTypeName?: string;\r\n titlePrefix?: string;\r\n configFile?: string;\r\n itemPolicyFile?: string;\r\n cwd?: string;\r\n yes?: boolean;\r\n noAutoPull?: boolean;\r\n strictBatchLimit?: boolean;\r\n onProgress?: (event: import('../batch/progress.js').BatchImportProgressEvent) => void;\r\n}): Promise<{ collectionId: string; created: FromDirCreatedItem[] }> {\r\n assertExplicitEnvForWriteOperation();\r\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\r\n assertRssManagedContentEditable(ctx.info, '从目录导入合集目录项');\r\n const collectionId = ctx.collection.resourceId!;\r\n const sourceDir = path.resolve(resolveCwd(opts.cwd), opts.dir);\r\n const created = await createFromDir({\r\n dir: sourceDir,\r\n typeCode: opts.resourceTypeCode,\r\n resourceTypeName: opts.resourceTypeName,\r\n titlePrefix: opts.titlePrefix,\r\n configFile: opts.configFile,\r\n cwd: opts.cwd,\r\n yes: opts.yes,\r\n strictBatchLimit: opts.strictBatchLimit,\r\n onProgress: opts.onProgress,\r\n });\r\n\r\n if (created.length) {\r\n const staged: FromDirCreatedItem[] = [];\r\n\r\n // 阶段 1:全部为子项 apply policy 并校验上架门禁(尚未 online)\r\n for (const item of created) {\r\n const childCwd = path.join(sourceDir, item.subdir);\r\n if (opts.itemPolicyFile?.trim()) {\r\n await policyApplyFromFile({\r\n store: projectStoreFromCwd(childCwd),\r\n fromFile: opts.itemPolicyFile,\r\n });\r\n }\r\n await assertChildCollectionReady(item.resourceId, childCwd, { requireOnline: false });\n staged.push(item);\n }\n\n // 阶段 2:所有远端只读授权门禁先通过,再产生 online 副作用。\n await assertCollectionItemBaseUpcastReady(\n collectionId,\n staged.map((item) => item.resourceId),\n );\n\n // 阶段 3:全部通过门禁后再逐个 online。\n for (let i = 0; i < staged.length; i += 1) {\r\n const item = staged[i]!;\r\n const childCwd = path.join(sourceDir, item.subdir);\r\n try {\r\n await onlineImportedChild(childCwd);\r\n } catch (error) {\r\n throw cliError(I18N_KEYS.collection_import_partial_online, {\r\n code: 4,\r\n params: { index: i + 1, total: staged.length },\r\n details: {\r\n failedResourceId: item.resourceId,\r\n alreadyProcessed: staged.slice(0, i).map((x) => x.resourceId),\r\n },\r\n cause: error,\r\n hint: '前序子资源可能已上架但未写入合集目录草稿,请 Console 核对或 offline 后重试',\r\n });\r\n }\r\n }\r\n\r\n // 阶段 4:Console 每次最多选择 100 项;CLI 复现为多个草稿写入批次。\n const existingDraftIds = new Set(\n (await fetchDraftItems(collectionId))\n .map((item) => item.resourceId?.trim())\n .filter((id): id is string => Boolean(id)),\n );\n const pending = staged.filter((item) => !existingDraftIds.has(item.resourceId));\n const chunks = splitCollectionItemBatches(pending);\n for (let batchIndex = 0; batchIndex < chunks.length; batchIndex += 1) {\n const chunk = chunks[batchIndex]!;\n try {\n const envelope = await FServiceAPI.Resource.addResourceItems_Draft({\n resourceId: collectionId,\n addCollectionItems: chunk.map((item) => ({\n resourceId: item.resourceId,\n itemTitle: item.itemTitle || item.resourceTitle || item.resourceName,\n authExcludedItems: item.authExcludedItems || [],\n })),\n isPublish: 0,\n } as Parameters<typeof FServiceAPI.Resource.addResourceItems_Draft>[0]);\n assertAddCollectionItemsResult(envelope, chunk.length);\n } catch (error) {\n let draftResourceIds: string[] = [];\n try {\n draftResourceIds = (await fetchDraftItems(collectionId))\n .map((item) => item.resourceId?.trim())\n .filter((id): id is string => Boolean(id));\n } catch {\n // Preserve the original mutation error; the next run refreshes the draft again.\n }\n throw cliError(I18N_KEYS.collection_import_partial_add, {\n code: 4,\n params: {\n completed: batchIndex * COLLECTION_ITEM_ADD_LIMIT,\n total: pending.length,\n },\n details: {\n collectionId,\n draftResourceIds,\n failedChunkResourceIds: chunk.map((item) => item.resourceId),\n },\n cause: error,\n hint: '保留源目录和子工程,修复平台错误后重跑同一 collection item import-dir;已在草稿中的条目会跳过',\n });\n }\n }\n await refreshCollectionDraftState(ctx.collection, opts.cwd);\n }\r\n\r\n return { collectionId, created };\r\n}\r\n\r\nexport function assertAddCollectionItemsResult(envelope: unknown, expectedCount: number): void {\r\n type AddCollectionItemsResult = {\r\n addSuccessfulItems?: unknown[];\r\n addFailedItems?: Array<{ itemName?: string; resourceId?: string; reason?: string }>;\r\n ignoreItems?: unknown[];\r\n };\r\n const unwrapped = unwrapData<AddCollectionItemsResult | { data?: AddCollectionItemsResult }>(\r\n envelope as AddCollectionItemsResult | { data?: AddCollectionItemsResult },\r\n );\r\n const data =\r\n unwrapped &&\r\n typeof unwrapped === 'object' &&\r\n 'data' in unwrapped &&\r\n unwrapped.data &&\r\n typeof unwrapped.data === 'object'\r\n ? unwrapped.data\r\n : (unwrapped as AddCollectionItemsResult);\r\n const failed = Array.isArray(data?.addFailedItems) ? data.addFailedItems : [];\r\n const successful = Array.isArray(data?.addSuccessfulItems) ? data.addSuccessfulItems : [];\r\n const ignored = Array.isArray(data?.ignoreItems) ? data.ignoreItems : [];\r\n const hasExplicitCounters =\r\n Array.isArray(data?.addSuccessfulItems) ||\r\n Array.isArray(data?.addFailedItems) ||\r\n Array.isArray(data?.ignoreItems);\r\n if (\r\n failed.length > 0 ||\r\n ignored.length > 0 ||\r\n (hasExplicitCounters && successful.length < expectedCount)\r\n ) {\r\n throw cliError(I18N_KEYS.partial_items_not_added_to_draft, {\r\n code: 4,\r\n details: data,\r\n hint: '确认子资源已发布、已添加启用策略并上架后重试 collection item add',\r\n });\r\n }\r\n}\r\n\r\nexport async function itemRemove(opts: {\r\n itemIds: string[];\r\n cwd?: string;\r\n noAutoPull?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\r\n assertRssManagedContentEditable(ctx.info, '移除合集目录项');\r\n if (!opts.itemIds.length) throw cliError(I18N_KEYS.missing_item_id, { code: 4 });\r\n await FServiceAPI.Resource.deleteCollectionItems_Draft({\r\n resourceId: ctx.collection.resourceId!,\r\n removeCollectionItemIds: opts.itemIds,\r\n } as Parameters<typeof FServiceAPI.Resource.deleteCollectionItems_Draft>[0]);\r\n await refreshCollectionDraftState(ctx.collection, opts.cwd);\r\n}\r\n\r\nexport async function itemUpdate(opts: {\r\n itemId: string;\r\n title: string;\r\n cwd?: string;\r\n noAutoPull?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\r\n assertRssManagedContentEditable(ctx.info, '修改合集目录项');\r\n if (!opts.itemId) throw cliError(I18N_KEYS.missing_item_id, { code: 4 });\r\n assertCollectionItemTitle(opts.title, true);\r\n await FServiceAPI.Resource.updateCollectionItemsInfo_Draft({\r\n resourceId: ctx.collection.resourceId!,\r\n data: [{ itemId: opts.itemId, itemTitle: opts.title.trim() }],\r\n } as Parameters<typeof FServiceAPI.Resource.updateCollectionItemsInfo_Draft>[0]);\r\n await refreshCollectionDraftState(ctx.collection, opts.cwd);\r\n}\r\n\r\nexport async function itemReorder(opts: {\r\n cwd?: string;\r\n noAutoPull?: boolean;\r\n sortField?: 'createDate' | 'itemTitle' | 'sortId' | 'resourceUpdateDate';\r\n sortType?: 1 | -1;\r\n orderFile?: string;\r\n itemIds?: string[];\r\n targetSortId?: number;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\r\n assertRssManagedContentEditable(ctx.info, '调整合集目录项顺序');\r\n const resourceId = ctx.collection.resourceId!;\r\n\r\n if (opts.orderFile || opts.itemIds?.length) {\r\n let itemIds = opts.itemIds || [];\r\n if (opts.orderFile) {\r\n const file = path.resolve(resolveCwd(opts.cwd), opts.orderFile);\r\n if (!fs.existsSync(file)) throw cliError(I18N_KEYS.order_file_not_found, { code: 4 });\r\n try {\r\n const raw = JSON.parse(fs.readFileSync(file, 'utf8')) as unknown;\r\n if (!Array.isArray(raw) || !raw.every((x) => typeof x === 'string')) {\r\n throw new Error('need string[]');\r\n }\r\n itemIds = raw as string[];\r\n } catch (error) {\r\n throw cliError(I18N_KEYS.order_file_must_be_string_array, { code: 4, cause: error });\r\n }\r\n }\r\n await FServiceAPI.Resource.setCollectionItemsSortID_Draft({\r\n resourceId,\r\n data: {\r\n itemIds,\r\n targetSortId: opts.targetSortId ?? 1,\r\n },\r\n } as Parameters<typeof FServiceAPI.Resource.setCollectionItemsSortID_Draft>[0]);\r\n await refreshCollectionDraftState(ctx.collection, opts.cwd);\r\n return { mode: 'manual' as const, itemIds };\r\n }\r\n\r\n if (!opts.sortField) {\r\n throw cliError(I18N_KEYS.order_or_sort_required, { code: 4 });\r\n }\r\n await FServiceAPI.Resource.reorderCollectionItems_Draft({\r\n resourceId,\r\n sortField: opts.sortField,\r\n sortType: opts.sortType ?? 1,\r\n } as Parameters<typeof FServiceAPI.Resource.reorderCollectionItems_Draft>[0]);\r\n await refreshCollectionDraftState(ctx.collection, opts.cwd);\r\n return { mode: 'auto' as const, sortField: opts.sortField, sortType: opts.sortType ?? 1 };\r\n}\r\n","import {\r\n loadCollectionProject,\r\n saveCollectionProject,\r\n type CollectionProject,\r\n} from '../../config/project.js';\nimport { assertExplicitEnvForWriteOperation } from '../../core/command.js';\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { FServiceAPI, unwrapData } from '../../platform/index.js';\r\nimport { assertIntro, assertResourceTitle, assertTags } from '../validation.js';\r\nimport { resolveCoverImageUrl } from '../coverUpload.js';\r\nimport { ensureCollectionOwner, ensureCollectionSynced } from './owner.js';\r\nimport { mapDisplayFlags } from './internal.js';\nimport { assertRssManagedContentEditable, isRssRelatedResource } from './rssContract.js';\n\r\nexport async function collectionUpdate(opts: {\n cwd?: string;\r\n noAutoPull?: boolean;\r\n title?: string;\r\n intro?: string;\r\n cover?: string;\r\n tags?: string[];\r\n displaySort?: string;\r\n displayTitle?: string;\r\n displayNo?: string;\r\n displayImage?: string;\r\n displayDescr?: string;\r\n displayView?: string;\r\n}) {\n assertExplicitEnvForWriteOperation();\n if (opts.title !== undefined) assertResourceTitle(opts.title, true);\n if (opts.intro !== undefined) assertIntro(opts.intro);\r\n assertTags(opts.tags);\r\n\r\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\n const resourceId = ctx.collection.resourceId!;\n\n const changesRssManagedListing =\n opts.title !== undefined ||\n opts.intro !== undefined ||\n opts.cover !== undefined ||\n opts.tags !== undefined ||\n opts.displaySort !== undefined ||\n opts.displayTitle !== undefined ||\n opts.displayNo !== undefined ||\n opts.displayImage !== undefined ||\n opts.displayDescr !== undefined ||\n opts.displayView !== undefined;\n if (changesRssManagedListing && isRssRelatedResource(ctx.info)) {\n assertRssManagedContentEditable(ctx.info, '修改标题、封面、标签、简介或目录展示');\n }\n\r\n let coverUrl: string | undefined;\r\n if (opts.cover !== undefined) {\r\n coverUrl = await resolveCoverImageUrl(opts.cover, opts.cwd);\r\n }\r\n\r\n const params: Record<string, unknown> = { resourceId };\r\n if (opts.title !== undefined) params.resourceTitle = opts.title.trim();\r\n if (opts.intro !== undefined) params.intro = opts.intro;\r\n if (coverUrl !== undefined) params.coverImages = [coverUrl];\r\n if (opts.tags !== undefined) params.tags = [...new Set(opts.tags.map((t) => t.trim()))];\r\n\r\n const hasListing =\r\n opts.title !== undefined ||\r\n opts.intro !== undefined ||\r\n coverUrl !== undefined ||\r\n opts.tags !== undefined;\r\n if (hasListing) {\r\n await FServiceAPI.Resource.update(\r\n params as unknown as Parameters<typeof FServiceAPI.Resource.update>[0],\r\n );\r\n }\r\n\r\n const display = mapDisplayFlags({\r\n sort: opts.displaySort,\r\n title: opts.displayTitle,\r\n no: opts.displayNo,\r\n image: opts.displayImage,\r\n descr: opts.displayDescr,\r\n view: opts.displayView,\r\n });\r\n\r\n if (Object.keys(display).length) {\r\n await FServiceAPI.Resource.updateCollection({\r\n resourceId,\r\n catalogueProperty: display,\r\n } as Parameters<typeof FServiceAPI.Resource.updateCollection>[0]);\r\n }\r\n\r\n const next: CollectionProject = {\r\n ...ctx.collection,\r\n resourceTitle: opts.title ?? ctx.collection.resourceTitle,\r\n intro: opts.intro ?? ctx.collection.intro,\r\n coverImages: coverUrl ? [coverUrl] : ctx.collection.coverImages,\r\n tags: opts.tags ?? ctx.collection.tags,\r\n display: Object.keys(display).length\r\n ? { ...(ctx.collection.display || {}), ...display }\r\n : ctx.collection.display,\r\n };\r\n saveCollectionProject(next, opts.cwd);\r\n return next;\r\n}\r\n\r\nexport async function collectionVersionSet(opts: {\n cwd?: string;\r\n version?: string;\r\n description?: string;\r\n}) {\n if (opts.version !== undefined) {\r\n throw cliError(I18N_KEYS.collection_fixed_version, {\r\n code: 4,\r\n hint: '官方 updateCollection 接口说明:合集目前固定版本,所以无需传递版本号;这里只能设置 --description',\r\n });\r\n }\n const { data: collection } = loadCollectionProject(opts.cwd);\n if (collection.resourceId) {\n const ctx = await ensureCollectionOwner({ cwd: opts.cwd, readOnly: true });\n assertRssManagedContentEditable(ctx.info, '修改合集发版描述');\n }\n const next: CollectionProject = {\r\n ...collection,\r\n description: opts.description ?? collection.description ?? '',\r\n };\r\n saveCollectionProject(next, opts.cwd);\r\n return next;\r\n}\r\n\r\nexport async function collectionLogs(opts: {\r\n cwd?: string;\r\n skip?: number;\r\n limit?: number;\r\n}) {\r\n const ctx = await ensureCollectionOwner({ cwd: opts.cwd });\r\n const envelope = await FServiceAPI.Resource.getCollectionUpdateLogs({\r\n resourceId: ctx.collection.resourceId!,\r\n skip: opts.skip ?? 0,\r\n limit: opts.limit ?? 50,\r\n } as Parameters<typeof FServiceAPI.Resource.getCollectionUpdateLogs>[0]);\r\n return unwrapData(envelope);\r\n}\r\n","import { savePlatformCollectionState } from '../../config/project.js';\nimport { assertExplicitEnvForWriteOperation } from '../../core/command.js';\nimport { FServiceAPI } from '../../platform/index.js';\r\nimport { fetchResourceInfo } from '../sync/index.js';\r\nimport {\r\n assertNewPoliciesUnique,\r\n assertPolicyStatusChangeAllowed,\r\n assertPolicySyntaxForAppend,\r\n buildPolicyUpdatePayload,\r\n parsePolicyFile,\r\n resolvePolicyFilePath,\r\n} from '../policyService.js';\r\nimport { ensureCollectionOwner, ensureCollectionSynced } from './owner.js';\r\n\r\nexport async function collectionPolicyApply(opts: {\n cwd?: string;\r\n fromFile: string;\r\n noAutoPull?: boolean;\r\n}) {\n assertExplicitEnvForWriteOperation();\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\n const items = parsePolicyFile(resolvePolicyFilePath(opts.fromFile, opts.cwd));\r\n const existing = ctx.info.policies || [];\r\n assertNewPoliciesUnique(existing, items);\r\n assertPolicySyntaxForAppend(items, existing.length);\r\n await FServiceAPI.Resource.update({\r\n resourceId: ctx.collection.resourceId!,\r\n ...buildPolicyUpdatePayload(items),\r\n } as Parameters<typeof FServiceAPI.Resource.update>[0]);\r\n const info = await fetchResourceInfo(ctx.collection.resourceId!);\r\n savePlatformCollectionState(\n { ...ctx.collection, ...info },\n opts.cwd,\n {},\n { remoteWriteConfirmed: true },\n );\n return items;\r\n}\r\n\r\nexport async function collectionPolicyList(opts: { cwd?: string }) {\r\n const ctx = await ensureCollectionOwner({ cwd: opts.cwd });\r\n const info = await fetchResourceInfo(ctx.collection.resourceId!);\r\n return info.policies || [];\r\n}\r\n\r\nexport async function collectionPolicySetStatus(opts: {\n cwd?: string;\r\n policyId: string;\r\n status: 0 | 1;\r\n noAutoPull?: boolean;\r\n}) {\n assertExplicitEnvForWriteOperation();\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\n assertPolicyStatusChangeAllowed(ctx.info, opts.policyId, opts.status);\r\n await FServiceAPI.Resource.update({\r\n resourceId: ctx.collection.resourceId!,\r\n updatePolicies: [{ policyId: opts.policyId, status: opts.status }],\r\n } as Parameters<typeof FServiceAPI.Resource.update>[0]);\r\n const info = await fetchResourceInfo(ctx.collection.resourceId!);\r\n savePlatformCollectionState(\n { ...ctx.collection, ...info },\n opts.cwd,\n {},\n { remoteWriteConfirmed: true },\n );\n}\r\n","import { loadState, saveCollectionProject, savePlatformCollectionState } from '../../config/project.js';\r\nimport { assertExplicitEnvForWriteOperation } from '../../core/command.js';\r\nimport { CliError } from '../../core/errors.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { FServiceAPI, unwrapData } from '../../platform/index.js';\r\nimport { fetchResourceInfo } from '../sync/index.js';\r\nimport { assertResourceTypeCode } from '../typeService.js';\r\nimport { assertOptionalConfigAllowed } from '../resourceTypeCapabilities.js';\r\nimport { isFrozenStatus } from '../shared/guards/index.js';\r\nimport {\r\n fingerprintCatalogueDraft,\r\n resolveMergeCatalogueDraft,\r\n} from '../catalogueDraftTracking.js';\r\nimport { ensureCollectionSynced } from './owner.js';\r\nimport { assertRssManagedContentEditable } from './rssContract.js';\r\nimport { fetchDraftItems, hydrateCollectionTypeProperties } from './internal.js';\r\nimport { buildCollectionPublishParams, buildCollectionSyncPropertiesParams } from './params.js';\r\nimport type { UpdateCollectionParams } from './types.js';\r\nimport { assessDeclaredAuthorization } from '../authorizationTree.js';\r\nimport { buildConsoleHandoff } from '../../core/consoleUrl.js';\r\nimport { getCliEnv } from '../../core/env.js';\r\n\r\nexport async function collectionPublish(opts: {\r\n cwd?: string;\r\n noAutoPull?: boolean;\r\n dryRun?: boolean;\r\n}): Promise<{\r\n resourceId: string;\r\n itemCount: number;\r\n isMergeCatalogueDraft: number;\r\n updateCollectionParams?: unknown;\r\n dryRun?: boolean;\r\n}> {\r\n if (!opts.dryRun) assertExplicitEnvForWriteOperation();\r\n const ctx = await ensureCollectionSynced({\r\n cwd: opts.cwd,\r\n noAutoPull: opts.noAutoPull,\r\n readOnly: opts.dryRun,\r\n });\r\n assertRssManagedContentEditable(ctx.info, '手工发布合集版本');\r\n if (isFrozenStatus(ctx.info.status)) {\r\n throw cliError(I18N_KEYS.resource_frozen_cannot_publish, {\r\n code: 4,\r\n details: { status: ctx.info.status },\r\n });\r\n }\r\n const resourceId = ctx.collection.resourceId!;\r\n const typeInfo = ctx.collection.resourceTypeCode\r\n ? await assertResourceTypeCode(ctx.collection.resourceTypeCode)\r\n : undefined;\r\n assertOptionalConfigAllowed({\r\n typeInfo,\r\n customPropertyDescriptors: ctx.collection.customPropertyDescriptors,\r\n });\r\n\r\n const collectionForPublish = await hydrateCollectionTypeProperties(ctx.collection);\r\n if (!opts.dryRun) saveCollectionProject(collectionForPublish, opts.cwd);\r\n\r\n const items = await fetchDraftItems(resourceId);\r\n const state = loadState(opts.cwd, 'collection').data;\r\n const mergeCatalogueDraft = resolveMergeCatalogueDraft({\r\n currentItems: items,\r\n publishedFingerprint: state.collection.cataloguePublishedFingerprint,\r\n });\r\n const itemIds = items\r\n .map((it) => (it as { itemId?: string }).itemId)\r\n .filter((id): id is string => Boolean(id));\r\n\r\n const params = buildCollectionPublishParams({\r\n resourceId,\r\n collection: collectionForPublish,\r\n mergeCatalogueDraft,\r\n });\r\n\r\n const collectionDeps = collectionForPublish.dependencies || [];\r\n const collectionBaseUpcast = collectionForPublish.baseUpcastResources || [];\r\n if (collectionDeps.length > 0 || collectionBaseUpcast.length > 0) {\r\n const authHandoff = buildConsoleHandoff({\r\n id: resourceId,\r\n kind: 'collection',\r\n reason: 'DEPENDENCY_AUTH_INCOMPLETE',\r\n nextCommand: `freelog-cli dep auth --policy-map ./auth-map.yaml --yes --env ${getCliEnv()}`,\r\n });\r\n try {\r\n const assessment = await assessDeclaredAuthorization({\r\n resourceId,\r\n version: collectionForPublish.version || ctx.info.latestVersion,\r\n dependencies: collectionDeps,\r\n baseUpcastResources: collectionBaseUpcast,\r\n });\r\n if (!assessment.resolved) {\r\n throw cliError(I18N_KEYS.cli_dependency_unauthorized, {\r\n code: 5,\r\n details: {\r\n unresolvedDependencies: assessment.unresolvedDependencies,\r\n ...authHandoff,\r\n },\r\n hint: '请先在 Console 合集发版页完成依赖/上抛授权后重试',\r\n });\r\n }\r\n } catch (error) {\r\n if (error instanceof CliError && error.code === 5) throw error;\r\n throw cliError(I18N_KEYS.publish_dep_auth_tree_failed, {\r\n code: 5,\r\n details: {\r\n unresolvedDependencies: [...collectionDeps, ...collectionBaseUpcast],\r\n ...authHandoff,\r\n cause: error instanceof Error ? error.message : String(error),\r\n },\r\n hint: '请在 Console 中确认合集依赖授权,或修正 manifest collection.dependencies / collection.baseUpcastResources 后重试',\r\n });\r\n }\r\n }\r\n\r\n if (opts.dryRun) {\r\n return {\r\n resourceId,\r\n itemCount: items.length,\r\n isMergeCatalogueDraft: mergeCatalogueDraft,\r\n updateCollectionParams: params,\r\n dryRun: true,\r\n };\r\n }\r\n\r\n if (itemIds.length) {\r\n const authEnv = await FServiceAPI.Resource.getCollectionItemsAuth_Draft({\r\n resourceId,\r\n itemIds: itemIds.join(','),\r\n } as Parameters<typeof FServiceAPI.Resource.getCollectionItemsAuth_Draft>[0]);\r\n const authData = unwrapData<\r\n | Array<{ itemId?: string; isAuth?: boolean; authStatus?: number; resourceId?: string }>\r\n | { dataList?: Array<{ itemId?: string; isAuth?: boolean; authStatus?: number }> }\r\n >(authEnv);\r\n const rows = Array.isArray(authData)\r\n ? authData\r\n : Array.isArray((authData as { dataList?: unknown[] })?.dataList)\r\n ? (authData as { dataList: Array<{ itemId?: string; isAuth?: boolean; authStatus?: number }> })\r\n .dataList\r\n : [];\r\n\r\n const unresolved = rows.filter((r) => {\r\n if (typeof r.isAuth === 'boolean') return !r.isAuth;\r\n if (r.authStatus !== undefined) return Number(r.authStatus) !== 1;\r\n return false;\r\n });\r\n\r\n if (unresolved.length) {\r\n throw cliError(I18N_KEYS.collection_item_auth_incomplete, {\r\n code: 5,\r\n details: {\r\n error: 'DEPENDENCY_AUTH_INCOMPLETE',\r\n unresolvedDependencies: [],\r\n unresolvedItems: unresolved,\r\n },\r\n hint: '打开 Console 合集发版页完成目录项授权',\r\n });\r\n }\r\n }\r\n\r\n await FServiceAPI.Resource.updateCollection(params);\r\n\r\n const info = await fetchResourceInfo(resourceId);\r\n const catalogueFingerprint = fingerprintCatalogueDraft(items);\r\n savePlatformCollectionState({ ...collectionForPublish, ...info }, opts.cwd, {\n catalogueDraft: items,\n catalogueProperty: ctx.collection.display,\n cataloguePublishedFingerprint: catalogueFingerprint,\n }, { remoteWriteConfirmed: true });\n return { resourceId, itemCount: items.length, isMergeCatalogueDraft: mergeCatalogueDraft };\r\n}\r\n\r\n/** 维护期保存合集自定义属性(≅ collectionManager version_syncAllProperties) */\r\nexport async function collectionSyncProperties(opts: {\r\n cwd?: string;\r\n noAutoPull?: boolean;\r\n dryRun?: boolean;\r\n}): Promise<{\r\n resourceId: string;\r\n updateCollectionParams?: UpdateCollectionParams;\r\n dryRun?: boolean;\r\n}> {\r\n if (!opts.dryRun) assertExplicitEnvForWriteOperation();\r\n const ctx = await ensureCollectionSynced({\r\n cwd: opts.cwd,\r\n noAutoPull: opts.noAutoPull,\r\n readOnly: opts.dryRun,\r\n });\r\n assertRssManagedContentEditable(ctx.info, '同步合集目录属性');\r\n const resourceId = ctx.collection.resourceId!;\r\n const typeInfo = ctx.collection.resourceTypeCode\r\n ? await assertResourceTypeCode(ctx.collection.resourceTypeCode)\r\n : undefined;\r\n assertOptionalConfigAllowed({\r\n typeInfo,\r\n customPropertyDescriptors: ctx.collection.customPropertyDescriptors,\r\n });\r\n\r\n const params = buildCollectionSyncPropertiesParams({\r\n resourceId,\r\n collection: ctx.collection,\r\n });\r\n\r\n if (opts.dryRun) {\r\n return { resourceId, updateCollectionParams: params, dryRun: true };\r\n }\r\n\r\n await FServiceAPI.Resource.updateCollection(params);\r\n return { resourceId };\r\n}\r\n","import { FServiceAPI, unwrapData } from '../platform/index.js';\n\nexport async function rssPreview(opts: {\n feedUrl: string;\n isLoadItemData?: 0 | 1;\n pubStartDate?: string;\n pubEndDate?: string;\n}) {\n return unwrapData<unknown>(await FServiceAPI.Rss.bindingsPreview(opts));\n}\n\nexport async function rssCompare(opts: { resourceId: string; feedUrl: string }) {\n return unwrapData<unknown>(await FServiceAPI.Rss.bindingsCompare(opts));\n}\n\r\nexport async function rssSendVerificationCode(opts: {\r\n feedUrl: string;\r\n resourceId: string;\r\n}) {\n return unwrapData<unknown>(await FServiceAPI.Rss.sendVerificationCode(opts));\n}\n\r\nexport async function rssBindFeed(opts: {\r\n resourceId: string;\r\n feedUrl: string;\r\n verificationCode: string;\r\n pubStartDate?: string;\r\n pubEndDate?: string;\r\n}) {\n return unwrapData<unknown>(await FServiceAPI.Rss.bindFeed(opts));\n}\n\nexport async function rssSyncBinding(opts: { resourceId: string }) {\n return unwrapData<unknown>(await FServiceAPI.Rss.syncBinding(opts));\n}\n\nexport async function rssGetSyncProgress(opts: { resourceId: string }) {\n return unwrapData<unknown>(await FServiceAPI.Rss.getSyncProgress(opts));\n}\n","import { cliError } from '../../i18n/cliError.js';\n\nexport const COLLECT_RULE_KEYS = ['resourceTitle', 'resourceTypeCode', 'authIdentity'] as const;\nexport const COLLECT_RULE_OPERATORS = [\n 'INCLUDES',\n 'NOT_INCLUDES',\n 'STARTS_WITH',\n 'ENDS_WITH',\n 'EQUAL',\n 'NOT_EQUAL',\n] as const;\n\nexport type CollectRuleKey = (typeof COLLECT_RULE_KEYS)[number];\nexport type CollectRuleOperator = (typeof COLLECT_RULE_OPERATORS)[number];\n\nexport interface CollectRuleCondition {\n key: CollectRuleKey;\n limitOperatorType: CollectRuleOperator;\n value: string;\n}\n\nexport interface CollectRulesBody {\n status: 0 | 1;\n serializeStatus?: 0 | 1;\n conditionType: 1 | 2;\n filterConditions: CollectRuleCondition[];\n}\n\nconst TEXT_OPERATORS = new Set<CollectRuleOperator>([\n 'INCLUDES',\n 'NOT_INCLUDES',\n 'STARTS_WITH',\n 'ENDS_WITH',\n]);\n\nfunction inputError(message: string, hint?: string): never {\n throw cliError(message, { code: 4, hint });\n}\n\nexport function parseBinaryFlag(value: unknown, field: string): 0 | 1 | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (parsed !== 0 && parsed !== 1) inputError(`${field} 只能是 0 或 1`);\n return parsed;\n}\n\nexport function parseConditionType(value: unknown): 1 | 2 | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (parsed !== 1 && parsed !== 2) {\n inputError('conditionType 只能是 1(every)或 2(some)');\n }\n return parsed;\n}\n\nexport function normalizeCollectRulesBody(input: unknown, username?: string): CollectRulesBody {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n inputError('collect-rules 必须是 JSON 对象');\n }\n const value = input as Record<string, unknown>;\n const status = parseBinaryFlag(value.status, 'status');\n const serializeStatus = parseBinaryFlag(value.serializeStatus, 'serializeStatus');\n const conditionType = parseConditionType(value.conditionType);\n if (status === undefined || conditionType === undefined) {\n inputError('collect-rules 缺少 status 或 conditionType');\n }\n if (!Array.isArray(value.filterConditions) || value.filterConditions.length === 0) {\n inputError('filterConditions 至少需要一条有效条件');\n }\n\n const filterConditions = value.filterConditions.map((raw, index): CollectRuleCondition => {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n inputError(`filterConditions[${index}] 必须是对象`);\n }\n const condition = raw as Record<string, unknown>;\n const key = String(condition.key || '') as CollectRuleKey;\n const operator = String(condition.limitOperatorType || '') as CollectRuleOperator;\n let conditionValue = typeof condition.value === 'string' ? condition.value.trim() : '';\n\n if (!COLLECT_RULE_KEYS.includes(key)) {\n inputError(`filterConditions[${index}].key 不受支持`, COLLECT_RULE_KEYS.join(' | '));\n }\n if (!COLLECT_RULE_OPERATORS.includes(operator)) {\n inputError(\n `filterConditions[${index}].limitOperatorType 不受支持`,\n COLLECT_RULE_OPERATORS.join(' | '),\n );\n }\n if (!conditionValue) inputError(`filterConditions[${index}].value 不能为空`);\n\n if (key === 'resourceTypeCode' && operator !== 'EQUAL') {\n inputError('resourceTypeCode 只支持 EQUAL,与 Console 选择器一致');\n }\n if ((key === 'resourceTitle' || key === 'authIdentity') && !TEXT_OPERATORS.has(operator)) {\n inputError(`${key} 不支持 ${operator},与 Console 选择器一致`);\n }\n if (key === 'resourceTitle' && conditionValue.length > 100) {\n inputError('resourceTitle 匹配值不能超过 100 个字符');\n }\n if (key === 'authIdentity') {\n if (conditionValue.length > 60) inputError('authIdentity 匹配值不能超过 60 个字符');\n if (operator === 'STARTS_WITH' && username && !conditionValue.includes('/')) {\n conditionValue = `${username}/${conditionValue}`;\n }\n }\n\n return { key, limitOperatorType: operator, value: conditionValue };\n });\n\n return { status, serializeStatus, conditionType, filterConditions };\n}\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { resolveCwd, saveCollectionProject } from '../../config/project.js';\nimport { assertExplicitEnvForWriteOperation } from '../../core/command.js';\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { FServiceAPI, unwrapData } from '../../platform/index.js';\r\nimport {\n rssCompare,\n rssBindFeed,\n rssGetSyncProgress,\n rssPreview,\n rssSendVerificationCode,\n rssSyncBinding,\n} from '../platformExtra.js';\nimport { ensureCollectionOwner, ensureCollectionSynced } from './owner.js';\nimport {\n normalizeCollectRulesBody,\n type CollectRuleCondition,\n type CollectRulesBody,\n} from './collectRulesContract.js';\nimport {\n assertRssDateRange,\n assertRssEpisodeRange,\n assertRssPreviewCanContinue,\n isGuidMassMismatch,\n isRssRelatedResource,\n RSS_FAILURE_STATUSES,\n RSS_IMPORTING_STATUSES,\n summarizeRssPreview,\n type RssCompareData,\n type RssPreviewData,\n} from './rssContract.js';\n\r\nexport async function collectRulesGet(opts: { cwd?: string }) {\n const ctx = await ensureCollectionOwner({ cwd: opts.cwd });\n const envelope = await FServiceAPI.Resource.getCollectionCollectRules({\n resourceId: ctx.collection.resourceId!,\n } as Parameters<typeof FServiceAPI.Resource.getCollectionCollectRules>[0]);\n const rules = unwrapData<Record<string, unknown> | null>(envelope) || {};\n return {\n ...rules,\n serializeStatus: ctx.info.serializeStatus,\n };\n}\n\r\nexport async function collectRulesSet(opts: {\n cwd?: string;\r\n noAutoPull?: boolean;\r\n fromFile?: string;\r\n status?: 0 | 1;\r\n serializeStatus?: 0 | 1;\r\n conditionType?: 1 | 2;\r\n filterConditions?: CollectRuleCondition[];\n}) {\n assertExplicitEnvForWriteOperation();\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\n if (isRssRelatedResource(ctx.info)) {\n throw cliError('RSS 合集的更新状态由 feed 管理,不能设置自动收录规则', { code: 4 });\n }\n let input: unknown;\n\r\n if (opts.fromFile) {\r\n const file = path.resolve(resolveCwd(opts.cwd), opts.fromFile);\r\n if (!fs.existsSync(file)) throw cliError(I18N_KEYS.rules_file_not_found, { code: 4 });\r\n try {\r\n input = JSON.parse(fs.readFileSync(file, 'utf8'));\n } catch (error) {\r\n throw cliError(I18N_KEYS.collect_rules_invalid_json, { code: 4, cause: error });\r\n }\r\n } else {\r\n if (opts.status === undefined || opts.conditionType === undefined) {\r\n throw cliError(I18N_KEYS.collect_rules_input_required, {\r\n code: 4,\r\n hint: '含 filterConditions 时推荐 --from-file rules.json;CLI 简写仅支持 --status + --condition-type',\r\n });\r\n }\r\n input = {\n status: opts.status,\n serializeStatus: opts.serializeStatus,\r\n conditionType: opts.conditionType,\r\n filterConditions: opts.filterConditions || [],\r\n };\n }\n\n const body: CollectRulesBody = normalizeCollectRulesBody(input, ctx.info.username);\n\r\n await FServiceAPI.Resource.setCollectRules({\r\n resourceId: ctx.collection.resourceId!,\r\n ...body,\r\n } as Parameters<typeof FServiceAPI.Resource.setCollectRules>[0]);\r\n\r\n const next = { ...ctx.collection, collectRules: body };\r\n saveCollectionProject(next, opts.cwd);\r\n return body;\r\n}\n\nexport async function collectionRssPreview(opts: { cwd?: string; feedUrl: string }) {\n const ctx = await ensureCollectionOwner({ cwd: opts.cwd, readOnly: true });\n const feedUrl = opts.feedUrl?.trim();\n if (!feedUrl) throw cliError(I18N_KEYS.missing_feed_url, { code: 4 });\n const data = (await rssPreview({ feedUrl, isLoadItemData: 0 })) as RssPreviewData;\n assertRssPreviewCanContinue(data);\n return {\n feedUrl,\n resourceId: ctx.collection.resourceId!,\n preview: summarizeRssPreview(data),\n alreadyBoundBySelf: data.errorCode === 'submitpodcastwrss_error_alreadyexists',\n };\n}\n\nexport async function collectionRssStatus(opts: { cwd?: string }) {\n const ctx = await ensureCollectionOwner({ cwd: opts.cwd, readOnly: true });\n return rssGetSyncProgress({ resourceId: ctx.collection.resourceId! });\n}\n\r\nexport async function collectionRssSendCode(opts: {\n cwd?: string;\r\n feedUrl: string;\r\n noAutoPull?: boolean;\r\n}) {\n assertExplicitEnvForWriteOperation();\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\n const feedUrl = opts.feedUrl?.trim();\n if (!feedUrl) throw cliError(I18N_KEYS.missing_feed_url, { code: 4 });\n const preview = (await rssPreview({ feedUrl, isLoadItemData: 0 })) as RssPreviewData;\n assertRssPreviewCanContinue(preview);\n const data = await rssSendVerificationCode({\n feedUrl,\n resourceId: ctx.collection.resourceId!,\n });\n return { data, preview: summarizeRssPreview(preview) };\n}\n\r\nexport async function collectionRssBind(opts: {\n cwd?: string;\r\n feedUrl: string;\r\n code: string;\r\n pubStartDate?: string;\r\n pubEndDate?: string;\n force?: boolean;\n confirmed?: boolean;\n noAutoPull?: boolean;\n}) {\n assertExplicitEnvForWriteOperation();\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\n if (!opts.code?.trim()) {\r\n throw cliError(I18N_KEYS.missing_verification_code, { code: 4 });\r\n }\r\n const feedUrl = opts.feedUrl?.trim() || ctx.collection.rssFeedUrl;\n if (!feedUrl) throw cliError(I18N_KEYS.missing_feed_url, { code: 4 });\n assertRssDateRange(opts.pubStartDate, opts.pubEndDate);\n\n const preview = (await rssPreview({\n feedUrl,\n isLoadItemData: 0,\n pubStartDate: opts.pubStartDate,\n pubEndDate: opts.pubEndDate,\n })) as RssPreviewData;\n assertRssPreviewCanContinue(preview);\n assertRssEpisodeRange(preview, opts.pubStartDate, opts.pubEndDate);\n\n const currentFeedUrl = ctx.info.feedUrl?.trim();\n if (currentFeedUrl && currentFeedUrl === feedUrl) {\n throw cliError('新的 RSS 订阅地址不能与原先的地址相同', { code: 4 });\n }\n if (currentFeedUrl) {\n const comparison = (await rssCompare({\n resourceId: ctx.collection.resourceId!,\n feedUrl,\n })) as RssCompareData;\n if (isGuidMassMismatch(comparison) && (!opts.force || !opts.confirmed)) {\n throw cliError('新的 RSS 源有大量单集 GUID 不匹配,将作为全新单集发布', {\n code: 3,\n hint: '确认风险后同时使用 --force --yes 重试',\n details: comparison,\n });\n }\n }\n\r\n const data = await rssBindFeed({\r\n resourceId: ctx.collection.resourceId!,\r\n feedUrl,\r\n verificationCode: opts.code.trim(),\r\n pubStartDate: opts.pubStartDate,\r\n pubEndDate: opts.pubEndDate,\r\n });\r\n saveCollectionProject({ ...ctx.collection, rssFeedUrl: feedUrl }, opts.cwd);\r\n return data;\r\n}\r\n\r\nexport async function collectionRssSync(opts: {\n cwd?: string;\r\n noAutoPull?: boolean;\r\n pollMs?: number;\r\n timeoutMs?: number;\r\n}) {\n assertExplicitEnvForWriteOperation();\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\n const resourceId = ctx.collection.resourceId!;\n if (!isRssRelatedResource(ctx.info)) {\n throw cliError('当前合集尚未绑定 RSS 地址', { code: 4 });\n }\n const current = (await rssGetSyncProgress({ resourceId })) as {\n status?: string;\n } | null;\n if (current && typeof current.status === 'string' && RSS_IMPORTING_STATUSES.has(current.status)) {\n throw cliError('RSS 正在同步中,请勿重复触发', { code: 3, details: current });\n }\n await rssSyncBinding({ resourceId });\n\r\n const timeoutMs = opts.timeoutMs ?? 300_000;\r\n const pollMs = opts.pollMs ?? 2000;\r\n const start = Date.now();\r\n let last: unknown;\r\n while (Date.now() - start < timeoutMs) {\r\n last = await rssGetSyncProgress({ resourceId });\r\n const progress = last as {\n status?: string | number;\n isFinished?: boolean;\n percent?: number;\n failedItems?: unknown[];\n };\n if (\r\n progress?.isFinished === true ||\r\n progress?.status === 'done' ||\n progress?.status === 'success' ||\n progress?.status === 2 ||\r\n progress?.percent === 100\r\n ) {\r\n return { done: true as const, progress: last };\r\n }\r\n if (typeof progress?.status === 'string' && RSS_FAILURE_STATUSES.has(progress.status)) {\n throw cliError(I18N_KEYS.rss_sync_failed, { code: 1, details: last });\n }\n await new Promise((r) => setTimeout(r, pollMs));\r\n }\r\n throw cliError(I18N_KEYS.rss_sync_timeout, {\r\n code: 1,\r\n details: last,\r\n hint: '稍后 freelog-cli collection rss sync 重试',\r\n });\r\n}\r\n","import { requireAuth } from '../core/auth.js';\r\nimport { assertExplicitEnvForWriteOperation } from '../core/command.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport {\r\n loadCollectionProject,\r\n loadResourceProject,\r\n savePlatformResourceState,\r\n tryLoadManifest,\r\n type ProjectSubject,\r\n} from '../config/project.js';\r\nimport { pullCollection } from './collection/index.js';\r\nimport {\r\n fetchResourceInfo,\r\n ownersMatch,\r\n pullResourceToLocal,\r\n type PlatformResourceInfo,\r\n} from './sync/index.js';\r\nimport { projectStoreFromCwd } from './store/projectStore.js';\r\n\r\nfunction platformToResourcePatch(info: PlatformResourceInfo) {\r\n return {\r\n resourceId: info.resourceId,\r\n resourceName: info.resourceName,\r\n resourceType: info.resourceType,\r\n resourceTypeCode: info.resourceTypeCode,\r\n resourceTitle: info.resourceTitle,\r\n intro: info.intro,\r\n coverImages: info.coverImages,\r\n tags: info.tags,\r\n userId: info.userId,\r\n username: info.username,\r\n status: info.status,\r\n latestVersion: info.latestVersion,\r\n policies: info.policies,\r\n updateDate: info.updateDate,\r\n };\r\n}\r\n\r\n/** 将现有平台资源绑定到本地项目,然后刷新平台事实;仅显式请求时采用平台展示字段。 */\r\nexport async function bindProject(opts: {\r\n cwd?: string;\r\n target: string;\r\n applyListing?: boolean;\r\n force?: boolean;\r\n yes?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n const auth = requireAuth();\r\n const target = opts.target?.trim();\r\n if (!target) {\r\n throw cliError(I18N_KEYS.missing_resource_id_or_name, { code: 4 });\r\n }\r\n\r\n const manifestLoaded = tryLoadManifest(opts.cwd);\r\n if (!manifestLoaded) {\r\n throw cliError(I18N_KEYS.manifest_not_found, {\r\n code: 4,\r\n hint: '先运行 freelog-cli init,或使用 --scaffold none|collection 接入现有目录',\r\n });\r\n }\r\n\r\n const subject: ProjectSubject = manifestLoaded.data.subject;\r\n const local =\r\n subject === 'collection'\r\n ? loadCollectionProject(opts.cwd).data\r\n : loadResourceProject(opts.cwd).data;\r\n\r\n if (local.resourceId?.trim() && local.resourceId !== target && !opts.force) {\r\n throw cliError(I18N_KEYS.dir_already_bound, {\r\n code: 3,\r\n hint: '如需更换绑定,请同时传 --force --yes',\r\n });\r\n }\r\n\r\n const info = await fetchResourceInfo(target);\r\n if (!ownersMatch(auth.userId, info.userId)) {\r\n throw cliError(I18N_KEYS.resource_owner_mismatch, {\r\n code: 2,\r\n params: {\r\n owner: String(info.username || info.userId),\r\n current: String(auth.username || auth.userId),\r\n },\r\n hint: '请使用当前账号拥有的 resourceId',\r\n });\r\n }\r\n\r\n savePlatformResourceState(\r\n {\r\n ...local,\r\n ...platformToResourcePatch(info),\r\n resourceName: info.resourceName ?? local.resourceName,\r\n resourceType: info.resourceType ?? local.resourceType,\r\n },\r\n opts.cwd,\r\n subject,\r\n );\r\n\r\n if (subject === 'collection') {\r\n const pulled = await pullCollection({\r\n cwd: opts.cwd,\r\n applyListing: opts.applyListing,\r\n force: opts.force,\r\n });\r\n return {\r\n subject,\r\n resourceId: info.resourceId,\r\n resourceName: info.resourceName,\r\n latestVersion: info.latestVersion,\r\n collection: pulled.collection,\r\n };\r\n }\r\n\r\n const pulled = await pullResourceToLocal({\r\n store: projectStoreFromCwd(opts.cwd),\r\n applyListing: opts.applyListing,\r\n force: opts.force,\r\n });\r\n return {\r\n subject,\r\n resourceId: info.resourceId,\r\n resourceName: info.resourceName,\r\n latestVersion: info.latestVersion,\r\n resource: pulled.resource,\r\n };\r\n}\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { bindProject } from '../services/bindService.js';\r\n\r\nexport const bindCommand = defineCommand({\r\n meta: {\r\n name: 'bind',\r\n description: '绑定 Console 已有资源(写 state.resourceId 并 pull)',\r\n },\r\n args: {\r\n target: {\r\n type: 'positional',\r\n required: true,\r\n description: 'resourceId 或 username/shortname',\r\n },\r\n 'apply-listing': {\r\n type: 'boolean',\r\n description: '绑定后把平台 listing 写回 manifest',\r\n },\r\n force: { type: 'boolean', description: '覆盖已绑定的 resourceId' },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const result = await bindProject({\r\n cwd: resolveCwd(args.cwd),\r\n target: String(args.target),\r\n applyListing: args['apply-listing'],\r\n force: args.force,\r\n yes: args.yes,\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('bind', result);\r\n } else {\r\n consola.success(`已绑定 ${result.resourceName || result.resourceId}`);\r\n if (result.latestVersion) consola.info(`latestVersion: ${result.latestVersion}`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import { cliReadCommandArgs, cliWriteCommandArgs } from '../../core/cliArgs.js';\r\n\r\nexport const collectionCommonArgs = cliWriteCommandArgs;\r\n\r\nexport const collectionEnvArgs = cliReadCommandArgs;\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { createCollection } from '../../services/collection/index.js';\r\nimport { collectionCommonArgs } from './common.js';\r\n\r\nexport const createCmd = defineCommand({\r\n meta: { name: 'create', description: '创建合集壳(subjectType=4)' },\r\n args: {\r\n title: { type: 'string', description: '合集标题' },\r\n type: { type: 'string', description: '合集类型 code' },\r\n 'type-name': { type: 'string', description: '自定义类型名(可选)' },\r\n name: { type: 'string', description: '短授权标识(不含 username/)' },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const data = await createCollection({\r\n cwd: resolveCwd(args.cwd),\r\n title: args.title,\r\n typeCode: args.type,\r\n resourceTypeName: args['type-name'],\r\n name: args.name,\r\n });\r\n if (args.json) writeJsonSuccess('collection create', { collection: data });\r\n else consola.success(`已创建合集 ${data.resourceId}(${data.resourceName})`);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import type { TextOptions } from '@clack/prompts';\nimport path from 'node:path';\nimport { isInteractive } from '../../core/tty.js';\nimport { I18N_KEYS, t } from '../../i18n/index.js';\nimport { assertLocalCoverFile } from '../coverUpload.js';\nimport { validateCreateNameInput } from '../resourceName.js';\nimport {\n FIELD_LIMITS,\n validateCollectionItemTitleInput,\n validateIntroInput,\n validatePolicyNameInput,\n validateResourceTitleInput,\n validateTagsCsvInput,\n validateTagsInput,\n} from '../validation.js';\n\nexport type FieldFormId =\n | 'FORM-RES-TITLE'\n | 'FORM-RES-NAME'\n | 'FORM-LIST-INTRO'\n | 'FORM-LIST-TAGS'\n | 'FORM-LIST-COVER'\n | 'FORM-POL-NAME'\n | 'FORM-COL-TITLE'\n | 'FORM-BATCH-TITLE';\n\nexport interface FieldSpec {\n formId: FieldFormId;\n label: string;\n hint: () => string;\n helpSnippet: string;\n validate: (value: string) => string | undefined;\n}\n\nfunction cliErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function shouldRunFieldWizard(args: {\n yes?: boolean;\n json?: boolean;\n hasBusinessFlags: boolean;\n}): boolean {\n return isInteractive(args.yes) && !args.json && !args.hasBusinessFlags;\n}\n\nexport function helpSnippet(formId: FieldFormId): string {\n return FIELD_SPECS[formId].helpSnippet;\n}\n\nexport const FIELD_SPECS: Record<FieldFormId, FieldSpec> = {\n 'FORM-RES-TITLE': {\n formId: 'FORM-RES-TITLE',\n label: '资源标题(展示名)',\n hint: () => `不可为空,最多 ${FIELD_LIMITS.resourceTitleMax} 字`,\n helpSnippet: `非空,最多 ${FIELD_LIMITS.resourceTitleMax} 字`,\n validate: (value) => validateResourceTitleInput(value, true),\n },\n 'FORM-RES-NAME': {\n formId: 'FORM-RES-NAME',\n label: '资源短授权标识',\n hint: () => t(I18N_KEYS.rqr_input_resourceauthid_hint),\n helpSnippet: '1–60 字;非法字符将自动转为下划线',\n validate: (value) => validateCreateNameInput(value).error,\n },\n 'FORM-LIST-INTRO': {\n formId: 'FORM-LIST-INTRO',\n label: '简介',\n hint: () => `最多 ${FIELD_LIMITS.introMax} 字`,\n helpSnippet: `最多 ${FIELD_LIMITS.introMax} 字`,\n validate: (value) => validateIntroInput(value),\n },\n 'FORM-LIST-TAGS': {\n formId: 'FORM-LIST-TAGS',\n label: '标签',\n hint: () =>\n `逗号分隔,最多 ${FIELD_LIMITS.tagsMaxCount} 个,每个最多 ${FIELD_LIMITS.tagMaxLength} 字`,\n helpSnippet: `最多 ${FIELD_LIMITS.tagsMaxCount} 个,单项 ≤${FIELD_LIMITS.tagMaxLength} 字,逗号分隔`,\n validate: (value) => validateTagsCsvInput(value),\n },\n 'FORM-LIST-COVER': {\n formId: 'FORM-LIST-COVER',\n label: '封面',\n hint: () => '本地路径:JPG/PNG/GIF,≤5MB;800px 为建议',\n helpSnippet: 'JPG/PNG/GIF,≤5MB',\n validate: (value) => {\n const trimmed = value.trim();\n if (!trimmed) return '路径不能为空';\n if (/^https?:\\/\\//i.test(trimmed)) return undefined;\n try {\n assertLocalCoverFile(path.resolve(trimmed));\n return undefined;\n } catch (error) {\n return cliErrorMessage(error);\n }\n },\n },\n 'FORM-POL-NAME': {\n formId: 'FORM-POL-NAME',\n label: '策略名称',\n hint: () => `${FIELD_LIMITS.policyNameMin}–${FIELD_LIMITS.policyNameMax} 字`,\n helpSnippet: `${FIELD_LIMITS.policyNameMin}–${FIELD_LIMITS.policyNameMax} 字`,\n validate: (value) => validatePolicyNameInput(value),\n },\n 'FORM-COL-TITLE': {\n formId: 'FORM-COL-TITLE',\n label: '条目标题',\n hint: () => `最多 ${FIELD_LIMITS.collectionItemTitleMax} 字`,\n helpSnippet: `最多 ${FIELD_LIMITS.collectionItemTitleMax} 字`,\n validate: (value) => validateCollectionItemTitleInput(value, true),\n },\n 'FORM-BATCH-TITLE': {\n formId: 'FORM-BATCH-TITLE',\n label: '资源标题前缀',\n hint: () => `可选,最多 ${FIELD_LIMITS.resourceTitleMax} 字`,\n helpSnippet: `可选,最多 ${FIELD_LIMITS.resourceTitleMax} 字`,\n validate: (value) => {\n if (!value.trim()) return undefined;\n return validateResourceTitleInput(value, false);\n },\n },\n};\n\nexport function fieldPromptMessage(formId: FieldFormId): string {\n const spec = FIELD_SPECS[formId];\n return `${spec.label}\\n ${spec.hint()}`;\n}\n\nexport function clackTextField(\n formId: FieldFormId,\n overrides?: Partial<TextOptions>,\n): TextOptions {\n const spec = FIELD_SPECS[formId];\n return {\n message: fieldPromptMessage(formId),\n validate: (value) => spec.validate(String(value ?? '')),\n ...overrides,\n };\n}\n\nexport function parseTagsCsv(raw: string): string[] {\n return raw\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n}\n\nexport function normalizePromptCreateName(raw: string): {\n normalized: string;\n wasModified: boolean;\n} {\n const result = validateCreateNameInput(raw);\n if (result.error) {\n throw new Error(result.error);\n }\n const trimmed = raw.trim();\n return {\n normalized: result.normalized,\n wasModified: trimmed !== result.normalized,\n };\n}\n\nexport { validateCreateNameInput, validateTagsInput };\n","import path from 'node:path';\r\nimport { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../../core/command.js';\r\nimport { createBatchProgressFormatter } from '../../services/batch/index.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport {\r\n itemAdd,\r\n itemImportDir,\r\n itemRemove,\r\n itemReorder,\r\n itemUpdate,\r\n} from '../../services/collection/index.js';\r\nimport { collectionCommonArgs } from './common.js';\r\nimport { helpSnippet } from '../../services/shared/fieldConstraints.js';\r\n\r\nconst itemAddCmd = defineCommand({\r\n meta: { name: 'add', description: '添加目录项到目录草稿(resourceId 或本地路径)' },\r\n args: {\r\n target: { type: 'positional', required: true, description: 'resourceId 或相对路径' },\r\n title: { type: 'string', description: `条目标题(${helpSnippet('FORM-COL-TITLE')})` },\r\n 'auth-excluded-file': {\r\n type: 'string',\r\n description: '目录项 authExcludedItems YAML/JSON(≅ Console FContractHandleDrawer)',\r\n },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const result = await itemAdd({\r\n cwd: resolveCwd(args.cwd),\r\n target: String(args.target),\r\n title: args.title,\r\n authExcludedFile: args['auth-excluded-file'],\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) writeJsonSuccess('collection item', result);\r\n else consola.success(`已添加目录项 ${result.resourceId}`);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst itemRemoveCmd = defineCommand({\r\n meta: { name: 'remove', description: '从目录草稿移除目录项' },\r\n args: {\r\n itemId: { type: 'positional', required: true, description: 'itemId(可逗号分隔)' },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const ids = String(args.itemId)\r\n .split(',')\r\n .map((s) => s.trim())\r\n .filter(Boolean);\r\n await itemRemove({\r\n cwd: resolveCwd(args.cwd),\r\n itemIds: ids,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) writeJsonSuccess('collection item', { removed: ids });\r\n else consola.success(`已移除 ${ids.length} 条`);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst itemUpdateCmd = defineCommand({\r\n meta: { name: 'update', description: '更新目录草稿条目标题' },\r\n args: {\r\n itemId: { type: 'positional', required: true, description: '目录项 itemId' },\r\n title: { type: 'string', required: true, description: `新标题(${helpSnippet('FORM-COL-TITLE')})` },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n await itemUpdate({\r\n cwd: resolveCwd(args.cwd),\r\n itemId: String(args.itemId),\r\n title: args.title,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) writeJsonSuccess('collection item', {});\r\n else consola.success('已更新条目标题');\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst itemReorderCmd = defineCommand({\r\n meta: { name: 'reorder', description: '重排目录草稿' },\r\n args: {\r\n 'order-file': { type: 'string', description: 'JSON itemId 数组' },\r\n 'sort-field': {\r\n type: 'string',\r\n description: 'createDate|itemTitle|sortId|resourceUpdateDate',\r\n },\r\n 'sort-type': { type: 'string', description: '1 升序 / -1 降序' },\r\n 'target-sort-id': { type: 'string', description: '目标 sortId(手动插入位置)' },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const sortType =\r\n args['sort-type'] === '-1' || args['sort-type'] === 'desc' ? (-1 as const) : (1 as const);\r\n const result = await itemReorder({\r\n cwd: resolveCwd(args.cwd),\r\n noAutoPull: args['no-auto-pull'],\r\n orderFile: args['order-file'],\r\n sortField: args['sort-field'] as\r\n | 'createDate'\r\n | 'itemTitle'\r\n | 'sortId'\r\n | 'resourceUpdateDate'\r\n | undefined,\r\n sortType,\r\n targetSortId: args['target-sort-id'] ? Number(args['target-sort-id']) : undefined,\r\n });\r\n if (args.json) writeJsonSuccess('collection item', result);\r\n else consola.success('已重排');\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst itemImportDirCmd = defineCommand({\r\n meta: { name: 'import-dir', description: '导入目录为多个资源并加入合集目录草稿' },\r\n args: {\r\n dir: { type: 'positional', required: true, description: '待导入文件目录' },\r\n 'resource-type': { type: 'string', description: '条目资源 typeCode;也可写在 --config defaults.resourceTypeCode' },\r\n 'resource-type-name': { type: 'string', description: '自定义条目资源类型名(可选)' },\r\n 'title-prefix': { type: 'string', description: `条目标题前缀(${helpSnippet('FORM-BATCH-TITLE')})` },\r\n config: { type: 'string', description: 'freelog.batch.json/yaml;默认自动发现目录内同名文件' },\r\n 'item-policy-file': {\r\n type: 'string',\r\n description: '子资源策略 JSON 文件;平台要求合集条目资源已上架',\r\n },\r\n 'strict-batch-limit': {\r\n type: 'boolean',\r\n description: '与 Console 一致:单次最多 20 个文件(默认自动分 batch 并 warn)',\r\n },\r\n 'json-lines': {\r\n type: 'boolean',\r\n description: '逐行输出 NDJSON 进度(createFromDir 阶段)',\r\n },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const jsonLines = Boolean(args['json-lines']);\r\n const formatProgress = createBatchProgressFormatter('collection item import-dir');\r\n const onProgress = jsonLines\r\n ? (event: Parameters<typeof formatProgress>[0]) => {\r\n process.stdout.write(formatProgress(event));\r\n }\r\n : undefined;\r\n const result = await itemImportDir({\r\n cwd: resolveCwd(args.cwd),\r\n dir: String(args.dir),\r\n resourceTypeCode:\r\n typeof args['resource-type'] === 'string' ? String(args['resource-type']) : undefined,\r\n resourceTypeName:\r\n typeof args['resource-type-name'] === 'string'\r\n ? String(args['resource-type-name'])\r\n : undefined,\r\n titlePrefix:\r\n typeof args['title-prefix'] === 'string' ? args['title-prefix'] : undefined,\r\n configFile: typeof args.config === 'string' ? args.config : undefined,\r\n itemPolicyFile:\r\n typeof args['item-policy-file'] === 'string'\r\n ? path.resolve(resolveCwd(args.cwd), args['item-policy-file'])\r\n : undefined,\r\n yes: Boolean(args.yes),\r\n noAutoPull: Boolean(args['no-auto-pull']),\r\n strictBatchLimit: Boolean(args['strict-batch-limit']),\r\n onProgress,\r\n });\r\n if (jsonLines) {\r\n return;\r\n }\r\n if (args.json) {\r\n writeJsonSuccess('collection item', result);\r\n } else {\r\n consola.success(`已导入并加入合集 ${result.created.length} 个资源`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const itemCommand = defineCommand({\r\n meta: { name: 'item', description: '合集目录草稿项' },\r\n subCommands: {\r\n add: itemAddCmd,\r\n 'import-dir': itemImportDirCmd,\r\n remove: itemRemoveCmd,\r\n update: itemUpdateCmd,\r\n reorder: itemReorderCmd,\r\n },\r\n});\r\n","import * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport { cliError } from '../i18n/cliError.js';\nimport { I18N_KEYS } from '../i18n/bundled.js';\nimport { ensureCollectionSynced } from './collection/owner.js';\nimport { isRssRelatedResource } from './collection/rssContract.js';\nimport { clackTextField, parseTagsCsv } from './shared/fieldConstraints.js';\n\nexport interface CollectionUpdateWizardResult {\n title?: string;\n intro?: string;\n cover?: string;\n tags?: string[];\n displaySort?: string;\n displayTitle?: string;\n displayNo?: string;\n displayImage?: string;\n displayDescr?: string;\n displayView?: string;\n}\n\nconst LISTING_OPTIONS = [\n { value: 'title' as const, label: '合集标题' },\n { value: 'intro' as const, label: '简介' },\n { value: 'cover' as const, label: '封面' },\n { value: 'tags' as const, label: '标签' },\n] as const;\n\nconst DISPLAY_OPTIONS = [\n { value: 'display-sort' as const, label: '条目排序', hint: 'asc | desc' },\n { value: 'display-title' as const, label: '条目标题显示', hint: 'rtitle | sn | empty | custom' },\n { value: 'display-no' as const, label: '条目序号', hint: 'show | hide' },\n { value: 'display-image' as const, label: '条目封面', hint: 'show | hide' },\n { value: 'display-descr' as const, label: '条目简介', hint: 'show | hide' },\n { value: 'display-view' as const, label: '目录视图', hint: 'list | card' },\n] as const;\n\ntype ListingKey = (typeof LISTING_OPTIONS)[number]['value'];\ntype DisplayKey = (typeof DISPLAY_OPTIONS)[number]['value'];\n\n/** TTY:合集 update — RSS 预检 + listing / display 多选 prompt */\nexport async function runCollectionUpdateWizard(opts: {\n cwd?: string;\n}): Promise<CollectionUpdateWizardResult> {\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd });\n if (isRssRelatedResource(ctx.info)) {\n consola.info('RSS 合集内容由 feed 托管,不能修改标题、封面、标签、简介或目录展示');\n throw cliError('RSS 托管合集不可编辑 listing / display', {\n code: 4,\n hint: '可使用 collection rss inspect/bind/sync 管理订阅源',\n });\n }\n\n const groups = await p.group({\n listing: () =>\n p.multiselect({\n message: '选择要更新的 listing 字段(可跳过)',\n options: [...LISTING_OPTIONS],\n }),\n display: () =>\n p.multiselect({\n message: '选择要更新的目录展示字段(可跳过)',\n options: [...DISPLAY_OPTIONS],\n }),\n });\n if (p.isCancel(groups)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n\n const listingFields = new Set((groups.listing || []) as ListingKey[]);\n const displayFields = new Set((groups.display || []) as DisplayKey[]);\n if (!listingFields.size && !displayFields.size) {\n throw cliError(I18N_KEYS.collection_listing_or_display_required, { code: 4 });\n }\n\n const result: CollectionUpdateWizardResult = {};\n const collection = ctx.collection;\n\n if (listingFields.has('title')) {\n const answer = await p.text(\n clackTextField('FORM-RES-TITLE', { defaultValue: collection.resourceTitle || '' }),\n );\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.title = String(answer).trim();\n }\n if (listingFields.has('intro')) {\n const answer = await p.text(\n clackTextField('FORM-LIST-INTRO', { defaultValue: collection.intro || '' }),\n );\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.intro = String(answer);\n }\n if (listingFields.has('cover')) {\n const answer = await p.text(clackTextField('FORM-LIST-COVER'));\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.cover = String(answer).trim();\n }\n if (listingFields.has('tags')) {\n const answer = await p.text(\n clackTextField('FORM-LIST-TAGS', { defaultValue: (collection.tags || []).join(', ') }),\n );\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.tags = parseTagsCsv(String(answer));\n }\n\n if (displayFields.has('display-sort')) {\n const answer = await p.select({\n message: '条目排序\\n asc=升序,desc=降序',\n options: [\n { value: 'asc', label: 'asc(升序)' },\n { value: 'desc', label: 'desc(降序)' },\n ],\n });\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.displaySort = String(answer);\n }\n if (displayFields.has('display-title')) {\n const answer = await p.select({\n message: '条目标题显示方式',\n options: [\n { value: 'rtitle', label: 'rtitle(资源标题)' },\n { value: 'sn', label: 'sn(短名)' },\n { value: 'empty', label: 'empty(不显示)' },\n { value: 'custom', label: 'custom(自定义)' },\n ],\n });\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.displayTitle = String(answer);\n }\n for (const [key, message, options] of [\n ['display-no', '条目序号', ['show', 'hide']],\n ['display-image', '条目封面', ['show', 'hide']],\n ['display-descr', '条目简介', ['show', 'hide']],\n ] as const) {\n if (!displayFields.has(key)) continue;\n const answer = await p.select({\n message: `${message}\\n show | hide`,\n options: options.map((v) => ({ value: v, label: v })),\n });\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n if (key === 'display-no') result.displayNo = String(answer);\n else if (key === 'display-image') result.displayImage = String(answer);\n else result.displayDescr = String(answer);\n }\n if (displayFields.has('display-view')) {\n const answer = await p.select({\n message: '目录视图\\n list | card',\n options: [\n { value: 'list', label: 'list(列表)' },\n { value: 'card', label: 'card(卡片)' },\n ],\n });\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.displayView = String(answer);\n }\n\n return result;\n}\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { collectionUpdate } from '../../services/collection/index.js';\r\nimport { collectionCommonArgs } from './common.js';\r\nimport { shouldRunFieldWizard, helpSnippet } from '../../services/shared/fieldConstraints.js';\r\nimport { runCollectionUpdateWizard } from '../../services/collectionUpdateWizard.js';\r\nimport { isInteractive } from '../../core/tty.js';\r\n\r\nexport const updateCmd = defineCommand({\r\n meta: { name: 'update', description: '更新合集 listing / 展示设置' },\r\n args: {\r\n title: { type: 'string', description: `合集标题(${helpSnippet('FORM-RES-TITLE')})` },\r\n intro: { type: 'string', description: `简介(${helpSnippet('FORM-LIST-INTRO')})` },\r\n cover: { type: 'string', description: `封面 URL 或本地路径(${helpSnippet('FORM-LIST-COVER')})` },\r\n tags: { type: 'string', description: `逗号分隔(${helpSnippet('FORM-LIST-TAGS')})` },\r\n 'display-sort': { type: 'string', description: 'asc|desc' },\r\n 'display-title': { type: 'string', description: 'rtitle|sn|empty|custom' },\r\n 'display-no': { type: 'string', description: 'show|hide' },\r\n 'display-image': { type: 'string', description: 'show|hide' },\r\n 'display-descr': { type: 'string', description: 'show|hide' },\r\n 'display-view': { type: 'string', description: 'list|card' },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n\r\n const hasDisplay =\r\n args['display-sort'] ||\r\n args['display-title'] ||\r\n args['display-no'] ||\r\n args['display-image'] ||\r\n args['display-descr'] ||\r\n args['display-view'];\r\n const hasListingFlags = Boolean(\r\n args.title || args.intro !== undefined || args.cover || args.tags || hasDisplay,\r\n );\r\n\r\n let title = typeof args.title === 'string' ? args.title : undefined;\r\n let intro = args.intro !== undefined ? String(args.intro) : undefined;\r\n let cover = typeof args.cover === 'string' ? args.cover : undefined;\r\n let tags = args.tags\r\n ? args.tags.split(',').map((t) => t.trim()).filter(Boolean)\r\n : undefined;\r\n let displaySort = typeof args['display-sort'] === 'string' ? args['display-sort'] : undefined;\r\n let displayTitle = typeof args['display-title'] === 'string' ? args['display-title'] : undefined;\r\n let displayNo = typeof args['display-no'] === 'string' ? args['display-no'] : undefined;\r\n let displayImage = typeof args['display-image'] === 'string' ? args['display-image'] : undefined;\r\n let displayDescr = typeof args['display-descr'] === 'string' ? args['display-descr'] : undefined;\r\n let displayView = typeof args['display-view'] === 'string' ? args['display-view'] : undefined;\r\n\r\n if (\r\n shouldRunFieldWizard({\r\n yes: args.yes,\r\n json: args.json,\r\n hasBusinessFlags: hasListingFlags,\r\n })\r\n ) {\r\n const wizard = await runCollectionUpdateWizard({ cwd });\r\n title = wizard.title ?? title;\r\n intro = wizard.intro ?? intro;\r\n cover = wizard.cover ?? cover;\r\n tags = wizard.tags ?? tags;\r\n displaySort = wizard.displaySort ?? displaySort;\r\n displayTitle = wizard.displayTitle ?? displayTitle;\r\n displayNo = wizard.displayNo ?? displayNo;\r\n displayImage = wizard.displayImage ?? displayImage;\r\n displayDescr = wizard.displayDescr ?? displayDescr;\r\n displayView = wizard.displayView ?? displayView;\r\n } else if (!hasListingFlags) {\r\n throw cliError(I18N_KEYS.collection_listing_or_display_required, { code: 4 });\r\n } else if (!isInteractive(args.yes) && !hasListingFlags) {\r\n throw cliError(I18N_KEYS.non_interactive_needs_yes, { code: 4 });\r\n }\r\n\r\n const data = await collectionUpdate({\r\n cwd,\r\n noAutoPull: args['no-auto-pull'],\r\n title,\r\n intro,\r\n cover,\r\n tags,\r\n displaySort,\r\n displayTitle,\r\n displayNo,\r\n displayImage,\r\n displayDescr,\r\n displayView,\r\n });\r\n if (args.json) writeJsonSuccess('collection update', { collection: data });\r\n else consola.success('已更新合集');\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport { applyCommandFlags, handleCommandError, writeJsonSuccess } from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { collectionVersionSet } from '../../services/collection/index.js';\r\nimport { collectionEnvArgs } from './common.js';\r\n\r\nconst versionSetCmd = defineCommand({\r\n meta: { name: 'set', description: '更新合集下一次 publish 的发布说明意图' },\r\n args: {\r\n version: { type: 'string', description: '已废弃:合集固定版本,不支持设置' },\r\n description: { type: 'string', description: '合集版本说明' },\r\n ...collectionEnvArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n if (args.version === undefined && args.description === undefined) {\r\n throw cliError(I18N_KEYS.collection_description_required, { code: 4 });\r\n }\r\n const collection = await collectionVersionSet({\r\n cwd: resolveCwd(args.cwd),\r\n version: args.version,\r\n description: args.description,\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('collection version set', {\r\n description: collection.description ?? '',\r\n });\r\n } else {\r\n consola.success('已更新合集发布说明意图');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'collection version set');\r\n }\r\n },\r\n});\r\n\r\nexport const versionCommand = defineCommand({\r\n meta: { name: 'version', description: '合集发布说明意图' },\r\n subCommands: { set: versionSetCmd },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {\r\n applyCommandFlags,\r\n applyWriteCommandFlags,\r\n handleCommandError,\r\n writeJsonSuccess,\r\n} from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport {\r\n collectionPolicyApply,\r\n collectionPolicyList,\r\n collectionPolicySetStatus,\r\n} from '../../services/collection/index.js';\r\nimport { collectionCommonArgs, collectionEnvArgs } from './common.js';\r\n\r\nconst policyApplyCmd = defineCommand({\r\n meta: { name: 'apply', description: '合集策略(同 policy.json)' },\r\n args: {\r\n 'from-file': { type: 'string', required: true },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const items = await collectionPolicyApply({\r\n cwd: resolveCwd(args.cwd),\r\n fromFile: args['from-file'],\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) writeJsonSuccess('collection policy', { applied: items.length });\r\n else consola.success(`已应用 ${items.length} 条策略`);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst policyListCmd = defineCommand({\r\n meta: { name: 'list', description: '列出合集策略' },\r\n args: {\r\n ...collectionEnvArgs,\r\n 'no-auto-pull': { type: 'boolean' as const },\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n const policies = await collectionPolicyList({ cwd });\r\n if (args.json) writeJsonSuccess('collection policy', { policies });\r\n else {\r\n for (const pol of policies) {\r\n consola.info(`${pol.policyId || '-'} ${pol.policyName || '-'} status=${pol.status}`);\r\n }\r\n if (!policies.length) consola.warn('无策略');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst policySetCmd = defineCommand({\r\n meta: { name: 'set', description: '启用或停用合集策略' },\r\n args: {\r\n policyId: { type: 'positional', required: true },\r\n status: { type: 'string', required: true, description: '0 | 1' },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const status = Number(args.status);\r\n if (status !== 0 && status !== 1) {\r\n throw cliError(I18N_KEYS.status_must_be_0_or_1, { code: 4 });\r\n }\r\n await collectionPolicySetStatus({\r\n cwd: resolveCwd(args.cwd),\r\n policyId: String(args.policyId),\r\n status,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('collection policy', { policyId: String(args.policyId), status });\r\n } else {\r\n consola.success(`${status === 1 ? '已启用' : '已停用'} ${String(args.policyId)}`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const policyCommand = defineCommand({\r\n meta: { name: 'policy', description: '合集策略' },\r\n subCommands: { apply: policyApplyCmd, list: policyListCmd, set: policySetCmd },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {\r\n applyCommandFlags,\r\n applyWriteCommandFlags,\r\n handleCommandError,\r\n writeJsonSuccess,\r\n} from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { collectionSyncProperties } from '../../services/collection/index.js';\r\nimport { collectionCommonArgs } from './common.js';\r\n\r\nconst propertiesSyncCmd = defineCommand({\r\n meta: {\r\n name: 'sync',\r\n description: '保存合集属性到平台(不合并目录草稿,≅ Console version_syncAllProperties)',\r\n },\r\n args: {\r\n ...collectionCommonArgs,\r\n 'dry-run': { type: 'boolean', description: '输出 updateCollection 请求体,不调用 API' },\r\n },\r\n async run({ args }) {\r\n try {\r\n if (args['dry-run']) applyCommandFlags(args);\r\n else applyWriteCommandFlags(args);\r\n const result = await collectionSyncProperties({\r\n cwd: resolveCwd(args.cwd),\r\n noAutoPull: args['no-auto-pull'],\r\n dryRun: args['dry-run'],\r\n });\r\n if (args.json) writeJsonSuccess('collection properties', result);\r\n else consola.success(`已同步合集属性 ${result.resourceId}`);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const propertiesCommand = defineCommand({\r\n meta: { name: 'properties', description: '合集版本属性' },\r\n subCommands: { sync: propertiesSyncCmd },\r\n});\r\n","import { createHash } from 'node:crypto';\nimport type {\n CollectionProject,\n CustomPropertyDescriptor,\n DraftSyncMeta,\n} from '../config/project.js';\n\n/** 合集发版表单草稿(目录草稿仍走 collection item *) */\nexport interface CollectionVersionDraftData {\n versionInput?: string;\n descriptionEditorInput?: string;\n collectionItemsSetting?: unknown;\n collectionItemsChanged?: boolean;\n directDependencies?: Array<{\n id: string;\n name?: string;\n type?: string;\n versionRange?: string;\n }>;\n baseUpcastResources?: Array<{ resourceID: string; resourceName?: string }>;\n authExcludedItems?: Array<{\n resourceId: string;\n excludedType: 'contractId' | 'policyId';\n excludedValue: string;\n }>;\n additionalProperties?: Array<{ key: string; value: string }>;\n customProperties?: Array<{\n key: string;\n name?: string;\n value?: string;\n description?: string;\n }>;\n customConfigurations?: Array<{\n key: string;\n name?: string;\n description?: string;\n type: 'input' | 'select';\n input?: string;\n select?: string[];\n }>;\n [key: string]: unknown;\n}\n\nfunction trimStr(v: unknown): string {\n return v === undefined || v === null ? '' : String(v).trim();\n}\n\r\nfunction stableStringify(value: unknown): string {\r\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\r\n if (Array.isArray(value)) {\r\n return `[${value.map((item) => stableStringify(item)).join(',')}]`;\r\n }\r\n const obj = value as Record<string, unknown>;\r\n const keys = Object.keys(obj).sort();\r\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(',')}}`;\r\n}\r\n\r\nexport function fingerprintCollectionDraft(d: CollectionVersionDraftData): string {\n const canonical = {\n versionInput: trimStr(d.versionInput),\n descriptionEditorInput: trimStr(d.descriptionEditorInput),\n collectionItemsChanged: Boolean(d.collectionItemsChanged),\n collectionItemsSetting: d.collectionItemsSetting ?? null,\n directDependencies: [...(d.directDependencies || [])]\n .map((x) => ({\n id: trimStr(x.id),\n name: trimStr(x.name),\n type: trimStr(x.type) || 'resource',\n versionRange: trimStr(x.versionRange),\n }))\n .filter((x) => x.id)\n .sort((a, b) => a.id.localeCompare(b.id)),\n baseUpcastResources: [...(d.baseUpcastResources || [])]\n .map((x) => ({\n resourceID: trimStr(x.resourceID),\n resourceName: trimStr(x.resourceName),\n }))\n .filter((x) => x.resourceID)\n .sort((a, b) => a.resourceID.localeCompare(b.resourceID)),\n authExcludedItems: [...(d.authExcludedItems || [])]\n .map((x) => ({\n resourceId: trimStr(x.resourceId),\n excludedType: x.excludedType === 'policyId' ? 'policyId' : 'contractId',\n excludedValue: trimStr(x.excludedValue),\n }))\n .filter((x) => x.resourceId && x.excludedValue)\n .sort((a, b) => {\n const byResource = a.resourceId.localeCompare(b.resourceId);\n if (byResource !== 0) return byResource;\n const byType = a.excludedType.localeCompare(b.excludedType);\n if (byType !== 0) return byType;\n return a.excludedValue.localeCompare(b.excludedValue);\n }),\n additionalProperties: [...(d.additionalProperties || [])]\n .map((a) => ({ key: trimStr(a.key), value: String(a.value ?? '') }))\n .filter((a) => a.key)\n .sort((a, b) => a.key.localeCompare(b.key)),\n customProperties: [...(d.customProperties || [])]\n .map((x) => ({\n key: trimStr(x.key),\n name: trimStr(x.name) || trimStr(x.key),\n value: String(x.value ?? ''),\n description: trimStr(x.description),\n }))\n .filter((x) => x.key)\n .sort((a, b) => a.key.localeCompare(b.key)),\n customConfigurations: [...(d.customConfigurations || [])]\n .map((x) => ({\n key: trimStr(x.key),\n name: trimStr(x.name) || trimStr(x.key),\n description: trimStr(x.description),\n type: (x.type === 'select' ? 'select' : 'input') as 'input' | 'select',\n input: trimStr(x.input),\n select: [...(x.select || [])].map(String).sort(),\n }))\n .filter((x) => x.key)\n .sort((a, b) => a.key.localeCompare(b.key)),\n };\n return createHash('sha256').update(stableStringify(canonical)).digest('hex');\n}\n\nfunction splitCustomPropertyDescriptors(descriptors: CustomPropertyDescriptor[] | undefined) {\n const customProperties: NonNullable<CollectionVersionDraftData['customProperties']> = [];\n const customConfigurations: NonNullable<CollectionVersionDraftData['customConfigurations']> = [];\n\n for (const desc of descriptors || []) {\n if (!desc?.key) continue;\n const name = desc.name || desc.key;\n const description = desc.remark || '';\n if (desc.type === 'readonlyText') {\n customProperties.push({\n key: desc.key,\n name,\n value: String(desc.defaultValue ?? ''),\n description,\n });\n continue;\n }\n if (desc.type === 'editableText') {\n customConfigurations.push({\n key: desc.key,\n name,\n description,\n type: 'input',\n input: String(desc.defaultValue ?? ''),\n select: [],\n });\n continue;\n }\n if (desc.type === 'select' || desc.type === 'radio' || desc.type === 'checkbox') {\n const select = [...(desc.candidateItems || [])].map(String);\n customConfigurations.push({\n key: desc.key,\n name,\n description,\n type: 'select',\n input: String(desc.defaultValue ?? select[0] ?? ''),\n select,\n });\n }\n }\n\n return { customProperties, customConfigurations };\n}\n\nexport function toCollectionDraftData(\n local: CollectionProject & { version?: string; description?: string },\n): CollectionVersionDraftData {\n const { customProperties, customConfigurations } = splitCustomPropertyDescriptors(\n local.customPropertyDescriptors,\n );\n return {\n versionInput: local.version || '',\n descriptionEditorInput: local.description || '',\n collectionItemsSetting: local.display ?? {},\n collectionItemsChanged: false,\n directDependencies: (local.dependencies || []).map((d) => ({\n id: d.resourceId,\n name: d.resourceName || '',\n type: 'resource',\n versionRange: d.versionRange || '',\n })),\n baseUpcastResources: (local.baseUpcastResources || []).map((b) => ({\n resourceID: b.resourceId,\n resourceName: b.resourceName || '',\n })),\n authExcludedItems: (local.authExcludedItems || []).map((a) => ({\n resourceId: a.resourceId,\n excludedType: a.excludedType,\n excludedValue: a.excludedValue,\n })),\n additionalProperties: (local.inputAttrs || []).map((a) => ({\n key: a.key,\n value: String(a.value),\n })),\n customProperties,\n customConfigurations,\n };\n}\n\r\nexport function applyCollectionDraft(\r\n local: CollectionProject,\r\n draft: CollectionVersionDraftData,\r\n): CollectionProject & { version?: string; description?: string } {\r\n return {\n ...local,\n version: trimStr(draft.versionInput) || (local as { version?: string }).version,\n description:\n draft.descriptionEditorInput !== undefined\n ? String(draft.descriptionEditorInput)\n : (local as { description?: string }).description,\n display:\n draft.collectionItemsSetting !== undefined\n ? (draft.collectionItemsSetting as CollectionProject['display'])\n : local.display,\n dependencies: (draft.directDependencies || [])\n .filter((d) => d.id && d.type !== 'object')\n .map((d) => ({\n resourceId: d.id,\n resourceName: d.name || '',\n versionRange: d.versionRange || '',\n })),\n baseUpcastResources: (draft.baseUpcastResources || [])\n .filter((b) => b.resourceID)\n .map((b) => ({\n resourceId: b.resourceID,\n resourceName: b.resourceName || '',\n })),\n authExcludedItems: (draft.authExcludedItems || [])\n .filter((a) => a.resourceId && a.excludedValue)\n .map((a) => ({\n resourceId: a.resourceId,\n excludedType: a.excludedType === 'policyId' ? 'policyId' : 'contractId',\n excludedValue: a.excludedValue,\n })),\n inputAttrs: (draft.additionalProperties || [])\n .filter((a) => a.key)\n .map((a) => ({ key: a.key, value: a.value })),\n customPropertyDescriptors: [\n ...(draft.customProperties || [])\n .filter((p) => p.key)\n .map((p) => ({\n type: 'readonlyText',\n key: p.key,\n name: p.name || p.key,\n defaultValue: String(p.value ?? ''),\n remark: p.description || '',\n })),\n ...(draft.customConfigurations || [])\n .filter((c) => c.key)\n .map((c) => {\n const select = [...(c.select || [])].map(String);\n return {\n type: c.type === 'input' ? 'editableText' : 'select',\n key: c.key,\n name: c.name || c.key,\n defaultValue: String(c.type === 'input' ? c.input ?? '' : c.input ?? select[0] ?? ''),\n candidateItems: c.type === 'input' ? undefined : select,\n remark: c.description || '',\n };\n }),\n ],\n };\n}\n\r\nexport function buildCollectionDraftSync(\r\n draft: CollectionVersionDraftData,\r\n remoteUpdateDate?: string,\r\n pushed = false,\r\n): DraftSyncMeta {\r\n return {\r\n lastFingerprint: fingerprintCollectionDraft(draft),\r\n lastRemoteUpdateDate: remoteUpdateDate,\r\n lastPushedAt: pushed ? new Date().toISOString() : undefined,\r\n };\r\n}\r\n","import { consola } from 'consola';\r\nimport { loadVersionProject, saveVersionProject } from '../config/project.js';\r\nimport { FServiceAPI, unwrapData } from '../platform/index.js';\r\nimport { assertExplicitEnvForWriteOperation } from '../core/command.js';\r\nimport type { VersionProject } from '../config/project.js';\r\nimport {\r\n applyDraftToVersionConfig,\r\n buildDraftSync,\r\n decideDraftPush,\r\n fingerprint,\r\n toDraftData,\r\n type ResourceVersionDraftData,\r\n} from '../adapters/versionDraftAdapter.js';\r\nimport { ensureOwner, ensureSynced } from './sync/index.js';\r\nimport { projectStoreFromCwd } from './store/projectStore.js';\r\nimport { uploadFileIfNeeded } from './storageUpload.js';\r\nimport { cleanupTempFile, processFileForPublish } from './processFile.js';\r\nimport { assertResourceTypeCode } from './typeService.js';\r\nimport { assertOptionalConfigAllowed } from './resourceTypeCapabilities.js';\r\nimport { looksLikeRemoteCoverUrl, resolveCoverImageUrl } from './coverUpload.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\nexport interface RemoteVersionDraft {\r\n exists: boolean;\r\n resourceId?: string;\r\n updateDate?: string;\r\n draftData?: ResourceVersionDraftData;\r\n raw?: unknown;\r\n}\r\n\r\nexport async function lookRemoteVersionDraft(resourceId: string): Promise<RemoteVersionDraft> {\r\n try {\r\n const envelope = await FServiceAPI.Resource.lookDraft({ resourceId });\r\n const data = unwrapData<Record<string, unknown> | null>(envelope);\r\n if (!data || (typeof data === 'object' && Object.keys(data).length === 0)) {\r\n return { exists: false };\r\n }\r\n const draftData = (data.draftData ?? data) as ResourceVersionDraftData;\r\n // 平台偶发把整包当 data;无 versionInput 且无 draftData 字段则视为无草稿\r\n const hasShape =\r\n data.draftData !== undefined ||\r\n draftData.versionInput !== undefined ||\r\n draftData.selectedFileInfo !== undefined ||\r\n draftData.descriptionEditorInput !== undefined ||\r\n Array.isArray(draftData.directDependencies);\r\n\r\n if (!hasShape && !data.updateDate) {\r\n return { exists: false };\r\n }\r\n\r\n return {\r\n exists: true,\r\n resourceId: (data.resourceId as string) || resourceId,\r\n updateDate: (data.updateDate || data.updateDateTime || data.modifyDate) as string | undefined,\r\n draftData: (data.draftData as ResourceVersionDraftData) || draftData,\r\n raw: data,\r\n };\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : String(error);\r\n if (/404|不存在|not\\s*found|无草稿/i.test(msg)) {\r\n return { exists: false };\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nasync function maybeUploadForDraft(\r\n config: VersionProject,\r\n cwd: string | undefined,\r\n upload: boolean,\r\n resourceName: string,\r\n resourceType?: string | string[],\r\n resourceTypeCode?: string,\r\n): Promise<VersionProject> {\r\n if (!upload) return config;\r\n if (!config.filePath?.trim()) {\r\n consola.warn('--upload 已指定但 manifest.version.filePath 为空,跳过上传');\r\n return config;\r\n }\r\n const typeInfo = resourceTypeCode ? await assertResourceTypeCode(resourceTypeCode) : undefined;\r\n assertOptionalConfigAllowed({\r\n typeInfo,\r\n inputAttrs: config.inputAttrs,\r\n customPropertyDescriptors: config.customPropertyDescriptors,\r\n });\r\n const processed = await processFileForPublish({\r\n versionConfig: config,\r\n resourceName,\r\n resourceType: resourceType ?? config.resourceType,\r\n resourceTypeCode,\r\n resourceTypeInfo: typeInfo,\r\n cwd,\r\n });\r\n try {\r\n await uploadFileIfNeeded(processed.filePath, processed.fileSha1);\r\n return {\r\n ...config,\r\n fileSha1: processed.fileSha1,\r\n filename: processed.filename,\r\n };\r\n } finally {\r\n if (processed.isTempFile) cleanupTempFile(processed.filePath);\r\n }\r\n}\r\n\r\nasync function maybeResolveVideoCoverForDraft(\r\n config: VersionProject,\r\n cwd: string | undefined,\r\n upload: boolean,\r\n): Promise<VersionProject> {\r\n const videoCover = config.videoCover?.trim();\r\n if (!videoCover) return config;\r\n if (looksLikeRemoteCoverUrl(videoCover)) return { ...config, videoCover };\r\n if (!upload) {\r\n throw cliError(I18N_KEYS.draft_video_cover_local_path, {\r\n code: 4,\r\n hint: '运行 freelog-cli draft push --upload,或把 videoCover 改成 http(s) URL',\r\n });\r\n }\r\n return {\r\n ...config,\r\n videoCover: await resolveCoverImageUrl(videoCover, cwd),\r\n };\r\n}\r\n\r\nexport async function draftPush(opts: {\r\n cwd?: string;\r\n force?: boolean;\r\n upload?: boolean;\r\n noAutoPull?: boolean;\r\n}): Promise<{\r\n resourceId: string;\r\n fingerprint: string;\r\n reason: string;\r\n skippedPost: boolean;\r\n}> {\r\n assertExplicitEnvForWriteOperation();\r\n const store = projectStoreFromCwd(opts.cwd);\r\n const ctx = await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const resourceId = ctx.resource.resourceId!;\r\n let { data: config } = loadVersionProject(opts.cwd);\r\n\r\n config = await maybeUploadForDraft(\r\n config,\r\n opts.cwd,\r\n Boolean(opts.upload),\r\n ctx.resource.resourceName || config.resourceName || 'resource',\r\n ctx.resource.resourceType || config.resourceType,\r\n ctx.resource.resourceTypeCode,\r\n );\r\n config = await maybeResolveVideoCoverForDraft(config, opts.cwd, Boolean(opts.upload));\r\n\r\n const localDraft = toDraftData(config);\r\n const localFp = fingerprint(localDraft);\r\n const remoteLook = await lookRemoteVersionDraft(resourceId);\r\n const remote =\r\n remoteLook.exists && remoteLook.draftData\r\n ? { draftData: remoteLook.draftData, updateDate: remoteLook.updateDate }\r\n : null;\r\n\r\n const decision = decideDraftPush({\r\n localFp,\r\n remote,\r\n sync: config.draftSync,\r\n force: opts.force,\r\n });\r\n\r\n if (decision.action === 'conflict') {\r\n throw cliError(\r\n decision.reason === 'remote-exists-without-sync'\r\n ? I18N_KEYS.draft_remote_conflict\r\n : decision.reason === 'both-dirty'\r\n ? I18N_KEYS.draft_both_changed\r\n : I18N_KEYS.draft_platform_updated,\r\n {\r\n code: 3,\r\n details: { error: 'DRAFT_CONFLICT', reason: decision.reason },\r\n hint: decision.hint,\r\n },\r\n );\r\n }\r\n\r\n let skippedPost = false;\r\n let updateDate = remoteLook.updateDate;\r\n\r\n if (decision.reason === 'aligned') {\r\n skippedPost = true;\r\n } else {\r\n const saveEnv = await FServiceAPI.Resource.saveVersionsDraft({\r\n resourceId,\r\n draftData: localDraft,\r\n });\r\n const saved = unwrapData<Record<string, unknown>>(saveEnv);\r\n updateDate =\r\n (saved?.updateDate as string | undefined) ||\r\n (saved?.updateDateTime as string | undefined) ||\r\n new Date().toISOString();\r\n }\r\n\r\n // 再 look 一次拿平台 updateDate(若 save 未回)\r\n if (!skippedPost) {\r\n const after = await lookRemoteVersionDraft(resourceId);\r\n if (after.updateDate) updateDate = after.updateDate;\r\n }\r\n\r\n const next: VersionProject = {\r\n ...config,\r\n resourceId,\r\n userId: ctx.resource.userId,\r\n username: ctx.resource.username,\r\n draftSync: buildDraftSync(localDraft, updateDate, !skippedPost),\r\n };\r\n // aligned:保留/刷新 fingerprint,补 lastRemoteUpdateDate\r\n if (skippedPost && next.draftSync) {\r\n next.draftSync = {\r\n ...next.draftSync,\r\n lastRemoteUpdateDate: updateDate || next.draftSync.lastRemoteUpdateDate,\r\n };\r\n }\r\n\r\n saveVersionProject(next, opts.cwd);\r\n return {\r\n resourceId,\r\n fingerprint: localFp,\r\n reason: decision.reason,\r\n skippedPost,\r\n };\r\n}\r\n\r\nexport async function draftPull(opts: {\r\n cwd?: string;\r\n noAutoPull?: boolean;\r\n}): Promise<{\r\n resourceId: string;\r\n fingerprint: string;\r\n updateDate?: string;\r\n version: string;\r\n}> {\r\n const store = projectStoreFromCwd(opts.cwd);\r\n const ctx = await ensureOwner({ store });\r\n const resourceId = ctx.resource.resourceId!;\r\n const remote = await lookRemoteVersionDraft(resourceId);\r\n if (!remote.exists || !remote.draftData) {\r\n throw cliError(I18N_KEYS.no_platform_draft, {\r\n code: 4,\r\n hint: '先 freelog-cli draft push,或在 Console 打开发版页',\r\n });\r\n }\r\n\r\n const { data: config } = loadVersionProject(opts.cwd);\r\n const filePath = config.filePath;\r\n const applied = applyDraftToVersionConfig(config, remote.draftData);\r\n applied.filePath = filePath;\r\n applied.resourceId = config.resourceId || resourceId;\r\n applied.userId = config.userId ?? ctx.resource.userId;\r\n applied.username = config.username ?? ctx.resource.username;\r\n applied.resourceName = config.resourceName;\r\n applied.resourceType = config.resourceType;\r\n applied.draftSync = buildDraftSync(remote.draftData, remote.updateDate, false);\r\n\r\n saveVersionProject(applied, opts.cwd);\r\n return {\r\n resourceId,\r\n fingerprint: applied.draftSync!.lastFingerprint,\r\n updateDate: remote.updateDate,\r\n version: applied.version,\r\n };\r\n}\r\n\r\nexport async function draftDiscard(opts: {\r\n cwd?: string;\r\n}): Promise<{ resourceId: string; existed: boolean }> {\r\n assertExplicitEnvForWriteOperation();\r\n const store = projectStoreFromCwd(opts.cwd);\r\n const ctx = await ensureOwner({ store });\r\n const resourceId = ctx.resource.resourceId!;\r\n const before = await lookRemoteVersionDraft(resourceId);\r\n\r\n try {\r\n await FServiceAPI.Resource.deleteResourceDraft({ resourceId });\r\n } catch (error) {\r\n if (before.exists) throw error;\r\n // 无草稿时 DELETE 失败 → 幂等成功\r\n consola.warn('平台无发版草稿或删除已完成');\r\n }\r\n\r\n const loaded = loadVersionProject(opts.cwd);\r\n const next: VersionProject = { ...loaded.data, draftSync: null };\r\n saveVersionProject(next, opts.cwd);\r\n\r\n return { resourceId, existed: before.exists };\r\n}\r\n","import { getCliEnv, getApiBaseURL } from '../core/env.js';\r\nimport { resolveCurrentAuth, type AuthScope } from '../core/auth.js';\r\nimport { findProjectFilePath } from '../config/project.js';\r\nimport {\r\n tryLoadCollectionProject,\r\n tryLoadResourceProject,\r\n tryLoadVersionProject,\r\n} from '../config/project.js';\r\nimport { fingerprint, toDraftData } from '../adapters/versionDraftAdapter.js';\r\nimport {\r\n fingerprintCollectionDraft,\r\n toCollectionDraftData,\r\n type CollectionVersionDraftData,\r\n} from '../adapters/collectionVersionDraftAdapter.js';\r\nimport { lookRemoteVersionDraft } from './draftService.js';\r\nimport { fetchResourceInfo, ownersMatch } from './sync/index.js';\r\n\r\nexport type DraftAdvice =\r\n | 'pull_or_force_push_or_discard'\r\n | 'draft_conflict'\r\n | 'draft_pull'\r\n | 'draft_push'\r\n | null;\r\n\r\nexport interface DraftSyncState {\r\n lastFingerprint: string;\r\n lastRemoteUpdateDate?: string | null;\r\n dirty: boolean;\r\n}\r\n\r\nexport interface PlatformFormDraftState {\r\n exists: boolean;\r\n updateDate?: string | null;\r\n version?: string | null;\r\n fingerprint?: string | null;\r\n}\r\n\r\nexport interface StatusPayload {\r\n ok: true;\r\n environment: string;\r\n apiBaseURL: string;\r\n loggedIn: boolean;\r\n auth: {\r\n username: string | null;\r\n userId: string | number | null;\r\n environment: string;\r\n scope: AuthScope | null;\r\n path: string | null;\r\n } | null;\r\n owner: {\r\n username: string | null;\r\n userId: string | number | null;\r\n matchLogin: boolean | null;\r\n } | null;\r\n sync: 'unknown' | 'ok' | 'behind';\r\n platform: {\r\n resourceId: string;\r\n latestVersion: string | null;\r\n status: number | null;\r\n enabledPolicyCount: number;\r\n } | null;\r\n platformVersionDraft: PlatformFormDraftState | null;\r\n localDraftSync: DraftSyncState | null;\r\n draftAdvice: DraftAdvice;\r\n draftAdviceHint: string | null;\r\n local: {\r\n resourceId: string | null;\r\n version: string | null;\r\n runtimeVersion: string | null;\r\n filePath: string | null;\r\n };\r\n collection: {\r\n resourceId: string | null;\r\n itemCount: number;\r\n hasCollectRules: boolean;\r\n rssFeedUrl: string | null;\r\n draftSync: DraftSyncState | null;\r\n platformFormDraftExists: boolean | null;\r\n platformFormDraft: PlatformFormDraftState | null;\r\n draftAdvice: DraftAdvice;\r\n draftAdviceHint: string | null;\r\n } | null;\r\n configs: {\r\n resource: string | null;\r\n version: string | null;\r\n collection: string | null;\r\n };\r\n}\r\n\r\nfunction resolveDraftAdvice(opts: {\r\n platformDraft: PlatformFormDraftState | null;\r\n localDraftSync: DraftSyncState | null;\r\n hasVersionCfg: boolean;\r\n remoteExistsNoSyncHint: string;\r\n conflictHint: string;\r\n pullHint: string;\r\n pushHint: string;\r\n noVersionHint: string;\r\n}): { advice: DraftAdvice; hint: string | null } {\r\n const { platformDraft, localDraftSync } = opts;\r\n const syncMeta = localDraftSync;\r\n const localDirty = Boolean(localDraftSync?.dirty);\r\n const remoteDirty = Boolean(\r\n platformDraft?.exists &&\r\n localDraftSync &&\r\n platformDraft.fingerprint &&\r\n platformDraft.fingerprint !== localDraftSync.lastFingerprint,\r\n );\r\n\r\n if (platformDraft?.exists && !syncMeta) {\r\n return {\r\n advice: 'pull_or_force_push_or_discard',\r\n hint: opts.hasVersionCfg ? opts.remoteExistsNoSyncHint : opts.noVersionHint,\r\n };\r\n }\r\n if (platformDraft?.exists && localDirty && remoteDirty) {\r\n return { advice: 'draft_conflict', hint: opts.conflictHint };\r\n }\r\n if (platformDraft?.exists && remoteDirty) {\r\n return { advice: 'draft_pull', hint: opts.pullHint };\r\n }\r\n if (localDirty) {\r\n return { advice: 'draft_push', hint: opts.pushHint };\r\n }\r\n return { advice: null, hint: null };\r\n}\r\n\r\nexport async function buildProjectStatus(cwd: string): Promise<StatusPayload> {\r\n const resolvedAuth = resolveCurrentAuth(cwd);\r\n const auth = resolvedAuth?.auth ?? null;\r\n const resourceCfg = tryLoadResourceProject(cwd);\r\n const versionCfg = tryLoadVersionProject(cwd);\r\n const collectionCfg = tryLoadCollectionProject(cwd);\r\n const activeCfg = resourceCfg || collectionCfg;\r\n\r\n let platform: Awaited<ReturnType<typeof fetchResourceInfo>> | null = null;\r\n let platformVersionDraft: PlatformFormDraftState | null = null;\r\n let ownerMatch: boolean | null = null;\r\n let sync: StatusPayload['sync'] = 'unknown';\r\n let draftAdvice: DraftAdvice = null;\r\n let draftAdviceHint: string | null = null;\r\n let localDraftSync: DraftSyncState | null = null;\r\n\r\n if (auth?.token && activeCfg?.data.resourceId) {\r\n try {\r\n platform = await fetchResourceInfo(activeCfg.data.resourceId);\r\n ownerMatch = ownersMatch(auth.userId, platform.userId);\r\n if (\r\n (activeCfg.data.resourceTitle &&\r\n platform.resourceTitle &&\r\n activeCfg.data.resourceTitle !== platform.resourceTitle) ||\r\n (activeCfg.data.intro !== undefined &&\r\n platform.intro !== undefined &&\r\n activeCfg.data.intro !== platform.intro) ||\r\n (activeCfg.data.tags &&\r\n platform.tags &&\r\n JSON.stringify(activeCfg.data.tags) !== JSON.stringify(platform.tags)) ||\r\n (activeCfg.data.coverImages &&\r\n platform.coverImages &&\r\n JSON.stringify(activeCfg.data.coverImages) !== JSON.stringify(platform.coverImages))\r\n ) {\r\n sync = 'behind';\r\n } else {\r\n sync = 'ok';\r\n }\r\n\r\n if (resourceCfg?.data.resourceId) {\r\n const remote = await lookRemoteVersionDraft(resourceCfg.data.resourceId);\r\n if (remote.exists && remote.draftData) {\r\n const remoteFp = fingerprint(remote.draftData);\r\n platformVersionDraft = {\r\n exists: true,\r\n updateDate: remote.updateDate ?? null,\r\n version: remote.draftData.versionInput ?? null,\r\n fingerprint: remoteFp,\r\n };\r\n } else {\r\n platformVersionDraft = {\r\n exists: false,\r\n updateDate: null,\r\n version: null,\r\n fingerprint: null,\r\n };\r\n }\r\n\r\n if (versionCfg?.data) {\r\n const localFp = fingerprint(toDraftData(versionCfg.data));\r\n const syncMeta = versionCfg.data.draftSync;\r\n if (syncMeta?.lastFingerprint) {\r\n localDraftSync = {\r\n lastFingerprint: syncMeta.lastFingerprint,\r\n lastRemoteUpdateDate: syncMeta.lastRemoteUpdateDate ?? null,\r\n dirty: localFp !== syncMeta.lastFingerprint,\r\n };\r\n }\r\n\r\n const advice = resolveDraftAdvice({\r\n platformDraft: platformVersionDraft,\r\n localDraftSync,\r\n hasVersionCfg: true,\r\n remoteExistsNoSyncHint: '平台存在草稿但本地没有同步基线;请先 pull,或确认后强制 push',\r\n conflictHint: '本地与平台草稿均已变化;请先 draft pull,核对后再决定是否强制 push',\r\n pullHint: '平台草稿有更新;请执行 draft pull',\r\n pushHint: '本地发布意图有更新;请执行 draft push',\r\n noVersionHint: '本地尚未设置下一版发布意图',\r\n });\r\n draftAdvice = advice.advice;\r\n draftAdviceHint = advice.hint;\r\n } else if (platformVersionDraft?.exists) {\r\n draftAdvice = 'pull_or_force_push_or_discard';\r\n draftAdviceHint = '平台存在草稿;请 pull、强制 push 或在 Console 中丢弃草稿';\r\n }\r\n }\r\n } catch {\r\n sync = 'unknown';\r\n }\r\n }\r\n\r\n const payload: StatusPayload = {\r\n ok: true,\r\n environment: getCliEnv(),\r\n apiBaseURL: getApiBaseURL(),\r\n loggedIn: Boolean(auth?.token),\r\n auth: auth\r\n ? {\r\n username: auth.username ?? null,\r\n userId: auth.userId ?? null,\r\n environment: auth.environment,\r\n scope: resolvedAuth?.scope ?? null,\r\n path: resolvedAuth?.path ?? null,\r\n }\r\n : null,\r\n owner: activeCfg\r\n ? {\r\n username: activeCfg.data.username ?? platform?.username ?? null,\r\n userId: activeCfg.data.userId ?? platform?.userId ?? null,\r\n matchLogin: ownerMatch,\r\n }\r\n : null,\r\n sync,\r\n platform: platform\r\n ? {\r\n resourceId: platform.resourceId,\r\n latestVersion: platform.latestVersion ?? null,\r\n status: platform.status ?? null,\r\n enabledPolicyCount: (platform.policies || []).filter((p) => Number(p.status) === 1)\r\n .length,\r\n }\r\n : null,\r\n platformVersionDraft,\r\n localDraftSync,\r\n draftAdvice,\r\n draftAdviceHint,\r\n local: {\r\n resourceId: resourceCfg?.data.resourceId ?? null,\r\n version: versionCfg?.data.version ?? null,\r\n runtimeVersion: versionCfg?.data.runtimeVersion ?? null,\r\n filePath: versionCfg?.data.filePath ?? null,\r\n },\r\n collection: null,\r\n configs: {\r\n resource: findProjectFilePath('resource', cwd),\r\n version: findProjectFilePath('version', cwd),\r\n collection: findProjectFilePath('collection', cwd),\r\n },\r\n };\r\n\r\n if (collectionCfg) {\r\n let platformFormDraftExists: boolean | null = null;\r\n let platformFormDraft: PlatformFormDraftState | null = null;\r\n if (auth?.token && collectionCfg.data.resourceId) {\r\n try {\r\n const remote = await lookRemoteVersionDraft(collectionCfg.data.resourceId);\r\n platformFormDraftExists = remote.exists;\r\n const remoteDraft = remote.draftData as CollectionVersionDraftData | undefined;\r\n platformFormDraft =\r\n remote.exists && remoteDraft\r\n ? {\r\n exists: true,\r\n updateDate: remote.updateDate ?? null,\r\n version: remoteDraft.versionInput ?? null,\r\n fingerprint: fingerprintCollectionDraft(remoteDraft),\r\n }\r\n : { exists: false, updateDate: null, version: null, fingerprint: null };\r\n } catch {\r\n platformFormDraftExists = null;\r\n platformFormDraft = null;\r\n }\r\n }\r\n\r\n const localFp = fingerprintCollectionDraft(toCollectionDraftData(collectionCfg.data));\r\n const syncMeta = collectionCfg.data.draftSync;\r\n const collectionDraftSync = syncMeta?.lastFingerprint\r\n ? {\r\n lastFingerprint: syncMeta.lastFingerprint,\r\n lastRemoteUpdateDate: syncMeta.lastRemoteUpdateDate ?? null,\r\n dirty: localFp !== syncMeta.lastFingerprint,\r\n }\r\n : null;\r\n\r\n const collectionAdvice = resolveDraftAdvice({\r\n platformDraft: platformFormDraft,\r\n localDraftSync: collectionDraftSync,\r\n hasVersionCfg: true,\r\n remoteExistsNoSyncHint: '平台存在合集草稿但本地没有同步基线;请先 pull',\r\n conflictHint:\r\n '本地与平台合集草稿均已变化;请先 draft pull --collection,核对后再决定是否强制 push',\r\n pullHint: '平台合集草稿有更新;请执行 draft pull --collection',\r\n pushHint: '本地合集意图有更新;请执行 draft push --collection',\r\n noVersionHint: '本地尚未形成合集草稿同步基线',\r\n });\r\n\r\n payload.collection = {\r\n resourceId: collectionCfg.data.resourceId ?? null,\r\n itemCount: Array.isArray(collectionCfg.data.catalogueItems)\r\n ? collectionCfg.data.catalogueItems.length\r\n : 0,\r\n hasCollectRules: Boolean(collectionCfg.data.collectRules),\r\n rssFeedUrl: collectionCfg.data.rssFeedUrl ?? null,\r\n draftSync: collectionDraftSync,\r\n platformFormDraftExists,\r\n platformFormDraft,\r\n draftAdvice: collectionAdvice.advice,\r\n draftAdviceHint: collectionAdvice.hint,\r\n };\r\n }\r\n\r\n return payload;\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport semver from 'semver';\r\nimport { getCurrentAuth } from '../core/auth.js';\r\nimport { getCliEnv } from '../core/env.js';\r\nimport {\r\n findProjectPath,\r\n resolveCwd,\r\n tryLoadCollectionProject,\r\n tryLoadResourceProject,\r\n tryLoadVersionProject,\r\n} from '../config/project.js';\r\nimport {\r\n assertIntro,\r\n assertPolicyName,\r\n assertResourceTitle,\r\n assertSemverLike,\r\n assertTags,\r\n assertValidVersionRange,\r\n} from './validation.js';\r\nimport { assertLeafResourceTypeCode } from './typeService.js';\r\nimport { evaluateOnlineGates } from './onlineGates.js';\r\nimport { fetchResourceInfo } from './sync/fetch.js';\r\nimport { ownersMatch } from './sync/index.js';\r\nimport { buildProjectStatus } from './statusService.js';\r\nimport {\r\n assertPublishNotCollectionCwd,\r\n assertPublishVersionReady,\r\n assertVersionGreaterThanLatest,\r\n} from './shared/guards/index.js';\r\n\r\nexport type ValidateLevel = 'ok' | 'warn' | 'error';\r\n\r\nexport interface ValidateCheck {\r\n id: string;\r\n level: ValidateLevel;\r\n message: string;\r\n hint?: string;\r\n}\r\n\r\nexport type ValidateTarget = 'project' | 'publish' | 'online';\r\n\r\nexport interface ValidateResult {\r\n ok: boolean;\r\n target: ValidateTarget;\r\n checks: ValidateCheck[];\r\n}\r\n\r\nfunction push(\r\n checks: ValidateCheck[],\r\n id: string,\r\n level: ValidateLevel,\r\n message: string,\r\n hint?: string,\r\n): void {\r\n checks.push({ id, level, message, hint });\r\n}\r\n\r\nfunction tryCheck(\r\n checks: ValidateCheck[],\r\n id: string,\r\n fn: () => void,\r\n okMessage: string,\r\n): void {\r\n try {\r\n fn();\r\n push(checks, id, 'ok', okMessage);\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const hint =\r\n error && typeof error === 'object' && 'hint' in error\r\n ? String((error as { hint?: string }).hint || '')\r\n : undefined;\r\n push(checks, id, 'error', message, hint || undefined);\r\n }\r\n}\r\n\r\nfunction resolveVersionFilePath(cwd: string, filePath: string): string {\r\n return path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);\r\n}\r\n\r\nfunction versionFileExists(cwd: string, filePath: string): boolean {\r\n const resolved = resolveVersionFilePath(cwd, filePath);\r\n return fs.existsSync(resolved);\r\n}\r\n\r\nexport async function validateProject(opts: {\r\n cwd?: string;\r\n target?: ValidateTarget;\r\n skipArtifactChecks?: boolean;\r\n versionOverride?: string;\r\n}): Promise<ValidateResult> {\r\n const cwd = resolveCwd(opts.cwd);\r\n const target = opts.target || 'project';\r\n const checks: ValidateCheck[] = [];\r\n\r\n if (!findProjectPath(cwd)) {\r\n push(checks, 'manifest', 'error', '未找到 freelog.manifest.json', 'freelog-cli init <dir>');\r\n return { ok: false, target, checks };\r\n }\r\n push(checks, 'manifest', 'ok', 'freelog.manifest.json 存在');\r\n\r\n const cliEnv = getCliEnv();\r\n push(checks, 'env', 'ok', `API 环境: ${cliEnv}`);\r\n\r\n const auth = getCurrentAuth(cwd);\r\n if (!auth?.token) {\r\n push(checks, 'auth', 'error', '未登录', 'freelog-cli login --env ' + cliEnv);\r\n } else {\r\n push(checks, 'auth', 'ok', `已登录: ${auth.username || auth.userId}`);\r\n if (auth.environment && auth.environment !== cliEnv) {\r\n push(\r\n checks,\r\n 'auth-env',\r\n 'error',\r\n `登录凭证环境 (${auth.environment}) 与当前 --env (${cliEnv}) 不一致`,\r\n `freelog-cli login --env ${cliEnv}`,\r\n );\r\n } else {\r\n push(checks, 'auth-env', 'ok', '登录环境与命令环境一致');\r\n }\r\n }\r\n\r\n const resourceCfg = tryLoadResourceProject(cwd);\r\n const collectionCfg = tryLoadCollectionProject(cwd);\r\n const versionCfg = tryLoadVersionProject(cwd);\r\n const versionData = versionCfg?.data\r\n ? { ...versionCfg.data, version: opts.versionOverride || versionCfg.data.version }\r\n : undefined;\r\n const subject = collectionCfg ? 'collection' : 'resource';\r\n const listing = collectionCfg?.data || resourceCfg?.data;\r\n\r\n if (listing) {\r\n tryCheck(\r\n checks,\r\n 'listing-title',\r\n () => assertResourceTitle(listing.resourceTitle, true),\r\n '标题满足 Console 字段契约',\r\n );\r\n tryCheck(\r\n checks,\r\n 'listing-intro',\r\n () => assertIntro(listing.intro),\r\n '简介满足 Console 字段契约',\r\n );\r\n tryCheck(\r\n checks,\r\n 'listing-tags',\r\n () => assertTags(listing.tags),\r\n '标签满足 Console 字段契约',\r\n );\r\n }\r\n\r\n const policies = resourceCfg?.data.policies || collectionCfg?.data.policies || [];\r\n for (const [index, policy] of policies.entries()) {\r\n tryCheck(\r\n checks,\r\n `policy-name-${index}`,\r\n () => assertPolicyName(policy.policyName),\r\n `策略名称满足 Console 字段契约: ${policy.policyName}`,\r\n );\r\n }\r\n\r\n if (subject === 'collection') {\r\n push(checks, 'subject', 'ok', '项目类型: 合集');\r\n if (!collectionCfg?.data.resourceId) {\r\n push(checks, 'resource-id', 'warn', '合集尚未 create(无 resourceId)', 'freelog-cli collection create');\r\n } else {\r\n push(checks, 'resource-id', 'ok', `resourceId: ${collectionCfg.data.resourceId}`);\r\n }\r\n } else {\r\n push(checks, 'subject', 'ok', '项目类型: 独立资源');\r\n if (!resourceCfg?.data.resourceId) {\r\n push(checks, 'resource-id', 'warn', '尚未 create/bind(无 resourceId)', 'freelog-cli create 或 bind');\r\n } else {\r\n push(checks, 'resource-id', 'ok', `resourceId: ${resourceCfg.data.resourceId}`);\r\n }\r\n }\r\n\r\n const typeCode =\r\n resourceCfg?.data.resourceTypeCode || collectionCfg?.data.resourceTypeCode;\r\n if (typeCode?.trim()) {\r\n try {\r\n await assertLeafResourceTypeCode(typeCode.trim());\r\n push(checks, 'type-leaf', 'ok', `resourceTypeCode ${typeCode} 可用`);\r\n } catch (error) {\r\n push(\r\n checks,\r\n 'type-leaf',\r\n 'error',\r\n error instanceof Error ? error.message : String(error),\r\n );\r\n }\r\n } else if (target !== 'project') {\r\n push(checks, 'type-code', 'error', '缺少 resourceTypeCode', 'manifest.resource.typeCode');\r\n }\r\n\r\n if (auth?.token && (resourceCfg?.data.resourceId || collectionCfg?.data.resourceId)) {\r\n const resourceId = (resourceCfg?.data.resourceId || collectionCfg?.data.resourceId)!;\r\n try {\r\n const info = await fetchResourceInfo(resourceId);\r\n if (auth.userId != null && info.userId != null && !ownersMatch(auth.userId, info.userId)) {\r\n push(checks, 'owner', 'error', '当前登录用户不是资源 owner', '换账号 login 或让 owner 操作');\r\n } else {\r\n push(checks, 'owner', 'ok', 'owner 与登录用户一致');\r\n }\r\n\r\n if (target === 'online' || target === 'publish') {\r\n const gates = evaluateOnlineGates(info);\r\n if (gates.hasLatestVersion) {\r\n push(checks, 'latest-version', 'ok', `平台 latestVersion: ${info.latestVersion}`);\r\n } else {\r\n push(checks, 'latest-version', 'warn', '平台尚无正式版本', 'freelog-cli publish 或 collection publish');\r\n }\r\n if (target === 'online') {\r\n if (gates.enabledPolicyCount >= 1) {\r\n push(checks, 'policy-enabled', 'ok', `启用策略: ${gates.enabledPolicyCount} 条`);\r\n } else {\r\n push(\r\n checks,\r\n 'policy-enabled',\r\n 'error',\r\n '无启用策略,无法 online',\r\n 'freelog-cli policy apply --from-file …',\r\n );\r\n }\r\n if (Number(info.status) === 1) {\r\n push(checks, 'online-status', 'ok', '资源已上架');\r\n } else if (gates.ok) {\r\n push(checks, 'online-status', 'ok', '门禁满足,可执行 online');\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n push(\r\n checks,\r\n 'platform',\r\n 'warn',\r\n `无法拉取平台信息: ${error instanceof Error ? error.message : String(error)}`,\r\n );\r\n }\r\n }\r\n\r\n if (target === 'publish' || target === 'online') {\r\n if (subject === 'resource' && versionData) {\r\n tryCheck(checks, 'publish-not-collection', () => assertPublishNotCollectionCwd(cwd), '非合集壳 publish 路径');\r\n tryCheck(\r\n checks,\r\n 'version-ready',\r\n () => assertPublishVersionReady(versionData),\r\n `版本意图: ${versionData.version}`,\r\n );\r\n\r\n if (versionData.version) {\r\n tryCheck(checks, 'semver', () => assertSemverLike(versionData.version!), '版本号格式合法');\r\n }\r\n\r\n if (!opts.skipArtifactChecks && versionData.filePath) {\r\n if (versionData.filePath === 'dist') {\r\n const distPath = path.join(cwd, 'dist');\r\n if (fs.existsSync(distPath)) {\r\n push(checks, 'file-exists', 'ok', 'dist/ 目录存在');\r\n } else {\r\n push(checks, 'file-exists', 'error', 'dist/ 目录不存在', '先 build 或 version set --file <路径>');\r\n }\r\n } else if (versionFileExists(cwd, versionData.filePath)) {\r\n push(checks, 'file-exists', 'ok', `文件存在: ${versionData.filePath}`);\r\n } else {\r\n push(\r\n checks,\r\n 'file-exists',\r\n 'error',\r\n `本地文件不存在: ${versionData.filePath}`,\r\n 'freelog-cli version set --file <路径>',\r\n );\r\n }\r\n }\r\n\r\n const latest = resourceCfg?.data.latestVersion;\r\n if (versionData.version && latest && semver.valid(latest) && semver.valid(versionData.version)) {\r\n tryCheck(\r\n checks,\r\n 'version-gt-latest',\r\n () => assertVersionGreaterThanLatest(versionData.version!, latest),\r\n `新版本 ${versionData.version} > 平台 ${latest}`,\r\n );\r\n }\r\n\r\n for (const [i, dep] of (versionData.dependencies || []).entries()) {\r\n if (dep.versionRange) {\r\n tryCheck(\r\n checks,\r\n `dep-range-${i}`,\r\n () => assertValidVersionRange(dep.versionRange),\r\n `依赖 ${dep.resourceId || dep.resourceName}: ${dep.versionRange}`,\r\n );\r\n }\r\n }\r\n } else if (subject === 'collection' && target === 'publish') {\r\n push(checks, 'collection-publish', 'ok', '合集发版请用 collection publish(非 resource publish)');\r\n }\r\n }\r\n\r\n if (auth?.token) {\r\n try {\r\n const status = await buildProjectStatus(cwd);\r\n if (status.draftAdvice === 'draft_conflict') {\r\n push(checks, 'draft', 'warn', '本地与平台发版草稿冲突', status.draftAdviceHint || 'draft pull 或 push');\r\n } else if (status.draftAdvice) {\r\n push(checks, 'draft', 'warn', status.draftAdviceHint || status.draftAdvice, '见 status 建议');\r\n } else if (status.localDraftSync?.dirty) {\r\n push(checks, 'draft', 'warn', '本地发版意图未 push 到平台草稿', 'freelog-cli draft push');\r\n } else {\r\n push(checks, 'draft', 'ok', '发版草稿无冲突');\r\n }\r\n if (status.sync === 'behind') {\r\n push(checks, 'listing-sync', 'warn', 'listing 与平台不一致', 'freelog-cli pull --apply-listing');\r\n } else if (status.sync === 'ok') {\r\n push(checks, 'listing-sync', 'ok', 'listing 与平台一致');\r\n }\r\n } catch {\r\n // status 失败不阻断 validate\r\n }\r\n }\r\n\r\n const ok = !checks.some((c) => c.level === 'error');\r\n return { ok, target, checks };\r\n}\r\n","import { consola } from 'consola';\nimport { resolveCwd } from '../config/project.js';\nimport { I18N_KEYS, t } from '../i18n/index.js';\nimport type { PlatformResourceInfo } from './sync/index.js';\nimport { evaluateOnlineGates } from './onlineGates.js';\nimport { validateProject } from './validateService.js';\n\nexport interface OnlineGatesSummary {\n gates: ReturnType<typeof evaluateOnlineGates>;\n lines: string[];\n failureKey?: string;\n}\n\n/** 上架门禁人类可读摘要 + 失败时将用的 i18n key(三分支顺序与 Console 一致) */\nexport function summarizeOnlineGates(info: PlatformResourceInfo): OnlineGatesSummary {\n const gates = evaluateOnlineGates(info);\n const lines = [\n `上架预检:latestVersion=${info.latestVersion || '(无)'};启用策略=${gates.enabledPolicyCount} 个`,\n ];\n if (!gates.ok) {\n if (!gates.hasLatestVersion) {\n lines.push(t(I18N_KEYS.msg_release_version_first));\n } else if ((info.policies || []).length === 0) {\n lines.push(t(I18N_KEYS.msg_set_resource_avaliable_for_auth01));\n } else {\n lines.push(t(I18N_KEYS.msg_set_resource_avaliable_for_auth02));\n }\n } else {\n lines.push('门禁检查通过,可执行上架');\n }\n\n let failureKey: string | undefined;\n if (!gates.ok) {\n if (!gates.hasLatestVersion) failureKey = I18N_KEYS.msg_release_version_first;\n else if ((info.policies || []).length === 0) {\n failureKey = I18N_KEYS.msg_set_resource_avaliable_for_auth01;\n } else failureKey = I18N_KEYS.msg_set_resource_avaliable_for_auth02;\n }\n\n return { gates, lines, failureKey };\n}\n\n/** 发行/草稿 preflight(warn 级及以上) */\nexport async function summarizePublishPreflight(opts: {\n cwd?: string;\n}): Promise<string[]> {\n const result = await validateProject({ cwd: resolveCwd(opts.cwd), target: 'publish' });\n const lines = [`发行预检(${result.checks.length} 项)`];\n for (const check of result.checks) {\n if (check.level === 'ok') continue;\n const prefix = check.level === 'error' ? '✗' : '⚠';\n lines.push(`${prefix} ${check.message}${check.hint ? `(${check.hint})` : ''}`);\n }\n if (result.ok) lines.push('预检通过');\n return lines;\n}\n\nexport function printPreflightLines(lines: string[]): void {\n for (const line of lines) consola.info(line);\n}\n","import * as p from '@clack/prompts';\r\nimport { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {\r\n applyCommandFlags,\r\n applyWriteCommandFlags,\r\n handleCommandError,\r\n writeJsonSuccess,\r\n} from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { isInteractive } from '../../core/tty.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { collectionPublish } from '../../services/collection/index.js';\r\nimport { collectionCommonArgs } from './common.js';\r\nimport {\r\n printPreflightLines,\r\n summarizePublishPreflight,\r\n} from '../../services/preflightSummary.js';\r\n\r\nexport const publishCmd = defineCommand({\r\n meta: { name: 'publish', description: '合并目录草稿并发布合集' },\r\n args: {\r\n ...collectionCommonArgs,\r\n 'dry-run': { type: 'boolean', description: '输出 updateCollection 请求体,不调用 API' },\r\n },\r\n async run({ args }) {\r\n try {\r\n if (args['dry-run']) applyCommandFlags(args);\r\n else applyWriteCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n if (!args.yes && isInteractive(args.yes) && !args['dry-run']) {\r\n printPreflightLines(await summarizePublishPreflight({ cwd }));\r\n const ok = await p.confirm({ message: '确认 collection publish?' });\r\n if (p.isCancel(ok) || !ok) {\r\n consola.info('已取消');\r\n process.exitCode = 0;\r\n return;\r\n }\r\n } else if (!args.yes && !isInteractive(args.yes)) {\r\n throw cliError(I18N_KEYS.non_interactive_publish_needs_yes, { code: 4 });\r\n }\r\n\r\n const result = await collectionPublish({\r\n cwd,\r\n noAutoPull: args['no-auto-pull'],\r\n dryRun: args['dry-run'],\r\n });\r\n if (args.json) writeJsonSuccess('collection publish', result);\r\n else consola.success(`已发布合集(draft items=${result.itemCount})`);\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'collection publish');\r\n }\r\n },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {\r\n applyCommandFlags,\r\n applyWriteCommandFlags,\r\n handleCommandError,\r\n writeJsonSuccess,\r\n} from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { collectRulesGet, collectRulesSet } from '../../services/collection/index.js';\r\nimport {\r\n parseBinaryFlag,\r\n parseConditionType,\r\n} from '../../services/collection/collectRulesContract.js';\r\nimport { collectionCommonArgs, collectionEnvArgs } from './common.js';\r\n\r\nconst collectRulesGetCmd = defineCommand({\r\n meta: { name: 'get', description: '读取自动收录规则' },\r\n args: collectionEnvArgs,\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const rules = await collectRulesGet({ cwd: resolveCwd(args.cwd) });\r\n if (args.json) writeJsonSuccess('collection collect-rules', { rules });\r\n else consola.info(JSON.stringify(rules, null, 2));\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst collectRulesSetCmd = defineCommand({\r\n meta: { name: 'set', description: '设置自动收录规则' },\r\n args: {\r\n 'from-file': { type: 'string', description: 'collect-rules JSON/YAML 文件路径' },\r\n status: { type: 'string', description: '0|1 自动收录开关' },\r\n 'serialize-status': { type: 'string', description: '0 连载 / 1 完结' },\r\n 'condition-type': { type: 'string', description: '1 every / 2 some' },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const body = await collectRulesSet({\r\n cwd: resolveCwd(args.cwd),\r\n noAutoPull: args['no-auto-pull'],\r\n fromFile: args['from-file'],\r\n status: parseBinaryFlag(args.status, 'status'),\r\n serializeStatus: parseBinaryFlag(args['serialize-status'], 'serializeStatus'),\r\n conditionType: parseConditionType(args['condition-type']),\r\n });\r\n if (args.json) writeJsonSuccess('collection collect-rules', { rules: body });\r\n else consola.success('已更新 collect-rules');\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const collectRulesCommand = defineCommand({\r\n meta: { name: 'collect-rules', description: '自动收录规则' },\r\n subCommands: { get: collectRulesGetCmd, set: collectRulesSetCmd },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { isInteractive } from '../../core/tty.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport {\r\n collectionRssBind,\r\n collectionRssPreview,\r\n collectionRssStatus,\r\n collectionRssSendCode,\r\n collectionRssSync,\r\n} from '../../services/collection/index.js';\r\nimport { collectionCommonArgs } from './common.js';\r\n\r\nconst rssInspectCmd = defineCommand({\r\n meta: { name: 'inspect', description: '检测 RSS 地址并输出 Console 等价预检结果' },\r\n args: {\r\n feedUrl: { type: 'positional', required: true, description: 'RSS feed URL' },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const result = await collectionRssPreview({\r\n cwd: resolveCwd(args.cwd),\r\n feedUrl: String(args.feedUrl),\r\n });\r\n if (args.json) writeJsonSuccess('collection rss', result);\r\n else consola.info(JSON.stringify(result, null, 2));\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst rssSendCodeCmd = defineCommand({\r\n meta: { name: 'send-code', description: '向邮箱发送 RSS 验证码' },\r\n args: {\r\n feedUrl: { type: 'positional', required: true, description: 'RSS feed URL' },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n await collectionRssSendCode({\r\n cwd: resolveCwd(args.cwd),\r\n feedUrl: String(args.feedUrl),\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) writeJsonSuccess('collection rss', {});\r\n else {\r\n consola.success('验证码已发送');\r\n consola.info('请查邮箱获取验证码,再执行 collection rss bind <feedUrl> --code <code> --yes');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst rssStatusCmd = defineCommand({\r\n meta: { name: 'status', description: '读取 RSS 同步状态,不触发同步' },\r\n args: { ...collectionCommonArgs },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const progress = await collectionRssStatus({ cwd: resolveCwd(args.cwd) });\r\n if (args.json) writeJsonSuccess('collection rss', { progress });\r\n else consola.info(JSON.stringify(progress, null, 2));\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst rssBindCmd = defineCommand({\r\n meta: { name: 'bind', description: '绑定 RSS(须 --code)' },\r\n args: {\r\n feedUrl: { type: 'positional', required: true, description: 'RSS feed URL' },\r\n code: { type: 'string', required: true, description: '邮箱验证码' },\r\n 'pub-start': { type: 'string', description: '收录起始日期(YYYY-MM-DD)' },\r\n 'pub-end': { type: 'string', description: '收录结束日期(YYYY-MM-DD)' },\r\n force: { type: 'boolean', description: '确认 RSS GUID 大面积不匹配风险' },\r\n ...collectionCommonArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n if (!args.yes && !isInteractive(args.yes)) {\r\n throw cliError(I18N_KEYS.non_interactive_bind_needs_yes, { code: 4 });\r\n }\r\n const data = await collectionRssBind({\r\n cwd: resolveCwd(args.cwd),\r\n feedUrl: String(args.feedUrl),\r\n code: args.code,\r\n pubStartDate: args['pub-start'],\r\n pubEndDate: args['pub-end'],\r\n force: args.force,\r\n confirmed: args.yes,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) writeJsonSuccess('collection rss', { data });\r\n else consola.success('已绑定 RSS');\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst rssSyncCmd = defineCommand({\r\n meta: { name: 'sync', description: '同步 RSS 并轮询进度' },\r\n args: { ...collectionCommonArgs },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const result = await collectionRssSync({\r\n cwd: resolveCwd(args.cwd),\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) writeJsonSuccess('collection rss', result);\r\n else consola.success('RSS 同步完成');\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const rssCommand = defineCommand({\r\n meta: { name: 'rss', description: '合集 RSS' },\r\n subCommands: {\r\n inspect: rssInspectCmd,\r\n status: rssStatusCmd,\r\n 'send-code': rssSendCodeCmd,\r\n bind: rssBindCmd,\r\n sync: rssSyncCmd,\r\n },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, handleCommandError, writeJsonSuccess} from '../../core/command.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { collectionLogs } from '../../services/collection/index.js';\r\nimport { collectionEnvArgs } from './common.js';\r\n\r\nexport const logsCmd = defineCommand({\r\n meta: { name: 'logs', description: '合集变更日志' },\r\n args: {\r\n skip: { type: 'string', description: '分页偏移,默认 0' },\r\n limit: { type: 'string', description: '每页条数,默认 20' },\r\n ...collectionEnvArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const logs = await collectionLogs({\r\n cwd: resolveCwd(args.cwd),\r\n skip: args.skip ? Number(args.skip) : undefined,\r\n limit: args.limit ? Number(args.limit) : undefined,\r\n });\r\n if (args.json) writeJsonSuccess('collection logs', { logs });\r\n else consola.info(JSON.stringify(logs, null, 2));\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import { spawn } from 'node:child_process';\r\nimport fs from 'fs-extra';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport { fileURLToPath } from 'node:url';\nimport { randomUUID } from 'node:crypto';\nimport ejs from 'ejs';\nimport semver from 'semver';\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport {\r\n createCollectionManifestTemplate,\r\n createResourceManifestTemplate,\r\n createVersionManifestTemplate,\r\n ensureProjectGitignore,\r\n writeCollectionProject,\r\n writeResourceProject,\r\n writeVersionProject,\r\n} from '../../config/project.js';\r\nimport {\r\n assertManifestMatchesRef,\r\n loadCompat,\r\n loadManifest,\r\n resolveTemplateRef,\r\n type TemplateCompat,\r\n type TemplateManifest,\r\n type TemplateRefInfo,\r\n} from '../compat.js';\r\n\r\nexport interface InitScaffoldOptions {\r\n dir: string;\r\n cwd: string;\r\n scaffold: 'runtime' | 'package' | 'none' | 'collection';\r\n template?: string;\r\n resourceTypeCode?: string;\r\n resourceTypeName?: string;\r\n resourceTypeLabels?: string[];\r\n runtime?: '0.4' | '0.5';\r\n resourceName?: string;\r\n title?: string;\r\n namespace?: string;\r\n templatesDir?: string;\r\n version?: string;\n versionFilePath?: string;\n artifactMode?: 'file' | 'directory-zip';\n pm?: 'pnpm' | 'npm' | 'yarn';\r\n skipInstall?: boolean;\r\n overwrite?: boolean;\r\n}\r\n\r\nfunction formatName(name: string): string {\r\n return name.trim().toLowerCase().replace(/[^a-z0-9_-]/g, '-');\r\n}\r\n\r\nfunction resolveInitTarget(opts: InitScaffoldOptions): {\r\n projectDir: string;\r\n projectName: string;\r\n resourceName: string;\r\n resourceTitle: string;\r\n} {\r\n const rawDir = opts.dir.trim();\r\n if (!rawDir) {\r\n throw cliError(I18N_KEYS.project_dir_name_empty, { code: 4 });\r\n }\r\n const projectDir = rawDir === '.' ? path.resolve(opts.cwd) : path.resolve(opts.cwd, rawDir);\r\n const projectName = formatName(path.basename(projectDir));\r\n if (!/^[a-z0-9_-]+$/.test(projectName)) {\r\n throw cliError(I18N_KEYS.project_name_invalid_chars, { code: 4 });\r\n }\r\n\r\n const resourceName = formatName(opts.resourceName || projectName);\r\n if (!/^[a-z0-9_-]+$/.test(resourceName)) {\r\n throw cliError(I18N_KEYS.auth_id_invalid_chars, { code: 4 });\r\n }\r\n\r\n return {\r\n projectDir,\r\n projectName,\r\n resourceName,\r\n resourceTitle: opts.title?.trim() || resourceName,\r\n };\r\n}\r\n\r\nasync function assertCanInitializeProject(\r\n projectDir: string,\r\n scaffold: InitScaffoldOptions['scaffold'],\r\n overwrite: boolean,\r\n): Promise<void> {\r\n const exists = await fs.pathExists(projectDir);\r\n if (!exists) return;\r\n\r\n const manifest = path.join(projectDir, 'freelog.manifest.json');\r\n const state = path.join(projectDir, '.freelog', 'state.json');\r\n if ((await fs.pathExists(manifest)) || (await fs.pathExists(state))) {\r\n if (!overwrite) {\r\n throw cliError(I18N_KEYS.dir_already_initialized, {\r\n code: 4,\r\n hint: '确认要重写 freelog.manifest.json/.freelog/state.json 时传 --yes',\r\n });\r\n }\r\n if (await hasBoundResource(manifest, state)) {\r\n throw cliError(I18N_KEYS.dir_bound_refuse_init, {\r\n code: 4,\r\n hint: '需要重新绑定时请先人工备份并移走 freelog.manifest.json 与 .freelog/state.json',\r\n });\r\n }\r\n return;\r\n }\r\n\r\n if (scaffold === 'runtime' || scaffold === 'package') {\r\n const entries = await fs.readdir(projectDir);\r\n if (entries.length) {\r\n throw cliError(I18N_KEYS.dir_not_empty_cannot_copy_template, {\r\n code: 4,\r\n hint: '已有主题/插件项目请在目录内执行 init . --scaffold none --runtime 0.5',\r\n });\r\n }\r\n }\r\n}\r\n\r\nasync function hasBoundResource(manifestPath: string, statePath: string): Promise<boolean> {\r\n for (const file of [manifestPath, statePath]) {\r\n if (!(await fs.pathExists(file))) continue;\r\n try {\r\n const raw = await fs.readJson(file);\r\n const record = raw && typeof raw === 'object' ? (raw as Record<string, unknown>) : {};\r\n const resource = record.resource as Record<string, unknown> | undefined;\r\n const collection = record.collection as Record<string, unknown> | undefined;\r\n if (record.resourceId || resource?.resourceId || collection?.resourceId) return true;\r\n } catch {\r\n continue;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction matchIgnore(relPosix: string, patterns: string[]): boolean {\r\n for (const pattern of patterns) {\r\n if (pattern === '**/public/**' && (relPosix.startsWith('public/') || relPosix.includes('/public/'))) {\r\n return true;\r\n }\r\n if (\r\n pattern === '**/node_modules/**' &&\r\n (relPosix.startsWith('node_modules/') || relPosix.includes('/node_modules/'))\r\n ) {\r\n return true;\r\n }\r\n if (pattern === relPosix || pattern === `**/${relPosix}`) return true;\r\n }\r\n return false;\r\n}\r\n\r\nasync function renderEjsTree(\r\n root: string,\r\n data: Record<string, unknown>,\r\n ejsIgnore: string[] = [],\r\n): Promise<void> {\r\n const walk = async (dir: string) => {\r\n const entries = await fs.readdir(dir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const full = path.join(dir, entry.name);\r\n const rel = path.relative(root, full).split(path.sep).join('/');\r\n if (entry.isDirectory()) {\r\n if (matchIgnore(`${rel}/`, ejsIgnore) || entry.name === 'node_modules') continue;\r\n await walk(full);\r\n continue;\r\n }\r\n if (matchIgnore(rel, ejsIgnore)) continue;\r\n if (!/\\.(json|js|ts|tsx|jsx|vue|html|md|mjs|cjs)$/.test(entry.name)) continue;\r\n const content = await fs.readFile(full, 'utf8');\r\n if (!content.includes('<%')) continue;\r\n await fs.writeFile(full, ejs.render(content, data), 'utf8');\r\n }\r\n };\r\n await walk(root);\r\n}\r\n\r\nfunction defaultTemplatesDir(): string {\r\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n // 源码:packages/cli/src/services → packages/templates\n path.resolve(here, '../../../../templates'),\n // 打包:packages/cli/dist → packages/templates\n path.resolve(here, '../../templates'),\n // 打包:packages/cli/dist/bin → packages/templates\r\n path.resolve(here, '../../../templates'),\r\n path.resolve(process.cwd(), 'packages/templates'),\r\n ];\r\n for (const p of candidates) {\r\n if (fs.existsSync(p)) return p;\r\n }\r\n return candidates[0];\r\n}\r\n\r\nfunction templateCacheDir(npmName: string, version: string): string {\n return path.join(os.homedir(), '.freelog-cli', 'template', npmName.replace('/', '__'), version);\r\n}\n\nasync function resolvePublishedTemplateRef(ref: TemplateRefInfo): Promise<TemplateRefInfo> {\n if (ref.version !== 'latest') return ref;\n\n const spec = `${ref.npmName}@latest`;\n const { stdout, stderr } = await new Promise<{ stdout: string; stderr: string }>((resolve, reject) => {\n const child = spawn('npm', ['view', spec, 'version', '--json'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: process.platform === 'win32',\n });\n let stdout = '';\n let stderr = '';\n child.stdout?.on('data', (chunk) => {\n stdout += String(chunk);\n });\n child.stderr?.on('data', (chunk) => {\n stderr += String(chunk);\n });\n child.on('error', reject);\n child.on('exit', (code) => {\n if (code === 0) resolve({ stdout, stderr });\n else {\n reject(\n cliError(I18N_KEYS.template_fetch_failed, {\n code: 4,\n params: { name: ref.npmName, version: ref.version },\n details: { spec, stderr: stderr.trim(), exitCode: code },\n }),\n );\n }\n });\n });\n\n let value: unknown;\n try {\n value = JSON.parse(stdout);\n } catch (error) {\n throw cliError(I18N_KEYS.template_fetch_failed, {\n code: 4,\n params: { name: ref.npmName, version: ref.version },\n details: { spec, stdout: stdout.trim(), stderr: stderr.trim() },\n cause: error,\n });\n }\n const candidate = Array.isArray(value) ? value.at(-1) : value;\n if (typeof candidate !== 'string' || !semver.valid(candidate)) {\n throw cliError(I18N_KEYS.template_fetch_failed, {\n code: 4,\n params: { name: ref.npmName, version: ref.version },\n details: { spec, resolvedVersion: candidate },\n });\n }\n return { ...ref, version: candidate };\n}\n\r\nasync function runPmInstall(pm: 'pnpm' | 'npm' | 'yarn', cwd: string): Promise<void> {\r\n await new Promise<void>((resolve, reject) => {\r\n const child = spawn(pm, ['install'], {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n });\r\n child.on('error', reject);\r\n child.on('exit', (code) => {\r\n if (code === 0) resolve();\r\n else reject(cliError(I18N_KEYS.pm_install_failed, { code: 1, params: { pm, code: code ?? -1 } }));\r\n });\r\n });\r\n}\r\n\r\nasync function resolveTemplateSource(\n ref: TemplateRefInfo,\n opts: { templatesDir?: string; runtime?: '0.4' | '0.5'; scaffold: 'runtime' | 'package' },\n): Promise<{ source: string; manifest: TemplateManifest; ref: TemplateRefInfo }> {\n const roots: string[] = [];\r\n if (opts.templatesDir) roots.push(path.resolve(opts.templatesDir));\r\n if (process.env.FREELOG_TEMPLATES_DIR) {\r\n roots.push(path.resolve(process.env.FREELOG_TEMPLATES_DIR));\r\n }\r\n roots.push(defaultTemplatesDir());\r\n\r\n for (const root of roots) {\r\n const templateDir = path.join(root, ref.id, 'template');\r\n const manifestPath = path.join(root, ref.id, 'template.manifest.json');\r\n if (!(await fs.pathExists(templateDir))) continue;\r\n const manifest = loadManifest(manifestPath);\n assertManifestMatchesRef(manifest, ref, opts.scaffold === 'runtime' ? opts.runtime : undefined);\n return { source: templateDir, manifest, ref: { ...ref, version: manifest.version } };\n }\n\n const resolvedRef = await resolvePublishedTemplateRef(ref);\n // latest 只用于选择版本;缓存、下载和校验始终使用解析后的精确版本。\n const cacheRoot = templateCacheDir(resolvedRef.npmName, resolvedRef.version);\n const cachedTemplate = path.join(cacheRoot, 'package', 'template');\n const cachedManifest = path.join(cacheRoot, 'package', 'template.manifest.json');\n if (!(await fs.pathExists(cachedTemplate))) {\n const tempRoot = `${cacheRoot}.tmp-${randomUUID()}`;\n await fs.ensureDir(tempRoot);\n try {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n 'npm',\n ['pack', `${resolvedRef.npmName}@${resolvedRef.version}`, '--pack-destination', tempRoot],\n { stdio: 'inherit', shell: process.platform === 'win32' },\n );\n child.on('error', reject);\n child.on('exit', (code) => {\n if (code === 0) resolve();\n else reject(cliError(I18N_KEYS.npm_pack_failed, { code: 1, params: { name: resolvedRef.npmName, version: resolvedRef.version } }));\n });\n });\n const tgz = (await fs.readdir(tempRoot)).find((file) => file.endsWith('.tgz'));\n if (!tgz) throw cliError(I18N_KEYS.npm_pack_no_tarball, { code: 1 });\n await new Promise<void>((resolve, reject) => {\n const child = spawn('tar', ['-xzf', tgz, '-C', tempRoot], {\n cwd: tempRoot,\n shell: process.platform === 'win32',\n });\n child.on('error', reject);\n child.on('exit', (code) => {\n if (code === 0) resolve();\n else reject(cliError(I18N_KEYS.template_tarball_extract_failed, { code: 1 }));\n });\n });\n\n const tempTemplate = path.join(tempRoot, 'package', 'template');\n const tempManifest = path.join(tempRoot, 'package', 'template.manifest.json');\n if (!(await fs.pathExists(tempTemplate))) {\n throw cliError(I18N_KEYS.template_fetch_failed, { code: 4 });\n }\n const manifest = loadManifest(tempManifest);\n assertManifestMatchesRef(manifest, resolvedRef, opts.scaffold === 'runtime' ? opts.runtime : undefined);\n\n await fs.ensureDir(path.dirname(cacheRoot));\n if (await fs.pathExists(cacheRoot)) {\n try {\n const existingManifest = loadManifest(cachedManifest);\n if (await fs.pathExists(cachedTemplate)) {\n assertManifestMatchesRef(\n existingManifest,\n resolvedRef,\n opts.scaffold === 'runtime' ? opts.runtime : undefined,\n );\n return { source: cachedTemplate, manifest: existingManifest, ref: resolvedRef };\n }\n } catch {\n // 缓存不完整或契约不匹配时,使用本次已校验的临时目录替换。\n }\n await fs.remove(cacheRoot);\n }\n try {\n await fs.rename(tempRoot, cacheRoot);\n } catch (error) {\n // 两个首次 init 可能同时完成下载;采用已经原子落盘且契约有效的赢家缓存。\n if (await fs.pathExists(cachedTemplate)) {\n const winnerManifest = loadManifest(cachedManifest);\n assertManifestMatchesRef(\n winnerManifest,\n resolvedRef,\n opts.scaffold === 'runtime' ? opts.runtime : undefined,\n );\n return { source: cachedTemplate, manifest: winnerManifest, ref: resolvedRef };\n }\n throw error;\n }\n } finally {\n if (await fs.pathExists(tempRoot)) await fs.remove(tempRoot);\n }\n }\n\r\n if (!(await fs.pathExists(cachedTemplate))) {\r\n throw cliError(I18N_KEYS.template_fetch_failed, {\r\n code: 4,\r\n hint: '开发时传 --templates-dir <repo>/packages/templates,或确认 npm 包已发布',\r\n });\r\n }\r\n\r\n const manifest = loadManifest(cachedManifest);\n assertManifestMatchesRef(manifest, resolvedRef, opts.scaffold === 'runtime' ? opts.runtime : undefined);\n\n return { source: cachedTemplate, manifest, ref: resolvedRef };\n}\n\r\nexport async function runInitScaffold(opts: InitScaffoldOptions): Promise<{\n projectDir: string;\n compat?: TemplateCompat;\n template?: TemplateRefInfo;\n}> {\r\n const { projectDir, projectName, resourceName, resourceTitle } = resolveInitTarget(opts);\r\n await assertCanInitializeProject(projectDir, opts.scaffold, Boolean(opts.overwrite));\r\n\r\n const version = opts.version || '1.0.0';\r\n const filePath =\r\n opts.versionFilePath !== undefined\r\n ? opts.versionFilePath\r\n : opts.scaffold === 'runtime' || opts.scaffold === 'package'\r\n ? 'dist'\r\n : '';\r\n\r\n if (!opts.resourceTypeCode?.trim()) {\r\n throw cliError(I18N_KEYS.init_resource_type_required, {\r\n code: 4,\r\n hint: '交互终端可省略 --resource-type(会一级级选择);或 freelog-cli type pick;脚本模式必须显式传 --resource-type',\r\n });\r\n }\r\n\r\n if (opts.scaffold === 'none' || opts.scaffold === 'collection') {\r\n await fs.ensureDir(projectDir);\r\n if (opts.scaffold === 'collection') {\r\n writeCollectionProject(\r\n createCollectionManifestTemplate({\r\n resourceName,\r\n resourceTypeCode: opts.resourceTypeCode || '',\r\n resourceTypeName: opts.resourceTypeName,\r\n resourceTitle,\r\n version,\r\n }),\r\n projectDir,\r\n );\r\n } else {\r\n writeResourceProject(\r\n createResourceManifestTemplate({\r\n resourceName,\r\n resourceTypeCode: opts.resourceTypeCode || '',\r\n resourceTypeName: opts.resourceTypeName,\r\n resourceTypeLabels: opts.resourceTypeLabels,\r\n resourceTitle,\r\n }),\r\n projectDir,\r\n );\r\n writeVersionProject(\r\n createVersionManifestTemplate({\r\n resourceName,\r\n resourceTypeCode: opts.resourceTypeCode || '',\n version,\n filePath: filePath || 'dist',\n artifactMode: opts.artifactMode,\n runtimeVersion: opts.runtime,\n }),\r\n projectDir,\r\n );\r\n }\r\n ensureProjectGitignore(projectDir);\r\n return { projectDir };\r\n }\r\n\r\n if (!opts.template) {\r\n throw cliError(I18N_KEYS.missing_template_flag, { code: 4 });\r\n }\r\n if (opts.scaffold === 'package' && !opts.namespace) {\r\n throw cliError(I18N_KEYS.frontend_scaffold_needs_namespace, { code: 4 });\r\n }\r\n\r\n const compat = loadCompat();\r\n const runtime = opts.runtime ?? compat.defaultRuntime;\r\n if (opts.scaffold === 'runtime' && runtime === '0.4' && !compat.runtimes['0.4']) {\r\n throw cliError(I18N_KEYS.runtime_04_not_supported, {\r\n code: 4,\r\n hint: '本仓主推 0.5;请使用 --runtime 0.5',\r\n });\r\n }\r\n\r\n const ref = resolveTemplateRef(compat, {\r\n scaffold: opts.scaffold,\r\n runtime: opts.scaffold === 'runtime' ? runtime : undefined,\r\n templateId: opts.template,\r\n });\r\n\r\n const { source, manifest, ref: resolvedTemplate } = await resolveTemplateSource(ref, {\n templatesDir: opts.templatesDir,\r\n runtime: opts.scaffold === 'runtime' ? runtime : undefined,\r\n scaffold: opts.scaffold,\r\n });\r\n\r\n await fs.copy(source, projectDir);\r\n await renderEjsTree(\r\n projectDir,\r\n {\r\n name: projectName,\r\n projectName,\r\n className: projectName.replace(/(^|[-_])(\\w)/g, (_, __, c: string) => c.toUpperCase()),\r\n version,\r\n nameSpace: opts.namespace,\r\n initType: opts.scaffold,\r\n runtimeVersion: runtime,\r\n },\r\n manifest.ejsIgnore || ['**/public/**', '**/node_modules/**'],\r\n );\r\n\r\n writeResourceProject(\r\n createResourceManifestTemplate({\r\n resourceName,\r\n resourceTypeCode: opts.resourceTypeCode || '',\r\n resourceTypeName: opts.resourceTypeName,\r\n resourceTypeLabels: opts.resourceTypeLabels,\r\n resourceTitle,\r\n }),\r\n projectDir,\r\n );\r\n\r\n writeVersionProject(\r\n createVersionManifestTemplate({\r\n resourceName,\r\n resourceTypeCode: opts.resourceTypeCode || '',\r\n version,\n filePath: manifest.filePath || filePath || 'dist',\n artifactMode: 'directory-zip',\n runtimeVersion: opts.scaffold === 'runtime' ? runtime : undefined,\r\n }),\r\n projectDir,\r\n );\r\n\r\n ensureProjectGitignore(projectDir);\r\n\r\n if (!opts.skipInstall) {\r\n const pm = opts.pm || 'pnpm';\r\n await runPmInstall(pm, projectDir);\r\n }\r\n\r\n return { projectDir, compat, template: resolvedTemplate };\n}\n","import type { ScaffoldInitCategory } from './picker.js';\n\nexport type InitScaffold = 'runtime' | 'package' | 'none' | 'collection';\n\n/** init 第一层与 Console 创建向导保持五类业务入口。 */\nexport const INIT_CATEGORY_META: Record<\n ScaffoldInitCategory,\n {\n label: string;\n scaffold: InitScaffold;\n fixedTypeNames?: string[];\n needsTemplate: boolean;\n needsRuntime: boolean;\n needsNamespace: boolean;\n defaultVersionFilePath: string;\n }\n> = {\n theme: {\n label: '主题',\n scaffold: 'runtime',\n fixedTypeNames: ['主题'],\n needsTemplate: true,\n needsRuntime: true,\n needsNamespace: false,\n defaultVersionFilePath: 'dist',\n },\n widget: {\n label: '插件',\n scaffold: 'runtime',\n fixedTypeNames: ['插件'],\n needsTemplate: true,\n needsRuntime: true,\n needsNamespace: false,\n defaultVersionFilePath: 'dist',\n },\n package: {\n label: '前端库/软件库',\n scaffold: 'package',\n fixedTypeNames: ['前端库', '软件库'],\n needsTemplate: true,\n needsRuntime: false,\n needsNamespace: true,\n defaultVersionFilePath: 'dist',\n },\n other: {\n label: '其余资源',\n scaffold: 'none',\n needsTemplate: false,\n needsRuntime: false,\n needsNamespace: false,\n defaultVersionFilePath: '',\n },\n collection: {\n label: '合集',\n scaffold: 'collection',\n needsTemplate: false,\n needsRuntime: false,\n needsNamespace: false,\n defaultVersionFilePath: '',\n },\n};\n\nconst COMPRESS_CODE_HINTS = ['theme', 'widget', 'package', 'library', 'lib'];\n\nexport function inferCategoryFromTypeCode(code: string): ScaffoldInitCategory | undefined {\n const c = code.trim().toLowerCase();\n if (c === 'theme') return 'theme';\n if (c === 'widget') return 'widget';\n if (c.includes('package') || c.includes('library') || c.includes('lib')) return 'package';\n return undefined;\n}\n\nexport function scaffoldForCategory(category: ScaffoldInitCategory): InitScaffold {\n return INIT_CATEGORY_META[category].scaffold;\n}\n\nexport function resolveScaffold(opts: {\n category?: ScaffoldInitCategory;\n scaffold?: InitScaffold;\n resourceTypeCode?: string;\n}): InitScaffold {\n if (opts.scaffold) return opts.scaffold;\n if (opts.category) return scaffoldForCategory(opts.category);\n const inferred = opts.resourceTypeCode\n ? inferCategoryFromTypeCode(opts.resourceTypeCode)\n : undefined;\n if (inferred) return scaffoldForCategory(inferred);\n return 'none';\n}\n\nexport function assertScaffoldCategoryMatch(opts: {\n scaffold: InitScaffold;\n category: ScaffoldInitCategory;\n}): void {\n const expected = INIT_CATEGORY_META[opts.category].scaffold;\n if (opts.scaffold === expected) return;\n // 允许 none 接入已有主题/插件工程\n if (opts.scaffold === 'none' && (opts.category === 'theme' || opts.category === 'widget')) {\n return;\n }\n if (opts.scaffold === 'runtime' && opts.category === 'package') {\n throw new Error(\n `资源大类为「前端库/软件库」时不应使用 --scaffold runtime,请用 --scaffold package`,\n );\n }\n if (opts.scaffold === 'package' && (opts.category === 'theme' || opts.category === 'widget')) {\n throw new Error(\n `资源大类为「${INIT_CATEGORY_META[opts.category].label}」时不应使用 --scaffold package,请用 --scaffold runtime`,\n );\n }\n if (opts.scaffold !== expected) {\n throw new Error(\n `资源大类「${INIT_CATEGORY_META[opts.category].label}」应使用 --scaffold ${expected},当前为 ${opts.scaffold}`,\n );\n }\n}\n\nexport function defaultVersionFilePath(opts: {\n category: ScaffoldInitCategory;\n resourceTypeCode: string;\n scaffold: InitScaffold;\n}): string {\n if (opts.scaffold === 'runtime' || opts.scaffold === 'package') {\n return 'dist';\n }\n const code = opts.resourceTypeCode.toLowerCase();\n if (opts.category === 'theme' || opts.category === 'widget' || opts.category === 'package') {\n return 'dist';\n }\n if (COMPRESS_CODE_HINTS.some((h) => code.includes(h))) {\n return 'dist';\n }\n return '';\n}\n\nexport function initNextSteps(opts: {\n scaffold: InitScaffold;\n category: ScaffoldInitCategory;\n projectDir: string;\n}): string[] {\n const lines: string[] = [];\n const explicitArtifactMode = opts.scaffold === 'none'\n ? ' --artifact-mode <file|directory-zip>'\n : '';\n if (opts.scaffold === 'runtime' || opts.scaffold === 'package') {\n lines.push(`cd ${opts.projectDir}`);\n lines.push('pnpm install && pnpm build');\n }\n lines.push('freelog-cli login --env dev');\n lines.push('freelog-cli create --yes --env dev');\n if (opts.category === 'theme' || opts.category === 'widget') {\n lines.push(\n `freelog-cli version set --version 1.0.0 --file dist --runtime 0.5${explicitArtifactMode} --env dev`,\n );\n } else if (opts.category === 'package') {\n lines.push(`freelog-cli version set --version 1.0.0 --file dist${explicitArtifactMode} --env dev`);\n } else if (opts.category === 'other') {\n lines.push(`freelog-cli version set --version 1.0.0 --file <你的文件路径>${explicitArtifactMode} --env dev`);\n } else if (opts.category === 'collection') {\n lines.push('freelog-cli collection create --yes --env dev');\n lines.push('freelog-cli collection item import-dir <媒体目录> --resource-type <条目类型> --env dev');\n lines.push('freelog-cli collection version set --description \"首版\" --env dev');\n lines.push('freelog-cli collection publish --yes --env dev');\n lines.push('freelog-cli collection policy apply --from-file ./policy.free.json --yes --env dev');\n lines.push('freelog-cli online --yes --env dev');\n return lines;\n }\n lines.push('freelog-cli publish --yes --env dev');\n lines.push('freelog-cli policy apply --from-file ./policy.free.json --yes --env dev');\n lines.push('freelog-cli online --yes --env dev');\n return lines;\n}\n\n/** runtime 模板 id → 用户可读名称。 */\nexport const TEMPLATE_DISPLAY_NAMES: Record<string, string> = {\n 'vite-vue-ts': 'freelog主题-vite-vue-ts',\n 'vite-vue': 'freelog主题-vite-vue',\n 'vite-react-ts': 'freelog主题-vite-react-ts',\n 'vite-react': 'freelog主题-vite-react',\n 'package-js': 'freelog前端库-package-js',\n 'package-react': 'freelog前端库-package-react',\n 'package-vue': 'freelog前端库-package-vue',\n};\n","import * as p from '@clack/prompts';\r\nimport { consola } from 'consola';\r\nimport { listTemplateRefs } from '../compat.js';\r\nimport { TEMPLATE_DISPLAY_NAMES } from './catalog.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport { t } from '../../i18n/index.js';\r\nimport {\r\n clackTextField,\r\n normalizePromptCreateName,\r\n} from '../shared/fieldConstraints.js';\r\n\r\n/** init 交互:选 runtime / package 工程模板 */\r\nexport async function pickInitTemplate(\r\n scaffold: 'runtime' | 'package',\r\n runtime?: '0.4' | '0.5',\r\n): Promise<string> {\r\n const rows = listTemplateRefs().filter((row) => {\r\n if (row.scaffold !== scaffold) return false;\r\n if (scaffold === 'runtime') return row.runtime === (runtime || '0.5');\r\n return true;\r\n });\r\n if (!rows.length) {\r\n throw cliError(I18N_KEYS.no_templates_available, { code: 4, hint: 'freelog-cli template list' });\r\n }\r\n const choice = await p.select({\r\n message: scaffold === 'runtime' ? '请选择主题/插件工程模板' : '请选择前端库工程模板',\r\n options: rows.map((row) => ({\r\n value: row.id,\r\n label: TEMPLATE_DISPLAY_NAMES[row.id] || row.id,\r\n hint: row.runtime ? `runtime ${row.runtime}` : 'package',\r\n })),\r\n });\r\n if (p.isCancel(choice)) {\r\n throw cliError(I18N_KEYS.cancelled_template_pick, { code: 4 });\r\n }\r\n return String(choice);\r\n}\r\n\r\n/** init 交互:package namespace */\r\nexport async function pickInitNamespace(): Promise<string> {\r\n const ns = await p.text({\r\n message: '请输入前端库 namespace(如 myLib,会自动加 freelogLibrary. 前缀)',\r\n validate: (value) => (value?.trim() ? undefined : 'namespace 不能为空'),\r\n });\r\n if (p.isCancel(ns)) {\r\n throw cliError(I18N_KEYS.cancelled_namespace_input, { code: 4 });\r\n }\r\n let formatted = String(ns).trim();\r\n if (!formatted.startsWith('freelogLibrary.')) {\r\n formatted = `freelogLibrary.${formatted}`;\r\n }\r\n return formatted;\r\n}\r\n\r\n/** init 交互:资源短名 + 展示标题 */\r\nexport async function pickInitResourceIdentity(\r\n defaultName: string,\r\n): Promise<{ resourceName: string; title: string }> {\r\n const nameAnswer = await p.text(\r\n clackTextField('FORM-RES-NAME', { defaultValue: defaultName }),\r\n );\r\n if (p.isCancel(nameAnswer)) {\r\n throw cliError(I18N_KEYS.cancelled_resource_info_input, { code: 4 });\r\n }\r\n const nameResult = normalizePromptCreateName(String(nameAnswer));\r\n if (nameResult.wasModified) {\r\n consola.info(t(I18N_KEYS.input_resourceauthid_automodified_msg, { authid: nameResult.normalized }));\r\n }\r\n\r\n const titleAnswer = await p.text(\r\n clackTextField('FORM-RES-TITLE', { defaultValue: defaultName }),\r\n );\r\n if (p.isCancel(titleAnswer)) {\r\n throw cliError(I18N_KEYS.cancelled_resource_info_input, { code: 4 });\r\n }\r\n\r\n return {\r\n resourceName: nameResult.normalized,\r\n title: String(titleAnswer).trim(),\r\n };\r\n}\r\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { loadFreelogIgnorePatterns, isIgnoredFilename } from './freelogIgnore.js';\n\nconst MEDIA_EXT = new Set([\n '.jpg',\n '.jpeg',\n '.png',\n '.gif',\n '.webp',\n '.svg',\n '.mp4',\n '.mov',\n '.m4v',\n '.webm',\n '.mp3',\n '.wav',\n]);\n\nconst CONFIG_RE = /^freelog\\./i;\n\nexport interface MediaDirScan {\n dir: string;\n totalFiles: number;\n mediaFiles: number;\n mediaPaths: string[];\n nonMediaFiles: number;\n}\n\n/** 扫描目录顶层文件(与 import-dir 一致:不递归) */\nexport function scanMediaDir(dir: string): MediaDirScan {\n const resolved = path.resolve(dir);\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {\n return {\n dir: resolved,\n totalFiles: 0,\n mediaFiles: 0,\n mediaPaths: [],\n nonMediaFiles: 0,\n };\n }\n const mediaPaths: string[] = [];\n let nonMedia = 0;\n const ignorePatterns = loadFreelogIgnorePatterns(resolved);\n for (const ent of fs.readdirSync(resolved, { withFileTypes: true })) {\n if (!ent.isFile() || CONFIG_RE.test(ent.name)) continue;\n if (isIgnoredFilename(ent.name, ignorePatterns)) continue;\n const ext = path.extname(ent.name).toLowerCase();\n if (MEDIA_EXT.has(ext)) {\n mediaPaths.push(path.join(resolved, ent.name));\n } else {\n nonMedia += 1;\n }\n }\n mediaPaths.sort((a, b) => path.basename(a).localeCompare(path.basename(b)));\n return {\n dir: resolved,\n totalFiles: mediaPaths.length + nonMedia,\n mediaFiles: mediaPaths.length,\n mediaPaths,\n nonMediaFiles: nonMedia,\n };\n}\n\nexport function formatMediaDirHint(scan: MediaDirScan): string | undefined {\n if (scan.mediaFiles < 2) return undefined;\n return `目录 ${scan.dir} 顶层有 ${scan.mediaFiles} 个媒体文件 → 适合用「freelog-cli resource import-dir <dir>」批量发行,或「freelog-cli collection init-from-folder」发行合集(不是 init 五选一)`;\n}\n","import * as p from '@clack/prompts';\r\nimport { consola } from 'consola';\r\nimport { CliError } from '../../core/errors.js';\r\nimport { listResourceTypes } from '../typeService.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport {\r\n buildResourceTypeLabels,\r\n findTypePath,\r\n formatTypePath,\r\n isLeafType,\r\n parseResourceTypeForest,\r\n resolveScaffoldResourceTypeFromForest,\r\n searchResourceTypes,\r\n type ResourceTypeNode,\r\n type ScaffoldPreset,\r\n} from '../resourceTypeTree.js';\r\n\r\nexport type { ScaffoldPreset };\r\n\r\n/** init 五选一 + type pick 可用的工程立项大类(方案 A:不含批量/文件夹合集) */\r\nexport type ScaffoldInitCategory = 'theme' | 'widget' | 'package' | 'other' | 'collection';\r\n\r\nexport const INIT_CATEGORY_OPTIONS = [\r\n {\r\n value: 'theme' as const,\r\n label: '主题',\r\n hint: '从平台类型树定稿「主题」,再选 runtime 工程模板',\r\n },\r\n {\r\n value: 'widget' as const,\r\n label: '插件',\r\n hint: '从平台类型树定稿「插件」,再选 runtime 工程模板',\r\n },\r\n {\r\n value: 'package' as const,\r\n label: '前端库 / 软件库',\r\n hint: '从平台类型树定稿「前端库/软件库」,再选 package 模板 + 命名空间',\r\n },\r\n {\r\n value: 'other' as const,\r\n label: '其余资源',\r\n hint: '图片 / 视频 / 文件等:一级级选到叶子类型,scaffold none',\r\n },\r\n {\r\n value: 'collection' as const,\r\n label: '合集',\r\n hint: 'init 合集 manifest,再 collection create → item *',\r\n },\r\n] satisfies ReadonlyArray<{ value: ScaffoldInitCategory; label: string; hint: string }>;\r\n\r\nexport interface PickedResourceType {\r\n code: string;\r\n name: string;\r\n path: ResourceTypeNode[];\r\n pathLabel: string;\r\n resourceTypeLabels: string[];\r\n category: ScaffoldInitCategory;\r\n suggestedScaffold: 'runtime' | 'package' | 'none' | 'collection';\r\n}\r\n\r\n/** 按平台展示名匹配候选类型,不写死环境相关 type code。 */\nexport async function resolveFixedScaffoldCategory(\n category: ScaffoldPreset,\n forest?: ResourceTypeNode[],\n templateId?: string,\n): Promise<PickedResourceType> {\n const types = forest ?? (await loadResourceTypeForest());\n try {\n const { node, path } = resolveScaffoldResourceTypeFromForest(types, category, {\n templateId,\n });\n return wrapPick(node, path, category);\r\n } catch (error) {\r\n throw new CliError(error instanceof Error ? error.message : String(error), {\r\n code: 4,\r\n hint: 'freelog-cli login --env dev 后重试;或 init theme|widget|package --resource-type <code> 显式指定',\r\n });\r\n }\r\n}\r\n\r\nfunction wrapPick(\r\n node: ResourceTypeNode,\r\n path: ResourceTypeNode[],\r\n category: ScaffoldInitCategory,\r\n): PickedResourceType {\r\n const suggestedScaffold =\r\n category === 'collection'\r\n ? 'collection'\r\n : category === 'package'\r\n ? 'package'\r\n : category === 'theme' || category === 'widget'\r\n ? 'runtime'\r\n : 'none';\r\n\r\n return {\r\n code: node.code,\r\n name: node.name,\r\n path,\r\n pathLabel: formatTypePath(path),\r\n resourceTypeLabels: buildResourceTypeLabels(path),\r\n category,\r\n suggestedScaffold,\r\n };\r\n}\r\n\r\nexport async function loadResourceTypeForest(opts?: {\r\n subjectType?: 1 | 4;\r\n}): Promise<ResourceTypeNode[]> {\r\n const envelope = await listResourceTypes({\r\n status: 1,\r\n subjectType: opts?.subjectType,\r\n });\r\n const forest = parseResourceTypeForest(envelope);\r\n if (!forest.length) {\r\n throw cliError(I18N_KEYS.no_resource_types_from_platform, {\r\n code: 4,\r\n hint: '先 freelog-cli login --env dev,再重试',\r\n });\r\n }\r\n return forest;\r\n}\r\n\r\nexport async function pickInitCategory(): Promise<ScaffoldInitCategory> {\r\n const choice = await p.select({\r\n message:\r\n '请选择要创建的资源大类(工程立项五选一;批量发行请用 resource import-dir)',\r\n options: [...INIT_CATEGORY_OPTIONS],\r\n });\r\n if (p.isCancel(choice)) {\r\n throw cliError(I18N_KEYS.cancelled_resource_type_pick, { code: 4 });\r\n }\r\n return choice;\r\n}\r\n\r\nasync function pickFromList(\r\n message: string,\r\n nodes: ResourceTypeNode[],\r\n extras?: Array<{ value: string; label: string; hint?: string }>,\r\n): Promise<ResourceTypeNode | '__back__' | '__search__'> {\r\n const options = [\r\n ...(extras || []),\r\n ...nodes.map((node) => ({\r\n value: node.code,\r\n label: node.name,\r\n hint: node.children?.length\r\n ? `${node.code} → 还有 ${node.children.length} 个子类型`\r\n : node.code,\r\n })),\r\n ];\r\n\r\n const selected = await p.select({ message, options });\r\n if (p.isCancel(selected)) {\r\n throw cliError(I18N_KEYS.cancelled_resource_type_pick, { code: 4 });\r\n }\r\n if (selected === '__back__') return '__back__';\r\n if (selected === '__search__') return '__search__';\r\n const node = nodes.find((n) => n.code === selected);\r\n if (!node) {\r\n throw cliError(I18N_KEYS.selected_resource_type_not_found, { code: 4 });\r\n }\r\n return node;\r\n}\r\n\r\nasync function pickBySearch(\r\n forest: ResourceTypeNode[],\r\n category: ScaffoldInitCategory,\r\n): Promise<PickedResourceType | null> {\r\n const keyword = await p.text({\r\n message: '搜索资源类型(名称或 code)',\r\n validate: (value) => (value?.trim() ? undefined : '请输入关键词'),\r\n });\r\n if (p.isCancel(keyword)) return null;\r\n\r\n const matches = searchResourceTypes(forest, String(keyword));\r\n if (!matches.length) {\r\n consola.warn('未找到匹配的资源类型');\r\n return null;\r\n }\r\n\r\n if (matches.length === 1) {\r\n const node = matches[0]!;\r\n const path = findTypePath(node, forest) || [node];\r\n return wrapPick(node, path, category);\r\n }\r\n\r\n const picked = await p.select({\r\n message: `找到 ${matches.length} 个匹配,请选择`,\r\n options: matches.map((node) => ({\r\n value: node.code,\r\n label: `${node.name} (${node.code})`,\r\n })),\r\n });\r\n if (p.isCancel(picked)) return null;\r\n const node = matches.find((n) => n.code === picked)!;\r\n const path = findTypePath(node, forest) || [node];\r\n return wrapPick(node, path, category);\r\n}\r\n\r\n/** 逐级选择,直到平台叶子类型。 */\nexport async function pickResourceTypeFromTree(opts: {\r\n forest: ResourceTypeNode[];\r\n category: ScaffoldInitCategory;\r\n rootMessage?: string;\r\n}): Promise<PickedResourceType> {\r\n type Frame = { level: ResourceTypeNode[]; parentPath: string; depth: number };\r\n const stack: Frame[] = [{ level: opts.forest, parentPath: '', depth: 1 }];\r\n\r\n while (stack.length) {\r\n const frame = stack[stack.length - 1]!;\r\n const extras: Array<{ value: string; label: string; hint?: string }> = [];\r\n if (frame.depth > 1) {\r\n extras.push({ value: '__back__', label: '← 返回上一级' });\r\n }\r\n extras.push({ value: '__search__', label: '🔍 搜索资源类型' });\r\n\r\n const message =\r\n frame.parentPath ||\r\n opts.rootMessage ||\r\n (frame.depth === 1 ? '请选择资源类型(一级)' : `请选择子类型(${frame.parentPath})`);\r\n\r\n const picked = await pickFromList(message, frame.level, extras);\r\n\r\n if (picked === '__search__') {\r\n const searched = await pickBySearch(opts.forest, opts.category);\r\n if (searched) return searched;\r\n continue;\r\n }\r\n\r\n if (picked === '__back__') {\r\n if (stack.length > 1) {\r\n stack.pop();\r\n }\r\n continue;\r\n }\r\n\r\n if (!isLeafType(picked) && picked.children?.length) {\r\n const nextPath = frame.parentPath ? `${frame.parentPath} > ${picked.name}` : picked.name;\r\n stack.push({\r\n level: picked.children,\r\n parentPath: nextPath,\r\n depth: frame.depth + 1,\r\n });\r\n continue;\r\n }\r\n\r\n const path = findTypePath(picked, opts.forest) || [picked];\r\n return wrapPick(picked, path, opts.category);\r\n }\r\n\r\n throw cliError(I18N_KEYS.cancelled_resource_type_pick, { code: 4 });\r\n}\r\n\r\nexport async function pickResourceTypeForCategory(\n category: ScaffoldInitCategory,\n opts?: { templateId?: string },\n): Promise<PickedResourceType> {\n if (category === 'theme' || category === 'widget' || category === 'package') {\n return resolveFixedScaffoldCategory(category, undefined, opts?.templateId);\n }\r\n if (category === 'collection') {\r\n const forest = await loadResourceTypeForest({ subjectType: 4 });\r\n return pickResourceTypeFromTree({\r\n forest,\r\n category: 'collection',\r\n rootMessage: '请选择合集资源类型(一级)',\r\n });\r\n }\r\n const forest = await loadResourceTypeForest();\r\n return pickResourceTypeFromTree({\r\n forest,\r\n category: 'other',\r\n rootMessage: '请选择资源类型(一级)',\r\n });\r\n}\r\n\r\nexport async function pickResourceTypeInteractive(opts?: {\r\n category?: ScaffoldInitCategory;\r\n}): Promise<PickedResourceType> {\r\n const category = opts?.category || (await pickInitCategory());\r\n return pickResourceTypeForCategory(category);\r\n}\r\n","import { consola } from 'consola';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { requireAuth } from '../../core/auth.js';\r\nimport { CliError } from '../../core/errors.js';\r\nimport { isInteractive } from '../../core/tty.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { cliError } from '../../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../../i18n/bundled.js';\r\nimport {\r\n assertScaffoldCategoryMatch,\r\n defaultVersionFilePath,\r\n inferCategoryFromTypeCode,\r\n INIT_CATEGORY_META,\r\n resolveScaffold,\r\n scaffoldForCategory,\r\n type InitScaffold,\r\n} from './catalog.js';\r\nimport {\r\n pickInitNamespace,\r\n pickInitResourceIdentity,\r\n pickInitTemplate,\r\n} from './prompts.js';\r\nimport { formatMediaDirHint, scanMediaDir } from '../mediaDirScan.js';\r\nimport {\r\n buildResourceTypeLabels,\r\n findTypeInForestByCode,\r\n formatTypePath,\r\n} from '../resourceTypeTree.js';\r\nimport {\r\n loadResourceTypeForest,\r\n pickInitCategory,\r\n pickResourceTypeForCategory,\r\n resolveFixedScaffoldCategory,\r\n type PickedResourceType,\r\n type ScaffoldInitCategory,\r\n type ScaffoldPreset,\r\n} from './picker.js';\r\nimport { assertResourceTypeCode } from '../typeService.js';\r\n\r\nexport interface ResolvedInitArgs {\r\n scaffold: InitScaffold;\r\n resourceTypeCode: string;\r\n resourceTypeName?: string;\r\n resourceTypeLabels?: string[];\r\n category: ScaffoldInitCategory;\r\n template?: string;\r\n runtime?: '0.4' | '0.5';\r\n namespace?: string;\r\n resourceName?: string;\r\n title?: string;\r\n versionFilePath?: string;\r\n}\r\n\r\nexport interface ResolvedInitOutcome {\r\n args: ResolvedInitArgs;\r\n dir: string;\r\n}\r\n\r\nfunction showMediaDirHintIfAny(cwd: string, dirArg: string): void {\r\n const target =\r\n dirArg === '.' ? cwd : path.isAbsolute(dirArg) ? dirArg : path.resolve(cwd, dirArg);\r\n if (!fs.existsSync(target) || !fs.statSync(target).isDirectory()) return;\r\n const hint = formatMediaDirHint(scanMediaDir(target));\r\n if (hint) consola.info(hint);\r\n}\r\n\r\nasync function resolveTypePick(opts: {\n scaffold?: InitScaffold;\n resourceTypeCode?: string;\n category: ScaffoldInitCategory;\n presetCategory?: ScaffoldPreset;\n templateId?: string;\n}): Promise<PickedResourceType> {\n if (opts.presetCategory) {\r\n if (opts.resourceTypeCode?.trim()) {\r\n return pickedFromExplicitCode(\r\n opts.resourceTypeCode,\r\n opts.scaffold || scaffoldForCategory(opts.presetCategory),\r\n );\r\n }\n requireAuth();\n return resolveFixedScaffoldCategory(opts.presetCategory, undefined, opts.templateId);\n }\r\n\r\n if (opts.resourceTypeCode?.trim()) {\r\n return pickedFromExplicitCode(opts.resourceTypeCode, opts.scaffold);\r\n }\r\n\r\n requireAuth();\r\n\r\n if (opts.category === 'theme' || opts.category === 'widget' || opts.category === 'package') {\n return resolveFixedScaffoldCategory(opts.category, undefined, opts.templateId);\n }\n\r\n return pickResourceTypeForCategory(opts.category);\r\n}\r\n\r\nasync function pickedFromExplicitCode(\r\n code: string,\r\n scaffold?: InitScaffold,\r\n): Promise<PickedResourceType> {\r\n const trimmed = code.trim();\r\n await assertResourceTypeCode(trimmed);\r\n const inferred = inferCategoryFromTypeCode(trimmed);\r\n const category: ScaffoldInitCategory =\r\n inferred ||\r\n (scaffold === 'collection' ? 'collection' : scaffold === 'package' ? 'package' : 'other');\r\n\r\n try {\r\n const forest = await loadResourceTypeForest();\r\n const found = findTypeInForestByCode(forest, trimmed);\r\n if (found) {\r\n return {\r\n code: found.node.code,\r\n name: found.node.name,\r\n path: found.path,\r\n pathLabel: formatTypePath(found.path),\r\n resourceTypeLabels: buildResourceTypeLabels(found.path),\r\n category,\r\n suggestedScaffold: resolveScaffold({ category, scaffold, resourceTypeCode: trimmed }),\r\n };\r\n }\r\n } catch {\r\n // 显式 code 已校验过;类型树不可用时回退到 code 本身\r\n }\r\n\r\n return {\r\n code: trimmed,\r\n name: trimmed,\r\n path: [],\r\n pathLabel: trimmed,\r\n resourceTypeLabels: [],\r\n category,\r\n suggestedScaffold: resolveScaffold({ category, scaffold, resourceTypeCode: trimmed }),\r\n };\r\n}\r\n\r\n/**\r\n * 解析 init 工程立项参数(方案 A:仅 scaffold 路径,不含批量/文件夹合集)。\r\n */\r\nexport async function resolveInitOutcome(opts: {\r\n yes?: boolean;\r\n scaffold?: InitScaffold;\r\n resourceTypeCode?: string;\r\n presetCategory?: ScaffoldPreset;\r\n template?: string;\r\n runtime?: '0.4' | '0.5';\r\n namespace?: string;\r\n resourceName?: string;\r\n title?: string;\r\n dir?: string;\r\n cwd?: string;\r\n}): Promise<ResolvedInitOutcome> {\r\n const args = await resolveInitArgsInteractive({\r\n ...opts,\r\n dir: String(opts.dir ?? '.'),\r\n });\r\n return { args, dir: String(opts.dir ?? '.') };\r\n}\r\n\r\nexport async function resolveInitArgsInteractive(opts: {\r\n yes?: boolean;\r\n scaffold?: InitScaffold;\r\n resourceTypeCode?: string;\r\n category?: ScaffoldInitCategory;\r\n presetCategory?: ScaffoldPreset;\r\n template?: string;\r\n runtime?: '0.4' | '0.5';\r\n namespace?: string;\r\n resourceName?: string;\r\n title?: string;\r\n dir?: string;\r\n cwd?: string;\r\n}): Promise<ResolvedInitArgs> {\r\n const cwd = resolveCwd(opts.cwd);\r\n const interactive = isInteractive(opts.yes);\r\n const dirArg = String(opts.dir ?? '.');\r\n\r\n let scaffold = opts.scaffold;\r\n let template = opts.template;\r\n let runtime = opts.runtime;\r\n let namespace = opts.namespace;\r\n let resourceName = opts.resourceName;\r\n let title = opts.title;\r\n\r\n let category = opts.category;\r\n if (opts.presetCategory) {\r\n category = opts.presetCategory;\r\n } else if (!category && opts.resourceTypeCode?.trim()) {\r\n category =\r\n inferCategoryFromTypeCode(opts.resourceTypeCode) ||\r\n (opts.scaffold === 'collection'\r\n ? 'collection'\r\n : opts.scaffold === 'package'\r\n ? 'package'\r\n : 'other');\r\n } else if (!category) {\r\n if (!interactive) {\r\n throw cliError(I18N_KEYS.non_interactive_init_needs_type, {\r\n code: 4,\r\n });\r\n }\r\n if (dirArg !== '.') {\r\n showMediaDirHintIfAny(cwd, dirArg);\r\n }\r\n category = await pickInitCategory();\r\n }\r\n\r\n if (category === 'package' && interactive && !template) {\n template = await pickInitTemplate('package', runtime);\n }\n\n const picked = await resolveTypePick({\n scaffold,\n resourceTypeCode: opts.resourceTypeCode,\n category,\n presetCategory: opts.presetCategory,\n templateId: template,\n });\n\r\n scaffold = resolveScaffold({\r\n category,\r\n scaffold: scaffold || picked.suggestedScaffold,\r\n resourceTypeCode: picked.code,\r\n });\r\n\r\n try {\r\n assertScaffoldCategoryMatch({ scaffold, category });\r\n } catch (error) {\r\n throw new CliError(error instanceof Error ? error.message : String(error), { code: 4 });\r\n }\r\n\r\n if (!opts.presetCategory) {\r\n await assertResourceTypeCode(picked.code);\r\n }\r\n\r\n const meta = INIT_CATEGORY_META[category];\r\n\r\n if (!interactive) {\r\n if ((scaffold === 'runtime' || scaffold === 'package') && !template) {\r\n throw cliError(I18N_KEYS.non_interactive_init_needs_template, {\r\n code: 4,\r\n hint: 'freelog-cli template list --scaffold runtime --runtime 0.5',\r\n });\r\n }\r\n if (scaffold === 'package' && !namespace) {\r\n throw cliError(I18N_KEYS.non_interactive_init_needs_namespace, { code: 4 });\r\n }\r\n if (scaffold === 'runtime' && !runtime) {\r\n runtime = '0.5';\r\n }\r\n } else {\r\n consola.success(`已选资源类型: ${picked.pathLabel} (${picked.code})`);\r\n\r\n if (meta.needsTemplate && !template) {\r\n template = await pickInitTemplate(scaffold as 'runtime' | 'package', runtime);\r\n }\r\n if (meta.needsRuntime && !runtime) {\r\n runtime = '0.5';\r\n }\r\n if (meta.needsNamespace && !namespace) {\r\n namespace = await pickInitNamespace();\r\n }\r\n\r\n const defaultDirName =\r\n dirArg && dirArg !== '.'\r\n ? dirArg.replace(/^.*[/\\\\]/, '').replace(/\\.[^.]+$/, '')\r\n : 'my-project';\r\n if (!resourceName || !title) {\r\n const identity = await pickInitResourceIdentity(resourceName || defaultDirName);\r\n resourceName = resourceName || identity.resourceName;\r\n title = title || identity.title;\r\n }\r\n }\r\n\r\n if (scaffold === 'runtime' && !runtime) {\r\n runtime = '0.5';\r\n }\r\n\r\n const versionFilePath = defaultVersionFilePath({\r\n category,\r\n resourceTypeCode: picked.code,\r\n scaffold,\r\n });\r\n\r\n return {\r\n scaffold,\r\n resourceTypeCode: picked.code,\r\n resourceTypeName: picked.name,\r\n resourceTypeLabels: picked.resourceTypeLabels,\r\n category,\r\n template,\r\n runtime,\r\n namespace,\r\n resourceName,\r\n title,\r\n versionFilePath,\r\n };\r\n}\r\n","import * as p from '@clack/prompts';\r\nimport { consola } from 'consola';\r\nimport path from 'node:path';\r\nimport { requireAuth } from '../core/auth.js';\r\nimport { runInitScaffold } from './init/index.js';\r\nimport { createCollection, itemImportDir } from './collection/index.js';\r\nimport {\r\n clackTextField,\r\n normalizePromptCreateName,\r\n} from './shared/fieldConstraints.js';\r\nimport { formatMediaDirHint, scanMediaDir } from './mediaDirScan.js';\r\nimport { pickResourceTypeForCategory } from './init/index.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { t } from '../i18n/index.js';\r\n\r\nexport interface CollectionFolderWizardResult {\r\n projectDir: string;\r\n mediaDir: string;\r\n collectionResourceTypeCode: string;\r\n itemResourceTypeCode: string;\r\n importedCount: number;\r\n}\r\n\r\nexport async function runCollectionFolderWizard(opts: {\r\n cwd: string;\r\n projectDir?: string;\r\n mediaDir?: string;\r\n yes?: boolean;\r\n}): Promise<CollectionFolderWizardResult> {\r\n requireAuth();\r\n\r\n const collectionPick = await pickResourceTypeForCategory('collection');\r\n consola.success(`合集类型: ${collectionPick.pathLabel} (${collectionPick.code})`);\r\n\r\n let projectDirName = opts.projectDir?.trim();\r\n if (!projectDirName) {\r\n const input = await p.text({\r\n message: '合集项目目录名(将写入 freelog.manifest.json)',\r\n defaultValue: 'my-collection',\r\n validate: (v) =>\r\n /^[a-zA-Z0-9_-]+$/.test(String(v || '').trim()) ? undefined : '只能英文/数字/_/-',\r\n });\r\n if (p.isCancel(input)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\r\n projectDirName = String(input).trim();\r\n }\r\n\r\n let mediaDir = opts.mediaDir?.trim();\r\n if (!mediaDir) {\r\n const input = await p.text({\r\n message: '媒体文件夹路径(每个文件先变成子资源,再加入合集目录)',\r\n validate: (v) => (v?.trim() ? undefined : '路径不能为空'),\r\n });\r\n if (p.isCancel(input)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\r\n mediaDir = String(input).trim();\r\n }\r\n\r\n const absMedia = path.isAbsolute(mediaDir) ? mediaDir : path.resolve(opts.cwd, mediaDir);\r\n const scan = scanMediaDir(absMedia);\r\n const hint = formatMediaDirHint(scan);\r\n if (hint) consola.info(hint);\r\n if (scan.mediaFiles === 0) {\r\n throw cliError(I18N_KEYS.no_importable_media_in_dir, { code: 4 });\r\n }\r\n\r\n const itemPick = await pickResourceTypeForCategory('other');\r\n consola.success(`合集条目资源类型: ${itemPick.pathLabel} (${itemPick.code})`);\r\n\r\n const identity = await p.group({\r\n resourceName: () => p.text(clackTextField('FORM-RES-NAME', { defaultValue: projectDirName })),\r\n title: () => p.text(clackTextField('FORM-RES-TITLE', { defaultValue: projectDirName })),\r\n });\r\n if (p.isCancel(identity)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\r\n\r\n const nameResult = normalizePromptCreateName(String(identity.resourceName));\r\n if (nameResult.wasModified) {\r\n consola.info(\r\n t(I18N_KEYS.input_resourceauthid_automodified_msg, { authid: nameResult.normalized }),\r\n );\r\n }\r\n\r\n if (!opts.yes) {\r\n const ok = await p.confirm({\r\n message: `创建合集项目并导入 ${scan.mediaFiles} 个文件为子资源?`,\r\n initialValue: true,\r\n });\r\n if (p.isCancel(ok) || !ok) throw cliError(I18N_KEYS.cancelled, { code: 4 });\r\n }\r\n\r\n const { projectDir } = await runInitScaffold({\r\n dir: projectDirName,\r\n cwd: opts.cwd,\r\n scaffold: 'collection',\r\n resourceTypeCode: collectionPick.code,\r\n resourceTypeName: collectionPick.name,\r\n resourceTypeLabels: collectionPick.resourceTypeLabels,\r\n resourceName: nameResult.normalized,\r\n title: String(identity.title).trim(),\r\n overwrite: Boolean(opts.yes),\r\n });\r\n\r\n await createCollection({ cwd: projectDir });\r\n\r\n const importResult = await itemImportDir({\r\n cwd: projectDir,\r\n dir: absMedia,\r\n resourceTypeCode: itemPick.code,\r\n resourceTypeName: itemPick.name,\r\n yes: true,\r\n });\r\n\r\n consola.info('下一步:');\r\n consola.info(' cd ' + projectDir);\r\n consola.info(' freelog-cli collection version set --description \"首版\" --env dev');\r\n consola.info(' freelog-cli collection publish --yes --env dev');\r\n consola.info(' freelog-cli collection policy apply --from-file ./policy.free.json --yes --env dev');\r\n consola.info(' freelog-cli online --yes --env dev');\r\n consola.info('注意: 子资源需有版本+启用策略;import-dir 会尝试 policy/online');\r\n\r\n return {\r\n projectDir,\r\n mediaDir: absMedia,\r\n collectionResourceTypeCode: collectionPick.code,\r\n itemResourceTypeCode: itemPick.code,\r\n importedCount: importResult.created.length,\r\n };\r\n}\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../../core/command.js';\r\nimport { cliWriteCommandArgs } from '../../core/cliArgs.js';\r\nimport { resolveCwd } from '../../config/project.js';\r\nimport { runCollectionFolderWizard } from '../../services/collectionFolderWizard.js';\r\n\r\nexport const initFromFolderCmd = defineCommand({\r\n meta: {\r\n name: 'init-from-folder',\r\n description: '从媒体文件夹创建合集工程并导入条目(方案 A:不经过 init 五选一)',\r\n },\r\n args: {\r\n 'project-dir': {\r\n type: 'string',\r\n description: '合集项目目录名(默认交互输入)',\r\n },\r\n 'media-dir': {\r\n type: 'string',\r\n description: '媒体文件夹路径(顶层每个文件 → 一个子资源 + 一个目录项)',\r\n },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args as { test?: boolean; env?: string; debug?: boolean });\r\n const cwd = resolveCwd(typeof args.cwd === 'string' ? args.cwd : undefined);\r\n const coll = await runCollectionFolderWizard({\r\n cwd,\r\n projectDir:\r\n typeof args['project-dir'] === 'string' ? args['project-dir'] : undefined,\r\n mediaDir: typeof args['media-dir'] === 'string' ? args['media-dir'] : undefined,\r\n yes: Boolean(args.yes),\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('collection init-from-folder', { mode: 'collection_init_from_folder', ...coll });\r\n } else {\r\n consola.success(\r\n `合集 ${coll.projectDir} 已创建并导入 ${coll.importedCount} 个子资源`,\r\n );\r\n consola.info('下一步:');\r\n consola.info(' freelog-cli collection version set --description \"首版\" --env dev');\r\n consola.info(' freelog-cli collection publish --yes --env dev');\r\n consola.info(\r\n ' freelog-cli collection policy apply --from-file ./policy.free.json --yes --env dev',\r\n );\r\n consola.info(' freelog-cli online --yes --env dev');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, Boolean(args.json));\r\n }\r\n },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { createCmd } from './create.js';\r\nimport { itemCommand } from './item.js';\r\nimport { updateCmd } from './update.js';\r\nimport { versionCommand } from './version.js';\r\nimport { policyCommand } from './policy.js';\r\nimport { propertiesCommand } from './properties.js';\r\nimport { publishCmd } from './publish.js';\r\nimport { collectRulesCommand } from './collect-rules.js';\r\nimport { rssCommand } from './rss.js';\r\nimport { logsCmd } from './logs.js';\r\nimport { initFromFolderCmd } from './init-from-folder.js';\r\n\r\nexport const collectionCommand = defineCommand({\r\n meta: { name: 'collection', description: '合集创建与目录管理' },\r\n subCommands: {\r\n create: createCmd,\r\n 'init-from-folder': initFromFolderCmd,\r\n item: itemCommand,\r\n update: updateCmd,\r\n version: versionCommand,\r\n policy: policyCommand,\r\n properties: propertiesCommand,\r\n publish: publishCmd,\r\n 'collect-rules': collectRulesCommand,\r\n rss: rssCommand,\r\n logs: logsCmd,\r\n },\r\n});\r\n","/** 顶层子命令与常用全局 flag(shell 补全真源) */\r\nexport const CLI_TOP_COMMANDS = [\r\n 'login',\r\n 'logout',\r\n 'status',\r\n 'validate',\r\n 'doctor',\r\n 'diff',\r\n 'release',\r\n 'type',\r\n 'template',\r\n 'init',\r\n 'bind',\r\n 'create',\r\n 'resource',\r\n 'publish',\r\n 'draft',\r\n 'dep',\r\n 'version',\r\n 'policy',\r\n 'online',\r\n 'offline',\r\n 'update',\r\n 'pull',\r\n 'collection',\r\n 'lang',\r\n 'completion',\r\n 'config',\r\n 'workspace',\r\n] as const;\r\n\r\nexport const CLI_GLOBAL_FLAGS = [\r\n '--env',\r\n '--test',\r\n '--json',\r\n '--yes',\r\n '-y',\r\n '--help',\r\n '-h',\r\n '--debug',\r\n '--lang',\r\n '--cwd',\r\n '--no-auto-pull',\r\n] as const;\r\n\r\nexport const CLI_ENV_VALUES = ['dev', 'test'] as const;\n\r\nexport const CLI_TYPE_SUBCOMMANDS = ['list', 'search', 'info', 'pick'] as const;\r\nexport const CLI_DRAFT_SUBCOMMANDS = ['push', 'pull', 'discard'] as const;\r\nexport const CLI_INIT_PRESETS = ['theme', 'widget', 'package'] as const;\r\nexport const CLI_COLLECTION_ITEM_SUBCOMMANDS = [\r\n 'add',\r\n 'import-dir',\r\n 'remove',\r\n 'update',\r\n 'reorder',\r\n] as const;\r\nexport const CLI_COLLECTION_RSS_SUBCOMMANDS = [\r\n 'inspect',\r\n 'status',\r\n 'send-code',\r\n 'bind',\r\n 'sync',\r\n] as const;\r\n\r\nexport function generateBashCompletion(): string {\r\n const cmds = CLI_TOP_COMMANDS.join(' ');\r\n const flags = CLI_GLOBAL_FLAGS.join(' ');\r\n const envs = CLI_ENV_VALUES.join(' ');\r\n const typeSubs = CLI_TYPE_SUBCOMMANDS.join(' ');\r\n const draftSubs = CLI_DRAFT_SUBCOMMANDS.join(' ');\r\n const initPresets = CLI_INIT_PRESETS.join(' ');\r\n const itemSubs = CLI_COLLECTION_ITEM_SUBCOMMANDS.join(' ');\r\n const rssSubs = CLI_COLLECTION_RSS_SUBCOMMANDS.join(' ');\r\n return `# freelog-cli bash completion\r\n# Usage: eval \"$(freelog-cli completion bash)\"\r\n\r\n_freelog_cli() {\r\n local cur prev cword\r\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\r\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\r\n cword=$COMP_CWORD\r\n\r\n if [[ \"$cur\" == -* ]]; then\r\n COMPREPLY=( $(compgen -W \"${flags} --resource-type --bump --build-cmd --for --dry-run --json-lines\" -- \"$cur\") )\r\n return 0\r\n fi\r\n\r\n if [[ $cword -eq 1 ]]; then\r\n COMPREPLY=( $(compgen -W \"${cmds}\" -- \"$cur\") )\r\n return 0\r\n fi\r\n\r\n case \"\\${COMP_WORDS[1]}\" in\r\n resource)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"import-dir search\" -- \"$cur\") )\r\n fi\r\n ;;\r\n version)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"set bump edit show\" -- \"$cur\") )\r\n fi\r\n ;;\r\n collection)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"create update publish item policy rss collect-rules logs init-from-folder version properties\" -- \"$cur\") )\r\n elif [[ $cword -eq 3 && \"\\${COMP_WORDS[2]}\" == \"item\" ]]; then\r\n COMPREPLY=( $(compgen -W \"${itemSubs}\" -- \"$cur\") )\r\n elif [[ $cword -eq 3 && \"\\${COMP_WORDS[2]}\" == \"rss\" ]]; then\r\n COMPREPLY=( $(compgen -W \"${rssSubs}\" -- \"$cur\") )\r\n fi\r\n ;;\r\n type)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"${typeSubs}\" -- \"$cur\") )\r\n fi\r\n ;;\r\n draft)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"${draftSubs}\" -- \"$cur\") )\r\n fi\r\n ;;\r\n init)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"${initPresets}\" -- \"$cur\") )\r\n fi\r\n ;;\r\n config)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"show set init\" -- \"$cur\") )\r\n fi\r\n ;;\r\n workspace)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"list\" -- \"$cur\") )\r\n fi\r\n ;;\r\n policy)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"init apply list set\" -- \"$cur\") )\r\n fi\r\n ;;\r\n dep)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"add remove list update auth init-auth-map\" -- \"$cur\") )\r\n fi\r\n ;;\r\n completion)\r\n if [[ $cword -eq 2 ]]; then\r\n COMPREPLY=( $(compgen -W \"bash zsh\" -- \"$cur\") )\r\n fi\r\n ;;\r\n login|publish|create|bind|release|validate|doctor|diff|online|offline|update|pull|status)\r\n COMPREPLY=( $(compgen -W \"${flags}\" -- \"$cur\") )\r\n ;;\r\n esac\r\n\r\n if [[ \"$prev\" == \"--env\" ]]; then\r\n COMPREPLY=( $(compgen -W \"${envs}\" -- \"$cur\") )\r\n fi\r\n}\r\n\r\ncomplete -F _freelog_cli freelog-cli\r\n`;\r\n}\r\n\r\nexport function generateZshCompletion(): string {\r\n const cmdList = CLI_TOP_COMMANDS.map((c) => `'${c}'`).join(' ');\r\n const typeList = CLI_TYPE_SUBCOMMANDS.map((c) => `'${c}'`).join(' ');\r\n const draftList = CLI_DRAFT_SUBCOMMANDS.map((c) => `'${c}'`).join(' ');\r\n const initList = CLI_INIT_PRESETS.map((c) => `'${c}'`).join(' ');\r\n const itemList = CLI_COLLECTION_ITEM_SUBCOMMANDS.map((c) => `'${c}'`).join(' ');\r\n const rssList = CLI_COLLECTION_RSS_SUBCOMMANDS.map((c) => `'${c}'`).join(' ');\r\n return `# freelog-cli zsh completion\r\n# Usage: eval \"$(freelog-cli completion zsh)\"\r\n\r\n#compdef freelog-cli\r\n\r\n_freelog_cli() {\r\n local -a commands global_flags env_values\r\n commands=(${cmdList})\r\n global_flags=(--env --test --json --yes -y --help -h --debug --lang --cwd --no-auto-pull)\r\n env_values=(dev test)\n\r\n if (( CURRENT == 2 )); then\r\n _describe 'command' commands\r\n return\r\n fi\r\n\r\n case $words[2] in\r\n resource)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' 'import-dir' 'search'\r\n fi\r\n ;;\r\n version)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' 'set' 'bump' 'edit' 'show'\r\n fi\r\n ;;\r\n collection)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' 'create' 'update' 'publish' 'item' 'policy' 'rss' 'collect-rules' 'logs' 'init-from-folder' 'version' 'properties'\r\n elif (( CURRENT == 4 )); then\r\n case $words[3] in\r\n item) _values 'subcommand' ${itemList} ;;\r\n rss) _values 'subcommand' ${rssList} ;;\r\n esac\r\n fi\r\n ;;\r\n type)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' ${typeList}\r\n fi\r\n ;;\r\n draft)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' ${draftList}\r\n fi\r\n ;;\r\n init)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' ${initList}\r\n fi\r\n ;;\r\n config)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' 'show' 'set' 'init'\r\n fi\r\n ;;\r\n workspace)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' 'list'\r\n fi\r\n ;;\r\n policy)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' 'init' 'apply' 'list' 'set'\r\n fi\r\n ;;\r\n dep)\r\n if (( CURRENT == 3 )); then\r\n _values 'subcommand' 'add' 'remove' 'list' 'update' 'auth' 'init-auth-map'\r\n fi\r\n ;;\r\n completion)\r\n if (( CURRENT == 3 )); then\r\n _values 'shell' 'bash' 'zsh'\r\n fi\r\n ;;\r\n esac\r\n\r\n if [[ $words[CURRENT-1] == --env ]]; then\r\n _describe 'env' env_values\r\n return\r\n fi\r\n\r\n _describe 'flag' global_flags\r\n}\r\n\r\ncompdef _freelog_cli freelog-cli\r\n`;\r\n}\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport { applyCommandFlags, handleCommandError } from '../core/command.js';\r\nimport { cliReadCommandArgs } from '../core/cliArgs.js';\r\nimport { generateBashCompletion, generateZshCompletion } from '../core/cliCatalog.js';\r\n\r\nconst bashCmd = defineCommand({\r\n meta: { name: 'bash', description: '输出 bash completion 脚本' },\r\n args: {},\r\n run() {\r\n process.stdout.write(generateBashCompletion());\r\n },\r\n});\r\n\r\nconst zshCmd = defineCommand({\r\n meta: { name: 'zsh', description: '输出 zsh completion 脚本' },\r\n args: {},\r\n run() {\r\n process.stdout.write(generateZshCompletion());\r\n },\r\n});\r\n\r\nexport const completionCommand = defineCommand({\r\n meta: { name: 'completion', description: 'Shell 补全(eval \"$(freelog-cli completion bash)\")' },\r\n subCommands: {\r\n bash: bashCmd,\r\n zsh: zshCmd,\r\n },\r\n args: cliReadCommandArgs,\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n consola.info('请指定 shell:freelog-cli completion bash | zsh');\r\n process.exitCode = 4;\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { cliEnvArgs, cliOutputArgs, cliReadCommandArgs } from '../core/cliArgs.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { assertCliEnvEnabled, getCliEnv, normalizeCliEnvForWriteGuard } from '../core/env.js';\nimport {\r\n DEFAULT_PROJECT_CONFIG_COMMENT,\r\n findProjectConfig,\r\n projectConfigPath,\r\n writeProjectConfig,\r\n} from '../core/projectConfig.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { DEFAULT_FREELOGIGNORE } from '../services/freelogIgnore.js';\r\n\r\nconst configShow = defineCommand({\r\n meta: { name: 'show', description: '显示项目 .freelog/config.json 与当前生效环境' },\r\n args: cliReadCommandArgs,\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n const found = findProjectConfig(cwd);\r\n const payload = {\r\n configPath: found?.path ?? null,\r\n config: found?.config ?? null,\r\n effectiveEnv: getCliEnv(),\r\n };\r\n if (args.json) {\r\n writeJsonSuccess('config', payload);\r\n return;\r\n }\r\n if (found) {\r\n consola.info(`配置文件: ${found.path}`);\r\n consola.info(`defaultEnv: ${found.config.defaultEnv ?? '(未设置)'}`);\r\n } else {\r\n consola.warn('未找到 .freelog/config.json');\r\n }\r\n consola.info(`当前生效环境: ${payload.effectiveEnv}`);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst configSet = defineCommand({\r\n meta: { name: 'set', description: '写入 .freelog/config.json 字段' },\r\n args: {\r\n 'default-env': { type: 'string', description: 'defaultEnv:dev|test(production/prod 暂未开放)' },\n cwd: cliReadCommandArgs.cwd,\r\n test: cliEnvArgs.test,\r\n json: cliOutputArgs.json,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n if (!args['default-env']) {\r\n throw cliError(I18N_KEYS.default_env_required, { code: 4 });\r\n }\r\n const defaultEnv = normalizeCliEnvForWriteGuard(args['default-env']);\r\n if (!defaultEnv) {\n throw cliError(I18N_KEYS.default_env_invalid, { code: 4 });\n }\n assertCliEnvEnabled(defaultEnv);\n const file = writeProjectConfig(cwd, { defaultEnv });\r\n if (args.json) {\r\n writeJsonSuccess('config', { path: file, defaultEnv });\r\n } else {\r\n consola.success(`已写入 ${file}(defaultEnv=${defaultEnv})`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst configInit = defineCommand({\r\n meta: { name: 'init', description: '初始化 .freelog/config.json 与 .freelogignore 模板' },\r\n args: {\r\n 'default-env': { type: 'string', description: 'defaultEnv,默认 dev' },\r\n force: { type: 'boolean', description: '覆盖已有文件' },\r\n ...cliReadCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n const defaultEnv =\n normalizeCliEnvForWriteGuard(args['default-env']) ||\n DEFAULT_PROJECT_CONFIG_COMMENT.defaultEnv;\n assertCliEnvEnabled(defaultEnv);\n const created: string[] = [];\r\n\r\n const configFile = projectConfigPath(cwd);\r\n if (!fs.existsSync(configFile) || args.force) {\r\n writeProjectConfig(cwd, { defaultEnv });\r\n created.push(configFile);\r\n }\r\n\r\n const ignoreFile = path.join(cwd, '.freelogignore');\r\n if (!fs.existsSync(ignoreFile) || args.force) {\r\n fs.writeFileSync(ignoreFile, DEFAULT_FREELOGIGNORE, 'utf8');\r\n created.push(ignoreFile);\r\n }\r\n\r\n if (args.json) {\r\n writeJsonSuccess('config', { created, defaultEnv, skipped: created.length === 0 });\r\n } else if (created.length === 0) {\r\n consola.info('配置文件已存在(加 --force 覆盖)');\r\n } else {\r\n consola.success(`已创建: ${created.join(', ')}`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const configCommand = defineCommand({\r\n meta: { name: 'config', description: '项目级配置(默认 env、ignore 模板)' },\r\n subCommands: {\r\n show: configShow,\r\n set: configSet,\r\n init: configInit,\r\n },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport path from 'node:path';\r\nimport { applyCommandFlags, handleCommandError, writeJsonSuccess } from '../core/command.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { prepareLocalFileForPlatform } from '../services/storageUpload.js';\r\nimport { compareCoverSyncAndSse } from '../services/coverGenerateService.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\nconst compareCommand = defineCommand({\r\n meta: {\r\n name: 'compare',\r\n description: '对比 generateCoverImage 同步 API 与 generateCoverImageSSE 同 sha1 封面 URL',\r\n },\r\n args: {\r\n file: { type: 'string', description: '本地图片(会上传若尚未存在)' },\r\n sha1: { type: 'string', description: '已有 sha1(与 --file 二选一)' },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n\r\n let sha1 = args.sha1?.trim();\r\n if (!sha1) {\r\n if (!args.file?.trim()) {\r\n throw cliError(I18N_KEYS.missing_file_or_sha1, { code: 4 });\r\n }\r\n const filePath = path.resolve(resolveCwd(args.cwd), args.file);\r\n sha1 = await prepareLocalFileForPlatform(filePath);\r\n }\r\n\r\n const result = await compareCoverSyncAndSse(sha1);\r\n\r\n if (args.json) {\r\n writeJsonSuccess('cover compare', { sha1, ...result }, { ok: result.ok });\r\n } else if (result.ok) {\r\n consola.success(`同步/SSE 封面 URL 一致(sha1=${sha1.slice(0, 12)}…)`);\r\n } else {\r\n consola.error(result.error || '封面 URL 不一致', result);\r\n process.exitCode = 1;\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const coverCommand = defineCommand({\r\n meta: { name: 'cover', description: '封面生成 parity 工具(dev/验证用)' },\r\n subCommands: {\r\n compare: compareCommand,\r\n },\r\n});\r\n","import path from 'node:path';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { createProjectStore, projectStoreFromCwd } from './projectStore.js';\nimport type { ProjectStore, ProjectStoreFactoryOpts } from './types.js';\n\nexport interface CommandStoreArgs {\n cwd?: string;\n session?: boolean;\n 'resource-id'?: string;\n seed?: ProjectStoreFactoryOpts['seed'];\n}\n\nexport function resolveCommandProjectStore(args: CommandStoreArgs): ProjectStore {\n if (args.session) {\n return createProjectStore({\n cwd: args.cwd,\n session: true,\n resourceId: args['resource-id'],\n seed: args.seed,\n });\n }\n return projectStoreFromCwd(args.cwd);\n}\n\nexport function assertSessionMode(args: { session?: boolean }, hint?: string): void {\n if (!args.session) {\n throw cliError(I18N_KEYS.session_flag_required, {\n code: 4,\n hint: hint ?? '维护/发版请使用 --session,工程目录请用顶层 publish/update',\n });\n }\n}\n\nexport function assertSessionResourceId(resourceId?: string): void {\n if (!resourceId?.trim()) {\n throw cliError(I18N_KEYS.session_resource_id_required, { code: 4 });\n }\n}\n\n/** 会话维护类命令 Store(policy/online 等 §20.6)。 */\nexport function resolveSessionMaintenanceStore(\n args: CommandStoreArgs & { session?: boolean },\n): ProjectStore {\n if (!args.session) {\n return projectStoreFromCwd(args.cwd);\n }\n assertSessionMode(args);\n assertSessionResourceId(args['resource-id']);\n return resolveCommandProjectStore({\n cwd: args.cwd,\n session: true,\n 'resource-id': args['resource-id'],\n });\n}\n\n/** 会话命令成功收尾:可选 --export-project 落盘 + JSON 字段(§7.4 / §9)。 */\nexport function finalizeSessionCommand(opts: {\n store: ProjectStore;\n exportProject?: string;\n result: Record<string, unknown>;\n}): Record<string, unknown> {\n if (opts.store.mode() !== 'session') return opts.result;\n\n let exportPath: string | null = null;\n let persisted = false;\n if (opts.exportProject?.trim()) {\n exportPath = opts.store.exportProject(path.resolve(opts.exportProject.trim()));\n persisted = true;\n }\n\n return {\n ...opts.result,\n mode: 'session',\n persisted,\n exportProject: exportPath,\n };\n}\n","import { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport type { ProjectStore } from './types.js';\n\n/** 会话 dep 改 Store 前须有「下一版」version 块(≅ Console versionCreator.versionInput)。 */\nexport function ensureSessionVersionIntent(store: ProjectStore, targetVersion?: string): void {\n if (store.mode() !== 'session') return;\n if (store.tryLoadVersion()?.version?.trim()) return;\n const version = targetVersion?.trim();\n if (!version) {\n throw cliError(I18N_KEYS.session_dep_target_version_required, {\n code: 4,\n hint: '传 --target-version <semver>;命令会话不会读取其他进程的 version 意图',\n });\n }\n store.saveVersion({ version, filePath: '' });\n}\n\n/** 仅修改本地意图的命令会话必须导出,否则命令退出后结果不可消费。 */\nexport function assertSessionDependencyIntentExport(\n store: ProjectStore,\n exportProject?: string,\n): void {\n if (store.mode() !== 'session' || exportProject?.trim()) return;\n throw cliError(I18N_KEYS.session_dep_export_project_required, {\n code: 4,\n hint: '添加 --export-project <dir> 后进入导出工程 publish;或使用 freelog-cli session 完成内存多步操作',\n });\n}\n","import * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport { cliError } from '../i18n/cliError.js';\nimport { I18N_KEYS } from '../i18n/bundled.js';\nimport { t } from '../i18n/index.js';\nimport { pickResourceTypeInteractive } from './init/picker.js';\nimport {\n clackTextField,\n normalizePromptCreateName,\n} from './shared/fieldConstraints.js';\nimport { validateCreateNameInput } from './resourceName.js';\n\nexport interface CreateWizardResult {\n title: string;\n typeCode: string;\n name: string;\n resourceTypeName?: string;\n}\n\nexport interface CreateCommandInput {\n title?: string;\n typeCode?: string;\n name?: string;\n resourceTypeName?: string;\n}\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n return value?.trim() || undefined;\n}\n\n/** 工程 create:命令行只覆盖 manifest,不能把 manifest 中已有字段当作缺失。 */\nexport function resolveCreateCommandInput(\n explicit: CreateCommandInput,\n local: {\n resourceTitle?: string;\n resourceTypeCode?: string;\n resourceName?: string;\n resourceTypeName?: string;\n },\n): CreateCommandInput {\n return {\n title:\n nonEmpty(explicit.title) || nonEmpty(local.resourceTitle) || nonEmpty(local.resourceName),\n typeCode: nonEmpty(explicit.typeCode) || nonEmpty(local.resourceTypeCode),\n name: nonEmpty(explicit.name) || nonEmpty(local.resourceName),\n // local.resourceTypeName 是平台展示事实;只有显式 --type-name 才是 customInput。\n resourceTypeName: nonEmpty(explicit.resourceTypeName),\n };\n}\n\n/** TTY:补齐 create 缺失的 type / title / name(fieldConstraints 同源校验) */\nexport async function runCreateWizard(partial: {\n title?: string;\n typeCode?: string;\n name?: string;\n}): Promise<CreateWizardResult> {\n let typeCode = partial.typeCode?.trim();\n if (!typeCode) {\n const picked = await pickResourceTypeInteractive();\n typeCode = picked.code;\n }\n\n let title = partial.title?.trim();\n if (!title) {\n const answer = await p.text(clackTextField('FORM-RES-TITLE'));\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n title = String(answer).trim();\n }\n\n let name = partial.name?.trim();\n if (!name) {\n const answer = await p.text(clackTextField('FORM-RES-NAME', { defaultValue: title }));\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n const nameResult = normalizePromptCreateName(String(answer));\n if (nameResult.wasModified) {\n consola.info(\n t(I18N_KEYS.input_resourceauthid_automodified_msg, { authid: nameResult.normalized }),\n );\n }\n name = nameResult.normalized;\n } else {\n const validated = validateCreateNameInput(name);\n if (validated.error) throw cliError(validated.error, { code: 4 });\n name = validated.normalized;\n }\n\n return { title, typeCode, name };\n}\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport { applyWriteCommandFlags, handleCommandError, writeJsonSuccess } from '../core/command.js';\nimport { resolveCwd } from '../config/project.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { createResource } from '../services/resourceService.js';\r\nimport { projectStoreFromCwd } from '../services/store/index.js';\r\nimport { shouldRunFieldWizard, helpSnippet } from '../services/shared/fieldConstraints.js';\r\nimport { resolveCreateCommandInput, runCreateWizard } from '../services/createWizard.js';\nimport { isInteractive } from '../core/tty.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\nexport const createCommand = defineCommand({\r\n meta: { name: 'create', description: '创建平台资源壳并写回 owner' },\r\n args: {\r\n title: { type: 'string', description: `资源标题(${helpSnippet('FORM-RES-TITLE')})` },\r\n type: { type: 'string', description: 'resourceTypeCode(须为平台叶子类型)' },\r\n name: { type: 'string', description: `短授权标识(${helpSnippet('FORM-RES-NAME')})` },\r\n 'type-name': { type: 'string', description: '自定义类型名(可选)' },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n\r\n const cwd = resolveCwd(args.cwd);\n const store = projectStoreFromCwd(cwd);\n const resolved = resolveCreateCommandInput(\n {\n title: typeof args.title === 'string' ? args.title : undefined,\n typeCode: typeof args.type === 'string' ? args.type : undefined,\n name: typeof args.name === 'string' ? args.name : undefined,\n resourceTypeName:\n typeof args['type-name'] === 'string' ? args['type-name'] : undefined,\n },\n store.loadResource(),\n );\n let { title, typeCode, name, resourceTypeName } = resolved;\n\r\n if (\r\n shouldRunFieldWizard({\r\n yes: args.yes,\r\n json: args.json,\r\n hasBusinessFlags: Boolean(title && typeCode && name),\r\n })\r\n ) {\r\n const wizard = await runCreateWizard({ title, typeCode, name });\r\n title = wizard.title;\r\n typeCode = wizard.typeCode;\r\n name = wizard.name;\r\n resourceTypeName = resourceTypeName || wizard.resourceTypeName;\r\n } else if (!title || !typeCode || !name) {\n if (!isInteractive(args.yes)) {\n const fields = [!title && 'title', !typeCode && 'type', !name && 'name'].filter(Boolean);\n throw cliError(I18N_KEYS.create_fields_required, {\n code: 4,\n params: { fields: fields.join(', ') },\n hint: '在 freelog.manifest.json 补齐字段,或传对应 create 覆盖参数',\n });\n }\n }\n\r\n const data = await createResource({\r\n store,\r\n title,\r\n typeCode,\r\n name,\r\n resourceTypeName,\r\n });\r\n\r\n if (args.json) {\r\n writeJsonSuccess('create', { resource: data });\r\n } else {\r\n consola.success(`已创建资源 ${data.resourceId}(${data.resourceName})`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import { FServiceAPI, unwrapData } from '../platform/index.js';\n\ntype BatchInfoResourceRow = {\n resourceId?: string;\n latestVersion?: string | null;\n};\n\nfunction parseBatchInfoRows(\n batchData: BatchInfoResourceRow[] | { dataList?: BatchInfoResourceRow[] } | null | undefined,\n): BatchInfoResourceRow[] {\n if (Array.isArray(batchData)) return batchData;\n if (Array.isArray(batchData?.dataList)) return batchData.dataList;\n return [];\n}\n\n/** 解析 dep add 默认 versionRange:显式传入优先;否则 ^latestVersion;无 latest 回退 *。 */\nexport async function resolveDefaultDepVersionRange(opts: {\n resourceId: string;\n versionRange?: string;\n}): Promise<string> {\n if (opts.versionRange?.trim()) return opts.versionRange.trim();\n\n try {\n const batchEnvelope = await FServiceAPI.Resource.batchInfo({\n resourceIds: opts.resourceId.trim(),\n isLoadLatestVersionInfo: 1,\n } as Parameters<typeof FServiceAPI.Resource.batchInfo>[0]);\n const batchData = unwrapData<\n BatchInfoResourceRow[] | { dataList?: BatchInfoResourceRow[] }\n >(batchEnvelope);\n const rows = parseBatchInfoRows(batchData);\n const latestVersion = rows\n .map((row) => row.latestVersion?.trim())\n .find((version) => Boolean(version));\n if (latestVersion) return `^${latestVersion}`;\n } catch {\n // batchInfo 失败不阻断 dep add\n }\n\n return '*';\n}\n","import type { VersionDependency } from '../config/project.js';\r\nimport { FServiceAPI, unwrapData } from '../platform/index.js';\r\nimport { ensureSynced } from './sync/index.js';\r\nimport { requireVersionProject } from './store/requireVersion.js';\r\nimport type { ProjectStore } from './store/types.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { assertValidVersionRange } from './validation.js';\r\nimport { resolveDefaultDepVersionRange } from './depVersionRange.js';\r\n\r\n/** 修改本地下一版依赖意图;平台草稿同步由 draft 命令显式执行。 */\r\nexport async function depAdd(opts: {\r\n store: ProjectStore;\r\n resourceId: string;\r\n versionRange?: string;\r\n resourceName?: string;\r\n noAutoPull?: boolean;\r\n}) {\r\n if (!opts.resourceId?.trim()) {\r\n throw cliError(I18N_KEYS.missing_dep_resource_id, { code: 4 });\r\n }\r\n const versionRange = await resolveDefaultDepVersionRange({\r\n resourceId: opts.resourceId,\r\n versionRange: opts.versionRange,\r\n });\r\n assertValidVersionRange(versionRange);\r\n const store = opts.store;\r\n await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const data = requireVersionProject(store);\r\n const deps = [...(data.dependencies || [])];\r\n const idx = deps.findIndex((d) => d.resourceId === opts.resourceId);\r\n const item: VersionDependency = {\r\n resourceId: opts.resourceId.trim(),\r\n versionRange,\r\n resourceName: opts.resourceName,\r\n };\r\n if (idx >= 0) deps[idx] = { ...deps[idx], ...item };\r\n else deps.push(item);\r\n store.saveVersion({ ...data, dependencies: deps });\r\n return deps;\r\n}\r\n\r\nexport async function depRemove(opts: {\r\n store: ProjectStore;\r\n resourceId: string;\r\n noAutoPull?: boolean;\r\n}) {\r\n const store = opts.store;\r\n await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const data = requireVersionProject(store);\r\n const before = data.dependencies || [];\r\n const deps = before.filter((d) => d.resourceId !== opts.resourceId);\r\n if (deps.length === before.length) {\r\n throw cliError(I18N_KEYS.dep_not_found, {\r\n code: 4,\r\n params: { resourceId: opts.resourceId },\r\n });\r\n }\r\n store.saveVersion({ ...data, dependencies: deps });\r\n return deps;\r\n}\r\n\r\nexport async function depUpdate(opts: {\r\n store: ProjectStore;\r\n resourceId: string;\r\n versionRange: string;\r\n noAutoPull?: boolean;\r\n}) {\r\n if (!opts.versionRange?.trim()) {\r\n throw cliError(I18N_KEYS.missing_version_range, { code: 4 });\r\n }\r\n assertValidVersionRange(opts.versionRange);\r\n const store = opts.store;\r\n await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const data = requireVersionProject(store);\r\n const deps = [...(data.dependencies || [])];\r\n const idx = deps.findIndex((d) => d.resourceId === opts.resourceId);\r\n if (idx < 0) {\r\n throw cliError(I18N_KEYS.dep_not_found, {\r\n code: 4,\r\n params: { resourceId: opts.resourceId },\r\n });\r\n }\r\n deps[idx] = { ...deps[idx], versionRange: opts.versionRange };\r\n store.saveVersion({ ...data, dependencies: deps });\r\n return deps;\r\n}\r\n\r\nexport async function depList(opts: {\r\n store: ProjectStore;\r\n noAutoPull?: boolean;\r\n tree?: boolean;\r\n}) {\r\n const store = opts.store;\r\n const ctx = await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const data = requireVersionProject(store);\r\n const local = data.dependencies || [];\r\n\r\n if (!opts.tree) return { local, tree: null as unknown };\r\n\r\n const resourceId = ctx.resource.resourceId!;\r\n const version = data.version || ctx.info.latestVersion;\r\n try {\r\n const envelope = await FServiceAPI.Resource.dependencyTree({\r\n resourceId,\r\n version,\r\n isContainRootNode: true,\r\n } as Parameters<typeof FServiceAPI.Resource.dependencyTree>[0]);\r\n const tree = unwrapData(envelope);\r\n return { local, tree };\r\n } catch (error) {\r\n throw cliError(I18N_KEYS.dep_tree_unreadable, {\r\n code: 1,\r\n details: { cause: error instanceof Error ? error.message : String(error) },\r\n hint: '请确认资源已绑定且版本已发布,然后重试',\r\n });\r\n }\r\n}\r\n","export const POLICY_TEMPLATE_RESOURCE = 'for public\\r\\n\\r\\ninitial[active]:\\r\\nterminate\\r\\n';\r\n\r\nexport const POLICY_TEMPLATE_COLLECTION = '\\nFOR PUBLIC\\n\\nInitial:\\n\\tterminate\\n';\r\n\r\nexport const POLICY_FREE_JSON_RESOURCE = {\r\n policyName: '免费',\r\n policyText: POLICY_TEMPLATE_RESOURCE,\r\n status: 1 as const,\r\n};\r\n\r\nexport const POLICY_FREE_JSON_COLLECTION = {\r\n policyName: '免费',\r\n policyText: POLICY_TEMPLATE_COLLECTION.trim(),\r\n status: 1 as const,\r\n};\r\n\r\nexport const AUTH_MAP_TEMPLATE_YAML = `# auth-map.yaml — 依赖免费策略签约(不含支付)\r\n# 用法: freelog-cli dep auth --policy-map auth-map.yaml --yes\r\ncontracts:\r\n - resourceId: \"<dependency-resource-id>\"\r\n policyIds:\r\n - \"<policy-id>\"\r\n`;\r\n\r\nexport function policyTemplateText(collection: boolean): string {\r\n return collection ? POLICY_TEMPLATE_COLLECTION : POLICY_TEMPLATE_RESOURCE;\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { resolveCwd, tryLoadCollectionProject } from '../config/project.js';\r\nimport {\r\n AUTH_MAP_TEMPLATE_YAML,\r\n POLICY_FREE_JSON_COLLECTION,\r\n POLICY_FREE_JSON_RESOURCE,\r\n} from '../services/scaffoldTemplates.js';\r\n\r\nexport function resolvePolicyInitTarget(cwd: string, collection?: boolean): {\r\n outfile: string;\r\n payload: typeof POLICY_FREE_JSON_RESOURCE;\r\n} {\r\n const isCollection = collection ?? Boolean(tryLoadCollectionProject(cwd));\r\n const outfile = path.join(cwd, 'policy.free.json');\r\n const payload = isCollection ? POLICY_FREE_JSON_COLLECTION : POLICY_FREE_JSON_RESOURCE;\r\n return { outfile, payload };\r\n}\r\n\r\nexport function writePolicyInitFile(\r\n cwd: string,\r\n opts?: { collection?: boolean; force?: boolean },\r\n): { path: string; skipped: boolean } {\r\n const { outfile, payload } = resolvePolicyInitTarget(cwd, opts?.collection);\r\n if (fs.existsSync(outfile) && !opts?.force) {\r\n return { path: outfile, skipped: true };\r\n }\r\n fs.writeFileSync(outfile, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8');\r\n return { path: outfile, skipped: false };\r\n}\r\n\r\nexport function writeAuthMapInitFile(\r\n cwd: string,\r\n opts?: { force?: boolean; filename?: string },\r\n): { path: string; skipped: boolean } {\r\n const outfile = path.join(cwd, opts?.filename || 'auth-map.yaml');\r\n if (fs.existsSync(outfile) && !opts?.force) {\r\n return { path: outfile, skipped: true };\r\n }\r\n fs.writeFileSync(outfile, AUTH_MAP_TEMPLATE_YAML, 'utf8');\r\n return { path: outfile, skipped: false };\r\n}\r\n\r\nconst policyInit = defineCommand({\r\n meta: { name: 'init', description: '生成 policy.free.json(FOR PUBLIC 免费策略模板)' },\r\n args: {\r\n collection: { type: 'boolean', description: '合集语法模板(默认按 manifest subject 推断)' },\r\n force: { type: 'boolean', description: '覆盖已有文件' },\r\n cwd: { type: 'string' },\r\n test: { type: 'boolean' },\r\n env: { type: 'string' },\r\n json: { type: 'boolean' },\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n const { path: outfile, skipped } = writePolicyInitFile(cwd, {\r\n collection: args.collection,\r\n force: args.force,\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('scaffold', { path: outfile, skipped });\r\n } else if (skipped) {\r\n consola.info(`${outfile} 已存在(加 --force 覆盖)`);\r\n } else {\r\n consola.success(`已创建 ${outfile}`);\r\n consola.info('下一步: freelog-cli policy apply --from-file policy.free.json --yes --env dev');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport { policyInit };\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { depAdd, depList, depRemove, depUpdate } from '../services/depService.js';\r\nimport { depAuthFromMap } from '../services/depAuthService.js';\r\nimport { writeAuthMapInitFile } from '../services/scaffoldInit.js';\r\nimport { cliReadCommandArgs, cliSyncWriteArgs, cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport {\r\n assertSessionMode,\n assertSessionDependencyIntentExport,\n ensureSessionVersionIntent,\n finalizeSessionCommand,\r\n resolveCommandProjectStore,\r\n} from '../services/store/index.js';\r\n\r\nconst depSessionArgs = {\r\n 'target-version': {\r\n type: 'string' as const,\r\n description: '会话模式:下一版 semver 意图(Store 无 version 块时必填,≅ Console versionInput)',\r\n },\r\n};\r\n\r\nfunction stringArg(value: string | boolean | string[] | undefined): string | undefined {\r\n return typeof value === 'string' ? value : undefined;\r\n}\r\n\r\nfunction resolveDepStore(args: {\n cwd?: string;\r\n session?: boolean;\r\n 'resource-id'?: string;\r\n}) {\r\n if (args.session) {\r\n assertSessionMode(args);\r\n if (!args['resource-id']?.trim()) {\r\n throw cliError(I18N_KEYS.session_resource_id_required, { code: 4 });\r\n }\r\n return resolveCommandProjectStore({\r\n cwd: resolveCwd(args.cwd),\r\n session: true,\r\n 'resource-id': args['resource-id'],\r\n });\r\n }\r\n return resolveCommandProjectStore({ cwd: resolveCwd(args.cwd) });\r\n}\n\nconst addCommand = defineCommand({\r\n meta: { name: 'add', description: '添加本地依赖意图(随下版 publish / draft)' },\r\n args: {\r\n resourceId: { type: 'positional', required: true, description: '依赖 resourceId' },\r\n version: { type: 'string', alias: 'v', description: 'versionRange(semver 可解析:*、^1.0.0、>=1.0.0)' },\r\n 'version-range': { type: 'string', description: 'semver 范围(同 --version)' },\r\n name: { type: 'string', description: 'resourceName(可选)' },\r\n ...depSessionArgs,\r\n ...cliSyncWriteArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\n const store = resolveDepStore(args);\n assertSessionDependencyIntentExport(store, stringArg(args['export-project']));\n ensureSessionVersionIntent(store, stringArg(args['target-version']));\n const deps = await depAdd({\r\n store,\r\n resourceId: String(args.resourceId),\r\n versionRange: args['version-range'] || args.version,\r\n resourceName: args.name,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: stringArg(args['export-project']),\r\n result: { dependencies: deps },\r\n });\r\n if (args.json) writeJsonSuccess('dep add', payload);\r\n else consola.success(`已添加依赖 ${args.resourceId}(共 ${deps.length})`);\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'dep add');\r\n }\r\n },\r\n});\r\n\r\nconst removeCommand = defineCommand({\r\n meta: { name: 'remove', description: '移除本地依赖意图' },\r\n args: {\r\n resourceId: { type: 'positional', required: true, description: '依赖 resourceId' },\r\n ...depSessionArgs,\r\n ...cliSyncWriteArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\n const store = resolveDepStore(args);\n assertSessionDependencyIntentExport(store, stringArg(args['export-project']));\n ensureSessionVersionIntent(store, stringArg(args['target-version']));\n const deps = await depRemove({\r\n store,\r\n resourceId: String(args.resourceId),\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: stringArg(args['export-project']),\r\n result: { dependencies: deps },\r\n });\r\n if (args.json) writeJsonSuccess('dep remove', payload);\r\n else consola.success(`已移除依赖 ${args.resourceId}`);\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'dep remove');\r\n }\r\n },\r\n});\r\n\r\nconst updateCommand = defineCommand({\r\n meta: { name: 'update', description: '更新本地依赖 versionRange' },\r\n args: {\r\n resourceId: { type: 'positional', required: true, description: '依赖 resourceId' },\r\n version: { type: 'string', alias: 'v', description: '新的 versionRange(semver 可解析)' },\r\n 'version-range': { type: 'string', description: 'semver 范围(同 --version)' },\r\n ...depSessionArgs,\r\n ...cliSyncWriteArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const range = args['version-range'] || args.version;\r\n if (!range) throw cliError(I18N_KEYS.missing_version_range, { code: 4 });\n const store = resolveDepStore(args);\n assertSessionDependencyIntentExport(store, stringArg(args['export-project']));\n ensureSessionVersionIntent(store, stringArg(args['target-version']));\n const deps = await depUpdate({\r\n store,\r\n resourceId: String(args.resourceId),\r\n versionRange: range,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: stringArg(args['export-project']),\r\n result: { dependencies: deps },\r\n });\r\n if (args.json) writeJsonSuccess('dep update', payload);\r\n else consola.success(`已更新 ${args.resourceId} → ${range}`);\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'dep update');\r\n }\r\n },\r\n});\r\n\r\nconst listCommand = defineCommand({\r\n meta: { name: 'list', description: '列出本地依赖意图;--tree 读平台依赖树' },\r\n args: {\r\n tree: { type: 'boolean', description: '读取平台 dependencyTree' },\r\n ...depSessionArgs,\r\n ...cliSyncWriteArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const store = resolveDepStore(args);\r\n ensureSessionVersionIntent(store, stringArg(args['target-version']));\r\n const result = await depList({\r\n store,\r\n noAutoPull: args['no-auto-pull'],\r\n tree: args.tree,\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: stringArg(args['export-project']),\r\n result: { dependencies: result.local, tree: result.tree },\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('dep list', payload);\r\n } else if (args.tree) {\r\n consola.info('平台依赖树:');\r\n process.stdout.write(`${JSON.stringify(result.tree, null, 2)}\\n`);\r\n } else if (result.local.length === 0) {\r\n consola.info('无本地依赖');\r\n } else {\r\n for (const d of result.local) {\r\n consola.info(`${d.resourceId} ${d.versionRange || '*'} ${d.resourceName || ''}`);\r\n }\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'dep list');\r\n }\r\n },\r\n});\r\n\r\nconst authCommand = defineCommand({\r\n meta: { name: 'auth', description: '声明式补签依赖(--policy-map,不含支付)' },\r\n args: {\r\n 'policy-map': { type: 'string', description: 'auth-map.yaml|json 路径' },\r\n version: {\r\n type: 'string',\r\n description: '会话模式:读 resourceVersionInfo1 的已发版号(默认 latestVersion)',\r\n },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const store = resolveDepStore(args);\r\n if (!args['policy-map']) {\r\n throw cliError(I18N_KEYS.missing_policy_map, { code: 4 });\r\n }\r\n const result = await depAuthFromMap({\r\n store,\r\n policyMap: args['policy-map'],\r\n noAutoPull: args['no-auto-pull'],\r\n version: args.version,\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: args['export-project'],\r\n result: result as Record<string, unknown>,\r\n });\r\n if (args.json) writeJsonSuccess('dep auth', payload);\r\n else consola.success(`依赖签约完成(${result.succeeded.length} 条)`);\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'dep auth');\r\n }\r\n },\r\n});\r\n\r\nconst initAuthMapCommand = defineCommand({\r\n meta: { name: 'init-auth-map', description: '生成 auth-map.yaml 依赖签约模板' },\r\n args: {\r\n out: { type: 'string', description: '输出文件名,默认 auth-map.yaml' },\r\n force: { type: 'boolean', description: '覆盖已有文件' },\r\n ...cliReadCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n const { path: outfile, skipped } = writeAuthMapInitFile(cwd, {\r\n force: args.force,\r\n filename: args.out,\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('dep init-auth-map', { path: outfile, skipped });\r\n } else if (skipped) {\r\n consola.info(`${outfile} 已存在(加 --force 覆盖)`);\r\n } else {\r\n consola.success(`已创建 ${outfile}`);\r\n consola.info('编辑 resourceId / policyIds 后: freelog-cli dep auth --policy-map auth-map.yaml --yes');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'dep init-auth-map');\r\n }\r\n },\r\n});\r\n\r\nexport const depCommand = defineCommand({\r\n meta: { name: 'dep', description: '依赖 add|remove|list|update|auth|init-auth-map' },\r\n subCommands: {\r\n add: addCommand,\r\n remove: removeCommand,\r\n list: listCommand,\r\n update: updateCommand,\r\n auth: authCommand,\r\n 'init-auth-map': initAuthMapCommand,\r\n },\r\n});\r\n","import { getCurrentAuth } from '../core/auth.js';\r\nimport {\r\n findProjectPath,\r\n resolveCwd,\r\n tryLoadCollectionProject,\r\n tryLoadResourceProject,\r\n tryLoadVersionProject,\r\n} from '../config/project.js';\r\nimport { listingDrifted } from './shared/listing.js';\r\nimport { fetchResourceInfo } from './sync/fetch.js';\r\nimport { ownersMatch } from './sync/index.js';\r\nimport { buildProjectStatus } from './statusService.js';\r\nimport { evaluateOnlineGates } from './onlineGates.js';\r\n\r\nexport type DiffLevel = 'same' | 'drift' | 'unknown';\r\n\r\nexport interface DiffEntry {\r\n field: string;\r\n level: DiffLevel;\r\n local: unknown;\r\n platform: unknown;\r\n note?: string;\r\n}\r\n\r\nexport interface DiffResult {\r\n ok: boolean;\r\n subject: 'resource' | 'collection' | 'none';\r\n hasDrift: boolean;\r\n entries: DiffEntry[];\r\n}\r\n\r\nfunction entry(\r\n field: string,\r\n level: DiffLevel,\r\n local: unknown,\r\n platform: unknown,\r\n note?: string,\r\n): DiffEntry {\r\n return { field, level, local, platform, note };\r\n}\r\n\r\nfunction normJson(v: unknown): string {\r\n return JSON.stringify(v ?? null);\r\n}\r\n\r\nexport async function diffProject(opts: { cwd?: string }): Promise<DiffResult> {\r\n const cwd = resolveCwd(opts.cwd);\r\n const entries: DiffEntry[] = [];\r\n\r\n if (!findProjectPath(cwd)) {\r\n return {\r\n ok: false,\r\n subject: 'none',\r\n hasDrift: true,\r\n entries: [entry('manifest', 'drift', null, null, '未找到 freelog.manifest.json')],\r\n };\r\n }\r\n\r\n const collectionCfg = tryLoadCollectionProject(cwd);\r\n const resourceCfg = tryLoadResourceProject(cwd);\r\n const versionCfg = tryLoadVersionProject(cwd);\r\n const subject = collectionCfg ? 'collection' : 'resource';\r\n\r\n const auth = getCurrentAuth(cwd);\r\n if (!auth?.token) {\r\n entries.push(entry('auth', 'unknown', '未登录', null, 'login 后可对比平台'));\r\n return { ok: true, subject, hasDrift: false, entries };\r\n }\r\n\r\n const resourceId = resourceCfg?.data.resourceId || collectionCfg?.data.resourceId;\r\n if (!resourceId) {\r\n entries.push(entry('resourceId', 'unknown', null, null, '尚未 create/bind'));\r\n return { ok: true, subject, hasDrift: false, entries };\r\n }\r\n\r\n let info: Awaited<ReturnType<typeof fetchResourceInfo>> | null = null;\r\n try {\r\n info = await fetchResourceInfo(resourceId);\r\n } catch (error) {\r\n entries.push(\r\n entry(\r\n 'platform',\r\n 'unknown',\r\n null,\r\n null,\r\n error instanceof Error ? error.message : String(error),\r\n ),\r\n );\r\n return { ok: true, subject, hasDrift: false, entries };\r\n }\r\n\r\n const local = resourceCfg?.data || collectionCfg?.data;\r\n if (local && info) {\r\n if (auth.userId != null && info.userId != null && !ownersMatch(auth.userId, info.userId)) {\r\n entries.push(entry('owner', 'drift', auth.userId, info.userId, '登录用户非 owner'));\r\n } else {\r\n entries.push(entry('owner', 'same', auth.userId, info.userId));\r\n }\r\n\r\n const fields: Array<{ key: string; localVal: unknown; platformVal: unknown }> = [\r\n { key: 'resourceTitle', localVal: local.resourceTitle, platformVal: info.resourceTitle },\r\n { key: 'intro', localVal: local.intro, platformVal: info.intro },\r\n { key: 'tags', localVal: local.tags, platformVal: info.tags },\r\n { key: 'coverImages', localVal: local.coverImages, platformVal: info.coverImages },\r\n ];\r\n\r\n for (const f of fields) {\r\n const same =\r\n f.key === 'tags' || f.key === 'coverImages'\r\n ? normJson(f.localVal) === normJson(f.platformVal)\r\n : (f.localVal ?? null) === (f.platformVal ?? null);\r\n entries.push(entry(`listing.${f.key}`, same ? 'same' : 'drift', f.localVal, f.platformVal));\r\n }\r\n\r\n if (local && info && listingDrifted(local, info)) {\r\n entries.push(entry('listing', 'drift', 'local', 'platform', 'listing 字段与平台不一致'));\r\n }\r\n\r\n entries.push(\r\n entry(\r\n 'platform.latestVersion',\r\n 'same',\r\n versionCfg?.data.version ?? null,\r\n info.latestVersion ?? null,\r\n '左:本地版本意图;右:平台 latest',\r\n ),\r\n );\r\n\r\n if (versionCfg?.data.version && info.latestVersion) {\r\n entries.push(\r\n entry(\r\n 'version.intent',\r\n versionCfg.data.version === info.latestVersion ? 'same' : 'drift',\r\n versionCfg.data.version,\r\n info.latestVersion,\r\n ),\r\n );\r\n }\r\n\r\n entries.push(\r\n entry('platform.status', 'same', local.status ?? null, info.status ?? null),\r\n );\r\n\r\n const gates = evaluateOnlineGates(info);\r\n entries.push(\r\n entry(\r\n 'online.gates',\r\n gates.ok ? 'same' : 'drift',\r\n {\r\n enabledPolicies: gates.enabledPolicyCount,\r\n hasLatest: gates.hasLatestVersion,\r\n },\r\n { ok: gates.ok },\r\n ),\r\n );\r\n }\r\n\r\n try {\r\n const status = await buildProjectStatus(cwd);\r\n if (status.sync === 'behind') {\r\n entries.push(entry('sync', 'drift', 'local', 'platform', 'listing 未与平台对齐'));\r\n }\r\n if (status.draftAdvice) {\r\n entries.push(\r\n entry('draft', 'drift', status.draftAdvice, status.platformVersionDraft?.exists, status.draftAdviceHint || undefined),\r\n );\r\n }\r\n if (status.localDraftSync?.dirty) {\r\n entries.push(entry('draft.local', 'drift', 'dirty', status.localDraftSync.lastFingerprint));\r\n }\r\n } catch (error) {\r\n entries.push(\r\n entry(\r\n 'status',\r\n 'unknown',\r\n null,\r\n null,\r\n error instanceof Error ? error.message : String(error),\r\n ),\r\n );\r\n }\r\n\r\n const hasDrift = entries.some((e) => e.level === 'drift');\r\n return { ok: !hasDrift, subject, hasDrift, entries };\r\n}\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport { applyCommandFlags, handleCommandError, writeJsonSuccess } from '../core/command.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { cliReadCommandArgs } from '../core/cliArgs.js';\r\nimport { diffProject } from '../services/diffService.js';\r\n\r\nexport const diffCommand = defineCommand({\r\n meta: {\r\n name: 'diff',\r\n description: '对比本地 manifest 与平台状态(漂移时 exit 3)',\r\n },\r\n args: cliReadCommandArgs,\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const result = await diffProject({ cwd: resolveCwd(args.cwd) });\r\n\r\n if (args.json) {\r\n writeJsonSuccess('diff', result, { ok: !result.hasDrift });\r\n if (result.hasDrift) process.exit(3);\r\n return;\r\n }\r\n\r\n for (const e of result.entries) {\r\n const mark = e.level === 'same' ? '=' : e.level === 'drift' ? '≠' : '?';\r\n consola.info(`${mark} ${e.field}`);\r\n consola.info(` local: ${JSON.stringify(e.local)}`);\r\n consola.info(` platform: ${JSON.stringify(e.platform)}`);\r\n if (e.note) consola.info(` note: ${e.note}`);\r\n }\r\n\r\n if (result.hasDrift) {\r\n consola.warn('存在与平台不一致项');\r\n process.exit(3);\r\n }\r\n consola.success('本地与平台一致(在已对比字段范围内)');\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import { consola } from 'consola';\r\nimport { loadCollectionProject, saveCollectionProject } from '../config/project.js';\r\nimport { FServiceAPI } from '../platform/index.js';\nimport { assertExplicitEnvForWriteOperation } from '../core/command.js';\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport {\r\n applyCollectionDraft,\r\n buildCollectionDraftSync,\r\n fingerprintCollectionDraft,\r\n toCollectionDraftData,\r\n type CollectionVersionDraftData,\r\n} from '../adapters/collectionVersionDraftAdapter.js';\r\nimport { ensureCollectionSynced, ensureCollectionOwner } from './collection/index.js';\r\nimport { lookRemoteVersionDraft } from './draftService.js';\nimport { assertRssManagedContentEditable } from './collection/rssContract.js';\n\r\nexport async function collectionDraftPush(opts: {\r\n cwd?: string;\r\n force?: boolean;\r\n noAutoPull?: boolean;\r\n}) {\n assertExplicitEnvForWriteOperation();\n const ctx = await ensureCollectionSynced({ cwd: opts.cwd, noAutoPull: opts.noAutoPull });\n assertRssManagedContentEditable(ctx.info, '推送合集发版草稿');\n const resourceId = ctx.collection.resourceId!;\r\n const { data: config } = loadCollectionProject(opts.cwd);\r\n const localDraft = toCollectionDraftData(config);\r\n const localFp = fingerprintCollectionDraft(localDraft);\r\n\r\n const remoteLook = await lookRemoteVersionDraft(resourceId);\r\n const remoteDraft =\r\n remoteLook.exists && remoteLook.draftData\r\n ? (remoteLook.draftData as CollectionVersionDraftData)\r\n : null;\r\n\r\n if (remoteDraft && !opts.force) {\r\n const remoteFp = fingerprintCollectionDraft(remoteDraft);\r\n if (localFp !== remoteFp) {\r\n const sync = config.draftSync;\r\n if (!sync?.lastFingerprint) {\r\n throw cliError(I18N_KEYS.collection_draft_remote_conflict, {\r\n code: 3,\r\n details: { error: 'DRAFT_CONFLICT', reason: 'remote-exists-without-sync' },\r\n hint: 'freelog-cli draft pull --collection 或 draft push --collection --force',\r\n });\r\n }\r\n const localDirty = localFp !== sync.lastFingerprint;\r\n const remoteDirty = remoteFp !== sync.lastFingerprint;\r\n if (localDirty && remoteDirty) {\r\n throw cliError(I18N_KEYS.collection_draft_both_changed, {\r\n code: 3,\r\n details: { error: 'DRAFT_CONFLICT', reason: 'both-dirty' },\r\n hint: 'draft pull --collection 或 --force',\r\n });\r\n }\r\n if (!localDirty && remoteDirty) {\r\n throw cliError(I18N_KEYS.collection_draft_platform_updated, {\r\n code: 3,\r\n details: { error: 'DRAFT_CONFLICT', reason: 'remote-dirty' },\r\n hint: 'draft pull --collection 或 --force',\r\n });\r\n }\r\n }\r\n }\r\n\r\n let skippedPost = false;\r\n let updateDate = remoteLook.updateDate;\r\n if (remoteDraft && localFp === fingerprintCollectionDraft(remoteDraft) && !opts.force) {\r\n skippedPost = true;\r\n } else {\r\n await FServiceAPI.Resource.saveVersionsDraft({\r\n resourceId,\r\n draftData: localDraft,\r\n });\r\n const after = await lookRemoteVersionDraft(resourceId);\r\n updateDate = after.updateDate || new Date().toISOString();\r\n }\r\n\r\n saveCollectionProject(\r\n {\r\n ...config,\r\n resourceId,\r\n userId: ctx.collection.userId,\r\n username: ctx.collection.username,\r\n draftSync: buildCollectionDraftSync(localDraft, updateDate, !skippedPost),\r\n },\r\n opts.cwd,\r\n );\r\n\r\n const reason = skippedPost\r\n ? 'aligned'\r\n : opts.force\r\n ? 'force'\r\n : remoteDraft\r\n ? 'fast-forward'\r\n : 'no-remote';\r\n return { resourceId, fingerprint: localFp, skippedPost, reason };\r\n}\r\n\r\nexport async function collectionDraftPull(opts: { cwd?: string }) {\n const ctx = await ensureCollectionOwner({ cwd: opts.cwd });\n assertRssManagedContentEditable(ctx.info, '拉取合集发版草稿');\n const resourceId = ctx.collection.resourceId!;\r\n const remote = await lookRemoteVersionDraft(resourceId);\r\n if (!remote.exists || !remote.draftData) {\r\n throw cliError(I18N_KEYS.no_platform_collection_draft, { code: 4, hint: 'draft push --collection' });\r\n }\r\n const { data: config } = loadCollectionProject(opts.cwd);\r\n const applied = applyCollectionDraft(config, remote.draftData as CollectionVersionDraftData);\r\n applied.draftSync = buildCollectionDraftSync(\r\n remote.draftData as CollectionVersionDraftData,\r\n remote.updateDate,\r\n false,\r\n );\r\n saveCollectionProject(applied, opts.cwd);\r\n return {\r\n resourceId,\r\n fingerprint: applied.draftSync!.lastFingerprint,\r\n version: applied.version,\r\n };\r\n}\r\n\r\nexport async function collectionDraftDiscard(opts: { cwd?: string }) {\n assertExplicitEnvForWriteOperation();\n const ctx = await ensureCollectionOwner({ cwd: opts.cwd });\n assertRssManagedContentEditable(ctx.info, '删除合集发版草稿');\n const resourceId = ctx.collection.resourceId!;\r\n const before = await lookRemoteVersionDraft(resourceId);\r\n try {\r\n await FServiceAPI.Resource.deleteResourceDraft({ resourceId });\r\n } catch (error) {\r\n if (before.exists) throw error;\r\n consola.warn('平台无合集发版草稿或删除已完成');\r\n }\r\n const { data } = loadCollectionProject(opts.cwd);\r\n const next = { ...data, draftSync: null };\r\n saveCollectionProject(next, opts.cwd);\r\n return { resourceId, existed: before.exists };\r\n}\r\n","import * as p from '@clack/prompts';\r\nimport { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { isInteractive } from '../core/tty.js';\r\nimport { draftDiscard, draftPull, draftPush } from '../services/draftService.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { t } from '../i18n/index.js';\r\nimport {\r\n collectionDraftDiscard,\r\n collectionDraftPull,\r\n collectionDraftPush,\r\n} from '../services/collectionDraftService.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport {\r\n printPreflightLines,\r\n summarizePublishPreflight,\r\n} from '../services/preflightSummary.js';\r\n\r\nconst collectionDraftFlag = {\r\n collection: { type: 'boolean' as const, description: '合集发版表单草稿(非目录草稿)' },\r\n};\r\n\r\nconst draftSharedArgs = {\r\n ...cliWriteCommandArgs,\r\n ...collectionDraftFlag,\r\n};\r\n\r\nfunction assertDraftAvailableInMode(args: { session?: boolean }): void {\r\n if (!args.session) return;\r\n throw cliError(I18N_KEYS.session_draft_not_supported, {\r\n code: 4,\r\n hint: '草稿 API 仅工程模式;请去掉 --session 或使用 resource publish --session',\r\n });\r\n}\r\n\r\nasync function confirmDestructive(args: { yes?: boolean }, message: string): Promise<boolean> {\r\n if (args.yes) return true;\r\n if (!isInteractive(args.yes)) {\r\n throw cliError(I18N_KEYS.non_interactive_needs_yes, { code: 4, hint: `加 --yes 后重试` });\r\n }\r\n const ok = await p.confirm({ message });\r\n if (p.isCancel(ok) || !ok) {\r\n consola.info('已取消');\r\n process.exitCode = 0;\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nconst pushCommand = defineCommand({\r\n meta: { name: 'push', description: '本地 → 平台发版草稿(--collection 为合集表单草稿)' },\r\n args: {\r\n force: { type: 'boolean', description: '覆盖远端冲突草稿' },\r\n upload: { type: 'boolean', description: '独立资源:先上传 filePath' },\r\n ...draftSharedArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n assertDraftAvailableInMode(args);\r\n applyWriteCommandFlags(args);\r\n if (args.force) {\r\n printPreflightLines(await summarizePublishPreflight({ cwd: resolveCwd(args.cwd) }));\r\n const ok = await confirmDestructive(args, '确认 --force 覆盖平台发版草稿?');\r\n if (!ok) return;\r\n }\r\n const cwd = resolveCwd(args.cwd);\r\n const result = args.collection\r\n ? await collectionDraftPush({\r\n cwd,\r\n force: args.force,\r\n noAutoPull: args['no-auto-pull'],\r\n })\r\n : await draftPush({\r\n cwd,\r\n force: args.force,\r\n upload: args.upload,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('draft', { collection: Boolean(args.collection), ...result });\r\n } else if (result.skippedPost) {\r\n consola.success(`草稿已对齐(fingerprint=${result.fingerprint.slice(0, 12)}…)`);\r\n } else {\r\n consola.success(t(I18N_KEYS.cli_draft_save_ok));\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'draft push');\r\n }\r\n },\r\n});\r\n\r\nconst pullCommand = defineCommand({\r\n meta: { name: 'pull', description: '平台发版草稿 → 本地' },\r\n args: {\r\n ...draftSharedArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n assertDraftAvailableInMode(args);\r\n applyWriteCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n const result = args.collection\r\n ? await collectionDraftPull({ cwd })\r\n : await draftPull({ cwd, noAutoPull: args['no-auto-pull'] });\r\n if (args.json) {\r\n writeJsonSuccess('draft', { collection: Boolean(args.collection), ...result });\r\n } else {\r\n consola.success(\r\n `已 pull ${args.collection ? '合集' : '独立资源'}草稿(fingerprint=${result.fingerprint.slice(0, 12)}…)`,\r\n );\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst discardCommand = defineCommand({\r\n meta: { name: 'discard', description: '删除平台发版草稿并清 draftSync' },\r\n args: {\r\n ...draftSharedArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n assertDraftAvailableInMode(args);\r\n applyWriteCommandFlags(args);\r\n const ok = await confirmDestructive(args, '确认删除平台发版草稿?');\r\n if (!ok) return;\r\n const cwd = resolveCwd(args.cwd);\r\n const result = args.collection\r\n ? await collectionDraftDiscard({ cwd })\r\n : await draftDiscard({ cwd });\r\n if (args.json) {\r\n writeJsonSuccess('draft', { collection: Boolean(args.collection), ...result });\r\n } else {\r\n consola.success(\r\n result.existed ? '已删除平台发版草稿' : '平台本无草稿(已清本地 draftSync)',\r\n );\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const draftCommand = defineCommand({\r\n meta: { name: 'draft', description: '发版草稿 push|pull|discard(--collection 合集表单)' },\r\n subCommands: {\r\n push: pushCommand,\r\n pull: pullCommand,\r\n discard: discardCommand,\r\n },\r\n});\r\n","import { defineCommand, parseArgs } from 'citty';\r\nimport { consola } from 'consola';\r\nimport { applyWriteCommandFlags, handleCommandError, writeJsonSuccess } from '../core/command.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { isInteractive } from '../core/tty.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { runInitScaffold, resolveInitOutcome, initNextSteps, type InitScaffold, type ScaffoldPreset } from '../services/init/index.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\ntype InitArgs = {\r\n dir?: string;\r\n scaffold?: string;\r\n template?: string;\r\n runtime?: string;\r\n 'resource-type'?: string;\r\n 'resource-type-name'?: string;\r\n 'resource-name'?: string;\r\n title?: string;\r\n namespace?: string;\r\n 'templates-dir'?: string;\r\n pm?: string;\r\n 'skip-install'?: boolean;\r\n 'artifact-mode'?: string;\r\n cwd?: string;\r\n yes?: boolean;\r\n json?: boolean;\r\n test?: boolean;\r\n env?: string;\r\n debug?: boolean;\r\n};\r\n\r\nconst SCAFFOLD_PRESET_META: Record<\r\n ScaffoldPreset,\r\n { label: string; description: string }\r\n> = {\r\n theme: {\r\n label: '主题',\r\n description: '创建主题工程(从平台类型树定稿「主题」,选 runtime 模板,不问类型树)',\r\n },\r\n widget: {\r\n label: '插件',\r\n description: '创建插件工程(从平台类型树定稿「插件」,选 runtime 模板,不问类型树)',\r\n },\r\n package: {\r\n label: '前端库',\r\n description: '创建前端库/软件库工程(从平台类型树定稿类型,选 package 模板 + namespace)',\r\n },\r\n};\r\n\r\nconst sharedInitArgs = {\r\n dir: {\r\n type: 'positional' as const,\r\n description: '项目目录名;传 . 表示当前目录',\r\n required: true,\r\n },\r\n template: { type: 'string' as const, description: '模板 id,如 vite-vue-ts' },\r\n runtime: { type: 'string' as const, description: '0.4 | 0.5(theme/widget)' },\r\n 'resource-type': {\r\n type: 'string' as const,\r\n description: '覆盖默认定稿类型(一般不需要)',\r\n },\r\n 'resource-type-name': { type: 'string' as const, description: '自定义资源类型名(可选)' },\r\n 'resource-name': { type: 'string' as const, description: '资源短授权标识;默认目录名' },\r\n title: { type: 'string' as const, description: '资源标题' },\r\n namespace: { type: 'string' as const, description: '前端库命名空间(package 必填)' },\r\n 'templates-dir': { type: 'string' as const, description: '本地 templates 根目录' },\r\n pm: { type: 'string' as const, description: 'pnpm | npm | yarn' },\r\n 'skip-install': { type: 'boolean' as const, description: '跳过依赖安装' },\r\n 'artifact-mode': {\r\n type: 'string' as const,\r\n description: '本地产物形态:file | directory-zip(scaffold none 可用)',\r\n },\r\n ...cliWriteCommandArgs,\r\n};\r\n\r\nasync function runInitCommand(args: InitArgs, presetCategory?: ScaffoldPreset): Promise<void> {\r\n applyWriteCommandFlags(args);\r\n let scaffold = args.scaffold as InitScaffold | undefined;\r\n if (scaffold && !['runtime', 'package', 'none', 'collection'].includes(scaffold)) {\r\n throw cliError(I18N_KEYS.invalid_scaffold, { code: 4 });\r\n }\r\n let runtime: '0.4' | '0.5' | undefined;\r\n if (args.runtime) {\r\n if (args.runtime !== '0.4' && args.runtime !== '0.5') {\r\n throw cliError(I18N_KEYS.runtime_only_04_05, { code: 4 });\r\n }\r\n runtime = args.runtime;\r\n }\r\n let pm: 'pnpm' | 'npm' | 'yarn' | undefined;\r\n if (args.pm) {\r\n if (!['pnpm', 'npm', 'yarn'].includes(args.pm)) {\r\n throw cliError(I18N_KEYS.pm_only_pnpm_npm_yarn, { code: 4 });\r\n }\r\n pm = args.pm as 'pnpm' | 'npm' | 'yarn';\r\n }\r\n let artifactMode: 'file' | 'directory-zip' | undefined;\r\n if (args['artifact-mode'] !== undefined) {\r\n if (args['artifact-mode'] !== 'file' && args['artifact-mode'] !== 'directory-zip') {\r\n throw cliError(I18N_KEYS.artifact_mode_invalid, { code: 4 });\r\n }\r\n artifactMode = args['artifact-mode'];\r\n }\r\n\r\n const cwd = resolveCwd(args.cwd);\r\n const { args: resolved, dir } = await resolveInitOutcome({\r\n yes: Boolean(args.yes),\r\n scaffold,\r\n resourceTypeCode: args['resource-type'],\r\n presetCategory,\r\n template: args.template,\r\n runtime,\r\n namespace: args.namespace,\r\n resourceName: args['resource-name'],\r\n title: args.title,\r\n dir: String(args.dir),\r\n cwd,\r\n });\r\n\r\n scaffold = resolved.scaffold;\r\n runtime = resolved.runtime;\r\n if (\r\n scaffold === 'none' &&\r\n !artifactMode &&\r\n !isInteractive(Boolean(args.yes))\r\n ) {\r\n throw cliError(I18N_KEYS.artifact_mode_invalid, {\r\n code: 4,\r\n details: { reason: 'missing', filePath: resolved.versionFilePath },\r\n hint: '本地目录或文件的打包方式不能猜测;请显式传 --artifact-mode file 或 --artifact-mode directory-zip',\r\n });\r\n }\r\n\r\n const result = await runInitScaffold({\r\n dir,\r\n cwd,\r\n scaffold,\r\n template: resolved.template,\r\n runtime,\r\n resourceTypeCode: resolved.resourceTypeCode,\r\n resourceTypeName: resolved.resourceTypeName || args['resource-type-name'],\r\n resourceTypeLabels: resolved.resourceTypeLabels,\r\n resourceName: resolved.resourceName || args['resource-name'],\r\n title: resolved.title || args.title,\r\n namespace: resolved.namespace,\r\n versionFilePath: resolved.versionFilePath,\r\n artifactMode,\r\n templatesDir: args['templates-dir'],\r\n pm,\r\n skipInstall: Boolean(args['skip-install']),\r\n overwrite: Boolean(args.yes),\r\n });\r\n\r\n if (args.json) {\r\n writeJsonSuccess('init', {\r\n mode: presetCategory ? `scaffold_${presetCategory}` : 'scaffold',\r\n projectDir: result.projectDir,\r\n cliVersion: result.compat?.cliVersion,\n template: result.template,\n resourceTypeCode: resolved.resourceTypeCode,\r\n scaffold,\r\n category: resolved.category,\r\n });\r\n } else {\r\n consola.success(`已创建 ${result.projectDir}`);\n if (result.template) {\n consola.info(\n `模板: ${result.template.id} · ${result.template.npmName}@${result.template.version}`,\n );\n }\n if (presetCategory) {\r\n consola.info(\r\n `脚手架: ${SCAFFOLD_PRESET_META[presetCategory].label} · resourceTypeCode=${resolved.resourceTypeCode} · scaffold=${scaffold}`,\r\n );\r\n } else {\r\n consola.info(\r\n `资源类型: ${resolved.resourceTypeCode} · 大类: ${resolved.category} · scaffold=${scaffold}`,\r\n );\r\n }\r\n consola.info('下一步:');\r\n for (const line of initNextSteps({\r\n scaffold,\r\n category: resolved.category,\r\n projectDir: result.projectDir,\r\n })) {\r\n consola.info(` ${line}`);\r\n }\r\n }\r\n}\r\n\r\nconst SCAFFOLD_PRESET_NAMES = ['theme', 'widget', 'package'] as const;\r\n\r\nfunction isScaffoldPreset(name: string): name is ScaffoldPreset {\r\n return (SCAFFOLD_PRESET_NAMES as readonly string[]).includes(name);\r\n}\r\n\r\n/** citty 子命令会把首个 positional 当子命令名,与 `init <dir>` 冲突;改用手动路由 preset。 */\r\nfunction resolveInitRawArgs(rawArgs: string[]): {\r\n preset?: ScaffoldPreset;\r\n stripped: string[];\r\n} {\r\n const firstIdx = rawArgs.findIndex((arg) => !arg.startsWith('-'));\r\n if (firstIdx >= 0 && isScaffoldPreset(rawArgs[firstIdx])) {\r\n return {\r\n preset: rawArgs[firstIdx] as ScaffoldPreset,\r\n stripped: [...rawArgs.slice(0, firstIdx), ...rawArgs.slice(firstIdx + 1)],\r\n };\r\n }\r\n return { stripped: rawArgs };\r\n}\r\n\r\nconst initCommandArgs = {\r\n dir: sharedInitArgs.dir,\r\n scaffold: {\r\n type: 'string' as const,\r\n description: 'runtime | package | none | collection',\r\n },\r\n template: sharedInitArgs.template,\r\n runtime: sharedInitArgs.runtime,\r\n 'resource-type': {\r\n type: 'string' as const,\r\n description: '平台 resourceTypeCode;通用 init 交互时可省略',\r\n },\r\n 'resource-type-name': sharedInitArgs['resource-type-name'],\r\n 'resource-name': sharedInitArgs['resource-name'],\r\n title: sharedInitArgs.title,\r\n namespace: sharedInitArgs.namespace,\r\n 'templates-dir': sharedInitArgs['templates-dir'],\r\n pm: sharedInitArgs.pm,\r\n 'skip-install': sharedInitArgs['skip-install'],\r\n 'artifact-mode': sharedInitArgs['artifact-mode'],\r\n ...cliWriteCommandArgs,\r\n};\r\n\r\nexport const initCommand = defineCommand({\r\n meta: {\r\n name: 'init',\r\n description:\r\n '工程立项五选一:init theme|widget|package <dir>(定稿类型+模板)或 init <dir>(交互选大类)',\r\n },\r\n args: initCommandArgs,\r\n async run({ rawArgs }) {\r\n try {\r\n const { preset, stripped } = resolveInitRawArgs(rawArgs);\r\n const args = parseArgs(stripped, initCommandArgs) as InitArgs;\r\n await runInitCommand(args, preset);\r\n } catch (error) {\r\n const { stripped } = resolveInitRawArgs(rawArgs);\r\n const args = parseArgs(stripped, initCommandArgs) as InitArgs;\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { cliEnvArgs, cliOutputArgs } from '../core/cliArgs.js';\r\nimport {\r\n getCliLocale,\r\n initCliI18n,\r\n setCliLocale,\r\n type CliLocale,\r\n} from '../i18n/index.js';\r\nimport { loadPersistedLocale, persistCliLocale } from '../i18n/localeConfig.js';\r\n\r\nfunction normalizeLangInput(raw: string): CliLocale {\r\n const v = raw.trim().replace('-', '_');\r\n if (v === 'en' || v === 'en_US') return 'en_US';\r\n if (v === 'zh' || v === 'zh_CN') return 'zh_CN';\r\n throw cliError(I18N_KEYS.locale_only_zh_en, {\r\n code: 4,\r\n hint: 'freelog-cli lang set zh_CN',\r\n });\r\n}\r\n\r\nexport const langShowCommand = defineCommand({\r\n meta: { name: 'show', description: '显示 CLI 语言:当前 / 持久化 / 环境变量' },\r\n args: {\r\n json: cliOutputArgs.json,\r\n debug: cliOutputArgs.debug,\r\n ...cliEnvArgs,\r\n lang: cliOutputArgs.lang,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n await initCliI18n();\r\n const payload = {\r\n current: getCliLocale(),\r\n persisted: loadPersistedLocale() ?? null,\r\n env: process.env.FREELOG_LANG ?? null,\r\n };\r\n if (args.json) {\r\n writeJsonSuccess('lang', payload);\r\n } else {\r\n consola.info(`当前: ${payload.current}`);\r\n consola.info(`持久化: ${payload.persisted ?? '(未设置,默认 zh_CN)'}`);\r\n if (payload.env) consola.info(`FREELOG_LANG: ${payload.env}`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const langSetCommand = defineCommand({\r\n meta: { name: 'set', description: '持久化 CLI 语言(zh_CN | en_US)' },\r\n args: {\r\n locale: { type: 'positional', required: true, description: 'zh_CN | en_US' },\r\n json: cliOutputArgs.json,\r\n debug: cliOutputArgs.debug,\r\n ...cliEnvArgs,\r\n lang: cliOutputArgs.lang,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const locale = normalizeLangInput(String(args.locale));\r\n persistCliLocale(locale);\r\n setCliLocale(locale);\r\n await initCliI18n();\r\n if (args.json) {\r\n writeJsonSuccess('lang', { lang: locale });\r\n } else {\r\n consola.success(`语言已设为 ${locale}(写入 ~/.freelog-cli/settings.json)`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const langCommand = defineCommand({\r\n meta: { name: 'lang', description: 'CLI 语言:show | set' },\r\n subCommands: {\r\n show: langShowCommand,\r\n set: langSetCommand,\r\n },\r\n});\r\n","import type { AuthInfo } from '../../core/auth.js';\nimport { getApiBaseURL, getCliEnv } from '../../core/env.js';\nimport { unwrapData, type PlatformEnvelope } from '../../platform/index.js';\n\ninterface LoginData {\n userId?: number;\n username?: string;\n token?: string;\n tokenSn?: string;\n authorization?: string;\n jwtType?: string;\n}\n\nfunction cookieHeaderFromSetCookie(headers: Headers): string | undefined {\n const getSetCookie = (headers as Headers & { getSetCookie?: () => string[] }).getSetCookie;\n const values =\n typeof getSetCookie === 'function'\n ? getSetCookie.call(headers)\n : (headers.get('set-cookie') || '')\n .split(/,(?=\\s*[^;,]+=)/)\n .map((item) => item.trim())\n .filter(Boolean);\n\n const pairs = values\n .map((item) => item.split(';')[0]?.trim())\n .filter(Boolean);\n return pairs.length ? pairs.join('; ') : undefined;\n}\n\n/** 调用平台 login API,返回可写入 auth 的字段(不负责落盘)。 */\nexport async function fetchLoginAuth(\n loginName: string,\n password: string,\n): Promise<AuthInfo> {\n const response = await fetch(`${getApiBaseURL()}/v2/passport/login`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ loginName, password, isRemember: 1 }),\n });\n const envelope = (await response.json()) as PlatformEnvelope<LoginData>;\n const data = unwrapData<LoginData>(envelope);\n const cookie = cookieHeaderFromSetCookie(response.headers);\n const token = data?.token || data?.authorization || data?.tokenSn;\n if (!token && !cookie) {\n throw new Error('login_response_missing_token');\n }\n\n return {\n token: token || cookie!,\n authorization:\n data.authorization || (data.jwtType && token ? `${data.jwtType} ${token}` : undefined),\n cookie,\n userId: data.userId,\n username: data.username || loginName,\n environment: getCliEnv(),\n };\n}\n\nexport function isLoginTokenMissingError(error: unknown): boolean {\n return error instanceof Error && error.message === 'login_response_missing_token';\n}\n","import * as p from '@clack/prompts';\r\r\nimport { consola } from 'consola';\r\r\nimport { defineCommand } from 'citty';\r\r\nimport { applyCommandFlags, handleCommandError, writeJsonSuccess } from '../core/command.js';\r\r\nimport { cliEnvArgs, cliOutputArgs } from '../core/cliArgs.js';\r\r\nimport { getCliEnv } from '../core/env.js';\r\r\nimport { authScopeLabel, saveAuth } from '../core/auth.js';\r\r\nimport { resolveCwd } from '../config/project.js';\r\r\nimport { isInteractive } from '../core/tty.js';\r\r\nimport { cliError } from '../i18n/cliError.js';\r\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\r\nimport { fetchLoginAuth, isLoginTokenMissingError } from '../services/auth/loginFlow.js';\r\r\n\r\r\nexport const loginCommand = defineCommand({\r\r\n meta: { name: 'login', description: '登录 Freelog 账号' },\r\r\n args: {\r\r\n ...cliEnvArgs,\r\r\n ...cliOutputArgs,\r\r\n global: { type: 'boolean', alias: 'g', description: '写入全局凭据 ~/.freelog-auth' },\r\r\n cwd: { type: 'string', description: '工作区凭据写入目录,默认当前目录' },\r\r\n yes: { type: 'boolean', alias: 'y', description: '非交互(需 --login-name/--password)' },\r\r\n 'login-name': { type: 'string', description: '登录名' },\r\r\n password: { type: 'string', description: '密码' },\r\r\n },\r\r\n async run({ args }) {\r\r\n try {\r\r\n applyCommandFlags(args);\r\r\n const loginCwd = resolveCwd(args.cwd);\r\r\n let loginName = args['login-name'];\r\r\n let password = args.password;\r\r\n\r\r\n if ((!loginName || !password) && isInteractive(args.yes)) {\r\r\n const answers = await p.group({\r\r\n loginName: () => p.text({ message: '登录名', defaultValue: loginName }),\r\r\n password: () => p.password({ message: '密码' }),\r\r\n });\r\r\n if (p.isCancel(answers)) {\r\r\n consola.info('已取消');\r\r\n process.exitCode = 0;\r\r\n return;\r\r\n }\r\r\n loginName = String(answers.loginName);\r\r\n password = String(answers.password);\r\r\n }\r\r\n\r\r\n if (!loginName || !password) {\r\r\n throw cliError(I18N_KEYS.missing_login_credentials, {\r\r\n code: 4,\r\r\n hint: 'freelog-cli login --login-name <name> --password <pwd> --yes',\r\r\n });\r\r\n }\r\r\n\r\r\n let auth;\r\r\n try {\r\r\n auth = await fetchLoginAuth(loginName, password);\r\r\n } catch (error) {\r\r\n if (isLoginTokenMissingError(error)) {\r\r\n throw cliError(I18N_KEYS.login_response_missing_token, { code: 1 });\r\r\n }\r\r\n throw error;\r\r\n }\r\r\n\r\r\n const authScope = args.global ? 'global' : 'workspace';\r\r\n saveAuth(\r\r\n auth,\r\r\n authScope === 'global' ? { scope: 'global' } : { scope: 'workspace', cwd: loginCwd },\r\r\n );\r\r\n\r\r\n if (args.json) {\r\r\n writeJsonSuccess('login', {\r\r\n username: auth.username || loginName,\r\r\n environment: getCliEnv(),\r\r\n scope: authScope,\r\r\n });\r\r\n } else {\r\r\n consola.success(\r\r\n `已登录 ${auth.username || loginName}(${getCliEnv()},${authScopeLabel(authScope)})`,\r\r\n );\r\r\n }\r\r\n } catch (error) {\r\r\n handleCommandError(error, args.json);\r\r\n }\r\r\n },\r\r\n});\r\r\n\r","import { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport { resolveCwd } from '../config/project.js';\nimport { cliEnvArgs, cliOutputArgs } from '../core/cliArgs.js';\nimport {\n authScopeLabel,\n clearGlobalAuth,\n clearResolvedAuth,\n resolveAuthTarget,\n} from '../core/auth.js';\nimport { applyCommandFlags, handleCommandError, writeJsonSuccess } from '../core/command.js';\n\nexport const logoutCommand = defineCommand({\n meta: { name: 'logout', description: '退出登录' },\n args: {\n ...cliEnvArgs,\n json: cliOutputArgs.json,\n debug: cliOutputArgs.debug,\n global: { type: 'boolean', alias: 'g', description: '仅清除全局凭据 ~/.freelog-auth' },\n cwd: { type: 'string', description: '解析工作区凭据的起点目录,默认当前目录' },\n },\n async run({ args }) {\n try {\n applyCommandFlags(args);\n const cwd = resolveCwd(args.cwd);\n const before = resolveAuthTarget(cwd);\n const cleared = args.global ? clearGlobalAuth() : clearResolvedAuth(cwd);\n if (args.json) {\n writeJsonSuccess('logout', {\n cleared,\n scope: args.global ? 'global' : before?.scope ?? 'resolved',\n });\n } else if (cleared) {\n consola.success(\n args.global\n ? `已清除${authScopeLabel('global')}`\n : before?.scope === 'ephemeral'\n ? '已清除临时会话凭据(未写磁盘)'\n : '已退出登录(当前上下文凭据)',\n );\n } else {\n consola.warn('没有可清除的登录凭据');\n }\n } catch (error) {\n handleCommandError(error, args.json);\n }\n },\n});\n","import { getCurrentAuth } from '../core/auth.js';\r\nimport { cliError } from '../i18n/cliError.js';\nimport { I18N_KEYS } from '../i18n/bundled.js';\nimport { FUtil } from '../platform/index.js';\r\nimport { pollFilesSha1Info, type HandleFilePropertiesResult } from './fileProperty/index.js';\r\n\r\nexport type ParsedMetaRow = {\r\n sha1: string;\r\n metaAnalyzeStatus: 0 | 1 | 2 | 3;\r\n fileSize: number;\r\n metaInfoArray: Array<{\r\n insertMode: 1 | 2;\r\n key: string;\r\n name: string;\r\n remark: string;\r\n value: number | string | null;\r\n valueDisplay: string;\r\n valueUnit: string;\r\n }>;\r\n};\r\n\r\nfunction normalizeMetaInfoArray(\r\n rows: ParsedMetaRow['metaInfoArray'] | undefined,\r\n): ParsedMetaRow['metaInfoArray'] {\r\n return [...(rows || [])]\r\n .map((row) => ({\r\n insertMode: row.insertMode,\r\n key: String(row.key),\r\n name: String(row.name ?? ''),\r\n remark: String(row.remark ?? ''),\r\n value: row.value,\r\n valueDisplay: String(row.valueDisplay ?? ''),\r\n valueUnit: String(row.valueUnit ?? ''),\r\n }))\r\n .sort((a, b) => a.key.localeCompare(b.key));\r\n}\r\n\r\nexport function metaInfoArraysEqual(\r\n a: ParsedMetaRow['metaInfoArray'] | undefined,\r\n b: ParsedMetaRow['metaInfoArray'] | undefined,\r\n): boolean {\r\n return JSON.stringify(normalizeMetaInfoArray(a)) === JSON.stringify(normalizeMetaInfoArray(b));\r\n}\r\n\r\nfunction isTerminalStatus(status: number): boolean {\r\n return status === 2 || status === 3;\r\n}\r\n\r\nfunction buildSseUrl(sha1: string[], resourceTypeCode: string): string {\r\n const base = FUtil.Format.completeUrlByDomain('api');\r\n const params = new URLSearchParams({\r\n sha1: sha1.join(','),\r\n resourceTypeCode,\r\n });\r\n return `${base}/v2/storages/files/listSSE/info?${params.toString()}`;\r\n}\r\n\r\nfunction buildAuthHeaders(): Record<string, string> {\r\n const auth = getCurrentAuth();\r\n if (!auth) {\r\n throw cliError(I18N_KEYS.meta_sse_login_required, {\n code: 2,\n hint: 'freelog-cli login',\n });\n }\r\n const headers: Record<string, string> = {\r\n Accept: 'text/event-stream',\r\n };\r\n if (auth.cookie) headers.Cookie = auth.cookie;\r\n const authorization =\r\n auth.authorization || (auth.token ? `Bearer ${auth.token}` : undefined);\r\n if (authorization) headers.Authorization = authorization;\r\n return headers;\r\n}\r\n\r\n/** Console PropertyParser SSE(Node fetch 读 stream) */\r\nexport async function pollFilesSha1InfoViaSse(opts: {\r\n sha1: string[];\r\n resourceTypeCode: string;\r\n timeoutMs?: number;\r\n}): Promise<{ error: string; result: ParsedMetaRow[] }> {\r\n if (!opts.sha1.length) return { error: '', result: [] };\r\n\r\n const url = buildSseUrl(opts.sha1, opts.resourceTypeCode);\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? 120_000);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n headers: buildAuthHeaders(),\r\n signal: controller.signal,\r\n });\r\n if (!response.ok) {\r\n return { error: `SSE HTTP ${response.status}`, result: [] };\r\n }\r\n\r\n const latestBySha1 = new Map<string, ParsedMetaRow>();\r\n const reader = response.body?.getReader();\r\n if (!reader) {\r\n return { error: 'SSE body 不可读', result: [] };\r\n }\r\n\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n buffer += decoder.decode(value, { stream: true });\r\n const chunks = buffer.split('\\n');\r\n buffer = chunks.pop() || '';\r\n for (const line of chunks) {\r\n const trimmed = line.trim();\r\n if (!trimmed.startsWith('data:')) continue;\r\n const payload = trimmed.slice(5).trim();\r\n if (!payload) continue;\r\n try {\r\n const row = JSON.parse(payload) as ParsedMetaRow;\r\n if (row?.sha1) latestBySha1.set(row.sha1, row);\r\n } catch {\r\n // 忽略非 JSON 行\r\n }\r\n }\r\n }\r\n\r\n const result = opts.sha1\r\n .map((sha1) => latestBySha1.get(sha1))\r\n .filter((row): row is ParsedMetaRow => Boolean(row));\r\n\r\n const missing = opts.sha1.filter((sha1) => !latestBySha1.has(sha1));\r\n if (missing.length) {\r\n return { error: `SSE 未收到 sha1: ${missing.join(',')}`, result };\r\n }\r\n\r\n const pending = result.filter((row) => !isTerminalStatus(row.metaAnalyzeStatus));\r\n if (pending.length) {\r\n return {\r\n error: `SSE 解析未完成: ${pending.map((r) => `${r.sha1}:${r.metaAnalyzeStatus}`).join(',')}`,\r\n result,\r\n };\r\n }\r\n\r\n return { error: '', result };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return { error: `SSE 请求失败: ${message}`, result: [] };\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n}\r\n\r\nexport type MetaApiParityDiff = {\r\n sha1: string;\r\n restStatus: number;\r\n sseStatus: number;\r\n metaEqual: boolean;\r\n};\r\n\r\n/** 同 sha1:REST 轮询 vs Console SSE 最终 metaInfoArray 对比 */\r\nexport async function compareFileMetaRestAndSse(opts: {\r\n sha1: string[];\r\n resourceTypeCode: string;\r\n delayMs?: number;\r\n sseTimeoutMs?: number;\r\n}): Promise<{ ok: boolean; diffs: MetaApiParityDiff[]; error?: string }> {\r\n const [rest, sse] = await Promise.all([\r\n pollFilesSha1Info({\r\n sha1: opts.sha1,\r\n resourceTypeCode: opts.resourceTypeCode,\r\n delayMs: opts.delayMs,\r\n }),\r\n pollFilesSha1InfoViaSse({\r\n sha1: opts.sha1,\r\n resourceTypeCode: opts.resourceTypeCode,\r\n timeoutMs: opts.sseTimeoutMs,\r\n }),\r\n ]);\r\n\r\n if (rest.error) return { ok: false, diffs: [], error: `REST: ${rest.error}` };\r\n if (sse.error) return { ok: false, diffs: [], error: `SSE: ${sse.error}` };\r\n\r\n const restMap = new Map(rest.result.map((row) => [row.sha1, row]));\r\n const sseMap = new Map(sse.result.map((row) => [row.sha1, row]));\r\n const diffs: MetaApiParityDiff[] = [];\r\n\r\n for (const sha1 of opts.sha1) {\r\n const restRow = restMap.get(sha1);\r\n const sseRow = sseMap.get(sha1);\r\n if (!restRow || !sseRow) {\r\n return { ok: false, diffs: [], error: `缺少 sha1 ${sha1} 的 REST/SSE 结果` };\r\n }\r\n const metaEqual = metaInfoArraysEqual(restRow.metaInfoArray, sseRow.metaInfoArray);\r\n diffs.push({\r\n sha1,\r\n restStatus: restRow.metaAnalyzeStatus,\r\n sseStatus: sseRow.metaAnalyzeStatus,\r\n metaEqual,\r\n });\r\n }\r\n\r\n return { ok: diffs.every((d) => d.metaEqual), diffs };\r\n}\r\n\r\nexport type { HandleFilePropertiesResult };\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport path from 'node:path';\r\nimport { applyCommandFlags, handleCommandError, writeJsonSuccess } from '../core/command.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { prepareLocalFileForPlatform } from '../services/storageUpload.js';\r\nimport { compareFileMetaRestAndSse } from '../services/metaInfoParity.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\nconst compareCommand = defineCommand({\r\n meta: {\r\n name: 'compare',\r\n description: '对比 REST filesListInfo 与 SSE listSSE/info 同 sha1 的 metaInfoArray',\r\n },\r\n args: {\r\n file: { type: 'string', description: '本地文件(会上传若尚未存在)' },\r\n sha1: { type: 'string', description: '已有 sha1(与 --file 二选一)' },\r\n 'resource-type': { type: 'string', description: 'resourceTypeCode,如 RT005001' },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const typeCode = args['resource-type']?.trim();\r\n if (!typeCode) throw cliError(I18N_KEYS.missing_resource_type_flag, { code: 4 });\r\n\r\n let sha1 = args.sha1?.trim();\r\n if (!sha1) {\r\n if (!args.file?.trim()) {\r\n throw cliError(I18N_KEYS.missing_file_or_sha1, { code: 4 });\r\n }\r\n const filePath = path.resolve(resolveCwd(args.cwd), args.file);\r\n sha1 = await prepareLocalFileForPlatform(filePath);\r\n }\r\n\r\n const result = await compareFileMetaRestAndSse({\r\n sha1: [sha1],\r\n resourceTypeCode: typeCode,\r\n });\r\n\r\n if (args.json) {\r\n writeJsonSuccess('meta compare', { sha1, ...result }, { ok: result.ok });\r\n } else if (result.ok) {\r\n consola.success(`REST/SSE meta 一致(sha1=${sha1.slice(0, 12)}…)`);\r\n } else {\r\n consola.error(result.error || 'REST/SSE meta 不一致', result.diffs);\r\n process.exitCode = 1;\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const metaCommand = defineCommand({\r\n meta: { name: 'meta', description: '文件 meta 解析 parity 工具(dev/验证用)' },\r\n subCommands: {\r\n compare: compareCommand,\r\n },\r\n});\r\n","import { assertExplicitEnvForWriteOperation } from '../core/command.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport {\r\n savePlatformCollectionState,\r\n tryLoadCollectionProject,\r\n} from '../config/project.js';\r\nimport { FServiceAPI } from '../platform/index.js';\r\nimport { ensureSynced, fetchResourceInfo, type PlatformResourceInfo } from './sync/index.js';\r\nimport type { ProjectStore } from './store/types.js';\r\nimport { evaluateOnlineGates } from './onlineGates.js';\r\nimport { ensureCollectionSynced } from './collection/index.js';\r\nimport { isFrozenStatus } from './shared/guards/index.js';\r\n\r\nexport { evaluateOnlineGates };\r\n\r\nasync function applyOnline(resourceId: string, info: PlatformResourceInfo, hint: string) {\r\n if (isFrozenStatus(info.status)) {\r\n throw cliError(I18N_KEYS.cli_resource_frozen, {\r\n code: 4,\r\n details: { status: info.status },\r\n });\r\n }\r\n\r\n const gates = evaluateOnlineGates(info);\r\n\r\n // 即使平台 status===1(Console 软上架),门禁未满足仍拒 —— 验收 #15b\r\n if (!gates.ok) {\r\n const policies = info.policies || [];\r\n const key = !gates.hasLatestVersion\r\n ? I18N_KEYS.msg_release_version_first\r\n : policies.length === 0\r\n ? I18N_KEYS.msg_set_resource_avaliable_for_auth01\r\n : I18N_KEYS.msg_set_resource_avaliable_for_auth02;\r\n throw cliError(key, {\r\n code: 4,\r\n details: {\r\n error: 'ONLINE_GATE_FAILED',\r\n gates: {\r\n hasLatestVersion: gates.hasLatestVersion,\r\n enabledPolicyCount: gates.enabledPolicyCount,\r\n },\r\n platformStatus: info.status,\r\n },\r\n hint,\r\n },\r\n );\r\n }\r\n\r\n if (Number(info.status) === 1) {\r\n return { already: true as const, info, gates };\r\n }\r\n\r\n await FServiceAPI.Resource.update({\r\n resourceId,\r\n status: 1,\r\n });\r\n\r\n return { already: false as const, info, gates };\r\n}\r\n\r\nexport async function onlineResource(opts: {\r\n store: ProjectStore;\r\n noAutoPull?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n const store = opts.store;\r\n if (store.mode() !== 'session' && tryLoadCollectionProject(store.rootDir())) {\r\n const ctx = await ensureCollectionSynced({ cwd: store.rootDir(), noAutoPull: opts.noAutoPull });\r\n const result = await applyOnline(\r\n ctx.collection.resourceId!,\r\n ctx.info,\r\n '先 collection publish / policy apply,然后 online',\r\n );\r\n savePlatformCollectionState(\n { ...ctx.collection, ...ctx.info, status: 1 },\n store.rootDir(),\n {},\n { remoteWriteConfirmed: true },\n );\n return result;\r\n }\r\n\r\n const ctx = await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const resourceId = ctx.resource.resourceId!;\r\n const info = await fetchResourceInfo(resourceId);\r\n const result = await applyOnline(resourceId, info, '先 publish 再 policy apply --from-file,然后 online');\r\n store.savePlatformFacts(\n { ...ctx.resource, ...info, status: 1 },\n { remoteWriteConfirmed: true },\n );\n return result;\r\n}\r\n\r\nexport async function offlineResource(opts: {\r\n store: ProjectStore;\r\n noAutoPull?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n const store = opts.store;\r\n if (store.mode() !== 'session' && tryLoadCollectionProject(store.rootDir())) {\r\n const ctx = await ensureCollectionSynced({ cwd: store.rootDir(), noAutoPull: opts.noAutoPull });\r\n await FServiceAPI.Resource.update({\r\n resourceId: ctx.collection.resourceId!,\r\n status: 4,\r\n } as unknown as Parameters<typeof FServiceAPI.Resource.update>[0]);\r\n savePlatformCollectionState(\n { ...ctx.collection, ...ctx.info, status: 4 },\n store.rootDir(),\n {},\n { remoteWriteConfirmed: true },\n );\n return;\r\n }\r\n\r\n const ctx = await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n await FServiceAPI.Resource.update({\r\n resourceId: ctx.resource.resourceId!,\r\n status: 4,\r\n } as unknown as Parameters<typeof FServiceAPI.Resource.update>[0]);\r\n store.savePlatformFacts(\n { ...ctx.resource, ...ctx.info, status: 4 },\n { remoteWriteConfirmed: true },\n );\n}\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { t } from '../i18n/index.js';\r\nimport { resolveCwd, tryLoadCollectionProject } from '../config/project.js';\r\nimport { offlineResource, onlineResource } from '../services/onlineService.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport {\r\n finalizeSessionCommand,\r\n resolveSessionMaintenanceStore,\r\n} from '../services/store/index.js';\r\nimport { isInteractive } from '../core/tty.js';\r\nimport * as p from '@clack/prompts';\r\nimport { ensureSynced } from '../services/sync/index.js';\r\nimport { ensureCollectionSynced } from '../services/collection/index.js';\r\nimport {\r\n printPreflightLines,\r\n summarizeOnlineGates,\r\n} from '../services/preflightSummary.js';\r\n\r\nexport const onlineCommand = defineCommand({\r\n meta: { name: 'online', description: '严格上架(须 latestVersion + 启用策略)' },\r\n args: cliWriteCommandArgs,\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const store = resolveSessionMaintenanceStore({\r\n cwd: resolveCwd(args.cwd),\r\n session: args.session,\r\n 'resource-id': args['resource-id'],\r\n });\r\n\r\n if (!args.yes && isInteractive(args.yes)) {\r\n let info;\r\n if (store.mode() !== 'session' && tryLoadCollectionProject(store.rootDir())) {\r\n const ctx = await ensureCollectionSynced({\r\n cwd: store.rootDir(),\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n info = ctx.info;\r\n } else {\r\n const ctx = await ensureSynced({ store, noAutoPull: args['no-auto-pull'] });\r\n info = ctx.info;\r\n }\r\n printPreflightLines(summarizeOnlineGates(info).lines);\r\n const ok = await p.confirm({ message: '确认上架?' });\r\n if (p.isCancel(ok) || !ok) {\r\n consola.info('已取消');\r\n process.exitCode = 0;\r\n return;\r\n }\r\n } else if (!args.yes && !isInteractive(args.yes)) {\r\n throw cliError(I18N_KEYS.non_interactive_online_needs_yes, { code: 4 });\r\n }\r\n\r\n const result = await onlineResource({\r\n store,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: args['export-project'],\r\n result: { already: result.already },\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('online', payload);\r\n } else if (result.already) {\r\n consola.info('资源已是上架状态');\r\n } else {\r\n consola.success('已上架');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'online');\r\n }\r\n },\r\n});\r\n\r\nexport const offlineCommand = defineCommand({\r\n meta: { name: 'offline', description: '下架(status=4)' },\r\n args: cliWriteCommandArgs,\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n if (!args.yes && isInteractive(args.yes)) {\r\n consola.info(t(I18N_KEYS.remove_resource_from_auth_confirmation_title));\r\n const ok = await p.confirm({\r\n message: t(I18N_KEYS.confirm_msg_remove_resource_from_auth),\r\n });\r\n if (p.isCancel(ok) || !ok) {\r\n consola.info('已取消');\r\n process.exitCode = 0;\r\n return;\r\n }\r\n } else if (!args.yes && !isInteractive(args.yes)) {\r\n throw cliError(I18N_KEYS.non_interactive_offline_needs_yes, { code: 4 });\r\n }\r\n\r\n const store = resolveSessionMaintenanceStore({\r\n cwd: resolveCwd(args.cwd),\r\n session: args.session,\r\n 'resource-id': args['resource-id'],\r\n });\r\n await offlineResource({\r\n store,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: args['export-project'],\r\n result: {},\r\n });\r\n if (args.json) writeJsonSuccess('offline', payload);\r\n else consola.success('已下架');\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'offline');\r\n }\r\n },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { policyApplyFromFile, policyList, policySetStatus } from '../services/policyService.js';\r\nimport { policyInit } from '../services/scaffoldInit.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\nimport { cliReadCommandArgs, cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport {\r\n finalizeSessionCommand,\r\n resolveSessionMaintenanceStore,\r\n} from '../services/store/index.js';\r\n\r\nconst policyApply = defineCommand({\r\n meta: { name: 'apply', description: '从 --from-file 应用策略' },\r\n args: {\r\n 'from-file': { type: 'string', required: true, description: '策略 JSON 文件路径' },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const store = resolveSessionMaintenanceStore({\r\n cwd: resolveCwd(args.cwd),\r\n session: args.session,\r\n 'resource-id': args['resource-id'],\r\n });\r\n const items = await policyApplyFromFile({\r\n store,\r\n fromFile: args['from-file'],\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: args['export-project'],\r\n result: { applied: items.length },\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('policy apply', payload);\r\n } else {\r\n consola.success(`已应用 ${items.length} 条策略`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst policyListCmd = defineCommand({\r\n meta: { name: 'list', description: '列出策略' },\r\n args: {\r\n ...cliReadCommandArgs,\r\n session: cliWriteCommandArgs.session,\r\n 'resource-id': cliWriteCommandArgs['resource-id'],\r\n 'export-project': cliWriteCommandArgs['export-project'],\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const store = resolveSessionMaintenanceStore({\r\n cwd: resolveCwd(args.cwd),\r\n session: args.session,\r\n 'resource-id': args['resource-id'],\r\n });\r\n const policies = await policyList({ store });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: args['export-project'],\r\n result: { policies },\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('policy list', payload);\r\n } else {\r\n for (const p of policies) {\r\n consola.info(`${p.policyId || '-'} ${p.policyName || '-'} status=${p.status}`);\r\n }\r\n if (!policies.length) consola.warn('无策略');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst policySetCmd = defineCommand({\r\n meta: { name: 'set', description: '启用或停用策略' },\r\n args: {\r\n policyId: { type: 'positional', required: true, description: '策略 ID' },\r\n status: { type: 'string', required: true, description: '0=停用 | 1=启用' },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const status = Number(args.status);\r\n if (status !== 0 && status !== 1) {\r\n throw cliError(I18N_KEYS.status_must_be_0_or_1, { code: 4 });\r\n }\r\n const store = resolveSessionMaintenanceStore({\r\n cwd: resolveCwd(args.cwd),\r\n session: args.session,\r\n 'resource-id': args['resource-id'],\r\n });\r\n await policySetStatus({\r\n store,\r\n policyId: String(args.policyId),\r\n status,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: args['export-project'],\r\n result: { policyId: String(args.policyId), status },\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('policy set', payload);\r\n } else {\r\n consola.success(`${status === 1 ? '已启用' : '已停用'} ${String(args.policyId)}`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const policyCommand = defineCommand({\r\n meta: { name: 'policy', description: '策略管理' },\r\n subCommands: {\r\n init: policyInit,\r\n apply: policyApply,\r\n list: policyListCmd,\r\n set: policySetCmd,\r\n },\r\n});\r\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { consola } from 'consola';\nimport {\n inheritDataFromVersionConfig,\n handleFilePropertiesBySha1,\n} from './fileProperty/index.js';\nimport { assertResourceTypeCode } from './typeService.js';\nimport { describeTypeFileSizeLimit } from './resourceTypeCapabilities.js';\nimport type { VersionProject } from '../config/project.js';\n\n/** TTY:选定发布文件后提示类型大小上限与必填属性 key(只读,不编辑) */\nexport async function infoPublishFileConstraints(opts: {\n cwd: string;\n filePath: string;\n resourceTypeCode: string;\n versionConfig?: VersionProject;\n}): Promise<void> {\n const absPath = path.isAbsolute(opts.filePath)\n ? opts.filePath\n : path.resolve(opts.cwd, opts.filePath);\n if (!fs.existsSync(absPath)) return;\n\n const typeInfo = await assertResourceTypeCode(opts.resourceTypeCode);\n const sizeHint = describeTypeFileSizeLimit(typeInfo);\n if (sizeHint) consola.info(sizeHint);\n\n const inheritData = inheritDataFromVersionConfig(opts.versionConfig || {});\n try {\n const handleResult = await handleFilePropertiesBySha1({\n sha1: '',\n resourceTypeCode: opts.resourceTypeCode,\n inheritData,\n });\n if (handleResult.state !== 'success') return;\n\n const systemKeys = handleResult.systemProperties\n .filter((item) => item.type === 'additional')\n .map((item) => item.key);\n const customKeys = [\n ...handleResult.customConfigurations.map((item) => item.key),\n ...handleResult.customProperties.map((item) => item.key),\n ];\n const required = [...systemKeys, ...customKeys].filter(Boolean);\n if (required.length) {\n consola.info(`该类型可能需补充的属性 key:${required.join(', ')}`);\n consola.info('可在 manifest 的 inputAttrs / customPropertyDescriptors 中预填');\n }\n } catch {\n // 解析失败保持现有 publish 路径 code 4,TTY 仅作提示\n }\n}\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { publishVersion } from '../services/resource/index.js';\r\nimport { applyReuseVersionIntent } from '../services/resource/reuseVersionIntent.js';\r\nimport { ensureSynced } from '../services/sync/index.js';\r\nimport { projectStoreFromCwd } from '../services/store/index.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { computeBumpedVersion } from '../services/resource/publishVersion.js';\r\nimport { isInteractive } from '../core/tty.js';\r\nimport { infoPublishFileConstraints } from '../services/publishFileHints.js';\r\n\r\nexport const publishCommand = defineCommand({\r\n meta: { name: 'publish', description: '正式发行版本(sha1 → Storage → createVersion)' },\r\n args: {\r\n 'dry-run': {\r\n type: 'boolean',\r\n description: '解析属性并输出 createVersion 请求体,不上传/不写平台',\r\n },\r\n bump: { type: 'boolean', description: '基于平台 latestVersion 自动升 patch 再发行' },\r\n version: { type: 'string', description: '目标 semver;省略时沿用 manifest.version' },\r\n description: { type: 'string', description: '版本描述(reuse 时覆盖平台描述)' },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const store = projectStoreFromCwd(resolveCwd(args.cwd));\r\n const reuseVersion = typeof args['reuse-version'] === 'string' ? args['reuse-version'] : undefined;\r\n const requestedVersion = typeof args.version === 'string' ? args.version : undefined;\r\n const description = typeof args.description === 'string' ? args.description : undefined;\r\n if (reuseVersion) {\r\n const ctx = await ensureSynced({ store, noAutoPull: args['no-auto-pull'] });\r\n const resourceId = ctx.resource.resourceId!;\r\n let targetVersion = requestedVersion?.trim() || store.tryLoadVersion()?.version?.trim();\r\n if (args.bump) {\r\n targetVersion = computeBumpedVersion(ctx.info.latestVersion);\r\n }\r\n if (!targetVersion) {\r\n throw cliError(I18N_KEYS.manifest_version_missing, {\r\n code: 4,\r\n hint: '传 --version 或 --bump',\r\n });\r\n }\r\n await applyReuseVersionIntent({\r\n store,\r\n resourceId,\r\n resourceName: ctx.resource.resourceName,\r\n resourceTypeCode: ctx.resource.resourceTypeCode,\r\n userId: ctx.resource.userId,\r\n username: ctx.resource.username,\r\n reuseVersion,\r\n targetVersion,\r\n description,\r\n noInheritDeps: args['no-inherit-deps'],\r\n });\r\n }\r\n if (!args['dry-run'] && isInteractive(args.yes)) {\r\n const versionCfg = store.tryLoadVersion();\r\n if (versionCfg?.filePath?.trim()) {\r\n const resourceCfg = store.loadResource();\r\n if (resourceCfg.resourceTypeCode) {\r\n await infoPublishFileConstraints({\r\n cwd: resolveCwd(args.cwd),\r\n filePath: versionCfg.filePath,\r\n resourceTypeCode: resourceCfg.resourceTypeCode,\r\n versionConfig: versionCfg,\r\n });\r\n }\r\n }\r\n }\r\n const result = await publishVersion({\r\n store,\r\n noAutoPull: args['no-auto-pull'],\r\n bump: args.bump && !reuseVersion,\r\n dryRun: args['dry-run'],\r\n debug: args.debug,\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('publish', result);\r\n } else {\r\n consola.success(\r\n `已发行 ${result.version}(${result.filename},sha1=${result.fileSha1.slice(0, 12)}…)`,\r\n );\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'publish');\r\n }\r\n },\r\n});\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { findProjectFilePath, resolveCwd } from '../config/project.js';\r\nimport { cliReadCommandArgs } from '../core/cliArgs.js';\r\nimport { pullResourceToLocal } from '../services/sync/index.js';\r\nimport { projectStoreFromCwd } from '../services/store/index.js';\r\nimport { pullCollection } from '../services/collection/index.js';\r\n\r\nexport const pullCommand = defineCommand({\r\n meta: { name: 'pull', description: '平台 → 本地缓存(含 owner)' },\r\n args: {\r\n version: { type: 'string', description: '写入本地版本意图为该版本号' },\r\n collection: {\r\n type: 'boolean',\r\n description: '合集 pull(info + catalogue draft + collectRules)',\r\n },\r\n all: {\r\n type: 'boolean',\r\n description: '对 cwd 下各子目录(含 manifest/state)逐个 pull',\r\n },\r\n 'apply-listing': {\r\n type: 'boolean',\r\n description: '将平台 listing 显式写回 manifest.resource',\r\n },\r\n force: {\r\n type: 'boolean',\r\n description: '与 --apply-listing 配合,允许覆盖本地 listing 意图',\r\n },\r\n ...cliReadCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n\r\n if (args.all) {\r\n if (args.collection) {\r\n throw cliError(I18N_KEYS.all_and_collection_mutually_exclusive, { code: 4 });\r\n }\r\n const entries = fs.readdirSync(cwd, { withFileTypes: true }).filter((d) => d.isDirectory());\r\n const results: Array<{ dir: string; ok: boolean; resourceId?: string; error?: string }> = [];\r\n for (const ent of entries) {\r\n const sub = path.join(cwd, ent.name);\r\n if (!findProjectFilePath('resource', sub)) continue;\r\n try {\r\n const pulled = await pullResourceToLocal({\r\n store: projectStoreFromCwd(sub),\r\n version: args.version,\r\n applyListing: args['apply-listing'],\r\n force: args.force,\r\n });\r\n results.push({ dir: ent.name, ok: true, resourceId: pulled.resource.resourceId });\r\n } catch (error) {\r\n results.push({\r\n dir: ent.name,\r\n ok: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n }\r\n if (results.length === 0) {\r\n throw cliError(I18N_KEYS.no_child_manifest_dir, { code: 4 });\r\n }\r\n if (args.json) {\r\n writeJsonSuccess('pull', { results }, { ok: results.every((r) => r.ok) });\r\n } else {\r\n for (const r of results) {\r\n if (r.ok) consola.success(`${r.dir}: ${r.resourceId}`);\r\n else consola.error(`${r.dir}: ${r.error}`);\r\n }\r\n }\r\n if (results.some((r) => !r.ok)) process.exitCode = 1;\r\n return;\r\n }\r\n\r\n if (args.collection) {\r\n const result = await pullCollection({\r\n cwd,\r\n applyListing: args['apply-listing'],\r\n force: args.force,\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('pull', {\r\n resourceId: result.collection.resourceId,\r\n userId: result.collection.userId,\r\n username: result.collection.username,\r\n itemCount: Array.isArray(result.catalogueItems)\r\n ? result.catalogueItems.length\r\n : 0,\r\n });\r\n } else {\r\n consola.success(\r\n `已 pull 合集 ${result.collection.resourceId}(owner=${result.collection.username}/${result.collection.userId})`,\r\n );\r\n }\r\n return;\r\n }\r\n\r\n const result = await pullResourceToLocal({\r\n store: projectStoreFromCwd(cwd),\r\n version: args.version,\r\n applyListing: args['apply-listing'],\r\n force: args.force,\r\n });\r\n if (args.json) {\r\n writeJsonSuccess('pull', {\r\n resourceId: result.resource.resourceId,\r\n userId: result.resource.userId,\r\n username: result.resource.username,\r\n latestVersion: result.info.latestVersion,\r\n localVersion: result.version?.version ?? null,\r\n });\r\n } else {\r\n consola.success(\r\n `已 pull ${result.resource.resourceId}(owner=${result.resource.username}/${result.resource.userId})`,\r\n );\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import { execSync } from 'node:child_process';\r\n\r\n/** 取最近一次 git commit 正文,用作 publish description */\r\nexport function readLatestGitCommitMessage(cwd: string): string | null {\r\n try {\r\n const msg = execSync('git log -1 --pretty=%B', {\r\n cwd,\r\n encoding: 'utf8',\r\n stdio: ['ignore', 'pipe', 'ignore'],\r\n }).trim();\r\n return msg || null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import semver from 'semver';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { assertSemverLike } from './validation.js';\r\n\r\nexport type BumpLevel = 'patch' | 'minor' | 'major';\r\n\r\n/** 基于当前 manifest 版本或平台 latest 计算下一版本(仅改 manifest,不调 API) */\r\nexport function computeManifestBumpVersion(opts: {\r\n currentVersion: string;\r\n latestPlatform?: string | null;\r\n level: BumpLevel;\r\n}): string {\r\n const { currentVersion, latestPlatform, level } = opts;\r\n assertSemverLike(currentVersion);\r\n\r\n const base = semver.valid(currentVersion)\r\n ? currentVersion\r\n : latestPlatform && semver.valid(latestPlatform)\r\n ? latestPlatform\r\n : '1.0.0';\r\n\r\n const next = semver.inc(base, level);\r\n if (!next) {\r\n throw cliError(I18N_KEYS.bump_version_compute_failed, {\r\n code: 4,\r\n params: { version: base },\r\n });\r\n }\r\n\r\n if (latestPlatform && semver.valid(latestPlatform) && !semver.gt(next, latestPlatform)) {\r\n throw cliError(I18N_KEYS.freelog_versioning, {\r\n code: 4,\r\n hint: `bump 后 ${next} 须大于平台 latest ${latestPlatform}`,\r\n });\r\n }\r\n\r\n return next;\r\n}\r\n","import { execSync } from 'node:child_process';\n\nimport { resolveCwd, tryLoadCollectionProject, loadVersionProject, saveVersionProject } from '../config/project.js';\nimport { assertExplicitEnvForWriteOperation } from '../core/command.js';\nimport { I18N_KEYS } from '../i18n/bundled.js';\nimport { cliError } from '../i18n/cliError.js';\nimport { collectionPublish } from './collection/index.js';\nimport { collectionVersionSet } from './collection/maintenance.js';\nimport { readLatestGitCommitMessage } from './gitChangelog.js';\nimport { onlineResource } from './onlineService.js';\nimport { ensureSyncedReadOnly, publishVersion } from './resource/publishVersion.js';\nimport { ensureSynced } from './sync/index.js';\nimport { projectStoreFromCwd } from './store/projectStore.js';\nimport { validateProject } from './validateService.js';\nimport { computeManifestBumpVersion, type BumpLevel } from './versionBumpService.js';\n\nexport interface ReleaseResult {\n validated: boolean;\n validatedAfterBuild?: boolean;\n built: boolean;\n buildPlanned?: boolean;\n bumped?: string;\n changelogFromGit?: string;\n published?: Awaited<ReturnType<typeof publishVersion>> | Awaited<ReturnType<typeof collectionPublish>>;\n online?: Awaited<ReturnType<typeof onlineResource>>;\n subject: 'resource' | 'collection';\n}\n\nfunction parseBumpArg(bump: boolean | string | undefined): BumpLevel | false {\n if (!bump) return false;\n if (bump === true) return 'patch';\n const raw = String(bump).toLowerCase();\n if (raw === 'patch' || raw === 'minor' || raw === 'major') return raw;\n throw cliError(I18N_KEYS.bump_level_invalid, { code: 4 });\n}\n\nfunction runBuildCommand(cwd: string, cmd: string): void {\n execSync(cmd, { cwd, stdio: 'inherit' });\n}\n\nasync function applyChangelogFromGit(\n cwd: string,\n isCollection: boolean,\n dryRun = false,\n): Promise<string | undefined> {\n const message = readLatestGitCommitMessage(cwd);\n if (!message) return undefined;\n if (dryRun) return message;\n\n if (isCollection) {\n await collectionVersionSet({ cwd, description: message });\n } else {\n const { data } = loadVersionProject(cwd);\n saveVersionProject({ ...data, description: message }, cwd);\n }\n return message;\n}\n\nexport async function releaseProject(opts: {\n cwd?: string;\n bump?: boolean | string;\n 'build-cmd'?: string;\n online?: boolean;\n skipValidate?: boolean;\n dryRun?: boolean;\n noAutoPull?: boolean;\n yes?: boolean;\n debug?: boolean;\n changelogFromGit?: boolean;\n}): Promise<ReleaseResult> {\n if (!opts.dryRun) assertExplicitEnvForWriteOperation();\n\n const cwd = resolveCwd(opts.cwd);\n const store = projectStoreFromCwd(cwd);\n const isCollection = Boolean(tryLoadCollectionProject(cwd));\n const result: ReleaseResult = {\n validated: false,\n built: false,\n subject: isCollection ? 'collection' : 'resource',\n };\n let plannedVersion: string | undefined;\n let plannedDescription: string | undefined;\n\n // 先形成 bump 后的目标版本,并用它做预检;校验通过前不写 manifest。\n const bumpLevel = parseBumpArg(opts.bump);\n if (bumpLevel && isCollection) {\n throw cliError(I18N_KEYS.collection_fixed_version, {\n code: 4,\n hint: '合集固定版本,release 不支持 --bump;可用 collection version set --description',\n });\n }\n if (bumpLevel) {\n const ctx = opts.dryRun\n ? await ensureSyncedReadOnly({ store })\n : await ensureSynced({ store, noAutoPull: opts.noAutoPull });\n const { data } = loadVersionProject(cwd);\n plannedVersion = computeManifestBumpVersion({\n currentVersion: data.version || ctx.info.latestVersion || '1.0.0',\n latestPlatform: ctx.info.latestVersion,\n level: bumpLevel,\n });\n result.bumped = plannedVersion;\n }\n\n // release 先完成 publish;online 动态门禁在 publish 成功后由 onlineResource 执行。\n const validateTarget = 'publish' as const;\n if (!opts.skipValidate) {\n const validation = await validateProject({\n cwd,\n target: validateTarget,\n skipArtifactChecks: Boolean(opts['build-cmd']),\n versionOverride: plannedVersion,\n });\n if (!validation.ok) {\n throw cliError(I18N_KEYS.release_preflight_failed, {\n code: 4,\n hint: `freelog-cli validate --for ${validateTarget} 查看详情`,\n details: { checks: validation.checks.filter((check) => check.level === 'error') },\n });\n }\n result.validated = true;\n }\n\n if (opts['build-cmd']) {\n if (opts.dryRun) {\n result.buildPlanned = true;\n } else {\n runBuildCommand(cwd, opts['build-cmd']);\n result.built = true;\n if (!opts.skipValidate) {\n const validation = await validateProject({\n cwd,\n target: validateTarget,\n versionOverride: plannedVersion,\n });\n if (!validation.ok) {\n throw cliError(I18N_KEYS.release_preflight_failed, {\n code: 4,\n hint: `build 已完成,但产物校验失败;运行 freelog-cli validate --for ${validateTarget} 查看详情`,\n details: { checks: validation.checks.filter((check) => check.level === 'error') },\n });\n }\n result.validatedAfterBuild = true;\n }\n }\n }\n\n if (bumpLevel && plannedVersion && !opts.dryRun) {\n const { data } = loadVersionProject(cwd);\n saveVersionProject({ ...data, version: plannedVersion }, cwd);\n }\n\n if (opts.changelogFromGit) {\n result.changelogFromGit = await applyChangelogFromGit(cwd, isCollection, opts.dryRun);\n if (opts.dryRun && !isCollection) plannedDescription = result.changelogFromGit;\n }\n\n if (isCollection) {\n result.published = await collectionPublish({\n cwd,\n noAutoPull: opts.noAutoPull,\n dryRun: opts.dryRun,\n });\n } else {\n result.published = await publishVersion({\n store,\n noAutoPull: opts.noAutoPull,\n bump: false,\n dryRun: opts.dryRun,\n debug: opts.debug,\n versionOverride: plannedVersion,\n descriptionOverride: plannedDescription,\n });\n }\n\n if (opts.online && !opts.dryRun) {\n result.online = await onlineResource({ store, noAutoPull: opts.noAutoPull });\n }\n\n return result;\n}\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { releaseProject } from '../services/releaseService.js';\r\n\r\nexport const releaseCommand = defineCommand({\r\n meta: {\r\n name: 'release',\r\n description: '发版流水线:validate → 可选 build → bump → publish → 可选 online',\r\n },\r\n args: {\r\n bump: {\r\n type: 'string',\r\n description: '升版本:patch|minor|major',\r\n },\r\n 'build-cmd': { type: 'string', description: '发布前执行的本地命令,如 npm run build' },\r\n online: { type: 'boolean', description: 'publish 成功后执行 online' },\r\n 'skip-validate': { type: 'boolean', description: '跳过 validate 预检' },\r\n 'dry-run': { type: 'boolean', description: '仅 publish dry-run(不实际上线)' },\r\n 'changelog-from-git': {\r\n type: 'boolean',\r\n description: '用最近一次 git commit 正文作为 publish description',\r\n },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const bumpRaw = args.bump;\r\n const bump =\r\n bumpRaw === undefined\r\n ? false\r\n : bumpRaw === 'true' || bumpRaw === '1'\r\n ? true\r\n : bumpRaw;\r\n\r\n const result = await releaseProject({\r\n cwd: resolveCwd(args.cwd),\r\n bump,\r\n 'build-cmd': args['build-cmd'],\r\n online: args.online,\r\n skipValidate: args['skip-validate'],\r\n dryRun: args['dry-run'],\r\n noAutoPull: args['no-auto-pull'],\r\n yes: args.yes,\r\n debug: args.debug,\r\n changelogFromGit: args['changelog-from-git'],\r\n });\r\n\r\n if (args.json) {\r\n writeJsonSuccess('release', result);\r\n return;\r\n }\r\n\r\n if (result.validated) consola.success('预检通过');\r\n if (result.built) consola.success('build 完成');\r\n if (result.validatedAfterBuild) consola.success('build 产物复检通过');\r\n if (result.bumped) consola.success(`已 bump 版本 → ${result.bumped}`);\r\n if (result.changelogFromGit) {\r\n consola.success(`已写入 changelog(git): ${result.changelogFromGit.split('\\n')[0]}`);\r\n }\r\n if (result.published) {\r\n if (result.subject === 'collection') {\r\n const coll = result.published as { itemCount?: number; dryRun?: boolean };\r\n consola.success(\r\n args['dry-run']\r\n ? '合集 dry-run 完成'\r\n : `已发布合集(draft items=${coll.itemCount ?? '?'})`,\r\n );\r\n } else {\r\n const pub = result.published as {\r\n version?: string;\r\n filename?: string;\r\n stages?: { package?: string; upload?: string; properties?: string; platformWrite?: string };\r\n };\r\n consola.success(\r\n args['dry-run']\r\n ? 'dry-run 完成'\r\n : `已发行 ${pub.version}(${pub.filename})`,\r\n );\r\n if (pub.stages) {\r\n consola.info(\r\n `阶段:package=${pub.stages.package} upload=${pub.stages.upload} properties=${pub.stages.properties} platformWrite=${pub.stages.platformWrite}`,\r\n );\r\n }\r\n }\r\n }\r\n if (result.online) {\r\n consola.success(result.online.already ? '资源已在上架状态' : '已上架');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import * as p from '@clack/prompts';\r\nimport { consola } from 'consola';\r\nimport path from 'node:path';\r\nimport { requireAuth } from '../core/auth.js';\r\nimport { createFromDir } from './batch/index.js';\r\nimport { clackTextField } from './shared/fieldConstraints.js';\r\nimport { formatMediaDirHint, scanMediaDir } from './mediaDirScan.js';\r\nimport { pickResourceTypeForCategory } from './init/index.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\nexport interface BatchImportWizardResult {\r\n dir: string;\r\n resourceTypeCode: string;\r\n createdCount: number;\r\n items: Array<{ subdir: string; resourceId: string; resourceName: string }>;\r\n}\r\n\r\nexport async function runBatchImportWizard(opts: {\r\n cwd: string;\r\n dir?: string;\r\n yes?: boolean;\r\n}): Promise<BatchImportWizardResult> {\r\n requireAuth();\r\n\r\n let mediaDir = opts.dir?.trim();\r\n if (!mediaDir) {\r\n const input = await p.text({\r\n message: '请输入媒体文件夹路径(顶层每个文件将变成一个独立资源)',\r\n validate: (v) => (v?.trim() ? undefined : '路径不能为空'),\r\n });\r\n if (p.isCancel(input)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\r\n mediaDir = String(input).trim();\r\n }\r\n\r\n const absDir = path.isAbsolute(mediaDir) ? mediaDir : path.resolve(opts.cwd, mediaDir);\r\n const scan = scanMediaDir(absDir);\r\n const hint = formatMediaDirHint(scan);\r\n if (hint) consola.info(hint);\r\n if (scan.mediaFiles === 0) {\r\n throw cliError(I18N_KEYS.no_importable_media_in_dir, {\r\n code: 4,\r\n hint: 'import-dir 只处理顶层文件;支持 jpg/png/mp4 等',\r\n });\r\n }\r\n\r\n consola.info(`将导入 ${scan.mediaFiles} 个文件为 ${scan.mediaFiles} 个独立资源`);\r\n\r\n if (!opts.yes) {\r\n const ok = await p.confirm({\r\n message: `确认批量导入 ${scan.mediaFiles} 个文件?`,\r\n initialValue: true,\r\n });\r\n if (p.isCancel(ok) || !ok) throw cliError(I18N_KEYS.cancelled_batch_import, { code: 4 });\r\n }\r\n\r\n const picked = await pickResourceTypeForCategory('other');\r\n consola.success(`条目资源类型: ${picked.pathLabel} (${picked.code})`);\r\n\r\n const titlePrefix = await p.text(\r\n clackTextField('FORM-BATCH-TITLE', { defaultValue: '' }),\r\n );\r\n if (p.isCancel(titlePrefix)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\r\n\r\n const created = await createFromDir({\r\n dir: absDir,\r\n typeCode: picked.code,\r\n resourceTypeName: picked.name,\r\n titlePrefix: String(titlePrefix).trim() || undefined,\r\n cwd: opts.cwd,\r\n yes: true,\r\n });\r\n\r\n consola.info('下一步(每个子目录可单独 policy/online,或批量配置 freelog.batch.json):');\r\n consola.info(' freelog-cli policy apply --from-file ./policy.free.json --cwd <子目录> --yes --env dev');\r\n consola.info(' 部分失败时使用 .freelog/reports/<runId>.json 配合 --retry / --resume');\r\n\r\n return {\r\n dir: absDir,\r\n resourceTypeCode: picked.code,\r\n createdCount: created.length,\r\n items: created.map((c) => ({\r\n subdir: c.subdir,\r\n resourceId: c.resourceId,\r\n resourceName: c.resourceName,\r\n })),\r\n };\r\n}\r\n","import { requireAuth } from '../core/auth.js';\r\nimport { FServiceAPI, unwrapData } from '../platform/index.js';\r\n\r\nexport interface ResourceSearchHit {\r\n resourceId: string;\r\n resourceName: string;\r\n resourceTitle?: string;\r\n resourceTypeCode?: string;\r\n status?: number;\r\n latestVersion?: string | null;\r\n}\r\n\r\nexport async function searchResources(opts: {\r\n query: string;\r\n limit?: number;\r\n}): Promise<ResourceSearchHit[]> {\r\n requireAuth();\r\n const q = opts.query.trim();\r\n if (!q) return [];\r\n\r\n const limit = Math.min(Math.max(opts.limit ?? 20, 1), 50);\r\n\r\n // 精确查询命中时直接返回;未命中时继续执行关键词列表查询。\n try {\r\n const envelope = await FServiceAPI.Resource.info({\r\n resourceIdOrName: q,\r\n isLoadLatestVersionInfo: 1,\r\n });\r\n const one = unwrapData<Record<string, unknown>>(envelope);\r\n if (one && typeof one === 'object' && one.resourceId) {\r\n return [mapHit(one)];\r\n }\r\n } catch {}\n\r\n const listEnvelope = await FServiceAPI.Resource.list({\r\n keywords: q,\r\n isSelf: 1,\r\n limit,\r\n isLoadLatestVersionInfo: 1,\r\n });\r\n const rows = unwrapData<unknown>(listEnvelope);\r\n const list = Array.isArray(rows) ? rows : [];\r\n return list\r\n .filter((row): row is Record<string, unknown> => Boolean(row && typeof row === 'object'))\r\n .map(mapHit);\r\n}\r\n\r\nfunction mapHit(row: Record<string, unknown>): ResourceSearchHit {\r\n return {\r\n resourceId: String(row.resourceId || ''),\r\n resourceName: String(row.resourceName || ''),\r\n resourceTitle: row.resourceTitle != null ? String(row.resourceTitle) : undefined,\r\n resourceTypeCode: row.resourceTypeCode != null ? String(row.resourceTypeCode) : undefined,\r\n status: row.status != null ? Number(row.status) : undefined,\r\n latestVersion:\r\n row.latestVersion != null ? String(row.latestVersion) : (row.latestVersion as null | undefined),\r\n };\r\n}\r\n","import path from 'node:path';\nimport { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport { applyCommandFlags, applyWriteCommandFlags, handleCommandError, writeJsonSuccess } from '../core/command.js';\nimport { cliJsonLinesArg, cliReadCommandArgs, cliWriteCommandArgs } from '../core/cliArgs.js';\nimport { resolveCwd } from '../config/project.js';\nimport type { ArtifactMode, RuntimeVersion } from '../config/project/types.js';\nimport { isInteractive } from '../core/tty.js';\nimport { createFromDir, createBatchProgressFormatter } from '../services/batch/index.js';\nimport { runBatchImportWizard } from '../services/batchImportWizard.js';\nimport { searchResources } from '../services/resourceSearchService.js';\nimport { assertResourceTypeCode } from '../services/typeService.js';\nimport {\n applySessionPublishIntent,\n createThenPublish,\n publishVersion,\n} from '../services/resource/index.js';\nimport { updateListing } from '../services/resourceService.js';\nimport {\n assertSessionMode,\n finalizeSessionCommand,\n resolveCommandProjectStore,\n} from '../services/store/index.js';\nimport { cliError } from '../i18n/cliError.js';\nimport { I18N_KEYS } from '../i18n/bundled.js';\n\nconst importDirCommand = defineCommand({\n meta: {\n name: 'import-dir',\n description: '把目录内文件发布成多个独立资源',\n },\n args: {\n dir: { type: 'positional', required: false, description: '文件目录;--resume/--retry 时可省略' },\n 'resource-type': { type: 'string', description: 'resourceTypeCode;也可写在 --config defaults.resourceTypeCode' },\n 'resource-type-name': { type: 'string', description: '自定义资源类型名(可选)' },\n 'title-prefix': { type: 'string', description: '资源标题前缀' },\n config: { type: 'string', description: 'freelog.batch.json/yaml;默认自动发现目录内同名文件' },\n resume: { type: 'string', description: '从正式批量报告的最后安全阶段继续' },\n retry: { type: 'string', description: '只重新执行正式批量报告中的失败项' },\n 'strict-batch-limit': {\n type: 'boolean',\n description: '与 Console UI 一致:单次最多 20 个文件,超限报错(默认自动分 batch 并 warn)',\n },\n ...cliWriteCommandArgs,\n ...cliJsonLinesArg,\n },\n async run({ args }) {\n try {\n applyWriteCommandFlags(args);\n const cwd = resolveCwd(args.cwd);\n if (!args.dir && !args.resume && !args.retry) {\n throw new Error('请提供文件目录,或使用 --resume/--retry <report>');\n }\n if (args.resume && args.retry) throw new Error('--resume 与 --retry 不能同时使用');\n const dir = args.dir ? path.resolve(cwd, String(args.dir)) : cwd;\n\n if (!args['resource-type'] && !args.resume && !args.retry && isInteractive(args.yes)) {\n const batch = await runBatchImportWizard({\n cwd,\n dir: String(args.dir),\n yes: Boolean(args.yes),\n });\n if (args.json) {\n writeJsonSuccess('resource import-dir', batch);\n } else {\n consola.success(`已从目录导入 ${batch.createdCount} 个独立资源`);\n for (const item of batch.items) {\n consola.info(`${item.subdir} ${item.resourceId} ${item.resourceName}`);\n }\n }\n return;\n }\n\n if (args['resource-type']) await assertResourceTypeCode(args['resource-type']);\n\n const jsonLines = Boolean(args['json-lines']);\n const formatProgress = createBatchProgressFormatter('resource import-dir');\n const onProgress = jsonLines\n ? (event: Parameters<typeof formatProgress>[0]) => {\n process.stdout.write(formatProgress(event));\n }\n : undefined;\n let reportFile: string | undefined;\n\n const created = await createFromDir({\n dir,\n typeCode: args['resource-type'],\n resourceTypeName: args['resource-type-name'],\n titlePrefix: args['title-prefix'],\n configFile: args.config,\n cwd,\n yes: Boolean(args.yes),\n strictBatchLimit: Boolean(args['strict-batch-limit']),\n onProgress,\n onReportCreated: (value) => {\n reportFile = value;\n },\n resumeReport: args.resume,\n retryReport: args.retry,\n });\n\n if (jsonLines) {\n return;\n }\n\n if (args.json) {\n writeJsonSuccess('resource import-dir', { created, reportFile });\n } else {\n consola.success(`已从目录导入 ${created.length} 个资源`);\n if (reportFile) consola.info(`正式报告: ${reportFile}`);\n for (const item of created) {\n consola.info(`${item.subdir} ${item.resourceId} ${item.resourceName}`);\n }\n }\n } catch (error) {\n handleCommandError(error, args.json);\n }\n },\n});\n\nconst searchCommand = defineCommand({\n meta: {\n name: 'search',\n description: '按关键词或授权名搜索当前账号下的资源',\n },\n args: {\n query: { type: 'positional', required: true, description: 'resourceId、授权名或标题关键词' },\n limit: { type: 'string', description: '最多返回条数(默认 20,最大 50)' },\n ...cliReadCommandArgs,\n },\n async run({ args }) {\n try {\n applyCommandFlags(args);\n const limit = args.limit ? Number(args.limit) : undefined;\n const hits = await searchResources({ query: String(args.query), limit });\n if (args.json) {\n writeJsonSuccess('resource search', { count: hits.length, items: hits });\n return;\n }\n if (!hits.length) {\n consola.warn('未找到匹配资源');\n return;\n }\n consola.info(`找到 ${hits.length} 个资源:`);\n for (const hit of hits) {\n consola.info(\n `${hit.resourceId} ${hit.resourceName} ${hit.resourceTitle || '—'} latest=${hit.latestVersion || '—'}`,\n );\n }\n consola.info('半路接入: freelog-cli bind <resourceId> --apply-listing');\n } catch (error) {\n handleCommandError(error, args.json);\n }\n },\n});\n\nconst publishCommand = defineCommand({\n meta: {\n name: 'publish',\n description: '会话模式正式发行(--session;工程目录请用顶层 publish)',\n },\n args: {\n file: { type: 'string', description: '发布文件或构建目录路径' },\n title: { type: 'string', description: '首发资源标题' },\n type: { type: 'string', description: '首发 resourceTypeCode' },\n name: { type: 'string', description: '首发短授权标识(可选)' },\n 'type-name': { type: 'string', description: '首发自定义类型名(可选)' },\n version: { type: 'string', description: 'semver 版本号' },\n bump: { type: 'boolean', description: '基于平台 latestVersion 自动升 patch' },\n description: { type: 'string', description: '版本说明' },\n 'video-cover': { type: 'string', description: '视频版本封面 URL 或本地路径' },\n 'artifact-mode': { type: 'string', description: 'file 或 directory-zip' },\n runtime: { type: 'string', description: '0.4 | 0.5(主题/插件)' },\n 'dry-run': {\n type: 'boolean',\n description: '解析属性并输出 createVersion 请求体,不上传/不写平台',\n },\n ...cliWriteCommandArgs,\n },\n async run({ args }) {\n try {\n assertSessionMode(args, '请使用 freelog-cli resource publish --session …');\n applyWriteCommandFlags(args);\n\n const cwd = resolveCwd(args.cwd);\n const store = resolveCommandProjectStore({\n cwd,\n session: true,\n 'resource-id': args['resource-id'],\n });\n\n const artifactMode =\n args['artifact-mode'] === 'directory-zip' || args['artifact-mode'] === 'file'\n ? (args['artifact-mode'] as ArtifactMode)\n : undefined;\n const runtime =\n args.runtime === '0.4' || args.runtime === '0.5'\n ? (args.runtime as RuntimeVersion)\n : undefined;\n\n const publishOpts = {\n store,\n noAutoPull: args['no-auto-pull'],\n dryRun: args['dry-run'],\n debug: args.debug,\n };\n\n let result;\n if (args['resource-id']) {\n await applySessionPublishIntent({\n store,\n file: args.file,\n reuseVersion: args['reuse-version'],\n version: args.version,\n bump: args.bump,\n description: args.description,\n videoCover: args['video-cover'],\n artifactMode,\n runtime,\n noInheritDeps: args['no-inherit-deps'],\n });\n result = await publishVersion(publishOpts);\n } else {\n result = await createThenPublish({\n title: args.title,\n typeCode: args.type,\n name: args.name,\n resourceTypeName: args['type-name'],\n file: args.file,\n version: args.version,\n bump: args.bump,\n description: args.description,\n videoCover: args['video-cover'],\n artifactMode,\n runtime,\n ...publishOpts,\n });\n }\n\n const payload = finalizeSessionCommand({\n store,\n exportProject: args['export-project'],\n result: { ...result, resourceName: store.loadResource().resourceName },\n });\n\n if (args.json) {\n writeJsonSuccess('resource publish', payload);\n } else {\n consola.success(\n `已发行 ${result.version}(${result.filename},sha1=${result.fileSha1.slice(0, 12)}…,session)`,\n );\n }\n } catch (error) {\n handleCommandError(error, args.json, 'resource publish');\n }\n },\n});\n\nconst updateCommand = defineCommand({\n meta: {\n name: 'update',\n description: '会话模式更新 listing(--session;工程目录请用顶层 update)',\n },\n args: {\n title: { type: 'string', description: '资源标题' },\n intro: { type: 'string', description: '简介(最多 200 字)' },\n cover: { type: 'string', description: '封面本地路径或 URL' },\n tags: { type: 'string', description: '逗号分隔 tags' },\n ...cliWriteCommandArgs,\n },\n async run({ args }) {\n try {\n assertSessionMode(args, '请使用 freelog-cli resource update --session …');\n applyWriteCommandFlags(args);\n if (!args['resource-id']?.trim()) {\n throw cliError(I18N_KEYS.session_resource_id_required, { code: 4 });\n }\n if (!args.title && args.intro === undefined && !args.cover && !args.tags) {\n throw cliError(I18N_KEYS.update_at_least_one_field, { code: 4 });\n }\n\n const store = resolveCommandProjectStore({\n cwd: resolveCwd(args.cwd),\n session: true,\n 'resource-id': args['resource-id'],\n });\n const data = await updateListing({\n store,\n title: args.title,\n intro: args.intro,\n cover: args.cover,\n tags: args.tags ? args.tags.split(',').map((t) => t.trim()).filter(Boolean) : undefined,\n noAutoPull: args['no-auto-pull'],\n });\n\n const payload = finalizeSessionCommand({\n store,\n exportProject: args['export-project'],\n result: { resource: data },\n });\n if (args.json) writeJsonSuccess('resource update', payload);\n else consola.success('已更新 listing(session)');\n } catch (error) {\n handleCommandError(error, args.json, 'resource update');\n }\n },\n});\n\nexport const resourceCommand = defineCommand({\n meta: { name: 'resource', description: '资源批量导入、搜索与会话维护' },\n subCommands: {\n 'import-dir': importDirCommand,\n search: searchCommand,\n publish: publishCommand,\n update: updateCommand,\n },\n});\n","import { tryLoadResourceProject } from '../../config/project.js';\nimport { requireAuth } from '../../core/auth.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { assertOwnerMatch } from '../shared/owner.js';\nimport { EphemeralStore } from '../store/ephemeralStore.js';\nimport { projectStoreFromCwd } from '../store/projectStore.js';\nimport type { ProjectStore } from '../store/types.js';\n\nexport interface InteractiveContext {\n mode: 'session' | 'studio';\n resourceId?: string;\n resourceTitle?: string;\n store: ProjectStore;\n workspaceRoot?: string;\n activeProjectDir?: string;\n}\n\nexport function createSessionStore(resourceId?: string): EphemeralStore {\n return new EphemeralStore({\n resourceId: resourceId?.trim() || undefined,\n });\n}\n\nexport function createSessionContext(resourceId?: string): InteractiveContext {\n return {\n mode: 'session',\n resourceId: resourceId?.trim() || undefined,\n store: createSessionStore(resourceId),\n };\n}\n\nexport function rebindSessionStore(ctx: InteractiveContext, resourceId?: string): void {\n const trimmed = resourceId?.trim() || undefined;\n ctx.store = createSessionStore(trimmed);\n ctx.resourceId = trimmed;\n ctx.resourceTitle = undefined;\n}\n\nexport function projectStoreForStudioDir(projectDir: string): ProjectStore {\n return projectStoreFromCwd(projectDir);\n}\n\n/** studio 维护:子工程 owner 须与当前 ephemeral 登录一致。 */\nexport function assertStudioOwner(projectDir: string): void {\n const loaded = tryLoadResourceProject(projectDir);\n if (!loaded?.data.resourceId) {\n throw cliError(I18N_KEYS.path_resource_invalid, {\n code: 2,\n hint: '选择含 manifest/state 的有效子工程',\n });\n }\n const auth = requireAuth();\n assertOwnerMatch({\n authUserId: auth.userId,\n authUsername: auth.username,\n platformUserId: loaded.data.userId,\n platformUsername: loaded.data.username,\n hint: '请切换账号(菜单 3)',\n });\n}\n","import * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport {\n authScopeLabel,\n getEphemeralAuth,\n setEphemeralAuth,\n type AuthInfo,\n} from '../../core/auth.js';\nimport { getCliEnv } from '../../core/env.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { isInteractive } from '../../core/tty.js';\nimport { fetchLoginAuth, isLoginTokenMissingError } from '../auth/loginFlow.js';\n\nexport async function promptEphemeralLogin(opts?: {\n loginName?: string;\n password?: string;\n yes?: boolean;\n}): Promise<AuthInfo> {\n let loginName = opts?.loginName?.trim();\n let password = opts?.password;\n\n if ((!loginName || !password) && isInteractive(opts?.yes)) {\n const answers = await p.group({\n loginName: () => p.text({ message: '登录名', defaultValue: loginName }),\n password: () => p.password({ message: '密码' }),\n });\n if (p.isCancel(answers)) {\n consola.info('已取消');\n process.exitCode = 0;\n throw new Error('interactive_cancelled');\n }\n loginName = String(answers.loginName);\n password = String(answers.password);\n }\n\n if (!loginName || !password) {\n throw cliError(I18N_KEYS.missing_login_credentials, {\n code: 4,\n hint: 'freelog-cli login --login-name <name> --password <pwd> --yes',\n });\n }\n\n try {\n const auth = await fetchLoginAuth(loginName, password);\n setEphemeralAuth(auth);\n consola.success(\n `已登录 ${auth.username || loginName}(${auth.environment},${authScopeLabel('ephemeral')})`,\n );\n return auth;\n } catch (error) {\n if (isLoginTokenMissingError(error)) {\n throw cliError(I18N_KEYS.login_response_missing_token, { code: 1 });\n }\n throw error;\n }\n}\n\n/** 确保 studio/session 进程内已有 ephemeral 凭据;绝不读取磁盘 auth。 */\nexport async function ensureEphemeralLogin(): Promise<AuthInfo> {\n const existing = getEphemeralAuth();\n if (existing?.token) {\n if (existing.environment !== getCliEnv()) {\n throw cliError(I18N_KEYS.login_env_mismatch, {\n code: 2,\n hint: `请在当前 ${getCliEnv()} 环境重新进行临时登录`,\n });\n }\n return existing;\n }\n return promptEphemeralLogin();\n}\n\nexport async function promptSwitchEphemeralAccount(): Promise<AuthInfo> {\n consola.info('切换账号:重新登录(凭据仍不落盘)');\n return promptEphemeralLogin();\n}\n\nexport function isInteractiveCancelled(error: unknown): boolean {\n return error instanceof Error && error.message === 'interactive_cancelled';\n}\n","import * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport { cliError } from '../i18n/cliError.js';\nimport { I18N_KEYS } from '../i18n/bundled.js';\nimport { ensureSynced } from './sync/index.js';\nimport type { ProjectStore } from './store/types.js';\nimport { isRssRelatedResource } from './collection/rssContract.js';\nimport { clackTextField, parseTagsCsv } from './shared/fieldConstraints.js';\n\nexport interface UpdateListingWizardResult {\n title?: string;\n intro?: string;\n cover?: string;\n tags?: string[];\n}\n\nconst LISTING_FIELD_OPTIONS = [\n { value: 'title' as const, label: '资源标题', hint: 'FORM-RES-TITLE' },\n { value: 'intro' as const, label: '简介', hint: 'FORM-LIST-INTRO' },\n { value: 'cover' as const, label: '封面', hint: 'FORM-LIST-COVER' },\n { value: 'tags' as const, label: '标签', hint: 'FORM-LIST-TAGS' },\n];\n\n/** TTY:RSS 预检 + 多选 listing 字段 prompt */\nexport async function runUpdateListingWizard(store: ProjectStore): Promise<UpdateListingWizardResult> {\n const ctx = await ensureSynced({ store });\n if (isRssRelatedResource(ctx.info)) {\n consola.info('RSS 资源内容由 feed 托管,不能修改标题、封面、标签或简介');\n throw cliError('RSS 托管资源不可编辑 listing', {\n code: 4,\n hint: '可使用 collection rss inspect/bind/sync 管理订阅源',\n });\n }\n\n const picked = await p.multiselect({\n message: '选择要更新的 listing 字段',\n options: LISTING_FIELD_OPTIONS,\n required: true,\n });\n if (p.isCancel(picked)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n\n const fields = new Set(picked as Array<'title' | 'intro' | 'cover' | 'tags'>);\n const result: UpdateListingWizardResult = {};\n\n if (fields.has('title')) {\n const answer = await p.text(\n clackTextField('FORM-RES-TITLE', { defaultValue: ctx.resource.resourceTitle || '' }),\n );\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.title = String(answer).trim();\n }\n if (fields.has('intro')) {\n const answer = await p.text(\n clackTextField('FORM-LIST-INTRO', { defaultValue: ctx.resource.intro || '' }),\n );\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.intro = String(answer);\n }\n if (fields.has('cover')) {\n const answer = await p.text(clackTextField('FORM-LIST-COVER'));\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.cover = String(answer).trim();\n }\n if (fields.has('tags')) {\n const defaultTags = (ctx.resource.tags || []).join(', ');\n const answer = await p.text(clackTextField('FORM-LIST-TAGS', { defaultValue: defaultTags }));\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n result.tags = parseTagsCsv(String(answer));\n }\n\n return result;\n}\n","import { assertExplicitEnvForWriteOperation } from '../core/command.js';\r\nimport { FServiceAPI, unwrapData } from '../platform/index.js';\r\nimport { ensureSynced } from './sync/index.js';\r\nimport type { ProjectStore } from './store/types.js';\r\nimport { assertSemverLike } from './validation.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { requireVersionProject } from './store/requireVersion.js';\r\nimport {\r\n fetchReleasedVersionProperties,\r\n mergeVersionPropertiesForSync,\r\n} from './versionPropertyService.js';\r\n\r\nexport async function editReleasedVersion(opts: {\r\n store: ProjectStore;\r\n version: string;\r\n description?: string;\r\n syncProperties?: boolean;\r\n noAutoPull?: boolean;\r\n}) {\r\n assertExplicitEnvForWriteOperation();\r\n if (!opts.version?.trim()) {\r\n throw cliError(I18N_KEYS.missing_version_flag, { code: 4 });\r\n }\r\n assertSemverLike(opts.version);\r\n\r\n const hasDescription = opts.description !== undefined;\r\n const hasSyncProperties = Boolean(opts.syncProperties);\n if (!hasDescription && !hasSyncProperties) {\n throw cliError(I18N_KEYS.version_edit_at_least_one_field, {\r\n code: 4,\r\n });\r\n }\r\n\r\n const store = opts.store;\r\n const ctx = await ensureSynced({ store, noAutoPull: opts.noAutoPull });\r\n const resourceId = ctx.resource.resourceId!;\r\n const versionCfg = requireVersionProject(store);\r\n\r\n let syncedInputAttrs: Array<{ key: string; value: string }> | undefined;\r\n let syncedCustomPropertyDescriptors:\r\n | Array<{\r\n key: string;\r\n name: string;\r\n defaultValue: string;\r\n type: 'editableText' | 'readonlyText' | 'radio' | 'checkbox' | 'select';\r\n candidateItems?: string[];\r\n remark?: string;\r\n }>\r\n | undefined;\r\n\r\n if (hasSyncProperties) {\r\n const platform = await fetchReleasedVersionProperties({\r\n resourceId,\r\n version: opts.version,\r\n });\r\n const merged = mergeVersionPropertiesForSync({\r\n platform,\r\n manifest: versionCfg,\r\n });\r\n syncedInputAttrs = merged.inputAttrs;\r\n syncedCustomPropertyDescriptors = merged.customPropertyDescriptors;\r\n }\r\n\r\n const params: Parameters<typeof FServiceAPI.Resource.updateResourceVersionInfo>[0] = {\r\n resourceId,\r\n version: opts.version,\r\n inputAttrs: hasSyncProperties ? syncedInputAttrs || [] : [],\r\n ...(hasDescription ? { description: opts.description } : {}),\r\n ...(hasSyncProperties\r\n ? {\r\n customPropertyDescriptors: syncedCustomPropertyDescriptors || [],\r\n }\r\n : {}),\r\n };\r\n\r\n const envelope = await FServiceAPI.Resource.updateResourceVersionInfo(params);\r\n\r\n const nextVersionCfg = {\r\n ...versionCfg,\r\n ...(hasDescription ? { description: opts.description } : {}),\r\n };\r\n if (hasSyncProperties) {\r\n nextVersionCfg.inputAttrs = syncedInputAttrs?.map((attr) => ({\r\n key: attr.key,\r\n value: attr.value,\r\n }));\r\n nextVersionCfg.customPropertyDescriptors = syncedCustomPropertyDescriptors?.map((desc) => ({\r\n type: desc.type,\r\n key: desc.key,\r\n name: desc.name,\r\n defaultValue: desc.defaultValue,\r\n candidateItems: desc.candidateItems,\r\n remark: desc.remark,\r\n }));\r\n }\r\n store.saveVersion(nextVersionCfg);\r\n\r\n return {\r\n resourceId,\r\n version: opts.version,\r\n data: unwrapData(envelope),\r\n ...(hasSyncProperties\r\n ? {\r\n syncedInputAttrKeys: syncedInputAttrs?.map((attr) => attr.key) || [],\r\n }\r\n : {}),\r\n };\r\n}\r\n","import * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport {\n assertExplicitEnvForWriteOperation,\n logAuthContextIfInteractive,\n} from '../../core/command.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { t } from '../../i18n/index.js';\n\n/** 交互壳写操作:显式 env + 当前账号提示 + clack confirm(非 --yes 语义)。 */\nexport async function confirmInteractiveWrite(message: string): Promise<boolean> {\n assertExplicitEnvForWriteOperation();\n logAuthContextIfInteractive();\n const ok = await p.confirm({ message });\n if (p.isCancel(ok) || !ok) {\n consola.info('已取消');\n return false;\n }\n return true;\n}\n\n/** 交互壳下架确认(与 online 命令 offline 分支同源 i18n)。 */\nexport async function confirmInteractiveOffline(): Promise<boolean> {\n assertExplicitEnvForWriteOperation();\n logAuthContextIfInteractive();\n consola.info(t(I18N_KEYS.remove_resource_from_auth_confirmation_title));\n const ok = await p.confirm({ message: t(I18N_KEYS.confirm_msg_remove_resource_from_auth) });\n if (p.isCancel(ok) || !ok) {\n consola.info('已取消');\n return false;\n }\n return true;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { runCreateWizard } from '../createWizard.js';\nimport {\n applySessionPublishIntent,\n createThenPublish,\n publishVersion,\n} from '../resource/index.js';\nimport { computeBumpedVersion } from '../resource/publishVersion.js';\nimport { ensureOperationContext } from '../sync/operationContext.js';\nimport { infoPublishFileConstraints } from '../publishFileHints.js';\nimport { assertSemverLike } from '../validation.js';\nimport type { InteractiveContext } from './context.js';\nimport { confirmInteractiveWrite } from './interactiveWrite.js';\n\nexport interface SessionPublishWizardResult {\n version: string;\n resourceId?: string;\n resourceTitle?: string;\n}\n\nasync function promptFilePath(): Promise<string> {\n const answer = await p.text({\n message: '发布文件或构建目录路径',\n validate: (value) => {\n const trimmed = String(value ?? '').trim();\n if (!trimmed) return '路径不能为空';\n const resolved = path.resolve(trimmed);\n if (!fs.existsSync(resolved)) return '路径不存在';\n return undefined;\n },\n });\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n return path.resolve(String(answer).trim());\n}\n\nasync function promptVersion(opts: {\n defaultVersion?: string;\n allowBump: boolean;\n}): Promise<{ version: string; bump?: boolean }> {\n if (opts.allowBump) {\n const mode = await p.select({\n message: '版本号',\n options: [\n { value: 'bump', label: '基于平台 latest 自动升 patch' },\n { value: 'manual', label: '手动输入 semver' },\n ],\n });\n if (p.isCancel(mode)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n if (mode === 'bump') {\n return { version: '', bump: true };\n }\n }\n\n const answer = await p.text({\n message: 'semver 版本号',\n defaultValue: opts.defaultVersion || '1.0.0',\n validate: (value) => {\n const trimmed = String(value ?? '').trim();\n if (!trimmed) return '版本号不能为空';\n try {\n assertSemverLike(trimmed);\n return undefined;\n } catch (error) {\n return error instanceof Error ? error.message : String(error);\n }\n },\n });\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n return { version: String(answer).trim() };\n}\n\nasync function promptOptionalDescription(): Promise<string | undefined> {\n const answer = await p.text({\n message: '版本说明(可选,回车跳过)',\n defaultValue: '',\n });\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n const trimmed = String(answer).trim();\n return trimmed || undefined;\n}\n\n/** session 发新版向导 → applySessionPublishIntent / createThenPublish + publishVersion */\nexport async function runSessionPublishWizard(\n ctx: InteractiveContext,\n): Promise<SessionPublishWizardResult | null> {\n const store = ctx.store;\n const hasResource = Boolean(ctx.resourceId?.trim());\n\n let publishMode: 'file' | 'reuse' = 'file';\n if (hasResource) {\n const modePick = await p.select({\n message: '发行方式',\n options: [\n { value: 'file', label: '上传新文件 / 目录' },\n { value: 'reuse', label: '复用已发版文件(reuse-version)' },\n ],\n });\n if (p.isCancel(modePick)) return null;\n publishMode = modePick as 'file' | 'reuse';\n }\n\n let file: string | undefined;\n let reuseVersion: string | undefined;\n if (publishMode === 'file') {\n file = await promptFilePath();\n } else {\n const reuse = await p.text({\n message: '要复用的已发版版本号',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(reuse)) return null;\n reuseVersion = String(reuse).trim();\n }\n\n let version = '1.0.0';\n let bump = false;\n if (hasResource) {\n const ctxInfo = await ensureOperationContext({ store });\n const picked = await promptVersion({\n defaultVersion: computeBumpedVersion(ctxInfo.platform.latestVersion),\n allowBump: true,\n });\n bump = Boolean(picked.bump);\n version = picked.version;\n if (bump) {\n version = computeBumpedVersion(ctxInfo.platform.latestVersion);\n }\n } else {\n const picked = await promptVersion({ defaultVersion: '1.0.0', allowBump: false });\n version = picked.version;\n }\n\n const description = await promptOptionalDescription();\n\n if (!hasResource) {\n const create = await runCreateWizard({});\n if (!(await confirmInteractiveWrite('确认首发并发行?'))) return null;\n\n const result = await createThenPublish({\n store,\n title: create.title,\n typeCode: create.typeCode,\n name: create.name,\n resourceTypeName: create.resourceTypeName,\n file: file!,\n version,\n description,\n });\n\n const resource = store.loadResource();\n ctx.resourceId = resource.resourceId;\n ctx.resourceTitle = resource.resourceTitle;\n consola.success(\n `已首发并发行 ${result.version}(resourceId=${resource.resourceId})`,\n );\n return {\n version: result.version,\n resourceId: resource.resourceId,\n resourceTitle: resource.resourceTitle,\n };\n }\n\n if (file && publishMode === 'file') {\n const resourceCfg = store.loadResource();\n if (resourceCfg.resourceTypeCode) {\n await infoPublishFileConstraints({\n cwd: store.rootDir(),\n filePath: file,\n resourceTypeCode: resourceCfg.resourceTypeCode,\n versionConfig: { version, filePath: file },\n });\n }\n }\n\n if (!(await confirmInteractiveWrite('确认发行?'))) return null;\n\n await applySessionPublishIntent({\n store,\n file,\n reuseVersion,\n version: bump ? undefined : version,\n bump,\n description,\n });\n const result = await publishVersion({ store });\n const resource = store.loadResource();\n consola.success(`已发行 ${result.version}(${result.filename})`);\n return {\n version: result.version,\n resourceId: resource.resourceId,\n resourceTitle: resource.resourceTitle,\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { depAdd, depList, depRemove, depUpdate } from '../depService.js';\nimport { depAuthFromMap } from '../depAuthService.js';\nimport { offlineResource, onlineResource } from '../onlineService.js';\nimport { policyApplyFromFile, policyList, policySetStatus } from '../policyService.js';\nimport { updateListing } from '../resourceService.js';\nimport { searchResources } from '../resourceSearchService.js';\nimport { ensureSynced } from '../sync/index.js';\nimport { fetchResourceInfo } from '../sync/fetch.js';\nimport { ensureSessionVersionIntent } from '../store/sessionVersionSeed.js';\nimport { runUpdateListingWizard } from '../updateListingWizard.js';\nimport { editReleasedVersion } from '../versionEditService.js';\nimport { assertSemverLike } from '../validation.js';\nimport { printPreflightLines, summarizeOnlineGates } from '../preflightSummary.js';\nimport type { InteractiveContext } from './context.js';\nimport { rebindSessionStore } from './context.js';\nimport { confirmInteractiveWrite, confirmInteractiveOffline } from './interactiveWrite.js';\nimport { runSessionPublishWizard } from './runSessionPublishWizard.js';\n\nexport async function pickSessionResource(ctx: InteractiveContext): Promise<void> {\n const mode = await p.select({\n message: '选择资源',\n options: [\n { value: 'id', label: '输入 resourceId' },\n { value: 'search', label: '搜索当前账号下的资源' },\n { value: 'new', label: '新建首发(稍后在「发新版」创建)' },\n { value: 'skip', label: '稍后在菜单中选择' },\n ],\n });\n if (p.isCancel(mode)) return;\n\n if (mode === 'skip') {\n ctx.resourceId = undefined;\n ctx.resourceTitle = undefined;\n rebindSessionStore(ctx);\n return;\n }\n\n if (mode === 'new') {\n rebindSessionStore(ctx);\n consola.info('已切换到新建首发模式;在「发新版」中创建资源');\n return;\n }\n\n if (mode === 'search') {\n const query = await p.text({\n message: '搜索关键词(resourceId / 授权名 / 标题)',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(query)) return;\n const hits = await searchResources({ query: String(query).trim() });\n if (!hits.length) {\n consola.warn('未找到匹配资源');\n return;\n }\n const pick = await p.select({\n message: '选择资源',\n options: hits.map((hit) => ({\n value: hit.resourceId,\n label: `${hit.resourceTitle || hit.resourceName || hit.resourceId} · latest ${hit.latestVersion || '—'}`,\n })),\n });\n if (p.isCancel(pick)) return;\n await bindSessionResource(ctx, String(pick));\n return;\n }\n\n const id = await p.text({\n message: 'resourceId',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(id)) return;\n await bindSessionResource(ctx, String(id).trim());\n}\n\nexport async function bindSessionResource(\n ctx: InteractiveContext,\n resourceId: string,\n): Promise<void> {\n rebindSessionStore(ctx, resourceId);\n try {\n const info = await fetchResourceInfo(resourceId);\n ctx.resourceTitle = info.resourceTitle;\n consola.success(\n `${info.resourceTitle || resourceId} · latest ${info.latestVersion || '—'}`,\n );\n } catch {\n consola.warn('无法拉取资源信息,仍可在菜单中操作');\n }\n}\n\nexport async function showSessionResourceSummary(ctx: InteractiveContext): Promise<void> {\n if (!ctx.resourceId) {\n consola.warn('尚未选择资源');\n return;\n }\n const info = await fetchResourceInfo(ctx.resourceId);\n consola.info(`resourceId: ${ctx.resourceId}`);\n consola.info(`title: ${info.resourceTitle || '—'}`);\n consola.info(`latest: ${info.latestVersion || '—'} status=${info.status ?? '—'}`);\n consola.info(`owner: ${info.username || '—'} (userId=${info.userId ?? '—'})`);\n}\n\nexport async function sessionActionPublish(ctx: InteractiveContext): Promise<void> {\n await runSessionPublishWizard(ctx);\n}\n\nexport async function sessionActionUpdateListing(ctx: InteractiveContext): Promise<void> {\n const wizard = await runUpdateListingWizard(ctx.store);\n if (!(await confirmInteractiveWrite('确认更新 listing?'))) return;\n await updateListing({\n store: ctx.store,\n title: wizard.title,\n intro: wizard.intro,\n cover: wizard.cover,\n tags: wizard.tags,\n });\n consola.success('已更新 listing');\n}\n\nexport async function sessionActionVersionEdit(ctx: InteractiveContext): Promise<void> {\n const synced = await ensureSynced({ store: ctx.store });\n const defaultVersion =\n synced.info.latestVersion || synced.version?.version || storeVersionFallback(ctx);\n const versionAnswer = await p.text({\n message: '已发版版本号',\n defaultValue: defaultVersion,\n validate: (v) => {\n const trimmed = String(v ?? '').trim();\n if (!trimmed) return '必填';\n try {\n assertSemverLike(trimmed);\n return undefined;\n } catch (error) {\n return error instanceof Error ? error.message : String(error);\n }\n },\n });\n if (p.isCancel(versionAnswer)) return;\n\n const descriptionAnswer = await p.text({\n message: '版本说明(留空表示不修改)',\n defaultValue: '',\n });\n if (p.isCancel(descriptionAnswer)) return;\n const description = String(descriptionAnswer);\n if (!description.trim()) {\n consola.warn('未填写说明,已取消');\n return;\n }\n\n if (!(await confirmInteractiveWrite('确认修改已发版说明?'))) return;\n\n const version = String(versionAnswer).trim();\n ctx.store.saveVersion({ version, filePath: '' });\n await editReleasedVersion({\n store: ctx.store,\n version,\n description,\n });\n consola.success(`已更新正式版 ${version} 说明`);\n}\n\nfunction storeVersionFallback(ctx: InteractiveContext): string {\n return ctx.store.tryLoadVersion()?.version || '1.0.0';\n}\n\nasync function promptSessionTargetVersion(store: InteractiveContext['store']): Promise<void> {\n if (store.tryLoadVersion()?.version?.trim()) return;\n const answer = await p.text({\n message: '下一版 semver 意图(dep 写入 Store 前必填)',\n defaultValue: '1.0.0',\n validate: (v) => {\n const trimmed = String(v ?? '').trim();\n if (!trimmed) return '必填';\n try {\n assertSemverLike(trimmed);\n return undefined;\n } catch (error) {\n return error instanceof Error ? error.message : String(error);\n }\n },\n });\n if (p.isCancel(answer)) throw cliError(I18N_KEYS.cancelled, { code: 4 });\n ensureSessionVersionIntent(store, String(answer).trim());\n}\n\nexport async function sessionActionDepMenu(ctx: InteractiveContext): Promise<void> {\n const action = await p.select({\n message: '依赖 / 签约',\n options: [\n { value: 'list', label: '列出本地依赖意图' },\n { value: 'tree', label: '读取平台依赖树' },\n { value: 'add', label: '添加依赖' },\n { value: 'remove', label: '移除依赖' },\n { value: 'update', label: '更新 versionRange' },\n { value: 'auth', label: '从 auth-map 补签' },\n { value: 'back', label: '返回主菜单' },\n ],\n });\n if (p.isCancel(action) || action === 'back') return;\n\n const store = ctx.store;\n\n if (action === 'list' || action === 'tree') {\n await promptSessionTargetVersion(store);\n const result = await depList({ store, tree: action === 'tree' });\n if (action === 'tree') {\n consola.info('平台依赖树:');\n process.stdout.write(`${JSON.stringify(result.tree, null, 2)}\\n`);\n } else if (!result.local.length) {\n consola.info('无本地依赖');\n } else {\n for (const dep of result.local) {\n consola.info(`${dep.resourceId} ${dep.versionRange || '*'} ${dep.resourceName || ''}`);\n }\n }\n return;\n }\n\n if (action === 'auth') {\n const mapPath = await p.text({\n message: 'auth-map.yaml|json 路径',\n defaultValue: 'auth-map.yaml',\n validate: (v) => {\n const resolved = path.resolve(String(v ?? '').trim() || 'auth-map.yaml');\n return fs.existsSync(resolved) ? undefined : '文件不存在';\n },\n });\n if (p.isCancel(mapPath)) return;\n if (!(await confirmInteractiveWrite('确认执行依赖签约?'))) return;\n const result = await depAuthFromMap({\n store,\n policyMap: path.resolve(String(mapPath).trim()),\n });\n consola.success(`依赖签约完成(${result.succeeded.length} 条)`);\n return;\n }\n\n await promptSessionTargetVersion(store);\n\n if (action === 'add') {\n const resourceId = await p.text({\n message: '依赖 resourceId',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(resourceId)) return;\n const range = await p.text({\n message: 'versionRange(可选,回车默认)',\n defaultValue: '',\n });\n if (p.isCancel(range)) return;\n if (!(await confirmInteractiveWrite('确认添加依赖?'))) return;\n const deps = await depAdd({\n store,\n resourceId: String(resourceId).trim(),\n versionRange: String(range).trim() || undefined,\n });\n consola.success(`已添加依赖 ${resourceId}(共 ${deps.length})`);\n return;\n }\n\n if (action === 'remove') {\n const resourceId = await p.text({\n message: '要移除的 resourceId',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(resourceId)) return;\n if (!(await confirmInteractiveWrite('确认移除依赖?'))) return;\n await depRemove({ store, resourceId: String(resourceId).trim() });\n consola.success(`已移除依赖 ${resourceId}`);\n return;\n }\n\n if (action === 'update') {\n const resourceId = await p.text({\n message: '依赖 resourceId',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(resourceId)) return;\n const range = await p.text({\n message: '新的 versionRange',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(range)) return;\n if (!(await confirmInteractiveWrite('确认更新依赖?'))) return;\n await depUpdate({\n store,\n resourceId: String(resourceId).trim(),\n versionRange: String(range).trim(),\n });\n consola.success(`已更新 ${resourceId} → ${range}`);\n }\n}\n\nexport async function sessionActionPolicyMenu(ctx: InteractiveContext): Promise<void> {\n const action = await p.select({\n message: '策略',\n options: [\n { value: 'list', label: '列出策略' },\n { value: 'apply', label: '从文件应用策略' },\n { value: 'set', label: '启用 / 停用策略' },\n { value: 'back', label: '返回主菜单' },\n ],\n });\n if (p.isCancel(action) || action === 'back') return;\n\n const store = ctx.store;\n\n if (action === 'list') {\n const policies = await policyList({ store });\n if (!policies.length) {\n consola.warn('无策略');\n return;\n }\n for (const policy of policies) {\n consola.info(`${policy.policyId || '-'} ${policy.policyName || '-'} status=${policy.status}`);\n }\n return;\n }\n\n if (action === 'apply') {\n const fromFile = await p.text({\n message: '策略 JSON 文件路径',\n validate: (v) => {\n const trimmed = String(v ?? '').trim();\n if (!trimmed) return '路径不能为空';\n return fs.existsSync(path.resolve(trimmed)) ? undefined : '文件不存在';\n },\n });\n if (p.isCancel(fromFile)) return;\n if (!(await confirmInteractiveWrite('确认应用策略?'))) return;\n const items = await policyApplyFromFile({\n store,\n fromFile: path.resolve(String(fromFile).trim()),\n });\n consola.success(`已应用 ${items.length} 条策略`);\n return;\n }\n\n const policyId = await p.text({\n message: '策略 ID',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(policyId)) return;\n const statusPick = await p.select({\n message: '状态',\n options: [\n { value: '1', label: '启用 (1)' },\n { value: '0', label: '停用 (0)' },\n ],\n });\n if (p.isCancel(statusPick)) return;\n if (!(await confirmInteractiveWrite('确认修改策略状态?'))) return;\n await policySetStatus({\n store,\n policyId: String(policyId).trim(),\n status: statusPick === '1' ? 1 : 0,\n });\n consola.success(`${statusPick === '1' ? '已启用' : '已停用'} ${policyId}`);\n}\n\nexport async function sessionActionOnlineMenu(ctx: InteractiveContext): Promise<void> {\n const action = await p.select({\n message: '上架 / 下架',\n options: [\n { value: 'online', label: '严格上架' },\n { value: 'offline', label: '下架' },\n { value: 'back', label: '返回主菜单' },\n ],\n });\n if (p.isCancel(action) || action === 'back') return;\n\n const store = ctx.store;\n\n if (action === 'online') {\n const ctxSync = await ensureSynced({ store });\n printPreflightLines(summarizeOnlineGates(ctxSync.info).lines);\n if (!(await confirmInteractiveWrite('确认上架?'))) return;\n const result = await onlineResource({ store });\n consola.success(result.already ? '资源已是上架状态' : '已上架');\n return;\n }\n\n if (!(await confirmInteractiveOffline())) return;\n await offlineResource({ store });\n consola.success('已下架');\n}\n\nexport async function sessionActionExportProject(ctx: InteractiveContext): Promise<void> {\n const target = await p.text({\n message: '导出到空目录(生成 manifest + state)',\n validate: (v) => {\n const trimmed = String(v ?? '').trim();\n if (!trimmed) return '路径不能为空';\n const resolved = path.resolve(trimmed);\n if (!fs.existsSync(resolved)) return undefined;\n const entries = fs.readdirSync(resolved).filter((name) => name !== '.git');\n return entries.length === 0 ? undefined : '目录须为空或不存在(将自动创建)';\n },\n });\n if (p.isCancel(target)) return;\n const resolved = path.resolve(String(target).trim());\n const exported = ctx.store.exportProject(resolved);\n consola.success(`已导出工程 → ${exported}`);\n consola.info('之后可 cd 该目录并用 login + 工程命令维护(模式 00)');\n}\n","import * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport { clearEphemeralAuth, formatAuthContextLine, resolveCurrentAuth } from '../../core/auth.js';\nimport { isInteractive } from '../../core/tty.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { createSessionContext } from './context.js';\nimport {\n ensureEphemeralLogin,\n isInteractiveCancelled,\n promptSwitchEphemeralAccount,\n} from './ephemeralLogin.js';\nimport {\n pickSessionResource,\n sessionActionDepMenu,\n sessionActionExportProject,\n sessionActionOnlineMenu,\n sessionActionPolicyMenu,\n sessionActionPublish,\n sessionActionUpdateListing,\n sessionActionVersionEdit,\n showSessionResourceSummary,\n} from './sessionActions.js';\n\n/** 11 · 交互会话:A=1 S=1 */\nexport async function runSessionShell(): Promise<void> {\n if (!isInteractive()) {\n throw cliError(I18N_KEYS.session_interactive_tty_required, {\n code: 4,\n hint: '脚本请用 xxx --session;多账号落盘请用 freelog-cli studio',\n });\n }\n\n consola.info('Freelog 交互会话(11 · 凭据与 state 均不落盘)');\n\n const ctx = createSessionContext();\n clearEphemeralAuth();\n\n try {\n await ensureEphemeralLogin();\n await pickSessionResource(ctx);\n\n let running = true;\n while (running) {\n const resolved = resolveCurrentAuth();\n if (resolved) {\n consola.info(formatAuthContextLine(resolved));\n }\n if (ctx.resourceId) {\n consola.info(`当前资源: ${ctx.resourceTitle || '—'} (${ctx.resourceId})`);\n } else {\n consola.info('当前资源: (未选择 / 新建首发)');\n }\n\n const action = await p.select({\n message: '接下来要做什么?',\n options: [\n { value: 'publish', label: '1. 发新版' },\n { value: 'update', label: '2. 改 listing' },\n { value: 'version', label: '3. 改版本说明' },\n { value: 'deps', label: '4. 依赖 / 签约' },\n { value: 'policy', label: '5. 策略' },\n { value: 'online', label: '6. 上架 / 下架' },\n { value: 'view', label: '7. 查看当前资源' },\n { value: 'export', label: '8. 导出工程' },\n { value: 'resource', label: '9. 切换 / 选择资源' },\n { value: 'switch', label: '10. 切换账号' },\n { value: 'exit', label: '0. 退出' },\n ],\n });\n if (p.isCancel(action)) break;\n\n const needsResource = !['publish', 'resource', 'switch', 'exit'].includes(String(action));\n if (needsResource && !ctx.resourceId) {\n consola.warn('请先选择资源(菜单 9),或直接用「发新版」新建首发');\n continue;\n }\n\n try {\n switch (action) {\n case 'publish':\n await sessionActionPublish(ctx);\n break;\n case 'update':\n await sessionActionUpdateListing(ctx);\n break;\n case 'version':\n await sessionActionVersionEdit(ctx);\n break;\n case 'deps':\n await sessionActionDepMenu(ctx);\n break;\n case 'policy':\n await sessionActionPolicyMenu(ctx);\n break;\n case 'online':\n await sessionActionOnlineMenu(ctx);\n break;\n case 'view':\n await showSessionResourceSummary(ctx);\n break;\n case 'export':\n await sessionActionExportProject(ctx);\n break;\n case 'resource':\n await pickSessionResource(ctx);\n break;\n case 'switch':\n await promptSwitchEphemeralAccount();\n if (ctx.resourceId) {\n consola.info(\n '已切换账号。若当前资源属于其他账号,写操作将被拒绝;请用菜单 9 重选资源。',\n );\n }\n break;\n case 'exit':\n running = false;\n break;\n default:\n break;\n }\n } catch (error) {\n if (isInteractiveCancelled(error)) continue;\n const message = error instanceof Error ? error.message : String(error);\n consola.error(message);\n }\n }\n\n consola.info('session 已结束。凭据与内存 state 已清空。');\n } catch (error) {\n if (isInteractiveCancelled(error)) return;\n throw error;\n } finally {\n clearEphemeralAuth();\n }\n}\n","import { defineCommand } from 'citty';\nimport { applyCommandFlags, handleCommandError } from '../core/command.js';\nimport { cliEnvArgs } from '../core/cliArgs.js';\nimport { runSessionShell } from '../services/interactive/sessionShell.js';\n\nexport const sessionInteractiveCommand = defineCommand({\n meta: {\n name: 'session',\n description: '交互会话(11:凭据与 state 均不落盘;须 TTY)',\n },\n args: {\n ...cliEnvArgs,\n },\n async run({ args }) {\n try {\n applyCommandFlags(args);\n await runSessionShell();\n } catch (error) {\n handleCommandError(error);\n }\n },\n});\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport { authScopeLabel } from '../core/auth.js';\r\nimport { applyCommandFlags, handleCommandError, writeJsonSuccess } from '../core/command.js';\r\nimport { cliReadCommandArgs } from '../core/cliArgs.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { buildProjectStatus } from '../services/statusService.js';\r\n\r\nfunction printStatusHuman(payload: Awaited<ReturnType<typeof buildProjectStatus>>): void {\r\n consola.info(`环境: ${payload.environment} (${payload.apiBaseURL})`);\r\n if (payload.loggedIn) {\r\n const scope =\r\n payload.auth?.scope != null ? `,${authScopeLabel(payload.auth.scope)}` : '';\r\n consola.success(\r\n `已登录: ${payload.auth?.username} (userId=${payload.auth?.userId}${scope})`,\r\n );\r\n } else {\r\n consola.warn('未登录');\r\n }\r\n if (payload.owner) {\r\n const mark =\r\n payload.owner.matchLogin === true ? '✅' : payload.owner.matchLogin === false ? '❌' : '—';\r\n consola.info(`所属用户: ${payload.owner.username} (${payload.owner.userId}) ${mark}`);\r\n }\r\n consola.info(`同步: ${payload.sync}`);\r\n if (payload.platform) {\r\n consola.info(\r\n `平台: latest=${payload.platform.latestVersion || '—'} status=${payload.platform.status} policies(enabled)=${payload.platform.enabledPolicyCount}`,\r\n );\r\n }\r\n if (payload.platformVersionDraft?.exists) {\r\n consola.warn(\r\n `平台发版草稿: 有 (updateDate: ${payload.platformVersionDraft.updateDate || '—'})`,\r\n );\r\n } else {\r\n consola.info('平台发版草稿: 无');\r\n }\r\n if (payload.localDraftSync) {\r\n consola.info(\r\n `本地相对上次草稿同步: ${payload.localDraftSync.dirty ? '有未 push 变更' : '已对齐'}`,\r\n );\r\n } else if (payload.platformVersionDraft?.exists) {\r\n consola.warn('本地草稿同步: 从未同步(可能来自 Console 防抖自动保存)');\r\n } else {\r\n consola.info('本地草稿同步: 从未同步');\r\n }\r\n if (payload.draftAdviceHint) {\r\n consola.info(`建议: ${payload.draftAdviceHint}`);\r\n consola.info(' freelog-cli draft pull');\r\n consola.info(' 或 freelog-cli draft push --force');\r\n consola.info(' 或 freelog-cli draft discard');\r\n }\r\n consola.info(\r\n `本地版本意图: ${payload.local.version || '—'} file=${payload.local.filePath || '—'}`,\r\n );\r\n if (payload.collection) {\r\n consola.info(\r\n `合集: id=${payload.collection.resourceId || '—'} items=${payload.collection.itemCount} rules=${payload.collection.hasCollectRules ? '有' : '无'} rss=${payload.collection.rssFeedUrl || '—'}`,\r\n );\r\n consola.info(\r\n `合集发版表单草稿: 平台=${payload.collection.platformFormDraftExists === null ? '—' : payload.collection.platformFormDraftExists ? '有' : '无'} 本地sync=${payload.collection.draftSync ? (payload.collection.draftSync.dirty ? '有未 push 变更' : '已对齐') : '从未同步'}`,\r\n );\r\n if (payload.collection.draftAdviceHint) {\r\n consola.info(`合集建议: ${payload.collection.draftAdviceHint}`);\r\n consola.info(' freelog-cli draft pull --collection');\r\n consola.info(' 或 freelog-cli draft push --collection --force');\r\n consola.info(' 或 freelog-cli draft discard --collection');\r\n }\r\n }\r\n}\r\n\r\nexport const statusCommand = defineCommand({\r\n meta: { name: 'status', description: '登录态 + owner + 同步 + 平台发版草稿' },\r\n args: cliReadCommandArgs,\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const payload = await buildProjectStatus(resolveCwd(args.cwd));\r\n if (args.json) {\r\n const { ok: _ok, ...data } = payload;\r\n writeJsonSuccess('status', data);\r\n return;\r\n }\r\n printStatusHuman(payload);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport { loadVersionProject, saveVersionProject, tryLoadResourceProject } from '../../config/project.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { offlineResource, onlineResource } from '../onlineService.js';\nimport { publishVersion } from '../resource/index.js';\nimport { applyReuseVersionIntent } from '../resource/reuseVersionIntent.js';\nimport { computeBumpedVersion } from '../resource/publishVersion.js';\nimport { updateListing } from '../resourceService.js';\nimport { ensureSynced } from '../sync/index.js';\nimport { infoPublishFileConstraints } from '../publishFileHints.js';\nimport { runUpdateListingWizard } from '../updateListingWizard.js';\nimport { editReleasedVersion } from '../versionEditService.js';\nimport { assertSemverLike } from '../validation.js';\nimport { printPreflightLines, summarizeOnlineGates, summarizePublishPreflight } from '../preflightSummary.js';\nimport { assertStudioOwner, projectStoreForStudioDir } from './context.js';\nimport { confirmInteractiveWrite, confirmInteractiveOffline } from './interactiveWrite.js';\nimport { isInteractiveCancelled } from './ephemeralLogin.js';\n\n/** 工作区下含 resourceId 的 Freelog 子工程目录。 */\nexport function listFreelogSubdirs(workspaceRoot: string): string[] {\n if (!fs.existsSync(workspaceRoot)) return [];\n return fs\n .readdirSync(workspaceRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(workspaceRoot, entry.name))\n .filter((dir) => Boolean(tryLoadResourceProject(dir)?.data.resourceId?.trim()));\n}\n\nasync function pickStudioSubdir(workspaceRoot: string): Promise<string | null> {\n const subdirs = listFreelogSubdirs(workspaceRoot);\n if (!subdirs.length) {\n consola.info('尚无 Freelog 子工程(需先菜单 1 从文件发行)');\n return null;\n }\n const pick = await p.select({\n message: '选择子工程',\n options: subdirs.map((dir) => ({ value: dir, label: path.basename(dir) })),\n });\n if (p.isCancel(pick)) return null;\n return String(pick);\n}\n\n/** studio 维护:发新版(含 publish preflight)。 */\nexport async function studioActionPublish(projectDir: string): Promise<void> {\n const store = projectStoreForStudioDir(projectDir);\n const synced = await ensureSynced({ store });\n const versionCfg = store.tryLoadVersion();\n const resourceCfg = store.loadResource();\n\n const mode = await p.select({\n message: '发行方式',\n options: [\n { value: 'manifest', label: '使用 manifest 中的文件与版本意图' },\n { value: 'bump', label: '自动升 patch 后发行(manifest 文件)' },\n { value: 'reuse', label: '复用已发版文件(reuse-version)' },\n { value: 'file', label: '指定新文件路径后发行' },\n ],\n });\n if (p.isCancel(mode)) return;\n\n let bump = false;\n let reuseVersion: string | undefined;\n let filePath = versionCfg?.filePath?.trim();\n\n if (mode === 'bump') {\n bump = true;\n } else if (mode === 'reuse') {\n const reuse = await p.text({\n message: '要复用的已发版版本号',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(reuse)) return;\n reuseVersion = String(reuse).trim();\n const targetVersion = computeBumpedVersion(synced.info.latestVersion);\n await applyReuseVersionIntent({\n store,\n resourceId: synced.resource.resourceId!,\n resourceName: synced.resource.resourceName,\n resourceTypeCode: synced.resource.resourceTypeCode,\n userId: synced.resource.userId,\n username: synced.resource.username,\n reuseVersion,\n targetVersion,\n });\n } else if (mode === 'file') {\n const fileAnswer = await p.text({\n message: '发布文件或构建目录路径',\n validate: (v) => {\n const trimmed = String(v ?? '').trim();\n if (!trimmed) return '路径不能为空';\n const resolved = path.resolve(trimmed);\n return fs.existsSync(resolved) ? undefined : '路径不存在';\n },\n });\n if (p.isCancel(fileAnswer)) return;\n filePath = path.resolve(String(fileAnswer).trim());\n const { data } = loadVersionProject(projectDir);\n data.filePath = filePath;\n if (!data.version?.trim()) {\n data.version = computeBumpedVersion(synced.info.latestVersion);\n }\n saveVersionProject(data, projectDir);\n } else if (!filePath) {\n throw cliError(I18N_KEYS.manifest_version_missing, {\n code: 4,\n hint: 'manifest 缺少 filePath,请选择「指定新文件」',\n });\n }\n\n if (filePath && resourceCfg.resourceTypeCode && !reuseVersion) {\n await infoPublishFileConstraints({\n cwd: projectDir,\n filePath,\n resourceTypeCode: resourceCfg.resourceTypeCode,\n versionConfig: store.tryLoadVersion() || undefined,\n });\n }\n\n printPreflightLines(await summarizePublishPreflight({ cwd: projectDir }));\n\n if (!(await confirmInteractiveWrite('确认发行?'))) return;\n const result = await publishVersion({ store, bump: bump && !reuseVersion });\n consola.success(`已发行 ${result.version}(${result.filename})`);\n}\n\nasync function studioActionUpdateListing(projectDir: string): Promise<void> {\n const store = projectStoreForStudioDir(projectDir);\n const wizard = await runUpdateListingWizard(store);\n if (!(await confirmInteractiveWrite('确认更新 listing?'))) return;\n await updateListing({\n store,\n title: wizard.title,\n intro: wizard.intro,\n cover: wizard.cover,\n tags: wizard.tags,\n });\n consola.success('已更新 listing');\n}\n\nasync function studioActionVersionEdit(projectDir: string): Promise<void> {\n const store = projectStoreForStudioDir(projectDir);\n const synced = await ensureSynced({ store });\n const defaultVersion = synced.info.latestVersion || synced.version?.version || '1.0.0';\n const versionAnswer = await p.text({\n message: '已发版版本号',\n defaultValue: defaultVersion,\n validate: (v) => {\n const trimmed = String(v ?? '').trim();\n if (!trimmed) return '必填';\n try {\n assertSemverLike(trimmed);\n return undefined;\n } catch (error) {\n return error instanceof Error ? error.message : String(error);\n }\n },\n });\n if (p.isCancel(versionAnswer)) return;\n\n const descriptionAnswer = await p.text({\n message: '版本说明',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(descriptionAnswer)) return;\n if (!(await confirmInteractiveWrite('确认修改已发版说明?'))) return;\n\n const version = String(versionAnswer).trim();\n await editReleasedVersion({\n store,\n version,\n description: String(descriptionAnswer),\n });\n consola.success(`已更新正式版 ${version} 说明`);\n}\n\nasync function studioActionOnlineMenu(projectDir: string): Promise<void> {\n const store = projectStoreForStudioDir(projectDir);\n const action = await p.select({\n message: '上架 / 下架',\n options: [\n { value: 'online', label: '严格上架' },\n { value: 'offline', label: '下架' },\n { value: 'back', label: '返回' },\n ],\n });\n if (p.isCancel(action) || action === 'back') return;\n\n if (action === 'online') {\n const ctxSync = await ensureSynced({ store });\n printPreflightLines(summarizeOnlineGates(ctxSync.info).lines);\n if (!(await confirmInteractiveWrite('确认上架?'))) return;\n const result = await onlineResource({ store });\n consola.success(result.already ? '资源已是上架状态' : '已上架');\n return;\n }\n\n if (!(await confirmInteractiveOffline())) return;\n await offlineResource({ store });\n consola.success('已下架');\n}\n\n/** studio 子工程维护子菜单(S=0 + ephemeral auth)。 */\nexport async function runStudioMaintainShell(projectDir: string): Promise<void> {\n assertStudioOwner(projectDir);\n consola.info(`维护子工程: ${path.basename(projectDir)}`);\n\n let running = true;\n while (running) {\n const action = await p.select({\n message: '子工程维护',\n options: [\n { value: 'publish', label: '1. 发新版' },\n { value: 'update', label: '2. 改 listing' },\n { value: 'version', label: '3. 改版本说明' },\n { value: 'online', label: '4. 上架 / 下架' },\n { value: 'back', label: '0. 返回工作区根' },\n ],\n });\n if (p.isCancel(action) || action === 'back') {\n running = false;\n break;\n }\n\n try {\n switch (action) {\n case 'publish':\n await studioActionPublish(projectDir);\n break;\n case 'update':\n await studioActionUpdateListing(projectDir);\n break;\n case 'version':\n await studioActionVersionEdit(projectDir);\n break;\n case 'online':\n await studioActionOnlineMenu(projectDir);\n break;\n default:\n break;\n }\n } catch (error) {\n if (isInteractiveCancelled(error)) continue;\n const message = error instanceof Error ? error.message : String(error);\n consola.error(message);\n }\n }\n}\n\nexport async function enterStudioMaintain(workspaceRoot: string): Promise<void> {\n const projectDir = await pickStudioSubdir(workspaceRoot);\n if (!projectDir) return;\n try {\n await runStudioMaintainShell(projectDir);\n } catch (error) {\n if (isInteractiveCancelled(error)) return;\n throw error;\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { withProjectWriteLockAsync } from '../../config/project.js';\nimport { requireAuth } from '../../core/auth.js';\nimport { getCliEnv } from '../../core/env.js';\nimport { FServiceAPI, getSHA1Hash, unwrapData } from '../../platform/index.js';\nimport { assertOwnerMatch } from '../shared/owner.js';\nimport { fetchResourceInfo } from '../shared/platform/index.js';\nimport type { PreparedFile } from '../batch/types.js';\nimport {\n finishBatchReport,\n markReportFailure,\n markReportRemote,\n markReportRemoteRequestNotApplied,\n loadBatchReport,\n type BatchReport,\n type BatchReportItem,\n} from '../batch/report.js';\n\nexport interface StudioRecovery {\n report: BatchReport;\n item: BatchReportItem;\n}\n\nfunction recordValue(value: unknown, key: string): unknown {\n if (!value || typeof value !== 'object') return undefined;\n return (value as Record<string, unknown>)[key];\n}\n\nfunction httpStatus(error: unknown): number | undefined {\n const candidates = [\n recordValue(error, 'status'),\n recordValue(error, 'statusCode'),\n recordValue(recordValue(error, 'response'), 'status'),\n recordValue(recordValue(error, 'response'), 'statusCode'),\n recordValue(recordValue(error, 'data'), 'status'),\n recordValue(recordValue(error, 'data'), 'statusCode'),\n ];\n const status = candidates.map(Number).find((value) => Number.isInteger(value));\n return status;\n}\n\n/** 只有明确 HTTP 4xx 才能断言 create 请求未被平台接受;超时/断连/响应缺失仍是 unknown。 */\nexport function isStudioRemoteRequestDefinitelyNotApplied(error: unknown): boolean {\n const status = httpStatus(error);\n return status !== undefined && status >= 400 && status < 500;\n}\n\nexport type StudioReconcileResolution = 'confirmed-not-created' | 'confirmed-created';\n\nasync function verifyConfirmedStudioResource(opts: {\n resourceId: string;\n report: BatchReport;\n row: BatchReportItem;\n auth: { userId?: number | string; username?: string };\n}): Promise<{ resourceName: string; versionId?: string }> {\n const info = await fetchResourceInfo(opts.resourceId);\n assertOwnerMatch({\n authUserId: opts.auth.userId,\n authUsername: opts.auth.username,\n platformUserId: info.userId,\n platformUsername: info.username,\n hint: 'resourceId 不属于当前对账账号,拒绝写回报告',\n });\n\n const expectedName = opts.auth.username\n ? `${opts.auth.username}/${opts.row.prepared.name}`\n : opts.row.prepared.name;\n if (info.resourceName !== expectedName) {\n throw new Error(\n `Studio 对账资源授权名不匹配:期望 ${expectedName},平台为 ${info.resourceName || 'unknown'}`,\n );\n }\n if (info.resourceTypeCode !== opts.row.prepared.resourceTypeCode) {\n throw new Error(\n `Studio 对账资源类型不匹配:期望 ${opts.row.prepared.resourceTypeCode},平台为 ${info.resourceTypeCode || 'unknown'}`,\n );\n }\n\n const listEnvelope = await FServiceAPI.Resource.getVersionListByResourceID({\n resourceId: opts.resourceId,\n } as Parameters<typeof FServiceAPI.Resource.getVersionListByResourceID>[0]);\n const listData = unwrapData<\n | Array<{ version?: string; versionId?: string }>\n | { dataList?: Array<{ version?: string; versionId?: string }> }\n >(listEnvelope);\n const versions = Array.isArray(listData)\n ? listData\n : Array.isArray(listData?.dataList)\n ? listData.dataList\n : [];\n const targetVersion = versions.find((item) => item.version === opts.row.prepared.version);\n if (targetVersion) {\n const versionEnvelope = await FServiceAPI.Resource.resourceVersionInfo1({\n resourceId: opts.resourceId,\n version: opts.row.prepared.version,\n } as Parameters<typeof FServiceAPI.Resource.resourceVersionInfo1>[0]);\n const versionInfo = unwrapData<{ fileSha1?: string; versionId?: string }>(versionEnvelope);\n if (versionInfo?.fileSha1 !== opts.row.prepared.sha1) {\n throw new Error(\n `Studio 对账版本 SHA1 不匹配:期望 ${opts.row.prepared.sha1},平台为 ${versionInfo?.fileSha1 || 'unknown'}`,\n );\n }\n return {\n resourceName: info.resourceName,\n versionId: versionInfo.versionId || targetVersion.versionId,\n };\n }\n\n if (info.latestVersion) {\n throw new Error(\n `Studio 对账资源不存在目标版本 ${opts.row.prepared.version},但已有 latestVersion=${info.latestVersion},拒绝绑定`,\n );\n }\n\n const createDate = Date.parse(String(recordValue(info, 'createDate') || ''));\n const reportStartedAt = Date.parse(opts.report.startedAt);\n if (\n !Number.isFinite(createDate) ||\n !Number.isFinite(reportStartedAt) ||\n createDate < reportStartedAt - 5 * 60 * 1000\n ) {\n throw new Error('Studio 对账只能绑定本次未知请求期间新建的资源壳,平台创建时间无法证明匹配');\n }\n\n return { resourceName: info.resourceName };\n}\n\nexport async function reconcileStudioPublish(opts: {\n workspaceRoot: string;\n reportPath?: string;\n resolution: StudioReconcileResolution;\n resourceId?: string;\n}): Promise<BatchReport> {\n const workspaceRoot = path.resolve(opts.workspaceRoot);\n return withProjectWriteLockAsync(workspaceRoot, async () => {\n const reportPath = opts.reportPath?.trim()\n ? path.resolve(workspaceRoot, opts.reportPath)\n : path.join(workspaceRoot, '.freelog', 'reports', 'studio-latest.json');\n const report = loadBatchReport(reportPath);\n if (report.command !== 'studio publish') {\n throw new Error(`报告不属于 Studio 发行: ${report.reportPath}`);\n }\n if (path.resolve(report.input.directory) !== workspaceRoot) {\n throw new Error(`Studio 报告工作区不匹配: ${report.input.directory}`);\n }\n if (report.env !== getCliEnv()) {\n throw new Error(`Studio 报告环境为 ${report.env},当前环境为 ${getCliEnv()},拒绝跨环境对账`);\n }\n if (report.items.length !== 1) {\n throw new Error(`Studio 报告必须且只能包含一项: ${report.reportPath}`);\n }\n const row = report.items[0]!;\n if (row.result !== 'remote_outcome_unknown') {\n throw new Error(`仅 remote_outcome_unknown 报告允许人工对账,当前为 ${row.result}`);\n }\n const auth = requireAuth();\n assertOwnerMatch({\n authUserId: auth.userId,\n authUsername: auth.username,\n platformUserId: report.actor?.userId,\n platformUsername: report.actor?.username,\n hint: '请切换回发起该 Studio 发行的账号后对账',\n });\n if (!fs.existsSync(row.prepared.absolutePath)) {\n throw new Error(`Studio 对账输入文件不存在: ${row.prepared.absolutePath}`);\n }\n const currentSha1 = await getSHA1Hash(row.prepared.absolutePath);\n if (currentSha1 !== row.prepared.sha1) {\n throw new Error(`Studio 对账输入文件内容已变化: ${row.prepared.absolutePath}`);\n }\n\n if (opts.resolution === 'confirmed-not-created') {\n markReportRemoteRequestNotApplied(report, workspaceRoot, [row.prepared]);\n markReportFailure(report, workspaceRoot, row.prepared, '人工对账确认:平台未创建资源,可安全重试');\n } else {\n const resourceId = opts.resourceId?.trim();\n if (!resourceId) throw new Error('confirmed-created 必须提供 resourceId');\n const verified = await verifyConfirmedStudioResource({\n resourceId,\n report,\n row,\n auth,\n });\n markReportRemote(report, workspaceRoot, row.prepared, {\n resourceId,\n resourceName: verified.resourceName,\n versionId: verified.versionId,\n });\n }\n finishBatchReport(report);\n return report;\n });\n}\n\n/** 查找同一工作区、文件内容与发行配置最近一次未完成的 Studio 远端写。 */\nexport function findStudioRecovery(\n workspaceRoot: string,\n item: PreparedFile,\n): StudioRecovery | null {\n const reportsDir = path.join(workspaceRoot, '.freelog', 'reports');\n if (!fs.existsSync(reportsDir)) return null;\n\n const latestPointer = path.join(reportsDir, 'studio-latest.json');\n if (fs.existsSync(latestPointer)) {\n try {\n loadBatchReport(latestPointer);\n } catch (error) {\n throw new Error(\n `无法验证 Studio 最近发行报告,已阻止远端写以避免重复创建: ${latestPointer}`,\n { cause: error },\n );\n }\n }\n\n const reportFiles = fs\n .readdirSync(reportsDir)\n .filter((name) => name.endsWith('.json') && !name.endsWith('latest.json'))\n .sort((a, b) => b.localeCompare(a));\n\n for (const filename of reportFiles) {\n try {\n const report = loadBatchReport(path.join(reportsDir, filename));\n if (report.command !== 'studio publish' || report.env !== getCliEnv()) continue;\n const row = report.items.find(\n (candidate) =>\n path.resolve(candidate.prepared.absolutePath) === path.resolve(item.absolutePath) &&\n candidate.prepared.sha1 === item.sha1 &&\n candidate.prepared.resourceTypeCode === item.resourceTypeCode,\n );\n if (!row || row.result === 'passed' || row.result === 'skipped') continue;\n if (row.result === 'remote_outcome_unknown') return { report, item: row };\n if (row.result === 'remote_succeeded_local_pending' && row.resourceId) {\n return { report, item: row };\n }\n } catch (error) {\n throw new Error(\n `无法验证已有发行报告,已阻止 Studio 远端写以避免重复创建: ${path.join(reportsDir, filename)}`,\n { cause: error },\n );\n }\n }\n return null;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport { tryLoadResourceProject, withProjectWriteLockAsync } from '../../config/project.js';\nimport { requireAuth } from '../../core/auth.js';\nimport { assertExplicitEnvForWriteOperation } from '../../core/command.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport { getSHA1Hash } from '../../platform/index.js';\nimport { uploadFileIfNeeded } from '../storageUpload.js';\nimport { filterIgnoredFiles, loadFreelogIgnorePatterns } from '../freelogIgnore.js';\nimport { assertLeafResourceTypeCode } from '../typeService.js';\nimport { assertLocalFileAllowedByType } from '../resourceTypeCapabilities.js';\nimport { assertSha1PublishAllowed } from '../shared/guards/index.js';\nimport { assertOwnerMatch } from '../shared/owner.js';\nimport {\n applyGeneratedResourceNames,\n createOneResource,\n ensureVersionAfterCreateBatch,\n resolveExistingImportBySha1,\n resolveInitialBatchResourceName,\n resolveUniqueSubdir,\n writeItemConfigs,\n} from '../batch/prepare.js';\nimport type { PreparedFile } from '../batch/types.js';\nimport {\n createBatchReport,\n findReportItem,\n finishBatchReport,\n markReportComplete,\n markReportFailure,\n markReportLocalWritePlanned,\n markReportRemote,\n markReportRemoteOutcomeUnknown,\n markReportRemoteRequestNotApplied,\n type BatchReport,\n} from '../batch/report.js';\nimport {\n findStudioRecovery,\n isStudioRemoteRequestDefinitelyNotApplied,\n} from './studioRecovery.js';\n\nconst CONFIG_RE = /^freelog\\..*\\.config/i;\n\nexport function listRootMediaFiles(workspaceRoot: string): string[] {\n if (!fs.existsSync(workspaceRoot) || !fs.statSync(workspaceRoot).isDirectory()) {\n return [];\n }\n const files = fs\n .readdirSync(workspaceRoot, { withFileTypes: true })\n .filter((ent) => ent.isFile() && !CONFIG_RE.test(ent.name))\n .map((ent) => path.join(workspaceRoot, ent.name));\n return filterIgnoredFiles(files, loadFreelogIgnorePatterns(workspaceRoot)).sort((a, b) =>\n path.basename(a).localeCompare(path.basename(b)),\n );\n}\n\nexport interface StudioPublishOptions {\n /** 自动化与集成测试可显式指定;交互模式留空时仍由菜单选择。 */\n filePath?: string;\n resourceTypeCode?: string;\n onReportCreated?: (reportPath: string) => void;\n}\n\nexport interface StudioPublishResult {\n subdir: string;\n resourceId: string;\n resourceName: string;\n versionId?: string;\n reportPath?: string;\n outcome: 'created' | 'recovered' | 'existing';\n}\n\nfunction resolvePlannedSubdir(workspaceRoot: string, relativeSubdir: string | undefined): string | undefined {\n if (!relativeSubdir) return undefined;\n const candidate = path.resolve(workspaceRoot, relativeSubdir);\n const relative = path.relative(workspaceRoot, candidate);\n if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`Studio 恢复报告包含越界子目录: ${relativeSubdir}`);\n }\n return candidate;\n}\n\nfunction writeStudioProject(opts: {\n report: BatchReport;\n workspaceRoot: string;\n prepared: PreparedFile;\n subdir: string;\n resourceId: string;\n resourceName: string;\n versionId?: string;\n userId: number;\n username: string;\n}): void {\n const { report, workspaceRoot, prepared, subdir, resourceId, resourceName, versionId } = opts;\n markReportLocalWritePlanned(report, workspaceRoot, prepared, subdir);\n writeItemConfigs({\n subdir,\n sourceFile: prepared.absolutePath,\n resourceId,\n resourceName,\n resourceTypeCode: prepared.resourceTypeCode,\n resourceTypeName: prepared.resourceTypeName,\n resourceTitle: prepared.resourceTitle,\n fileSha1: prepared.sha1,\n filename: prepared.filename,\n version: prepared.version,\n description: prepared.description,\n intro: prepared.intro,\n coverImages: prepared.coverImages,\n tags: prepared.tags,\n dependencies: prepared.dependencies,\n baseUpcastResources: prepared.baseUpcastResources,\n authExcludedItems: prepared.authExcludedItems,\n inputAttrs: prepared.inputAttrs,\n customPropertyDescriptors: prepared.customPropertyDescriptors,\n versionId,\n userId: opts.userId,\n username: opts.username,\n });\n markReportComplete(\n report,\n workspaceRoot,\n prepared,\n {\n subdir: path.relative(workspaceRoot, subdir) || path.basename(subdir),\n resourceId,\n resourceName,\n resourceTitle: prepared.resourceTitle,\n itemTitle: prepared.itemTitle,\n authExcludedItems: prepared.authExcludedItems,\n },\n versionId,\n );\n finishBatchReport(report);\n}\n\nfunction recordStudioFailure(\n report: BatchReport,\n workspaceRoot: string,\n prepared: PreparedFile,\n error: unknown,\n): void {\n try {\n const row = findReportItem(report, workspaceRoot, prepared);\n if (\n row.result === 'remote_outcome_unknown' &&\n isStudioRemoteRequestDefinitelyNotApplied(error)\n ) {\n markReportRemoteRequestNotApplied(report, workspaceRoot, [prepared]);\n }\n markReportFailure(\n report,\n workspaceRoot,\n prepared,\n error instanceof Error ? error.message : String(error),\n );\n finishBatchReport(report);\n } catch {\n // 保留原始发行错误;最后一次成功的原子报告仍可用于人工恢复或对账。\n }\n}\n\n/** studio:从工作区根目录选择单个媒体文件发行并落盘子工程。 */\nexport async function studioPublishOneFile(\n workspaceRoot: string,\n options: StudioPublishOptions = {},\n): Promise<StudioPublishResult | null> {\n assertExplicitEnvForWriteOperation();\n const auth = requireAuth();\n if (!auth.username) {\n throw cliError(I18N_KEYS.auth_missing_username, { code: 2, hint: '重新 login' });\n }\n const username = auth.username;\n const userId = Number(auth.userId);\n if (!Number.isInteger(userId) || userId <= 0) {\n throw cliError(I18N_KEYS.owner_compare_missing_user_id, { code: 2, hint: '重新 login' });\n }\n\n const files = listRootMediaFiles(workspaceRoot);\n if (files.length === 0) {\n consola.warn('工作文件夹内没有可发行的文件');\n return null;\n }\n\n let absolutePath: string;\n if (options.filePath) {\n absolutePath = path.resolve(options.filePath);\n if (!files.some((file) => path.resolve(file) === absolutePath)) {\n throw new Error(`Studio 只能发行工作区根目录内的普通文件: ${absolutePath}`);\n }\n } else {\n const pick = await p.select({\n message: '选择要发行的文件',\n options: files.map((file) => ({\n value: file,\n label: path.basename(file),\n })),\n });\n if (p.isCancel(pick)) return null;\n absolutePath = String(pick);\n }\n const sha1 = await getSHA1Hash(absolutePath);\n const basename = path.parse(absolutePath).name;\n const safeDir = basename.replace(/[\\\\/:*?\"<>|\\s@$#]+/g, '_').replace(/_+/g, '_') || 'file';\n const name = resolveInitialBatchResourceName(undefined, safeDir);\n const draftPrepared = {\n absolutePath,\n filename: path.basename(absolutePath),\n sha1,\n name,\n resourceTitle: basename,\n resourceTypeCode: '',\n safeDir,\n version: '1.0.0',\n description: '',\n };\n let resourceTypeCode = options.resourceTypeCode?.trim();\n if (!resourceTypeCode) {\n const typeCode = await p.text({\n message: '资源类型 code(如 RT005001)',\n validate: (v) => (v?.trim() ? undefined : '必填'),\n });\n if (p.isCancel(typeCode)) return null;\n resourceTypeCode = String(typeCode).trim();\n }\n const selectedResourceTypeCode = resourceTypeCode;\n const typeInfo = await assertLeafResourceTypeCode(selectedResourceTypeCode);\n assertLocalFileAllowedByType({\n typeInfo,\n filePath: absolutePath,\n filename: path.basename(absolutePath),\n });\n return withProjectWriteLockAsync(workspaceRoot, async () => {\n const existing = resolveExistingImportBySha1(workspaceRoot, draftPrepared);\n if (existing) {\n const existingProject = tryLoadResourceProject(path.join(workspaceRoot, existing.subdir));\n assertOwnerMatch({\n authUserId: userId,\n authUsername: username,\n platformUserId: existingProject?.data.userId,\n platformUsername: existingProject?.data.username,\n hint: '该文件已有其他账号的 Studio 子工程,请切换账号或更换文件',\n });\n consola.info(`该文件已有子工程: ${existing.subdir}(resourceId=${existing.resourceId})`);\n return {\n subdir: path.join(workspaceRoot, existing.subdir),\n resourceId: existing.resourceId,\n resourceName: existing.resourceName,\n outcome: 'existing',\n };\n }\n\n draftPrepared.resourceTypeCode = selectedResourceTypeCode;\n const recovery = findStudioRecovery(workspaceRoot, draftPrepared);\n if (recovery?.item.result === 'remote_outcome_unknown') {\n throw new Error(\n `此前 Studio 发行的远端结果未知,已禁止自动重试以避免重复创建;请先在 Console 核对。恢复报告: ${recovery.report.reportPath}`,\n );\n }\n if (recovery?.item.resourceId) {\n assertOwnerMatch({\n authUserId: userId,\n authUsername: username,\n platformUserId: recovery.report.actor?.userId,\n platformUsername: recovery.report.actor?.username,\n hint: '请切换回创建该 Studio 资源的账号后恢复',\n });\n const prepared = recovery.item.prepared;\n let versionId = recovery.item.versionId;\n const resourceName = recovery.item.resourceName || prepared.name;\n let subdir = resolvePlannedSubdir(workspaceRoot, recovery.item.subdir);\n try {\n await uploadFileIfNeeded(prepared.absolutePath, prepared.sha1);\n const version = await ensureVersionAfterCreateBatch(prepared, recovery.item.resourceId);\n versionId = version.versionId || versionId;\n markReportRemote(recovery.report, workspaceRoot, prepared, {\n resourceId: recovery.item.resourceId,\n resourceName,\n versionId,\n });\n subdir ||= resolveUniqueSubdir(workspaceRoot, prepared.safeDir);\n writeStudioProject({\n report: recovery.report,\n workspaceRoot,\n prepared,\n subdir,\n resourceId: recovery.item.resourceId,\n resourceName,\n versionId,\n userId,\n username,\n });\n } catch (error) {\n recordStudioFailure(recovery.report, workspaceRoot, prepared, error);\n throw error;\n }\n consola.info(`已从恢复报告完成本地落盘: ${recovery.report.reportPath}`);\n return {\n subdir: subdir!,\n resourceId: recovery.item.resourceId,\n resourceName,\n versionId,\n reportPath: recovery.report.reportPath,\n outcome: 'recovered',\n };\n }\n\n await assertSha1PublishAllowed(sha1);\n await uploadFileIfNeeded(absolutePath, sha1);\n\n const [prepared] = await applyGeneratedResourceNames([\n {\n ...draftPrepared,\n resourceTypeCode: selectedResourceTypeCode,\n },\n ]);\n\n const subdir = resolveUniqueSubdir(workspaceRoot, prepared.safeDir);\n const report = createBatchReport({\n parent: workspaceRoot,\n prepared: [prepared],\n command: 'studio publish',\n actor: { userId, username },\n configFingerprintSource: {\n file: prepared.absolutePath,\n sha1: prepared.sha1,\n resourceTypeCode: prepared.resourceTypeCode,\n resourceName: prepared.name,\n },\n });\n options.onReportCreated?.(report.reportPath);\n markReportLocalWritePlanned(report, workspaceRoot, prepared, subdir);\n const spinner = p.spinner();\n spinner.start('发行中…');\n try {\n markReportRemoteOutcomeUnknown(report, workspaceRoot, [prepared]);\n const created = await createOneResource(prepared, (remote) => {\n markReportRemote(report, workspaceRoot, prepared, remote);\n });\n markReportRemote(report, workspaceRoot, prepared, created);\n writeStudioProject({\n report,\n workspaceRoot,\n prepared,\n subdir,\n resourceId: created.resourceId,\n resourceName: created.resourceName,\n versionId: created.versionId,\n userId,\n username,\n });\n spinner.stop(`已发行 → ${path.relative(workspaceRoot, subdir) || path.basename(subdir)}`);\n consola.info(`resourceId=${created.resourceId} owner=${username} report=${report.reportPath}`);\n return {\n subdir,\n resourceId: created.resourceId,\n resourceName: created.resourceName,\n versionId: created.versionId,\n reportPath: report.reportPath,\n outcome: 'created',\n };\n } catch (error) {\n recordStudioFailure(report, workspaceRoot, prepared, error);\n spinner.stop('发行失败');\n consola.error(`Studio 恢复/对账报告: ${report.reportPath}`);\n throw error;\n }\n });\n}\n\nexport function summarizeStudioWorkspace(workspaceRoot: string): void {\n if (!fs.existsSync(workspaceRoot)) {\n consola.warn('工作文件夹不存在');\n return;\n }\n const subdirs = fs\n .readdirSync(workspaceRoot, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name);\n const files = listRootMediaFiles(workspaceRoot).map((f) => path.basename(f));\n consola.info(`工作文件夹: ${workspaceRoot}`);\n consola.info(`根目录文件: ${files.length ? files.join(', ') : '(无)'}`);\n consola.info(`子工程: ${subdirs.length ? subdirs.join(', ') : '(无)'}`);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport * as p from '@clack/prompts';\nimport { consola } from 'consola';\nimport { clearEphemeralAuth, formatAuthContextLine, resolveCurrentAuth } from '../../core/auth.js';\nimport { isInteractive } from '../../core/tty.js';\nimport { cliError } from '../../i18n/cliError.js';\nimport { I18N_KEYS } from '../../i18n/bundled.js';\nimport {\n ensureEphemeralLogin,\n isInteractiveCancelled,\n promptSwitchEphemeralAccount,\n} from './ephemeralLogin.js';\nimport { enterStudioMaintain } from './studioActions.js';\nimport { studioPublishOneFile, summarizeStudioWorkspace } from './studioPublish.js';\nimport { reconcileStudioPublish } from './studioRecovery.js';\n\nasync function promptStudioReconcile(workspaceRoot: string): Promise<void> {\n const defaultReport = path.join(workspaceRoot, '.freelog', 'reports', 'studio-latest.json');\n const reportPath = await p.text({\n message: 'Studio 报告路径',\n defaultValue: defaultReport,\n validate: (value) => (String(value || '').trim() ? undefined : '必填'),\n });\n if (p.isCancel(reportPath)) return;\n const resolution = await p.select({\n message: 'Console 对账结果',\n options: [\n { value: 'confirmed-not-created', label: '确认平台未创建(允许安全重试)' },\n { value: 'confirmed-created', label: '确认平台已创建(录入 resourceId 后恢复)' },\n ],\n });\n if (p.isCancel(resolution)) return;\n\n let resourceId: string | undefined;\n if (resolution === 'confirmed-created') {\n const resource = await p.text({\n message: 'Console 中确认的 resourceId',\n validate: (value) => (String(value || '').trim() ? undefined : '必填'),\n });\n if (p.isCancel(resource)) return;\n resourceId = String(resource).trim();\n }\n\n const report = await reconcileStudioPublish({\n workspaceRoot,\n reportPath: String(reportPath),\n resolution,\n resourceId,\n });\n consola.info(`对账结果已写回报告: ${report.reportPath}`);\n}\n\nexport async function runStudioShell(): Promise<void> {\n if (!isInteractive()) {\n throw cliError(I18N_KEYS.studio_tty_required, {\n code: 4,\n hint: '同账号批量请用 resource import-dir;临时维护请用 freelog-cli session',\n });\n }\n\n consola.info('Freelog 多账号工作区(10 · 凭据不落盘,子工程落盘)');\n clearEphemeralAuth();\n\n try {\n await ensureEphemeralLogin();\n\n let workspaceRoot = process.cwd();\n const folderPick = await p.text({\n message: '工作文件夹路径',\n defaultValue: workspaceRoot,\n validate: (v) => {\n const resolved = path.resolve(String(v || '').trim() || workspaceRoot);\n if (!fs.existsSync(resolved)) return '路径不存在';\n if (!fs.statSync(resolved).isDirectory()) return '须为目录';\n return undefined;\n },\n });\n if (p.isCancel(folderPick)) return;\n workspaceRoot = path.resolve(String(folderPick));\n\n let running = true;\n while (running) {\n const resolved = resolveCurrentAuth();\n if (resolved) {\n consola.info(formatAuthContextLine(resolved));\n }\n consola.info(`工作区: ${workspaceRoot}`);\n\n const action = await p.select({\n message: '接下来要做什么?',\n options: [\n { value: 'publish', label: '1. 从文件夹选文件发行(新建子工程)' },\n { value: 'maintain', label: '2. 进入子工程维护' },\n { value: 'switch', label: '3. 切换账号(重新登录)' },\n { value: 'summary', label: '4. 文件夹概况' },\n { value: 'reconcile', label: '5. 对账/恢复结果未知的发行' },\n { value: 'exit', label: '0. 退出' },\n ],\n });\n if (p.isCancel(action)) break;\n\n try {\n switch (action) {\n case 'publish':\n await studioPublishOneFile(workspaceRoot);\n break;\n case 'maintain':\n await enterStudioMaintain(workspaceRoot);\n break;\n case 'switch':\n await promptSwitchEphemeralAccount();\n break;\n case 'summary':\n summarizeStudioWorkspace(workspaceRoot);\n break;\n case 'reconcile':\n await promptStudioReconcile(workspaceRoot);\n break;\n case 'exit':\n running = false;\n break;\n default:\n break;\n }\n } catch (error) {\n if (isInteractiveCancelled(error)) continue;\n const message = error instanceof Error ? error.message : String(error);\n consola.error(message);\n }\n }\n\n consola.info('studio 已结束。凭据未保存;子工程已保留在磁盘。');\n } catch (error) {\n if (isInteractiveCancelled(error)) return;\n throw error;\n } finally {\n clearEphemeralAuth();\n }\n}\n","import { defineCommand } from 'citty';\nimport { applyCommandFlags, handleCommandError } from '../core/command.js';\nimport { cliEnvArgs } from '../core/cliArgs.js';\nimport { runStudioShell } from '../services/interactive/studioShell.js';\n\nexport const studioCommand = defineCommand({\n meta: {\n name: 'studio',\n description: '多账号工作区(10:凭据不落盘,子工程落盘;须 TTY)',\n },\n args: {\n ...cliEnvArgs,\n },\n async run({ args }) {\n try {\n applyCommandFlags(args);\n await runStudioShell();\n } catch (error) {\n handleCommandError(error);\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport { consola } from 'consola';\nimport {applyCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\nimport { cliReadCommandArgs } from '../core/cliArgs.js';\nimport { listTemplateRefs } from '../services/compat.js';\n\nconst listCommand = defineCommand({\n meta: { name: 'list', description: '列出可用项目模板' },\n args: {\n scaffold: { type: 'string', description: 'runtime | package' },\n runtime: { type: 'string', description: '0.4 | 0.5' },\n ...cliReadCommandArgs,\n },\n async run({ args }) {\n try {\n applyCommandFlags(args);\n const rows = listTemplateRefs().filter((row) => {\n if (args.scaffold && row.scaffold !== args.scaffold) return false;\n if (args.runtime && row.runtime !== args.runtime) return false;\n return true;\n });\n if (args.json) {\n writeJsonSuccess('template', { templates: rows });\n return;\n }\n if (!rows.length) {\n consola.warn('没有匹配模板');\n return;\n }\n for (const row of rows) {\n const runtime = row.runtime ? ` runtime=${row.runtime}` : '';\n const defaultMark = row.defaultRuntime ? ' default' : '';\n const range = row.freelogRuntimeRange ? ` freelogRuntime=${row.freelogRuntimeRange}` : '';\n consola.info(\n `${row.id} scaffold=${row.scaffold}${runtime}${defaultMark} version=${row.version}${range}`,\n );\n }\n } catch (error) {\n handleCommandError(error, args.json);\n }\n },\n});\n\nexport const templateCommand = defineCommand({\n meta: { name: 'template', description: '模板发现与选择' },\n subCommands: {\n list: listCommand,\n },\n});\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { cliReadCommandArgs } from '../core/cliArgs.js';\r\nimport { requireAuth } from '../core/auth.js';\r\nimport { assertResourceTypeCode, listResourceTypes } from '../services/typeService.js';\r\nimport { pickResourceTypeInteractive, type ScaffoldInitCategory } from '../services/init/index.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\n\r\nfunction flattenTypes(value: unknown): Array<Record<string, unknown>> {\r\n const rows: Array<Record<string, unknown>> = [];\r\n const visit = (node: unknown) => {\r\n if (!node || typeof node !== 'object') return;\r\n if (Array.isArray(node)) {\r\n for (const item of node) visit(item);\r\n return;\r\n }\r\n const record = node as Record<string, unknown>;\r\n if (record.code || record.resourceTypeCode || record.typeCode) rows.push(record);\r\n for (const key of ['children', 'childNodes', 'dataList', 'list']) visit(record[key]);\r\n };\r\n visit(value);\r\n return rows;\r\n}\r\n\r\nfunction typeCode(row: Record<string, unknown>): string {\r\n return String(row.code || row.resourceTypeCode || row.typeCode || '');\r\n}\r\n\r\nfunction typeName(row: Record<string, unknown>): string {\r\n return String(row.name || row.resourceTypeName || row.title || row.typeName || '');\r\n}\r\n\r\nconst listCommand = defineCommand({\r\n meta: { name: 'list', description: '列出平台资源类型' },\r\n args: {\r\n subject: { type: 'string', description: 'resource | collection' },\r\n ...cliReadCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const data = await listResourceTypes({\r\n subjectType: args.subject === 'collection' ? 4 : undefined,\r\n });\r\n const types = flattenTypes(data);\r\n if (args.json) {\r\n writeJsonSuccess('type', { types });\r\n } else {\r\n for (const row of types) consola.info(`${typeCode(row)} ${typeName(row)}`);\r\n if (!types.length) consola.warn('未返回资源类型');\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst searchCommand = defineCommand({\r\n meta: { name: 'search', description: '搜索平台资源类型' },\r\n args: {\r\n keyword: { type: 'positional', required: true, description: '搜索关键词(匹配 code 或名称)' },\r\n subject: { type: 'string', description: 'resource | collection' },\r\n ...cliReadCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const keyword = String(args.keyword).toLowerCase();\r\n const data = await listResourceTypes({\r\n subjectType: args.subject === 'collection' ? 4 : undefined,\r\n });\r\n const types = flattenTypes(data).filter((row) => {\r\n return (\r\n typeCode(row).toLowerCase().includes(keyword) ||\r\n typeName(row).toLowerCase().includes(keyword)\r\n );\r\n });\r\n if (!types.length) {\r\n throw cliError(I18N_KEYS.resource_type_not_found, {\r\n code: 4,\r\n hint: '运行 freelog-cli type list 查看全部类型',\r\n });\r\n }\r\n if (args.json) {\r\n writeJsonSuccess('type', { types });\r\n } else {\r\n for (const row of types) consola.info(`${typeCode(row)} ${typeName(row)}`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst infoCommand = defineCommand({\r\n meta: { name: 'info', description: '查看资源类型能力' },\r\n args: {\r\n code: { type: 'positional', required: true, description: '资源类型 code(如 RT005001)' },\r\n ...cliReadCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const info = await assertResourceTypeCode(String(args.code));\r\n if (args.json) {\r\n writeJsonSuccess('type', { info });\r\n } else {\r\n consola.info(JSON.stringify(info, null, 2));\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst pickCommand = defineCommand({\r\n meta: {\r\n name: 'pick',\r\n description: '交互式逐级选择平台叶子资源类型(需已 login)',\r\n },\r\n args: {\r\n category: {\r\n type: 'string',\r\n description: '跳过第一层:theme | widget | package | other | collection',\r\n },\r\n subject: { type: 'string', description: 'collection 时用 collection' },\r\n ...cliReadCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n requireAuth();\r\n let category = args.category as ScaffoldInitCategory | undefined;\r\n if (category && !['theme', 'widget', 'package', 'other', 'collection'].includes(category)) {\r\n throw cliError(I18N_KEYS.invalid_category, {\r\n code: 4,\r\n hint: 'theme | widget | package | other | collection',\r\n });\r\n }\r\n if (args.subject === 'collection') {\r\n category = 'collection';\r\n }\r\n const picked = await pickResourceTypeInteractive({ category });\r\n if (args.json) {\r\n writeJsonSuccess('type pick', {\r\n code: picked.code,\r\n name: picked.name,\r\n pathLabel: picked.pathLabel,\r\n resourceTypeLabels: picked.resourceTypeLabels,\r\n suggestedScaffold: picked.suggestedScaffold,\r\n category: picked.category,\r\n });\r\n } else {\r\n consola.success(`已选择: ${picked.pathLabel}`);\r\n consola.info(`resourceTypeCode=${picked.code}`);\r\n consola.info(`建议 scaffold=${picked.suggestedScaffold}`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json, 'type pick');\r\n }\r\n },\r\n});\r\n\r\nexport const typeCommand = defineCommand({\r\n meta: { name: 'type', description: '资源类型发现' },\r\n subCommands: {\r\n list: listCommand,\r\n search: searchCommand,\r\n info: infoCommand,\r\n pick: pickCommand,\r\n },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { updateListing } from '../services/resourceService.js';\r\nimport { projectStoreFromCwd } from '../services/store/index.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { shouldRunFieldWizard, helpSnippet } from '../services/shared/fieldConstraints.js';\r\nimport { runUpdateListingWizard } from '../services/updateListingWizard.js';\r\n\r\nexport const updateCommand = defineCommand({\r\n meta: { name: 'update', description: '更新 listing(禁止用 status:1 当上架)' },\r\n args: {\r\n title: { type: 'string', description: `资源标题(${helpSnippet('FORM-RES-TITLE')})` },\r\n intro: { type: 'string', description: `简介(${helpSnippet('FORM-LIST-INTRO')})` },\r\n cover: { type: 'string', description: `封面本地路径或 URL(${helpSnippet('FORM-LIST-COVER')})` },\r\n tags: { type: 'string', description: `逗号分隔 tags(${helpSnippet('FORM-LIST-TAGS')})` },\r\n ...cliWriteCommandArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const store = projectStoreFromCwd(resolveCwd(args.cwd));\r\n\r\n let title = typeof args.title === 'string' ? args.title : undefined;\r\n let intro = args.intro !== undefined ? String(args.intro) : undefined;\r\n let cover = typeof args.cover === 'string' ? args.cover : undefined;\r\n let tags = args.tags\r\n ? args.tags.split(',').map((t) => t.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n const hasListingFlags = Boolean(title || intro !== undefined || cover || tags);\r\n if (\r\n shouldRunFieldWizard({\r\n yes: args.yes,\r\n json: args.json,\r\n hasBusinessFlags: hasListingFlags,\r\n })\r\n ) {\r\n const wizard = await runUpdateListingWizard(store);\r\n title = wizard.title ?? title;\r\n intro = wizard.intro ?? intro;\r\n cover = wizard.cover ?? cover;\r\n tags = wizard.tags ?? tags;\r\n } else if (!hasListingFlags) {\r\n throw cliError(I18N_KEYS.update_at_least_one_field, { code: 4 });\r\n }\r\n\r\n const data = await updateListing({\r\n store,\r\n title,\r\n intro,\r\n cover,\r\n tags,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) writeJsonSuccess('update', { resource: data });\r\n else consola.success('已更新 listing');\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { cliReadCommandArgs } from '../core/cliArgs.js';\r\nimport { resolveCwd, tryLoadVersionProject } from '../config/project.js';\r\nimport { validateProject, type ValidateTarget } from '../services/validateService.js';\r\n\r\nfunction parseTarget(raw: string | undefined): ValidateTarget {\r\n if (raw === 'publish' || raw === 'online') return raw;\r\n return 'project';\r\n}\r\n\r\nasync function runValidate(args: {\r\n cwd?: string;\r\n for?: string;\r\n json?: boolean;\r\n}): Promise<void> {\r\n const cwd = resolveCwd(args.cwd);\r\n let target: ValidateTarget = args.for ? parseTarget(args.for) : 'project';\r\n if (!args.for && tryLoadVersionProject(cwd)) {\r\n target = 'publish';\r\n }\r\n const result = await validateProject({ cwd, target });\r\n\r\n if (args.json) {\r\n writeJsonSuccess('validate', { target: result.target, checks: result.checks }, { ok: result.ok });\r\n if (!result.ok) process.exit(4);\r\n return;\r\n }\r\n\r\n for (const check of result.checks) {\r\n const prefix = check.level === 'ok' ? '✓' : check.level === 'warn' ? '!' : '✗';\r\n const line = `${prefix} ${check.message}`;\r\n if (check.level === 'ok') consola.success(line);\r\n else if (check.level === 'warn') consola.warn(line);\r\n else consola.error(line);\r\n if (check.hint) consola.info(` → ${check.hint}`);\r\n }\r\n\r\n if (result.ok) {\r\n consola.success(`validate 通过 (${result.checks.length} 项)`);\r\n } else {\r\n consola.error('validate 未通过');\r\n process.exit(4);\r\n }\r\n}\r\n\r\nconst validateArgs = {\r\n for: {\r\n type: 'string' as const,\r\n description: '检查深度: project | publish | online(有 resourceId 时默认 publish)',\r\n },\r\n ...cliReadCommandArgs,\r\n};\r\n\r\nexport const validateCommand = defineCommand({\r\n meta: {\r\n name: 'validate',\r\n description: '发版前预检(登录、manifest、版本文件、owner、online 门禁等)',\r\n },\r\n args: validateArgs,\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n await runValidate(args);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const doctorCommand = defineCommand({\r\n meta: { name: 'doctor', description: 'validate 别名 — 发版前健康检查' },\r\n args: validateArgs,\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n await runValidate(args);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n","import * as p from '@clack/prompts';\r\nimport { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, applyWriteCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport {\r\n loadVersionProject,\r\n resolveCwd,\r\n saveVersionProject,\r\n tryLoadResourceProject,\r\n} from '../config/project.js';\r\nimport { editReleasedVersion } from '../services/versionEditService.js';\r\nimport { ensureSynced } from '../services/sync/index.js';\r\nimport {\r\n finalizeSessionCommand,\r\n projectStoreFromCwd,\r\n resolveCommandProjectStore,\r\n} from '../services/store/index.js';\r\nimport { assertSemverLike } from '../services/validation.js';\r\nimport { computeManifestBumpVersion, type BumpLevel } from '../services/versionBumpService.js';\r\nimport { cliError } from '../i18n/cliError.js';\r\nimport { I18N_KEYS } from '../i18n/bundled.js';\r\nimport { t } from '../i18n/index.js';\r\nimport { isInteractive } from '../core/tty.js';\r\nimport fs from 'node:fs';\r\nimport path from 'node:path';\r\n\r\nasync function confirmClearFile(args: { yes?: boolean }): Promise<boolean> {\r\n if (args.yes) return true;\r\n if (!isInteractive(args.yes)) {\r\n throw cliError(I18N_KEYS.non_interactive_needs_yes, { code: 4, hint: '加 --yes 后重试' });\r\n }\r\n const ok = await p.confirm({ message: t(I18N_KEYS.createversion_remove_file_confirmation) });\r\n if (p.isCancel(ok) || !ok) {\r\n consola.info('已取消');\r\n process.exitCode = 0;\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nimport { cliWriteCommandArgs } from '../core/cliArgs.js';\r\nimport { infoPublishFileConstraints } from '../services/publishFileHints.js';\r\n\r\nconst sharedVersionArgs = cliWriteCommandArgs;\r\n\r\nconst bumpCommand = defineCommand({\r\n meta: { name: 'bump', description: '递增 manifest 中的版本号(不调用发布 API)' },\r\n args: {\r\n level: {\r\n type: 'positional' as const,\r\n required: false,\r\n description: 'patch|minor|major,默认 patch',\r\n },\r\n ...sharedVersionArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n const store = projectStoreFromCwd(cwd);\r\n const rawLevel = (args.level ? String(args.level) : 'patch').toLowerCase();\r\n if (rawLevel !== 'patch' && rawLevel !== 'minor' && rawLevel !== 'major') {\r\n throw cliError(I18N_KEYS.bump_level_invalid, { code: 4 });\r\n }\r\n const level = rawLevel as BumpLevel;\r\n\r\n const resource = tryLoadResourceProject(cwd);\r\n const ctx = resource?.data.resourceId\r\n ? await ensureSynced({ store, noAutoPull: args['no-auto-pull'] })\r\n : null;\r\n const { data } = loadVersionProject(cwd);\r\n const previous = data.version;\r\n const next = computeManifestBumpVersion({\r\n currentVersion: data.version || ctx?.info.latestVersion || '1.0.0',\r\n latestPlatform: ctx?.info.latestVersion,\r\n level,\r\n });\r\n data.version = next;\r\n if (ctx) {\r\n data.resourceId = ctx.resource.resourceId || data.resourceId;\r\n data.resourceName = ctx.resource.resourceName || data.resourceName;\r\n data.resourceTypeCode = ctx.resource.resourceTypeCode || data.resourceTypeCode;\r\n data.userId = ctx.resource.userId;\r\n data.username = ctx.resource.username;\r\n }\r\n saveVersionProject(data, cwd);\r\n\r\n if (args.json) {\r\n writeJsonSuccess('version', { previous, version: next, level });\r\n } else {\r\n consola.success(`版本已从 ${previous || '未设置'} 递增为 ${next}(${level},仅修改 manifest)`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst setCommand = defineCommand({\r\n meta: { name: 'set', description: '写本地下一版发布意图(不调用平台草稿 API)' },\r\n args: {\r\n version: { type: 'string' as const, description: 'semver 版本号' },\n description: { type: 'string' as const, description: '版本说明(写入 manifest 意图)' },\n 'video-cover': { type: 'string' as const, description: '下一版视频封面 URL 或本地图片路径' },\n file: { type: 'string' as const, description: '发布文件或构建目录路径' },\r\n 'artifact-mode': {\r\n type: 'string' as const,\r\n description: '发行物模式:file 或 directory-zip',\r\n },\r\n 'clear-file': { type: 'boolean' as const, description: '清除本地文件发布意图(交互模式会确认)' },\r\n runtime: { type: 'string' as const, description: '0.4 | 0.5' },\r\n ...sharedVersionArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n const cwd = resolveCwd(args.cwd);\r\n const store = projectStoreFromCwd(cwd);\r\n const resource = tryLoadResourceProject(cwd);\r\n const ctx = resource?.data.resourceId\r\n ? await ensureSynced({ store, noAutoPull: args['no-auto-pull'] })\r\n : null;\r\n const { data } = loadVersionProject(cwd);\r\n const previousVersion = data.version;\r\n const previousFilePath = data.filePath;\r\n const previousArtifactMode = data.artifactMode;\r\n const clearFile = Boolean(args['clear-file']);\r\n\r\n if (clearFile && args.file) {\r\n throw cliError(I18N_KEYS.version_set_clear_file_conflict, { code: 4 });\r\n }\r\n\r\n if (args.version) {\r\n assertSemverLike(args.version);\r\n data.version = args.version;\r\n }\r\n if (args.description !== undefined) data.description = args.description;\r\n if (args['video-cover'] !== undefined) data.videoCover = args['video-cover'];\r\n if (args['artifact-mode'] !== undefined) {\r\n if (args['artifact-mode'] !== 'file' && args['artifact-mode'] !== 'directory-zip') {\r\n throw cliError(I18N_KEYS.artifact_mode_invalid, { code: 4 });\r\n }\r\n data.artifactMode = args['artifact-mode'];\r\n }\r\n\r\n if (clearFile) {\r\n const ok = await confirmClearFile(args);\r\n if (!ok) return;\r\n data.filePath = '';\r\n data.fileSha1 = null;\r\n data.filename = null;\r\n data.versionId = null;\r\n } else if (args.file) {\r\n const filePath = path.resolve(cwd, args.file);\r\n if (!fs.existsSync(filePath)) {\r\n throw cliError(I18N_KEYS.version_set_file_not_found, {\r\n code: 4,\r\n params: { path: args.file },\r\n });\r\n }\r\n if (isInteractive(args.yes)) {\r\n const typeCode =\r\n ctx?.resource.resourceTypeCode || resource?.data.resourceTypeCode || data.resourceTypeCode;\r\n if (typeCode) {\r\n await infoPublishFileConstraints({\r\n cwd,\r\n filePath: args.file,\r\n resourceTypeCode: typeCode,\r\n versionConfig: data,\r\n });\r\n }\r\n }\r\n data.filePath = args.file;\r\n }\r\n\r\n if (args.runtime) {\r\n if (args.runtime !== '0.4' && args.runtime !== '0.5') {\r\n throw cliError(I18N_KEYS.runtime_flag_only_04_05, { code: 4 });\r\n }\r\n data.runtimeVersion = args.runtime;\r\n }\r\n if (\r\n data.version !== previousVersion ||\r\n data.filePath !== previousFilePath ||\r\n data.artifactMode !== previousArtifactMode ||\r\n clearFile\r\n ) {\r\n if (!clearFile) {\r\n data.fileSha1 = null;\r\n data.filename = null;\r\n data.versionId = null;\r\n }\r\n }\r\n if (ctx) {\r\n data.resourceId = ctx.resource.resourceId || data.resourceId;\r\n data.resourceName = ctx.resource.resourceName || data.resourceName;\r\n data.resourceTypeCode = ctx.resource.resourceTypeCode || data.resourceTypeCode;\r\n data.userId = ctx.resource.userId;\r\n data.username = ctx.resource.username;\r\n }\r\n\r\n if (!data.version) {\r\n throw cliError(I18N_KEYS.naming_convention_version_required, { code: 4 });\r\n }\r\n if (!clearFile && !data.filePath?.trim()) {\r\n throw cliError(I18N_KEYS.version_and_filepath_or_clear_required, { code: 4 });\r\n }\r\n assertSemverLike(data.version);\r\n\r\n saveVersionProject(data, cwd);\r\n if (args.json) {\r\n writeJsonSuccess('version', { version: data });\r\n } else if (clearFile) {\r\n consola.success(`已清除本地文件意图,版本 ${data.version}`);\r\n } else {\r\n consola.success(`已更新本地版本意图 ${data.version}`);\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nconst editCommand = defineCommand({\r\n meta: { name: 'edit', description: '修改已发行版本的可维护元数据(不换文件、不升版本)' },\r\n args: {\r\n version: { type: 'string' as const, description: '已存在的正式版本号' },\n description: { type: 'string' as const, description: '已发版说明文案' },\n 'sync-properties': {\r\n type: 'boolean' as const,\r\n description: '将 manifest 中的 inputAttrs/customPropertyDescriptors 同步到已发版',\r\n },\r\n ...sharedVersionArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyWriteCommandFlags(args);\r\n if (!args.version) throw cliError(I18N_KEYS.missing_version_flag, { code: 4 });\r\n\r\n if (args.session) {\r\n if (!args['resource-id']?.trim()) {\r\n throw cliError(I18N_KEYS.session_resource_id_required, { code: 4 });\r\n }\r\n const store = resolveCommandProjectStore({\r\n cwd: resolveCwd(args.cwd),\r\n session: true,\r\n 'resource-id': args['resource-id'],\r\n });\r\n store.saveVersion({ version: args.version, filePath: '' });\r\n const result = await editReleasedVersion({\r\n store,\r\n version: args.version,\r\n description: args.description,\r\n syncProperties: args['sync-properties'],\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n const payload = finalizeSessionCommand({\r\n store,\r\n exportProject: args['export-project'],\r\n result: result as Record<string, unknown>,\r\n });\r\n if (args.json) writeJsonSuccess('version edit', payload);\r\n else consola.success(`已更新正式版 ${result.version} 元数据(session)`);\r\n return;\r\n }\r\n\r\n const result = await editReleasedVersion({\r\n store: projectStoreFromCwd(resolveCwd(args.cwd)),\r\n version: args.version,\r\n description: args.description,\r\n syncProperties: args['sync-properties'],\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n if (args.json) writeJsonSuccess('version', result);\r\n else consola.success(`已更新正式版 ${result.version} 元数据`);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nimport { inspectReleasedVersion } from '../services/versionPropertyService.js';\r\n\r\nconst showCommand = defineCommand({\r\n meta: { name: 'show', description: '读取平台已发版属性(inputAttrs/customPropertyDescriptors)' },\r\n args: {\r\n version: { type: 'string' as const, description: '已存在的正式版本号' },\r\n ...sharedVersionArgs,\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n if (!args.version) throw cliError(I18N_KEYS.missing_version_flag, { code: 4 });\r\n const store = projectStoreFromCwd(resolveCwd(args.cwd));\r\n const ctx = await ensureSynced({\r\n store,\r\n noAutoPull: args['no-auto-pull'],\r\n });\r\n const result = await inspectReleasedVersion({\r\n resourceId: ctx.resource.resourceId!,\r\n version: args.version,\r\n });\r\n if (args.json) writeJsonSuccess('version', result);\r\n else {\r\n consola.info(\r\n `版本 ${result.version}:inputAttrs=${result.inputAttrs.length},custom=${result.customPropertyDescriptors.length}`,\r\n );\r\n }\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const versionCommand = defineCommand({\r\n meta: { name: 'version', description: '管理下一版发布意图与已发行版本元数据' },\r\n subCommands: {\r\n set: setCommand,\r\n bump: bumpCommand,\r\n edit: editCommand,\r\n show: showCommand,\r\n },\r\n});\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\n\r\nexport interface WorkspaceProjectHit {\r\n path: string;\r\n manifest: string;\r\n subject?: string;\r\n name?: string;\r\n resourceId?: string | null;\r\n}\r\n\r\nconst MANIFEST = 'freelog.manifest.json';\r\nconst SKIP_DIRS = new Set([\r\n 'node_modules',\r\n '.git',\r\n 'dist',\r\n 'build',\r\n '.freelog',\r\n 'coverage',\r\n '.turbo',\r\n]);\r\n\r\nexport function scanWorkspaceProjects(root: string, maxDepth = 5): WorkspaceProjectHit[] {\r\n const resolved = path.resolve(root);\r\n const hits: WorkspaceProjectHit[] = [];\r\n\r\n function walk(dir: string, depth: number): void {\r\n if (depth > maxDepth) return;\r\n let entries: fs.Dirent[];\r\n try {\r\n entries = fs.readdirSync(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n\r\n const manifestPath = path.join(dir, MANIFEST);\r\n if (fs.existsSync(manifestPath)) {\r\n hits.push(readManifestHit(dir, manifestPath));\r\n }\r\n\r\n for (const ent of entries) {\r\n if (!ent.isDirectory()) continue;\r\n if (SKIP_DIRS.has(ent.name)) continue;\r\n walk(path.join(dir, ent.name), depth + 1);\r\n }\r\n }\r\n\r\n walk(resolved, 0);\r\n hits.sort((a, b) => a.path.localeCompare(b.path));\r\n return hits;\r\n}\r\n\r\nfunction readManifestHit(dir: string, manifestPath: string): WorkspaceProjectHit {\r\n try {\r\n const raw = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as {\r\n subject?: string;\r\n identity?: { name?: string };\r\n };\r\n let resourceId: string | null = null;\r\n const statePath = path.join(dir, '.freelog', 'state.json');\r\n if (fs.existsSync(statePath)) {\r\n const state = JSON.parse(fs.readFileSync(statePath, 'utf8')) as {\r\n resource?: { resourceId?: string };\r\n };\r\n resourceId = state.resource?.resourceId ?? null;\r\n }\r\n return {\r\n path: dir,\r\n manifest: manifestPath,\r\n subject: raw.subject,\r\n name: raw.identity?.name,\r\n resourceId,\r\n };\r\n } catch {\r\n return { path: dir, manifest: manifestPath };\r\n }\r\n}\r\n","import { defineCommand } from 'citty';\r\nimport { consola } from 'consola';\r\nimport {applyCommandFlags, handleCommandError, writeJsonSuccess} from '../core/command.js';\r\nimport { cliReadCommandArgs } from '../core/cliArgs.js';\r\nimport { resolveCwd } from '../config/project.js';\r\nimport { scanWorkspaceProjects } from '../services/workspaceScan.js';\r\n\r\nconst workspaceListCommand = defineCommand({\r\n meta: { name: 'list', description: '列出子目录中的 freelog.manifest.json' },\r\n args: {\r\n depth: { type: 'string', description: '最大递归深度,默认 5' },\r\n ...cliReadCommandArgs,\r\n cwd: { type: 'string', description: '扫描根目录,默认当前目录' },\r\n },\r\n async run({ args }) {\r\n try {\r\n applyCommandFlags(args);\r\n const root = resolveCwd(args.cwd);\r\n const depth = args.depth ? Number(args.depth) : 5;\r\n const projects = scanWorkspaceProjects(root, Number.isFinite(depth) ? depth : 5);\r\n\r\n if (args.json) {\r\n writeJsonSuccess('workspace', { root, projects });\r\n return;\r\n }\r\n\r\n if (projects.length === 0) {\r\n consola.warn(`未在 ${root} 下找到 freelog.manifest.json`);\r\n return;\r\n }\r\n\r\n for (const p of projects) {\r\n const id = p.resourceId ? ` id=${p.resourceId}` : '';\r\n consola.info(\r\n `${p.path} subject=${p.subject ?? '?'} name=${p.name ?? '-'}${id}`,\r\n );\r\n }\r\n consola.success(`共 ${projects.length} 个项目`);\r\n } catch (error) {\r\n handleCommandError(error, args.json);\r\n }\r\n },\r\n});\r\n\r\nexport const workspaceCommand = defineCommand({\r\n meta: { name: 'workspace', description: 'monorepo 工作区扫描' },\r\n subCommands: {\r\n list: workspaceListCommand,\r\n },\r\n});\r\n","import type { SubCommandsDef } from 'citty';\nimport { bindCommand } from '../commands/bind.js';\nimport { collectionCommand } from '../commands/collection/index.js';\nimport { completionCommand } from '../commands/completion.js';\nimport { configCommand } from '../commands/config.js';\nimport { coverCommand } from '../commands/cover.js';\nimport { createCommand } from '../commands/create.js';\nimport { depCommand } from '../commands/dep.js';\nimport { diffCommand } from '../commands/diff.js';\nimport { draftCommand } from '../commands/draft.js';\nimport { initCommand } from '../commands/init.js';\nimport { langCommand } from '../commands/lang.js';\nimport { loginCommand } from '../commands/login.js';\nimport { logoutCommand } from '../commands/logout.js';\nimport { metaCommand } from '../commands/meta.js';\nimport { offlineCommand, onlineCommand } from '../commands/online.js';\nimport { policyCommand } from '../commands/policy.js';\nimport { publishCommand } from '../commands/publish.js';\nimport { pullCommand } from '../commands/pull.js';\nimport { releaseCommand } from '../commands/release.js';\nimport { resourceCommand } from '../commands/resource.js';\nimport { sessionInteractiveCommand } from '../commands/sessionInteractive.js';\nimport { statusCommand } from '../commands/status.js';\nimport { studioCommand } from '../commands/studio.js';\nimport { templateCommand } from '../commands/template.js';\nimport { typeCommand } from '../commands/type.js';\nimport { updateCommand } from '../commands/update.js';\nimport { validateCommand, doctorCommand } from '../commands/validate.js';\nimport { versionCommand } from '../commands/version.js';\nimport { workspaceCommand } from '../commands/workspace.js';\n\nexport function createSubCommands(devMode = process.env.FREELOG_DEV === '1'): SubCommandsDef {\n const subCommands: SubCommandsDef = {\n login: loginCommand,\n logout: logoutCommand,\n status: statusCommand,\n validate: validateCommand,\n doctor: doctorCommand,\n diff: diffCommand,\n release: releaseCommand,\n completion: completionCommand,\n config: configCommand,\n workspace: workspaceCommand,\n type: typeCommand,\n template: templateCommand,\n init: initCommand,\n bind: bindCommand,\n create: createCommand,\n resource: resourceCommand,\n publish: publishCommand,\n draft: draftCommand,\n dep: depCommand,\n version: versionCommand,\n policy: policyCommand,\n online: onlineCommand,\n offline: offlineCommand,\n update: updateCommand,\n pull: pullCommand,\n collection: collectionCommand,\n lang: langCommand,\n session: sessionInteractiveCommand,\n studio: studioCommand,\n };\n\n if (devMode) {\n subCommands.meta = metaCommand;\n subCommands.cover = coverCommand;\n }\n\n return subCommands;\n}\n","import { installToolsLibForNode } from '../platform/bootstrap.js';\r\n\r\ninstallToolsLibForNode();\r\n\r\nimport { createRequire } from 'node:module';\r\nimport { defineCommand, runMain } from 'citty';\nimport { tryPrintInitPresetHelpFromArgv } from '../commands/initHelp.js';\nimport { createSubCommands } from './subCommands.js';\n\r\nif (tryPrintInitPresetHelpFromArgv(process.argv)) {\r\n process.exit(0);\r\n}\r\n\r\nconst require = createRequire(import.meta.url);\r\nconst pkg = require('../../package.json') as { version?: string };\r\n\r\nconst subCommands = createSubCommands();\n\r\nimport { mainGlobalArgs } from '../core/cliArgs.js';\r\n\r\nconst main = defineCommand({\r\n meta: {\r\n name: 'freelog-cli',\r\n version: pkg.version || '0.5.0',\r\n description: 'Freelog CLI — 与 Console 同源 @freelog-cli/tools-lib2 的资源脚手架与发行工具',\n },\r\n args: mainGlobalArgs,\r\n subCommands,\r\n});\r\n\r\nrunMain(main);\r\n"],"mappings":"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"}