@hcmai/cli 0.3.7 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/exit.ts","../src/middleware/auth-guard.ts","../src/utils/attachment-args.ts","../src/utils/slash.ts","../src/streaming/TerminalRenderer.ts","../src/streaming/StreamPresenter.ts","../src/repl/InkRendererBridge.ts","../src/repl/BlockView.tsx","../src/repl/MultilineInput.tsx","../src/repl/types.ts","../src/repl/App.tsx","../src/repl/run.ts","../src/streaming/control-prompt.ts","../src/io/readline.ts","../src/index.ts","../src/package-version.ts","../src/commands/login.ts","../src/utils/prompt.ts","../src/commands/config.ts","../src/commands/env.ts","../src/utils/table.ts","../src/commands/query.ts","../src/commands/action.ts","../src/utils/json-input.ts","../src/commands/create.ts","../src/commands/update.ts","../src/commands/setting.ts","../src/commands/version.ts","../src/commands/delete.ts","../src/commands/import.ts","../src/commands/describe.ts","../src/commands/chat.ts","../src/commands/download.ts","../src/commands/trace.ts","../src/commands/cache.ts","../src/commands/upload.ts","../src/commands/skills.ts","../src/commands/skills-catalog.ts","../src/commands/skills-bundled.ts","../src/commands/skills-manifest.ts","../src/commands/skills-sync.ts","../src/commands/skills-runtime.ts","../src/commands/tenant.ts","../src/commands/meta.ts","../src/commands/workspace.ts","../src/commands/workspace-format.ts","../src/commands/identity.ts","../src/commands/delivery-action-policy.ts","../src/commands/delivery.ts","../src/commands/delivery-doctor.ts","../src/commands/delivery-recon.ts","../src/commands/delivery-execution.ts","../src/commands/user.ts","../src/startup.ts"],"sourcesContent":["import { CliError } from '@hcmai/sdk';\n\nexport function exitWithError(err: unknown): never {\n if (err instanceof CliError) {\n process.stderr.write(`Error: ${err.toFormattedString()}\\n`);\n process.exit(err.exitCode);\n }\n if (err instanceof Error) {\n process.stderr.write(`Error: ${err.message}\\n`);\n process.exit(1);\n }\n process.stderr.write(`Error: ${String(err)}\\n`);\n process.exit(1);\n}\n\nexport function exitOk(stdout?: string): never {\n if (stdout) process.stdout.write(stdout + '\\n');\n process.exit(0);\n}\n","import axios from 'axios';\nimport {\n ensureSessionFresh,\n loadGlobalConfig,\n loadEnv,\n loadIdentity,\n resolveActiveEnv,\n resolveActiveIdentity,\n listEnvs,\n CliError,\n CliErrorCode,\n type ClientAuthContext,\n} from '@hcmai/sdk';\n\nexport interface AuthContext {\n env: string;\n endpoint: string;\n tenantId: string;\n identity: string;\n}\n\n/**\n * Resolve the active auth context for a business command.\n *\n * Priority for env: `args.envFlag > HCM_ENV > HCM_PROFILE > global.activeEnv`.\n * Priority for identity: `args.asFlag > HCM_IDENTITY > env.defaultIdentity > first identity in env`.\n *\n * Throws CliError:\n * - NO_ACTIVE_ENV when no env is configured on disk\n * - IDENTITY_NOT_FOUND when env has no identity (via resolveActiveIdentity)\n * - TOKEN_EXPIRED when identity.expiresAt < now\n *\n * 🔴 判过期**之前**先尝试续期。原因是本地的 `expiresAt` 只是服务端状态的一份缓存:\n * 后端 `TokenAuthenticationFilter` 在每个带 token 的请求上都会滑动续期,而这份缓存\n * 是登录那一刻算死的、之后再没更新过 —— 直接拿它判,就是**用一个早就过时的本地值\n * 去拒绝服务端明明还认的 token**。`ensureSessionFresh` 打一次无条件续期端点并把结果\n * 写回本地,让这个判断重新变成真的。它 best-effort,不抛。\n */\nexport async function ensureActiveAuth(args: {\n envFlag?: string;\n asFlag?: string;\n}): Promise<AuthContext> {\n const g = await loadGlobalConfig();\n const envName = resolveActiveEnv({ envFlag: args.envFlag }, process.env, g);\n\n // verify env exists on disk (handles fresh install where activeEnv='default' has no file)\n const envs = await listEnvs();\n if (!envs.includes(envName)) {\n throw new CliError({\n code: CliErrorCode.NO_ACTIVE_ENV,\n message: `no env configured. Run: hcm env add <name> --endpoint <url> && hcm login --env <name>`,\n });\n }\n\n const envCfg = await loadEnv(envName);\n const identityName = await resolveActiveIdentity(\n { asFlag: args.asFlag },\n process.env,\n envName,\n );\n let idMeta = await loadIdentity(identityName);\n\n // 续上会话再判过期。续期成功会改写同一份 meta,所以要重读。\n const slid = await ensureSessionFresh({\n endpoint: envCfg.endpoint,\n identity: identityName,\n httpClient: axios.create({ baseURL: envCfg.endpoint, timeout: 30_000 }),\n });\n if (slid) idMeta = await loadIdentity(identityName);\n\n if (idMeta.expiresAt && new Date(idMeta.expiresAt) < new Date()) {\n throw new CliError({\n code: CliErrorCode.TOKEN_EXPIRED,\n message: `identity '${identityName}' token expired. Run: hcm login --env ${envName}`,\n });\n }\n\n return {\n env: envName,\n endpoint: envCfg.endpoint,\n // 服务端认定的租户优先。`envCfg.tenantId` 是登录前的入参,它的缺省 `'1'` 是个\n // 猜测——ADR-177 之后新租户是 UUID,那个猜测几乎必然错。\n tenantId: idMeta.tenantId ?? envCfg.tenantId ?? '1',\n identity: identityName,\n };\n}\n\n/**\n * CLI sugar around `ensureActiveAuth` for business commands (T15).\n *\n * - Transpiles deprecated `--profile <name>` to `--env <name>` (one-time stderr warn)\n * - Forwards `--env` and `--as` flags to `ensureActiveAuth`\n * - Returns a `ClientAuthContext` ready for `HcmClient.fromAuthContext(ctx)`\n *\n * Use this in every business command (`query` / `action` / `describe` / `chat`\n * / `trace` / `workspace*`) so the env/identity resolution + deprecated flag\n * handling lives in one place.\n */\nexport async function getActiveAuthContextFromCli(\n args: {\n env?: string;\n /** @deprecated 用 --env 替代 — transpiled here with a stderr warning */\n profile?: string;\n as?: string;\n },\n /**\n * Optional fallback when neither flag nor env-var resolves an env. Used by\n * workspace commands that fall back to the bound env stored in the local\n * hcm.workspace.json. Kept as a separate arg (not args.env) so the\n * `--profile` transpile warning still fires independently.\n */\n opts?: { fallbackEnv?: string },\n): Promise<ClientAuthContext> {\n let envFlag = args.env;\n if (args.profile && !envFlag) {\n process.stderr.write(\n '[hcm] event=deprecated_flag flag=--profile replacement=--env\\n',\n );\n envFlag = args.profile;\n }\n if (!envFlag && opts?.fallbackEnv) envFlag = opts.fallbackEnv;\n const ctx = await ensureActiveAuth({ envFlag, asFlag: args.as });\n return ctx;\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * `@路径` 内联附件解析(issue #64 · 对标 Claude Code 的 @ mention 交互手势)。\n *\n * 从消息文本提取 `@` 前缀且指向存在本地文件的 token,返回清理后的文本与路径列表。\n * 支持 `~` 展开与引号包裹的含空格路径(`@\"my file.pdf\"`)。`@` 后不是存在文件的\n * token(如 @某人 称呼)原样保留——存在性检查即歧义消解。\n */\nexport function extractAtFileTokens(text: string): { cleaned: string; paths: string[] } {\n const paths: string[] = [];\n // @\"quoted path\" | @'quoted path' | @bare-token(到空白为止)\n const re = /@(?:\"([^\"]+)\"|'([^']+)'|(\\S+))/g;\n const cleaned = text\n .replace(re, (match, dq: string | undefined, sq: string | undefined, bare: string | undefined) => {\n const candidate = dq ?? sq ?? bare ?? '';\n const abs = expandHome(candidate);\n if (isExistingFile(abs)) {\n paths.push(abs);\n return '';\n }\n return match;\n })\n .replace(/[ \\t]{2,}/g, ' ')\n .trim();\n return { cleaned, paths };\n}\n\n/**\n * 行内「裸绝对路径」内联附件解析(无 `@` 前缀、与正文同行)。\n *\n * 补 {@link extractAtFileTokens}(要 `@` 前缀)与 {@link isBareFilePath}(要整行就一个路径)\n * 之间的缺口:终端粘贴图片/剪贴板自动插入的绝对路径常是「`/var/folders/.../clipboard-x.png`\n * 给某人换头像」这种「路径 + 同行文字、无 `@`」形态——旧两检测器都接不住,裸路径漏进消息\n * 文本 → 传给 LLM 当散文 → 幻觉成别的路径(实测 bug)。这里识别 `/` 或 `~/` 开头的 token\n * (含引号包裹的含空格绝对路径),**存在性检查消歧**:只有真指向本地文件的才当附件剥离,\n * 普通含「/」的文字(`他/她`、日期 `2026/06/13`、URL path)因不存在对应文件而原样保留。\n */\nexport function extractInlineFilePaths(text: string): { cleaned: string; paths: string[] } {\n const paths: string[] = [];\n // \"abs path\" | 'abs path' | 裸 abs token(到空白为止);三支都要求以 / 或 ~/ 开头。\n const re = /\"((?:\\/|~\\/)[^\"]+)\"|'((?:\\/|~\\/)[^']+)'|((?:\\/|~\\/)\\S+)/g;\n const cleaned = text\n .replace(re, (match, dq: string | undefined, sq: string | undefined, bare: string | undefined) => {\n const candidate = dq ?? sq ?? bare ?? '';\n const abs = expandHome(candidate);\n if (isExistingFile(abs)) {\n paths.push(abs);\n return '';\n }\n return match;\n })\n .replace(/[ \\t]{2,}/g, ' ')\n .trim();\n return { cleaned, paths };\n}\n\n/** 整条消息恰为一个存在的文件路径(粘贴路径场景,D4 一期)。 */\nexport function isBareFilePath(text: string): string | null {\n const t = text.trim().replace(/^[\"']|[\"']$/g, '');\n if (!t || t.includes('\\n')) return null;\n const abs = expandHome(t);\n return isExistingFile(abs) ? abs : null;\n}\n\nfunction expandHome(p: string): string {\n return p.startsWith('~') ? path.join(os.homedir(), p.slice(1)) : path.resolve(p);\n}\n\nfunction isExistingFile(p: string): boolean {\n try {\n return fs.statSync(p).isFile();\n } catch {\n return false;\n }\n}\n","export interface SlashCommand {\n name: string;\n args: string[];\n}\n\nexport function parseSlash(line: string): SlashCommand | null {\n if (!line.startsWith('/')) return null;\n const parts = line.slice(1).trim().split(/\\s+/);\n return { name: parts[0]!, args: parts.slice(1) };\n}\n\n/** REPL 输入区的 slash 命令补全候选。 */\nexport interface SlashCommandSpec {\n cmd: string;\n desc: string;\n /** 命令带参数(如 /attach <路径>):回车/Tab 只补全命令名并留空格,不立即提交。 */\n takesArgs?: boolean;\n}\n\n/** 输入框可补全的 slash 命令目录(顺序即菜单展示顺序)。 */\nexport const SLASH_COMMANDS: SlashCommandSpec[] = [\n { cmd: '/new', desc: '开新会话' },\n { cmd: '/attach', desc: '添加附件', takesArgs: true },\n { cmd: '/send', desc: '发送当前草稿' },\n { cmd: '/help', desc: '帮助' },\n { cmd: '/exit', desc: '退出' },\n];\n\n/** 输入是否处于「正在敲 slash 命令名」状态(/ 开头、尚未出现空格进入参数区)。 */\nexport function isSlashTyping(input: string): boolean {\n return input.startsWith('/') && !input.includes(' ') && !input.includes('\\n');\n}\n\n/** 按前缀过滤候选命令;非「敲命令名」状态返回空数组(菜单关闭)。 */\nexport function filterSlashCommands(\n input: string,\n commands: SlashCommandSpec[] = SLASH_COMMANDS,\n): SlashCommandSpec[] {\n if (!isSlashTyping(input)) return [];\n return commands.filter((c) => c.cmd.startsWith(input));\n}\n\n/** 菜单候选索引归一(支持负数 / 越界回绕)。 */\nexport function wrapIndex(index: number, length: number): number {\n if (length <= 0) return 0;\n return ((index % length) + length) % length;\n}\n\n/** slash 菜单打开时一次按键的归宿(纯函数,便于测试)。 */\nexport type SlashKeyAction =\n | { type: 'move'; delta: number }\n | { type: 'complete'; text: string } // 补全到输入框,不提交(带参命令 / Tab)\n | { type: 'execute'; text: string } // 补全并立即提交(无参命令回车)\n | { type: 'none' };\n\n/** 把按键 + 当前选中项映射为菜单动作;不识别的键返回 none(交还输入框默认行为)。 */\nexport function resolveSlashKey(\n key: { upArrow?: boolean; downArrow?: boolean; tab?: boolean; return?: boolean },\n selected: SlashCommandSpec | undefined,\n): SlashKeyAction {\n if (key.upArrow) return { type: 'move', delta: -1 };\n if (key.downArrow) return { type: 'move', delta: 1 };\n if (!selected) return { type: 'none' };\n if (key.tab) return { type: 'complete', text: selected.cmd + (selected.takesArgs ? ' ' : '') };\n if (key.return) {\n return selected.takesArgs\n ? { type: 'complete', text: selected.cmd + ' ' }\n : { type: 'execute', text: selected.cmd };\n }\n return { type: 'none' };\n}\n","import chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport { marked } from 'marked';\n// marked-terminal v7: 用 named export markedTerminal() 返回 marked extension\nimport { markedTerminal } from 'marked-terminal';\nimport { absoluteDownloadUrl, type InteractionRequest, type ResumeSummary } from '@hcmai/sdk';\n\n/**\n * OSC 8 终端超链接:把 text 标记为指向 url 的可点链接。链接是字符单元的属性,\n * **跨行不失效**——绕开终端对「软/硬换行的长 URL」不自动识别(点不动)的坑。\n * Ghostty / iTerm2 / WezTerm / kitty / VS Code 终端均支持;不支持的终端降级为纯 text。\n */\nexport function terminalHyperlink(url: string, text: string): string {\n return `\u001b]8;;${url}\u0007${text}\u001b]8;;\u0007`;\n}\n\n/** 终端可读行宽:管道/CI 无 columns 时 80;超宽终端钳到 120 保持行长可读。 */\nfunction termWidth(): number {\n const c = process.stdout.columns;\n return c && c > 40 ? Math.min(c, 120) : 80;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nmarked.use(markedTerminal({ width: termWidth() }) as any);\n\nexport interface TerminalRendererOptions {\n markdown: boolean;\n showThinking: boolean;\n /** verbose 时展开 thinking content; 默认 false → 仅单行总结 (类似 web \"✓ 推理完成 Xs\") */\n verboseThinking?: boolean;\n showToolCalls: boolean;\n /** verbose 时显示 tool args; 默认 false → 仅显示 tool name + 状态 */\n verboseTools?: boolean;\n spinner: boolean;\n color: boolean;\n /** 可注入 writer(测试捕获输出用);缺省走 process.stdout.write */\n sink?: (s: string) => void;\n /** 后端地址(HcmClient.endpoint),用于把相对下载链接拼成可点的绝对签名 URL(ADR-140)。 */\n apiBase?: string;\n}\n\n/** 已知 agent 中文显示名映射, 跟 web 端 AGENT_PALETTES 对齐. agentKey 未知时 fallback 用 raw key. */\nconst AGENT_NAMES: Record<string, string> = {\n moirai: 'Moirai',\n analyst: '数据分析专家',\n hr: 'HR 专家',\n reporter: '报表专家',\n trans_mgr: '调动管理员',\n recruiter: '招聘专家',\n talent_dev: '人才发展专家',\n meta_config: '元数据配置专家',\n alert_mgr: '监控专家',\n flow_mgr: '流程专家',\n knowledge: '知识库专家',\n exporter: '导出专家',\n comp: '薪酬专家',\n 'comp-analyst': '薪酬分析专家',\n notifier: '通知专家',\n troubleshooter: '排障专家',\n};\n\n/** agent 显示名(presenter 拼 spinner 委派摘要时也用)。 */\nexport function agentDisplayName(agentKey: string): string {\n return AGENT_NAMES[agentKey] ?? agentKey;\n}\n\n/** ask 卡 choice 文案:string 直用;对象取 label/value/text 字段兜底 JSON 化。 */\nfunction choiceLabel(c: unknown): string {\n if (typeof c === 'string') return c;\n if (c && typeof c === 'object') {\n const o = c as Record<string, unknown>;\n const v = o.label ?? o.value ?? o.text;\n if (typeof v === 'string') return v;\n try { return JSON.stringify(c); } catch { /* fallthrough */ }\n }\n return String(c);\n}\n\n/** G6 · 终态行额外统计(in/out token 分解 + 工具/委派计数)。全为可选,0 值省略。 */\nexport interface CompletionLineStats {\n inputTokens?: number;\n outputTokens?: number;\n toolCount?: number;\n delegationCount?: number;\n}\n\nexport class TerminalRenderer {\n private spinner: Ora | null = null;\n private chatBuffer: string = '';\n private thinkingActive = false;\n private thinkingBuffer = '';\n private thinkingStartMs = 0;\n private depth = 0;\n /**\n * 行首状态机:所有输出统一经 write() 跟踪末字符。块级输出(工具行/委派/卡片/终态)\n * 前必过 blockBoundary()——2026-06-11 实测的「正文与工具行黏连/缩进忽 2 忽 4/孤儿 ✓ 行」\n * 三类乱象共同根因就是各方法独立 write、互不知道光标在不在行首。\n */\n private atLineStart = true;\n\n constructor(private readonly opts: TerminalRendererOptions) {\n if (!opts.color) {\n // chalk v5 不可关 level via assign; 用 ChalkInstance level=0 处理\n // 全局降级\n chalk.level = 0;\n }\n }\n\n private write(text: string): void {\n if (!text) return;\n (this.opts.sink ?? ((s: string) => { process.stdout.write(s); }))(text);\n this.atLineStart = text.endsWith('\\n');\n }\n\n private indent(): string {\n return ' '.repeat(this.depth);\n }\n\n /** 光标不在行首时补换行。 */\n private ensureLineStart(): void {\n if (!this.atLineStart) this.write('\\n');\n }\n\n /** 块级输出统一前置:停 spinner → 渲染收口累积正文 → 确保行首。 */\n private blockBoundary(): void {\n this.stopSpinner();\n this.flushChatBuffer();\n this.ensureLineStart();\n }\n\n /**\n * 流式正文 chunk。\n *\n * markdown 开(TTY 默认):段落级流式渲染——chunk 累积进 chatBuffer,每攒满一个完整\n * 段落(`\\n\\n` 边界、且 code fence 已闭合)立即过 marked 渲染输出,未完段留 buffer。\n * 修复 2026-06-11 实测灾难:旧实现全程只累积、终态才一次性渲染,62s 任务正文零流式。\n *\n * markdown 关(管道/--no-markdown):逐 chunk 直写。行首缩进由「当前在行首 + depth>0」\n * 单点决定,chunk 尾换行不再预挂缩进(旧实现残留 2 空格是缩进忽 2 忽 4 的根因)。\n */\n writeChatChunk(text: string): void {\n this.stopSpinner();\n this.chatBuffer += text;\n if (this.opts.markdown) {\n this.flushCompleteParagraphs();\n return;\n }\n let out = text.replace(/\\n(?!$)/g, '\\n' + this.indent());\n if (this.atLineStart && this.depth > 0) out = this.indent() + out;\n this.write(out);\n }\n\n /**\n * 把 chatBuffer 中已完整的段落渲染输出;半截 code fence(``` 计数为奇)推迟到闭合。\n * fence 判定按 CommonMark:行首 0-3 空格 + ```(不用 \\s*——它会吃换行,把行内三反引号\n * 误计入奇偶,致段落被误判未闭合而退化回「憋到终态」;2026-06-11 review I3)。\n */\n private flushCompleteParagraphs(): void {\n const idx = this.chatBuffer.lastIndexOf('\\n\\n');\n if (idx < 0) return;\n const head = this.chatBuffer.slice(0, idx + 2);\n const fences = (head.match(/(?:^|\\n) {0,3}```/g) ?? []).length;\n if (fences % 2 === 1) return;\n this.chatBuffer = this.chatBuffer.slice(idx + 2);\n this.renderMarkdown(head);\n }\n\n /** 渲染一段 markdown 并按 depth 缩进输出,段尾统一单空行(对齐 Claude Code 段间距)。 */\n private renderMarkdown(text: string): void {\n const src = text.replace(/\\n+$/, '');\n if (!src.trim()) return;\n const rendered = (marked.parse(src) as string).replace(/\\n+$/, '');\n if (!rendered) return;\n this.ensureLineStart();\n const indented = this.depth > 0\n ? this.indent() + rendered.replace(/\\n/g, '\\n' + this.indent())\n : rendered;\n this.write(indented + '\\n\\n');\n }\n\n /** 渲染收口累积正文(终态/块级边界时调)。markdown 关时正文已直写,仅校正行首。 */\n flushChatBuffer(): void {\n if (this.opts.markdown) {\n const rest = this.chatBuffer;\n this.chatBuffer = '';\n this.renderMarkdown(rest);\n } else {\n this.chatBuffer = '';\n this.ensureLineStart();\n }\n }\n\n startSpinner(text: string): void {\n if (!this.opts.spinner) return;\n if (this.spinner) {\n // 已在转:仅换文案,避免 stop/start 闪烁。\n this.spinner.text = chalk.gray(text);\n return;\n }\n // spinner 永远独占一行:半行正文上直接 start 会被 ora 的 clearLine 抹掉。\n this.ensureLineStart();\n // discardStdin 必须关(2026-06-12 REPL 第二轮挂死 RCA):ora 默认接管并丢弃 stdin,\n // 与 REPL 的 readline 同 stdin 共存时,多次 start/stop 会破坏 readline 的行事件\n // 监听——第二轮输入回显正常但 line 事件永不触发(无 spinner 无 Error 纯空白挂死)。\n this.spinner = ora({ text: chalk.gray(text), discardStdin: false }).start();\n }\n\n updateSpinner(text: string): void {\n if (this.spinner) this.spinner.text = chalk.gray(text);\n }\n\n stopSpinner(): void {\n if (this.spinner) {\n this.spinner.stop();\n this.spinner = null;\n // ora.stop() 清掉 spinner 行并把光标归位行首。\n this.atLineStart = true;\n }\n }\n\n /**\n * thinking 流。默认折叠:累积字符数,endThinking 时单行总结「✓ 推理完成 (Xs · N chars)」。\n * 首 chunk 自动起算(旧实现靠零调用的 showThinkingHeader 置位 thinkingActive,\n * 导致总结行从未显示过——2026-06-11 审计钉出的死配置)。\n */\n writeThinkingChunk(text: string): void {\n if (!this.opts.showThinking) return;\n if (!this.thinkingActive) {\n this.thinkingActive = true;\n this.thinkingBuffer = '';\n this.thinkingStartMs = Date.now();\n if (this.opts.verboseThinking) {\n this.blockBoundary();\n this.write(chalk.gray.italic('💭 thinking…\\n'));\n }\n }\n this.thinkingBuffer += text;\n if (this.opts.verboseThinking) {\n this.write(chalk.gray.italic(text));\n }\n }\n\n endThinking(): void {\n if (!this.opts.showThinking || !this.thinkingActive) return;\n const elapsedSec = Math.max(0, (Date.now() - this.thinkingStartMs) / 1000);\n const chars = this.thinkingBuffer.length;\n this.ensureLineStart();\n if (this.opts.verboseThinking) {\n this.write(chalk.gray('─'.repeat(40)) + '\\n');\n } else if (chars > 0) {\n this.write(chalk.gray(`✓ 推理完成 (${elapsedSec.toFixed(1)}s · ${chars} chars)\\n`));\n }\n this.thinkingActive = false;\n this.thinkingBuffer = '';\n }\n\n showInterrupted(reason: string): void {\n this.blockBoundary();\n this.write(chalk.yellow(`^C 已中断 (${reason})\\n`));\n }\n\n /**\n * 用户纠偏被注入的确认行(W1a-2,对齐 Web SteeringRow「↪ 纠偏」风格):\n * steer 命令发出后此前终端零确认,用户不知道纠偏有没有被采纳。\n * 仅后端真正注入(steering.applied 事件)时显示——不在发送时乐观显示。\n */\n steeringLine(contents: string[]): void {\n this.blockBoundary();\n for (const text of contents) {\n this.write(this.indent() + chalk.blue('↪ 纠偏 ') + chalk.gray(text) + '\\n');\n }\n }\n\n /**\n * 续会话上下文回顾(刀⑤,对标 Claude Code resume):续接已有 conversation 时\n * 在新输出前回显「续接提示行 + 最近 N 轮摘要」,让用户知道聊到哪了。\n * 整块 dim 弱化——它是背景回顾,不能比正文抢眼。\n */\n showResumeContext(summary: ResumeSummary): void {\n this.ensureLineStart();\n const shortId = summary.conversationId.length > 12\n ? '…' + summary.conversationId.slice(-12)\n : summary.conversationId;\n const shownRounds = summary.recent.filter((t) => t.role === 'user').length;\n const earlier = summary.totalRounds - shownRounds;\n const earlierNote = earlier > 0 ? `,更早 ${earlier} 轮略` : '';\n this.write(chalk.dim(`↻ 续接会话 ${shortId}(共 ${summary.totalRounds} 轮${earlierNote};不带 --resume 将开新会话)`) + '\\n');\n for (const turn of summary.recent) {\n if (turn.role === 'user') {\n this.write(chalk.dim(` > ${turn.text}`) + '\\n');\n } else {\n this.write(chalk.dim(` ${turn.text}`) + '\\n');\n }\n }\n this.write('\\n');\n }\n\n /**\n * 流结束完成行。G6 · 对标 Claude Code 终态行——单行紧凑 dim,信息密度拉满:\n * 耗时 · token(总量带 in/out 分解)· 工具调用数 · 委派数 · traceId · conversationId。\n * 0 值的可选段(in/out、工具、委派)省略,保持紧凑不堆砌。\n */\n showCompleted(\n durMs: number,\n traceId: string | null,\n conversationId: string,\n totalTokens?: number,\n stats?: CompletionLineStats,\n ): void {\n this.blockBoundary();\n const segs: string[] = [`${durMs}ms`];\n\n // token:总量 + in/out 分解(in/out 任一 > 0 才展开括号)。\n if (totalTokens) {\n const inTok = stats?.inputTokens ?? 0;\n const outTok = stats?.outputTokens ?? 0;\n const split = inTok > 0 || outTok > 0 ? ` (↑${inTok}/↓${outTok})` : '';\n segs.push(`${totalTokens} tok${split}`);\n }\n // 工具调用数 / 委派数(> 0 才出)。\n if (stats?.toolCount) segs.push(`${stats.toolCount} 工具`);\n if (stats?.delegationCount) segs.push(`${stats.delegationCount} 委派`);\n\n segs.push(`traceId ${traceId ?? '?'}`);\n segs.push(`conversation ${conversationId}`);\n this.write(chalk.dim(`\\n✓ done (${segs.join(' · ')})\\n`));\n }\n\n /**\n * v4 委派开始(折叠模式):单行「⏺ 委派 → 名」即收,子流过程不平铺——活动状态由\n * presenter 驱动 spinner 动态摘要(「⎿ 名 · …」),结束由 delegationEnd 统计收口。\n * 修复 2026-06-11 实测:子代理全程独白 + 最终表格平铺重复输出(Claude Code 对标:\n * 子 Task 折叠为单行摘要 + 工具计数)。\n */\n delegationStart(agentKey: string, _callId: string): void {\n this.blockBoundary();\n this.write(this.indent() + chalk.blue(`⏺ 委派 → ${agentDisplayName(agentKey)}`) + '\\n');\n this.depth += 1;\n }\n\n /**\n * v4 委派收口:「⎿ 完成 (N 工具 · X.Xs)」;有失败工具时一并标出。\n * success=false(委派整体失败)→ 红色「⎿ 委派失败」+ ADR-058 next_step 路标——\n * 失败委派绝不打绿勾(2026-06-11 review C1:旧版收口无 success 态,失败静默显成功)。\n */\n delegationEnd(\n _callId: string,\n durMs?: number,\n toolCount?: number,\n failCount?: number,\n success: boolean = true,\n nextSteps?: string[],\n ): void {\n this.blockBoundary();\n const segs: string[] = [];\n if (toolCount) segs.push(`${toolCount} 工具${failCount ? `,${failCount} 失败` : ''}`);\n if (durMs) segs.push(`${(durMs / 1000).toFixed(1)}s`);\n const detail = segs.length > 0 ? ` (${segs.join(' · ')})` : '';\n if (success) {\n this.write(this.indent() + chalk.gray(`⎿ 完成${detail}`) + '\\n');\n } else {\n this.write(this.indent() + chalk.red(`⎿ ✗ 委派失败${detail}`) + '\\n');\n if (nextSteps && nextSteps.length > 0) this.writeNextSteps(nextSteps);\n }\n this.depth = Math.max(0, this.depth - 1);\n }\n\n /**\n * v4 工具行(整行原子输出):tool.result 到达时一次打印「⚙ name preview ✓ 12ms」。\n * 旧「tool() 打半行 + toolResult() 追加状态」模型已删——并行工具/正文 chunk 交错会把\n * 追加的 ✓/✗ 挤成孤儿行(2026-06-11 实测「✓ 0ms」孤儿)。执行中可见性由 spinner 文案承担。\n *\n * G5 · 失败时透出 ADR-058 `next_step` 路标(逐行 dim),用户看到下一步指引而非只一个 ✗。\n */\n toolLine(name: string, argsPreview: string, success: boolean, durMs: number, nextSteps?: string[]): void {\n this.blockBoundary();\n const status = success ? chalk.green('✓') : chalk.red('✗');\n const preview = argsPreview ? chalk.gray(` ${argsPreview}`) : '';\n this.write(this.indent() + chalk.cyan(`⚙ ${name}`) + preview + ' ' + status + chalk.gray(` ${durMs}ms`) + '\\n');\n if (!success && nextSteps && nextSteps.length > 0) {\n this.writeNextSteps(nextSteps);\n }\n }\n\n /** G5 · next_step 路标块:dim「↳ 下一步」标题 + 逐条缩进列表(对齐工具行缩进)。 */\n private writeNextSteps(steps: string[]): void {\n const pad = this.indent() + ' ';\n this.write(pad + chalk.dim('↳ 下一步:') + '\\n');\n for (const s of steps) {\n this.write(pad + chalk.dim(` • ${s}`) + '\\n');\n }\n }\n\n /** 来源行(仅子代理触发,agentPath ≥2 段时显示 `↑ 来自 a › b`,对齐 Web)。 */\n private originLine(path: string): string {\n const segs = path.split('.').filter(Boolean);\n if (segs.length < 2) return '';\n const names = segs.map((k) => agentDisplayName(k));\n return chalk.gray(` ↑ 来自 ${names.join(' › ')}`) + '\\n';\n }\n\n /** v4 控制通道 confirm 卡(醒目 box + 编号选项),对齐 Web ConfirmationCard。 */\n confirmCard(req: InteractionRequest): void {\n this.blockBoundary();\n const hi = req.riskLevel === 'HIGH' || req.riskLevel === 'CRITICAL';\n this.write('\\n' + chalk.yellow('┌─ CONFIRM' + (hi ? ' · 高风险' : '') + ' ' + '─'.repeat(20)) + '\\n');\n this.write(this.originLine(req.originAgentPath));\n if (req.toolName) this.write(chalk.gray(' 操作 ') + `${req.toolName}(${req.summary})` + '\\n');\n else this.write(chalk.gray(' 说明 ') + req.summary + '\\n');\n if (req.argsPreview) {\n const chips = Object.entries(req.argsPreview).map(([k, v]) => `${k}=${String(v)}`).join(' · ');\n this.write(chalk.gray(' 参数 ') + chips + '\\n');\n }\n this.write(chalk.yellow('─'.repeat(38)) + '\\n');\n this.write(hi ? ' 1) 批准 2) 驳回并说明\\n' : ' 1) 确认执行 2) 取消\\n');\n }\n\n /** v4 控制通道 ask 卡(轻量 ? 引导 + 编号 choices / 自由文本),对齐 Web AskCard。 */\n askCard(req: InteractionRequest): void {\n this.blockBoundary();\n const lastSeg = req.originAgentPath.split('.').pop() ?? '';\n const name = lastSeg ? agentDisplayName(lastSeg) : 'Moirai';\n this.write('\\n' + chalk.cyan(`? ${name} · 提问`) + '\\n');\n this.write(' ' + (req.question ?? req.summary) + '\\n');\n if (req.choices?.length) {\n // choices 元素可能是对象({label}/{value}/{text},控制通道 wire 形态)——\n // 直接模板插值会渲染成 [object Object](2026-06-12 实测)。\n req.choices.forEach((c, i) => this.write(` ${i + 1}) ${choiceLabel(c)} `));\n this.write('\\n');\n } else {\n this.write(chalk.dim(' (直接输入回答)') + '\\n');\n }\n }\n\n /** --auto-approve 下自动批准 confirm 时的审计行(不静默)。 */\n autoApproved(toolName: string | undefined, summary: string): void {\n this.ensureLineStart();\n this.write(chalk.gray(` ✓ 已自动批准: ${toolName ?? ''}(${summary})`) + '\\n');\n }\n\n /**\n * G4 · control.interaction.resolved(phase=RESUMED):决策已受理、继续执行(ADR-125)。\n * 不再让用户决策后视觉空白。\n */\n interactionResumed(): void {\n this.blockBoundary();\n this.write(chalk.green(' ✓ 已受理,继续执行…') + '\\n');\n }\n\n /**\n * G4 · control.interaction.resolved(phase=TERMINAL):交互终局(ADR-125),\n * status ∈ {COMPLETED, FAILED, SUPERSEDED}。按 status 渲染终局行。\n */\n interactionTerminal(status?: string): void {\n this.blockBoundary();\n if (status === 'FAILED') {\n this.write(chalk.red(' ✗ 交互失败') + '\\n');\n } else if (status === 'SUPERSEDED') {\n this.write(chalk.gray(' ↪ 交互已被新请求接管') + '\\n');\n } else {\n // COMPLETED(含 status 缺省)\n this.write(chalk.gray(' ✓ 交互完成') + '\\n');\n }\n }\n\n /**\n * v4 content_part 终端降级:终端画不了富内容,降级为「▸ 类型 · 标题」头行 +\n * insight 缩进副行的强调块(委派块内随 depth 缩进)——区别于正文灰色一行,\n * 富内容产物是结果本身,视觉层级须高于过程文本。\n */\n contentPartSummary(part: Record<string, unknown>): void {\n this.blockBoundary();\n const type = part.type as string;\n const pad = this.indent();\n if (type === 'chart') {\n this.write(pad + chalk.cyan(`▸ 图表 · ${(part.title as string) ?? ''}`) + '\\n');\n if (part.insight) this.write(pad + chalk.gray(` ${String(part.insight)}`) + '\\n');\n } else if (type === 'table') {\n this.write(pad + chalk.cyan(`▸ 表格 · ${(part.title as string) ?? ''}`) + '\\n');\n } else if (type === 'file' || type === 'fileDownload') {\n // fileDownload:文件名做成 OSC 8 超链接,点击由浏览器打开签名链接(ADR-140,免 Bearer)。\n // 不打印裸 URL——长签名 URL 换行后终端不自动识别(点不动);OSC 8 链接跨行仍可点。\n const fileName = (part.fileName as string) ?? '文件';\n const abs = part.downloadUrl ? absoluteDownloadUrl(this.opts.apiBase, String(part.downloadUrl)) : undefined;\n const head = abs ? terminalHyperlink(abs, `📎 ${fileName}`) : `📎 ${fileName}`;\n this.write(pad + chalk.cyan(`▸ ${head}`) + (abs ? chalk.gray(' ← 点击打开') : '') + '\\n');\n } else {\n this.write(pad + chalk.cyan(`▸ ${type}`) + '\\n');\n }\n }\n}\n","import { agentDisplayName, type TerminalRenderer } from './TerminalRenderer';\nimport { createV4Reducer, truncateDisplay, type V4RenderSink } from '@hcmai/sdk';\n\nexport interface StreamPresenterOptions {\n showToolCalls: boolean;\n output: 'text' | 'json';\n}\n\nexport interface StreamResult {\n status: 'completed' | 'interrupted' | 'incomplete';\n traceId: string | null;\n streamId?: string;\n conversationId?: string;\n}\n\n/** G6 · 终态行统计素材(流中累计)。 */\nexport interface CompletionStats {\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n toolCount: number;\n delegationCount: number;\n}\n\n/** 委派子流折叠态:子流文本/工具不平铺,凝成 spinner 活动摘要 + 收口统计。 */\ninterface DelegationMeta {\n name: string;\n toolCount: number;\n failCount: number;\n /** 子流文本滚动窗(取最后非空行做 spinner 摘要),上限防长会话累积。 */\n textTail: string;\n /** 跨暂停累计耗时:每段(暂停前 + RESUME 后)的 durMs 相加,收口时一次性透出。 */\n accumDurMs: number;\n /** 当前是否处于「暂停待应答」态(specialist 子流内 ASK/CONFIRM HALT,等用户应答续跑)。 */\n paused: boolean;\n}\n\n// 极简 logger,避免引入 winston\nconst debug = (...args: unknown[]): void => {\n if (process.env.HCM_DEBUG) console.error('[StreamPresenter]', ...args);\n};\n\n/**\n * StreamPresenter(v4):把 v4 block 流经 createV4Reducer 折成语义事件 → TerminalRenderer。\n * delete-on-supersede(ADR-120):v3 case 已全删,仅保留终态三事件(response.completed/failed/\n * interrupted)作 iterator 终态边界;展示流 6 事件(message.start / block 三件 / tool.result / message.stop)\n * 全部交给 reducer。output='json' 时旁路渲染、直打原始 envelope。\n *\n * 子流折叠(2026-06-11 对标 Claude Code):reducer 每个回调都带 parentToolUseId,\n * parent 非空(委派子流)的 text/thinking/tool 不进正文区——折叠为委派块 spinner 的\n * 动态活动摘要(「⎿ 数据分析专家 · …」),委派结束由 delegationEnd 收口统计行。\n * 修复实测灾难:子代理 80 行表格平铺一遍 + 主代理复述一遍的双重输出。\n */\nexport class StreamPresenter {\n private traceId: string | null = null;\n private streamId: string | undefined;\n private totalTokens = 0;\n // G6:终态行密度——in/out token 分解 + 工具调用数 + 委派数(流中统计)。\n private inputTokens = 0;\n private outputTokens = 0;\n private toolCount = 0;\n private delegationCount = 0;\n /** 已见 ROOT message.stop(end_turn)——iterator 收口后据此判 completed/incomplete。 */\n private sawRootStop = false;\n private readonly reducer: {\n handle: (type: string, payload: Record<string, unknown>) => boolean;\n };\n /** 委派折叠态(callId → 名字/工具计数/文本尾窗)。耗时不再自计——onDelegationEnd 带后端 durMs。 */\n private readonly delgMeta = new Map<string, DelegationMeta>();\n /** 工具行整行输出模型:result 到达才打整行,start 时暂存 name/argsPreview。 */\n private readonly pendingTools = new Map<string, { toolName: string; argsPreview: string }>();\n\n constructor(\n private readonly renderer: TerminalRenderer,\n private readonly opts: StreamPresenterOptions,\n ) {\n // G1:spinner 由 presenter 驱动(renderer 仅 TTY+spinner 开时真转,CI/raw 自动 no-op)。\n // 关键空白期:① 等 LLM 首 token ② 工具执行中 ③ 委派子流执行中。有真实输出即停转。\n const sink: V4RenderSink = {\n onText: (t, parent) => {\n if (parent) {\n this.bumpDelegationActivity(parent, t);\n return;\n }\n this.renderer.writeChatChunk(t); // 内部已 stopSpinner\n },\n onThinkingDelta: (t, parent) => {\n if (parent) {\n this.bumpDelegationActivity(parent, null, '思考中…');\n return;\n }\n this.renderer.writeThinkingChunk(t); // 折叠态保留「思考中…」spinner\n },\n onThinkingDone: (parent) => {\n if (!parent) this.renderer.endThinking();\n },\n onToolStarted: (callId, toolName, argsPreview, parent) => {\n this.pendingTools.set(callId, { toolName, argsPreview });\n if (parent) {\n // 子流工具:折叠——只更新委派活动摘要 + 计数,不打行。\n const d = this.delgMeta.get(parent);\n if (d) {\n d.toolCount += 1;\n this.renderer.updateSpinner(`⎿ ${d.name} · ⚙ ${toolName}…`);\n }\n return;\n }\n // 主流程:工具行等 result 到齐才整行输出(见 onToolResult),执行中由 spinner 透出。\n this.renderer.startSpinner(`执行工具 ${toolName}…`);\n },\n onToolResult: (callId, success, durMs, _childConvId, parent, nextSteps, toolName) => {\n const meta = this.pendingTools.get(callId);\n this.pendingTools.delete(callId);\n this.toolCount += 1; // G6:全局计数含子流工具\n if (parent) {\n const d = this.delgMeta.get(parent);\n if (d && !success) d.failCount += 1;\n return;\n }\n // G5:失败时透出 next_step 路标(成功 nextSteps 为 undefined)。\n // #1930:名字优先取 onToolStarted 暂存的(block.start 注册);无 start 的事件(缓存短路\n // no-op 等)用 reducer 兜底解析的 toolName;都没有才退回 `?`。\n if (this.opts.showToolCalls) {\n this.renderer.toolLine(meta?.toolName ?? toolName ?? '?', meta?.argsPreview ?? '', success, durMs, nextSteps);\n }\n // 工具结束 → 回到等下一轮 LLM 输出\n this.renderer.startSpinner('思考中…');\n },\n // content_part 是面向用户的产物(图表/表格/文件),子流产生的也透出(委派块内缩进显示)。\n onContentPart: (part) => this.renderer.contentPartSummary(part),\n // W1a-2:纠偏注入确认行——steer 后终端不再零反馈。\n onSteeringApplied: (contents) => this.renderer.steeringLine(contents),\n onDelegationStart: (agentKey, parentToolUseId) => {\n const existing = this.delgMeta.get(parentToolUseId);\n if (existing) {\n // RESUME:暂停应答后续跑同一委派块(同 parentToolUseId 再来 message.start)——\n // 不重复计数、不重画块头(CLI append-only 不能回填),仅复位活动 spinner。\n existing.paused = false;\n this.renderer.startSpinner(`⎿ ${existing.name} · 执行中…`);\n return;\n }\n this.delegationCount += 1; // G6:委派计数(暂停→续跑不重复计入)\n const name = agentDisplayName(agentKey);\n this.delgMeta.set(parentToolUseId, { name, toolCount: 0, failCount: 0, textTail: '', accumDurMs: 0, paused: false });\n this.renderer.delegationStart(agentKey, parentToolUseId); // 内部 blockBoundary\n this.renderer.startSpinner(`⎿ ${name} · 执行中…`);\n },\n onDelegationPaused: (parentToolUseId, durMs) => {\n const d = this.delgMeta.get(parentToolUseId);\n if (!d) return; // 无块可挂(理论不达:暂停必先有 delegationStart)\n // 暂停待应答:保留委派块不收口、累计本段耗时,等 RESUME 续跑收口成一条「完成」。\n // 可见反馈由 control 通道「✓ 已受理,继续执行…」+ 交互提示 UI 承载,此处不打收口行\n // (旧版把 transport success=false 渲染成红色「✗ 委派失败」= 假警报,本修复消除)。\n d.accumDurMs += durMs;\n d.paused = true;\n this.renderer.updateSpinner(`⎿ ${d.name} · ⏸ 等待应答…`);\n },\n onDelegationEnd: (parentToolUseId, success, durMs, nextSteps) => {\n const d = this.delgMeta.get(parentToolUseId);\n this.delgMeta.delete(parentToolUseId);\n if (!d) {\n // 子流从未启动(委派在路由/校验层直接失败,无 message.start)——没有委派块头行,\n // 失败渲染为普通失败工具行(委派本来就是 tool),成功则静默(无可收口的块)。\n if (!success) this.renderer.toolLine('hcm_delegate', '', false, durMs, nextSteps);\n this.renderer.startSpinner('思考中…');\n return;\n }\n // 累计跨暂停的各段耗时(暂停段已 onDelegationPaused 累入 accumDurMs)。\n const totalDurMs = d.accumDurMs + durMs;\n this.renderer.delegationEnd(parentToolUseId, totalDurMs, d.toolCount, d.failCount, success, nextSteps);\n this.renderer.startSpinner('思考中…');\n },\n onTerminal: (_stopReason, tokens) => {\n this.totalTokens = tokens || this.totalTokens;\n this.pendingTools.clear();\n // 暂停待应答的委派块要跨 HALT 的「中间 ROOT message.stop」存活(resume 段续跑后才\n // 由 onDelegationEnd 收口删除)——只清非暂停态,否则中间 stop 会把块清空、resume\n // 被误判为新委派(退回到「2 委派 + 假失败」老 bug)。终局 stop 时块已收口、此处为空。\n for (const [k, d] of this.delgMeta) {\n if (!d.paused) this.delgMeta.delete(k);\n }\n // G3:markdown 段落已流式渲染,终态仅 flush 未完尾段(非 markdown 校正行首)。\n this.renderer.flushChatBuffer();\n this.renderer.stopSpinner();\n },\n };\n this.reducer = createV4Reducer(sink);\n }\n\n /**\n * 子流活动摘要:取子流文本最后一个非空行(截显示宽度)刷进 spinner 文案,\n * TTY 上呈现「⎿ 数据分析专家 · 正在并行执行两个查询…」的单行滚动效果。\n */\n private bumpDelegationActivity(parent: string, text: string | null, fallback?: string): void {\n const d = this.delgMeta.get(parent);\n if (!d) return;\n if (text) {\n d.textTail = (d.textTail + text).slice(-300);\n const lastLine = d.textTail\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .pop();\n if (lastLine) {\n this.renderer.updateSpinner(`⎿ ${d.name} · ${truncateDisplay(lastLine, 48)}`);\n return;\n }\n }\n this.renderer.updateSpinner(`⎿ ${d.name} · ${fallback ?? '执行中…'}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async consume(events: AsyncIterable<any>): Promise<StreamResult> {\n // G1:起手即转「思考中…」覆盖「已发 message.create,等 LLM 首 token」这段最大空白期。\n // json 旁路不渲染,故仅 text 模式驱动 spinner。\n if (this.opts.output !== 'json') this.renderer.startSpinner('思考中…');\n for await (const ev of events) {\n if (!this.traceId && ev.traceId) this.traceId = ev.traceId;\n if (!this.streamId && ev.streamId) this.streamId = ev.streamId;\n // G6:token in/out 分解从终态 payload 取(ROOT message.stop 带 inputTokens/outputTokens;\n // response.completed 走 usage.{inputTokens,outputTokens})。子流 message.stop 不计入。\n this.captureTokenBreakdown(ev);\n\n if (this.opts.output === 'json') {\n process.stdout.write(JSON.stringify(ev) + '\\n');\n if (ev.type === 'response.completed') return this.result('completed');\n if (ev.type === 'response.interrupted') return this.result('interrupted');\n if (ev.type === 'response.failed') throw this.toError(ev);\n // ROOT message.stop 不再立即终态(2026-06-12 ASK 挂死 RCA):hold 模式下它可能是\n // HALT 的中间 stop,resume 段事件还在路上——终态判定单点在 iterator(它持有未决\n // 交互集),presenter 以 iterator 收口为唯一终态。非 hold 时 iterator 在 stop 后\n // 立即 finish,行为与旧版完全一致。\n if (ev.type === 'message.stop' && !ev.payload?.parentToolUseId) {\n this.sawRootStop = true;\n }\n continue;\n }\n\n // 终态三事件(v4 兼容边界)= iterator 终态\n if (ev.type === 'response.completed') {\n if (ev.payload?.totalTokens) this.totalTokens = ev.payload.totalTokens;\n // G3:兜底 flush(reducer onTerminal 未触达时,仍把 markdown 累积段渲染出来)。\n this.renderer.flushChatBuffer();\n this.renderer.stopSpinner();\n return this.result('completed');\n }\n if (ev.type === 'response.failed') {\n this.renderer.stopSpinner();\n throw this.toError(ev);\n }\n if (ev.type === 'response.interrupted') {\n this.renderer.showInterrupted(ev.payload?.reason ?? 'UNKNOWN');\n return this.result('interrupted');\n }\n\n // v4 原生终态信号:ROOT message.stop(parentToolUseId 空)。\n // 🔴 end_turn 不在此 return(2026-06-12 ASK 挂死 RCA):hold 模式下 HALT 的 ROOT stop\n // 是中间态——iterator(唯一持有未决交互集的层)会继续吐 resume 段事件;旧版在此\n // 无条件 return 导致 ASK/confirm 决策回发后的 resume 正文整段被丢(用户答完「1」\n // 后纯黑洞,体感挂死)。终态判定单点化:presenter 只记录 stop、消费到 iterator\n // 收口为止。error/interrupted 仍即时终态(无 resume 语义)。\n if (ev.type === 'message.stop' && !ev.payload?.parentToolUseId) {\n this.reducer.handle(ev.type, ev.payload ?? {}); // onTerminal 记 tokens + flush\n const reason = ev.payload?.stopReason;\n if (reason === 'error') throw this.toError(ev);\n if (reason === 'interrupted') {\n this.renderer.showInterrupted('INTERRUPTED');\n return this.result('interrupted');\n }\n this.sawRootStop = true;\n continue;\n }\n\n // v4 block 流 → reducer;未命中则 debug 静默(v3 已删)\n if (!this.reducer.handle(ev.type, ev.payload ?? {})) debug('unknown event', ev.type);\n }\n // iterator 收口(非 hold:ROOT stop 即 finish;hold:TERMINAL 兜底/无未决 stop 后 finish)。\n this.renderer.stopSpinner();\n return this.result(this.sawRootStop ? 'completed' : 'incomplete');\n }\n\n get tokenCount(): number {\n return this.totalTokens;\n }\n\n /** G6 · 终态行素材:总/进/出 token + 工具数 + 委派数。0 值由 renderer 决定是否省略。 */\n get completionStats(): CompletionStats {\n return {\n totalTokens: this.totalTokens,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n toolCount: this.toolCount,\n delegationCount: this.delegationCount,\n };\n }\n\n /**\n * G6 · 从终态 payload 抽 in/out token 分解。仅 ROOT(parentToolUseId 空)的 message.stop /\n * response.completed 计入,避免子流 message.stop 的 turn 增量被误当全程值覆盖。\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private captureTokenBreakdown(ev: any): void {\n const p = ev?.payload;\n if (!p) return;\n if (ev.type === 'message.stop' && !p.parentToolUseId) {\n if (typeof p.inputTokens === 'number') this.inputTokens = p.inputTokens;\n if (typeof p.outputTokens === 'number') this.outputTokens = p.outputTokens;\n } else if (ev.type === 'response.completed') {\n const usage = p.usage;\n if (usage && typeof usage === 'object') {\n if (typeof usage.inputTokens === 'number') this.inputTokens = usage.inputTokens;\n if (typeof usage.outputTokens === 'number') this.outputTokens = usage.outputTokens;\n }\n }\n }\n\n private result(status: StreamResult['status']): StreamResult {\n return { status, traceId: this.traceId, streamId: this.streamId };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private toError(ev: any): Error {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err: any = new Error(ev.payload?.message ?? 'stream failed');\n err.code = ev.payload?.errorCode ?? ev.payload?.code;\n err.traceId = ev.traceId;\n return err;\n }\n}\n","import { marked } from 'marked';\nimport { markedTerminal } from 'marked-terminal';\nimport { agentDisplayName, terminalHyperlink } from '../streaming/TerminalRenderer';\nimport { absoluteDownloadUrl, type ResumeSummary } from '@hcmai/sdk';\nimport type { Block, StreamingState } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nmarked.use(markedTerminal() as any);\n\nexport interface BridgeSinks {\n appendBlock(b: Block): void;\n updateStreaming(patch: Partial<StreamingState>): void;\n}\n\n/**\n * ADR-129 · duck-type TerminalRenderer 的方法面 → React state 事件。\n *\n * StreamPresenter 以 TS 结构类型依赖 TerminalRenderer——本 bridge 实现同一方法面\n * (与单测 rendererSpy 同一招),把每个渲染语义翻译为「append 历史块」或「更新动态区」。\n * 语义层(reducer/presenter/iterator)零改动全复用,这是 ADR-129 D2 的落点。\n *\n * 正文策略:流式期间原文进动态区(打字机);段落落块时整段过 marked-terminal 渲染\n * 为 ANSI 进 `<Static>` 历史——与单发模式渲染完全一致。\n */\nexport function createInkRendererBridge(sinks: BridgeSinks, apiBase?: string) {\n let chatBuffer = '';\n let thinkingChars = 0;\n let thinkingSince: number | null = null;\n\n const renderAnsi = (src: string): string =>\n (marked.parse(src.replace(/\\n+$/, '')) as string).replace(/\\n+$/, '');\n\n const flushParagraphs = (force: boolean): void => {\n if (!chatBuffer) return;\n let head = '';\n if (force) {\n head = chatBuffer;\n chatBuffer = '';\n } else {\n const idx = chatBuffer.lastIndexOf('\\n\\n');\n if (idx < 0) return;\n const candidate = chatBuffer.slice(0, idx + 2);\n const fences = (candidate.match(/(?:^|\\n) {0,3}```/g) ?? []).length;\n if (fences % 2 === 1) return;\n head = candidate;\n chatBuffer = chatBuffer.slice(idx + 2);\n }\n if (head.trim()) {\n sinks.appendBlock({ kind: 'assistant', ansi: renderAnsi(head) });\n }\n sinks.updateStreaming({ text: chatBuffer });\n };\n\n return {\n // ── 正文流 ──\n writeChatChunk(text: string): void {\n chatBuffer += text;\n sinks.updateStreaming({ text: chatBuffer, spinner: null });\n flushParagraphs(false);\n },\n flushChatBuffer(): void {\n flushParagraphs(true);\n sinks.updateStreaming({ text: '' });\n },\n\n // ── spinner(动态区状态行)──\n startSpinner(text: string): void {\n sinks.updateStreaming({ spinner: text });\n },\n updateSpinner(text: string): void {\n sinks.updateStreaming({ spinner: text });\n },\n stopSpinner(): void {\n sinks.updateStreaming({ spinner: null });\n },\n\n // ── thinking(折叠:进行中计时,结束落总结块)──\n writeThinkingChunk(text: string): void {\n if (thinkingSince == null) {\n thinkingSince = Date.now();\n sinks.updateStreaming({ thinkingSince });\n }\n thinkingChars += text.length;\n },\n endThinking(): void {\n if (thinkingSince != null && thinkingChars > 0) {\n sinks.appendBlock({\n kind: 'thinking',\n seconds: Math.max(0, (Date.now() - thinkingSince) / 1000),\n chars: thinkingChars,\n });\n }\n thinkingSince = null;\n thinkingChars = 0;\n sinks.updateStreaming({ thinkingSince: null });\n },\n\n // ── 工具/委派/富内容 ──\n toolLine(name: string, preview: string, success: boolean, durMs: number, nextSteps?: string[]): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'tool', name, preview, success, durMs, nextSteps });\n },\n delegationStart(agentKey: string): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'delegationStart', agentName: agentDisplayName(agentKey) });\n },\n delegationEnd(_id: string, durMs?: number, toolCount?: number, failCount?: number,\n success: boolean = true, nextSteps?: string[]): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'delegationEnd', durMs, toolCount, failCount, success, nextSteps });\n },\n contentPartSummary(part: Record<string, unknown>): void {\n flushParagraphs(true);\n const type = part.type as string;\n let label: string;\n let detail: string | undefined;\n if (type === 'file' || type === 'fileDownload') {\n // 文件名做 OSC 8 超链接,点击由浏览器打开签名链接(ADR-140,免 Bearer);不打裸 URL——\n // 长签名 URL 换行后终端不自动识别(点不动),OSC 8 链接是字符单元属性、跨行仍可点。\n const fileName = (part.fileName as string) ?? '文件';\n const abs = part.downloadUrl ? absoluteDownloadUrl(apiBase, String(part.downloadUrl)) : undefined;\n label = abs ? `▸ ${terminalHyperlink(abs, `📎 ${fileName}`)} ← 点击打开` : `▸ 📎 ${fileName}`;\n } else if (type === 'chart') {\n label = `▸ 图表 · ${(part.title as string) ?? ''}`;\n detail = part.insight ? String(part.insight) : undefined;\n } else if (type === 'table') {\n label = `▸ 表格 · ${(part.title as string) ?? ''}`;\n } else {\n label = `▸ ${type}`;\n detail = part.insight ? String(part.insight) : undefined;\n }\n sinks.appendBlock({ kind: 'contentPart', label, detail });\n },\n steeringLine(contents: string[]): void {\n flushParagraphs(true);\n for (const text of contents) sinks.appendBlock({ kind: 'steering', text });\n },\n\n // ── 交互反馈 / 终态 ──\n interactionResumed(): void {\n sinks.appendBlock({ kind: 'interactionNote', tone: 'ok', text: '已受理,继续执行…' });\n },\n interactionTerminal(status?: string): void {\n const tone = status === 'FAILED' ? 'fail' as const : 'info' as const;\n const text = status === 'FAILED' ? '交互失败'\n : status === 'SUPERSEDED' ? '交互已被新请求接管' : '交互完成';\n sinks.appendBlock({ kind: 'interactionNote', tone, text });\n },\n autoApproved(toolName: string | undefined, summary: string): void {\n sinks.appendBlock({ kind: 'interactionNote', tone: 'ok', text: `已自动批准: ${toolName ?? ''}(${summary})` });\n },\n showInterrupted(reason: string): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'interrupted', reason });\n sinks.updateStreaming({ spinner: null, text: '' });\n },\n showCompleted(durMs: number, traceId: string | null, conversationId: string,\n totalTokens?: number, stats?: { inputTokens?: number; outputTokens?: number; toolCount?: number; delegationCount?: number }): void {\n flushParagraphs(true);\n sinks.appendBlock({\n kind: 'done', durMs, traceId, conversationId, totalTokens,\n inputTokens: stats?.inputTokens, outputTokens: stats?.outputTokens,\n toolCount: stats?.toolCount, delegationCount: stats?.delegationCount,\n });\n sinks.updateStreaming({ spinner: null, text: '' });\n },\n showResumeContext(summary: ResumeSummary): void {\n sinks.appendBlock({\n kind: 'resume', conversationId: summary.conversationId,\n totalRounds: summary.totalRounds, turns: summary.recent,\n });\n },\n };\n}\n\nexport type InkRendererBridge = ReturnType<typeof createInkRendererBridge>;\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Block } from './types';\n\n/** 历史块渲染(进 `<Static>`,append-only 永不重绘)。视觉语义对齐手搓版 TerminalRenderer。 */\nexport function BlockView({ block: b }: { block: Block }): React.JSX.Element {\n switch (b.kind) {\n case 'banner':\n return <Text color=\"gray\">{b.text}</Text>;\n case 'user':\n return (\n <Box flexDirection=\"column\">\n <Text><Text color=\"cyan\">{'❯ '}</Text>{b.text}</Text>\n {b.attachments?.length ? (\n <Text dimColor>{' 📎 ' + b.attachments.map((a) => a.fileName).join(' · ')}</Text>\n ) : null}\n </Box>\n );\n case 'assistant':\n return <Box flexDirection=\"column\" marginBottom={1}><Text>{b.ansi}</Text></Box>;\n case 'thinking':\n return <Text color=\"gray\">✓ 推理完成 ({b.seconds.toFixed(1)}s · {b.chars} chars)</Text>;\n case 'tool':\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"cyan\">⚙ {b.name}</Text>\n {b.preview ? <Text color=\"gray\"> {b.preview}</Text> : null}\n {' '}{b.success ? <Text color=\"green\">✓</Text> : <Text color=\"red\">✗</Text>}\n <Text color=\"gray\"> {b.durMs}ms</Text>\n </Text>\n {!b.success && b.nextSteps?.length ? (\n <Box flexDirection=\"column\" marginLeft={4}>\n <Text dimColor>↳ 下一步:</Text>\n {b.nextSteps.map((s, i) => <Text key={i} dimColor> • {s}</Text>)}\n </Box>\n ) : null}\n </Box>\n );\n case 'delegationStart':\n return <Text color=\"blue\">⏺ 委派 → {b.agentName}</Text>;\n case 'delegationEnd': {\n const segs: string[] = [];\n if (b.toolCount) segs.push(`${b.toolCount} 工具${b.failCount ? `,${b.failCount} 失败` : ''}`);\n if (b.durMs) segs.push(`${(b.durMs / 1000).toFixed(1)}s`);\n const detail = segs.length ? ` (${segs.join(' · ')})` : '';\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n {b.success\n ? <Text color=\"gray\">⎿ 完成{detail}</Text>\n : <Text color=\"red\">⎿ ✗ 委派失败{detail}</Text>}\n {!b.success && b.nextSteps?.length ? (\n <Box flexDirection=\"column\" marginLeft={2}>\n {b.nextSteps.map((s, i) => <Text key={i} dimColor> • {s}</Text>)}\n </Box>\n ) : null}\n </Box>\n );\n }\n case 'steering':\n return <Text><Text color=\"blue\">↪ 纠偏 </Text><Text color=\"gray\">{b.text}</Text></Text>;\n case 'contentPart':\n return (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\">{b.label}</Text>\n {b.detail ? <Text color=\"gray\"> {b.detail}</Text> : null}\n </Box>\n );\n case 'interactionNote':\n return b.tone === 'fail'\n ? <Text color=\"red\"> ✗ {b.text}</Text>\n : b.tone === 'ok'\n ? <Text color=\"green\"> ✓ {b.text}</Text>\n : <Text color=\"gray\"> {b.text}</Text>;\n case 'resume': {\n const shownUsers = b.turns.filter((t) => t.role === 'user').length;\n const earlier = b.totalRounds - shownUsers;\n const shortId = b.conversationId.length > 12 ? '…' + b.conversationId.slice(-12) : b.conversationId;\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>↻ 续接会话 {shortId}(共 {b.totalRounds} 轮{earlier > 0 ? `,更早 ${earlier} 轮略` : ''})</Text>\n {b.turns.map((t, i) => (\n <Text key={i} dimColor>{t.role === 'user' ? ` > ${t.text}` : ` ${t.text}`}</Text>\n ))}\n </Box>\n );\n }\n case 'done': {\n const segs: string[] = [`${b.durMs}ms`];\n if (b.totalTokens) {\n const split = (b.inputTokens || b.outputTokens) ? ` (↑${b.inputTokens ?? 0}/↓${b.outputTokens ?? 0})` : '';\n segs.push(`${b.totalTokens} tok${split}`);\n }\n if (b.toolCount) segs.push(`${b.toolCount} 工具`);\n if (b.delegationCount) segs.push(`${b.delegationCount} 委派`);\n segs.push(`traceId ${b.traceId ?? '?'}`);\n segs.push(`conversation ${b.conversationId}`);\n return <Box marginBottom={1}><Text dimColor>✓ done ({segs.join(' · ')})</Text></Box>;\n }\n case 'interrupted':\n return <Text color=\"yellow\">^ 已中断 ({b.reason})</Text>;\n case 'error':\n return <Text color=\"red\">✗ Error: {b.text}</Text>;\n default:\n return <Text />;\n }\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nexport interface MultilineInputProps {\n value: string;\n onChange: (v: string) => void;\n onSubmit: (v: string) => void;\n placeholder?: string;\n /** 首行提示符(续行自动等宽缩进)。 */\n prompt?: string;\n /** 光标已在首行仍按 ↑ —— 交还历史导航。 */\n onHistoryUp?: () => void;\n /** 光标已在末行仍按 ↓ —— 交还历史导航。 */\n onHistoryDown?: () => void;\n /** Esc 清空输入时同步回调(清待发附件等外部暂存态,issue #64)。 */\n onEscapeClear?: () => void;\n /**\n * 外部按键捕获钩子:在输入框处理任何键之前调用,返回 true 表示该键已被上层\n * (如 slash 命令菜单)消费,输入框跳过自身处理。保持输入框对 slash 语义无知。\n */\n captureKey?: (input: string, key: KeyLike) => boolean;\n}\n\n/**\n * 多行输入框(对标主流聊天输入区:Enter 发送,修饰 Enter 换行):\n * - 裸 Enter 发送;Shift+Enter / Ctrl+Enter / Option+Enter / Ctrl+J 换行续输\n * (修饰 Enter 需终端键盘增强,run.ts 开 modifyOtherKeys;Ctrl+J 传统 \\n 作无增强兜底)\n * - 草稿末行输入 /send 再 Enter 仍可发送(剥掉 /send 行)\n * - 粘贴多行文本(单 chunk 含换行)原样插入,不误触提交\n * - ↑↓ 在多行间移动光标,首/末行边界让位给历史导航(Claude Code 同行为)\n * - Esc 清空当前输入(busy 态的 Esc 打断在 App 层,互不冲突)\n *\n * value 受控于父级;光标是组件内部状态——外部改值(历史回填/提交清空)时\n * 光标自动置末尾,selfEdit 标记区分两种来源。\n */\nexport function MultilineInput(props: MultilineInputProps): React.JSX.Element {\n const { value, onChange, onSubmit, placeholder = '', prompt = '› ', onHistoryUp, onHistoryDown, onEscapeClear, captureKey } = props;\n const [cursor, setCursor] = useState(value.length);\n const selfEdit = useRef(false);\n\n useEffect(() => {\n if (selfEdit.current) { selfEdit.current = false; return; }\n setCursor(value.length);\n }, [value]);\n\n const edit = (next: string, nextCursor: number): void => {\n selfEdit.current = true;\n setCursor(nextCursor);\n onChange(next);\n };\n\n useInput((input, key) => {\n // 上层(slash 菜单)优先消费导航/补全键;返回 true 则输入框不再处理本次按键。\n if (captureKey?.(input, key)) return;\n if (key.escape) { if (value) edit('', 0); onEscapeClear?.(); return; }\n // 固定 composer 语义(对标主流聊天输入区):\n // - 裸 Enter 发送\n // - Shift/Ctrl/Option+Enter 换行;Ctrl+J(传统 \\n)换行作无终端增强兜底\n // - 草稿末行 `/send` + Enter 仍兜底发送(剥掉 /send 行)。\n // 终端差异:\n // - Shift/Ctrl/Option+Enter(kitty CSI-u 形态)Ink 7 原生解析出 key.return + 修饰位\n // - xterm modifyOtherKeys 形态(ESC[27;<mod>;13~)Ink 不识别,匹配剥掉 ESC 的原文\n const modifiedEnter = classifyModifiedEnter(input, key);\n if (modifiedEnter === 'newline' || input === '\\n') {\n edit(value.slice(0, cursor) + '\\n' + value.slice(cursor), cursor + 1);\n return;\n }\n if (key.return) {\n // 裸 Enter 发送(修饰 Enter 已在上面归为换行)。空白输入不触发提交。\n const sendDraft = draftFromSendCommandLine(value, cursor);\n const toSend = sendDraft !== null ? sendDraft : value;\n if (toSend.trim()) onSubmit(toSend);\n return;\n }\n // 其他未映射的修饰键序列(CSI ~/u 收尾)不入正文。\n if (/^(?:\\x1b)?\\[\\d+(?:;\\d+)*[~u]$/.test(input)) return;\n if (key.backspace || key.delete) {\n if (cursor > 0) edit(value.slice(0, cursor - 1) + value.slice(cursor), cursor - 1);\n return;\n }\n if (key.leftArrow) { setCursor((c) => Math.max(0, c - 1)); return; }\n if (key.rightArrow) { setCursor((c) => Math.min(value.length, c + 1)); return; }\n if (key.upArrow || key.downArrow) {\n const lines = value.split('\\n');\n const { row, col } = locate(lines, cursor);\n if (key.upArrow) {\n if (row === 0) { onHistoryUp?.(); return; }\n setCursor(offsetOf(lines, row - 1, Math.min(col, lines[row - 1]!.length)));\n } else {\n if (row === lines.length - 1) { onHistoryDown?.(); return; }\n setCursor(offsetOf(lines, row + 1, Math.min(col, lines[row + 1]!.length)));\n }\n return;\n }\n if (key.ctrl || key.meta || key.tab) return;\n if (input) {\n // 可打印输入与粘贴整段同路:\\r / \\r\\n 统一归一为 \\n。\n const text = input.replace(/\\r\\n?/g, '\\n');\n edit(value.slice(0, cursor) + text + value.slice(cursor), cursor + text.length);\n }\n });\n\n const indent = ' '.repeat(prompt.length);\n\n if (!value) {\n return (\n <Box>\n <Text color=\"cyan\">{prompt}</Text>\n <Text inverse>{placeholder.charAt(0) || ' '}</Text>\n <Text dimColor>{placeholder.slice(1)}</Text>\n </Box>\n );\n }\n\n const lines = value.split('\\n');\n const { row, col } = locate(lines, cursor);\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, r) => (\n <Box key={r}>\n <Text color=\"cyan\">{r === 0 ? prompt : indent}</Text>\n {r === row ? (\n <Text>\n {line.slice(0, col)}\n <Text inverse>{col < line.length ? line[col] : ' '}</Text>\n {col < line.length ? line.slice(col + 1) : ''}\n </Text>\n ) : (\n <Text>{line.length ? line : ' '}</Text>\n )}\n </Box>\n ))}\n </Box>\n );\n}\n\ninterface KeyLike {\n return?: boolean;\n shift?: boolean;\n ctrl?: boolean;\n meta?: boolean;\n upArrow?: boolean;\n downArrow?: boolean;\n tab?: boolean;\n}\n\nexport function classifyModifiedEnter(input: string, key: KeyLike): 'submit' | 'newline' | null {\n // Enter 发送、修饰 Enter 换行:Shift/Ctrl/Option+Enter 一律换行(裸 Enter 走 key.return 提交分支)。\n if (key.return && (key.ctrl || key.meta || key.shift)) return 'newline';\n\n // xterm modifyOtherKeys 形态 ESC[27;<mod>;13~:任何修饰位(shift=2 / alt=3,4 / ctrl=5…)都换行。\n const match = /^(?:\\x1b)?\\[27;(\\d+);13~$/.exec(input);\n if (!match) return null;\n return 'newline';\n}\n\nexport function isSingleLineSlashCommand(value: string): boolean {\n const text = value.trim();\n return text.startsWith('/') && !text.includes('\\n');\n}\n\nexport function draftFromSendCommandLine(value: string, cursor: number): string | null {\n const lines = value.split('\\n');\n const { row } = locate(lines, cursor);\n if ((lines[row] ?? '').trim() !== '/send') return null;\n const next = lines.filter((_, i) => i !== row).join('\\n').trim();\n return next.length > 0 ? next : '';\n}\n\n/** 光标线性偏移 → (行, 列)。 */\nfunction locate(lines: string[], cursor: number): { row: number; col: number } {\n let rest = cursor;\n for (let r = 0; r < lines.length; r++) {\n if (rest <= lines[r]!.length) return { row: r, col: rest };\n rest -= lines[r]!.length + 1;\n }\n return { row: lines.length - 1, col: lines[lines.length - 1]!.length };\n}\n\n/** (行, 列) → 光标线性偏移。 */\nfunction offsetOf(lines: string[], row: number, col: number): number {\n let off = 0;\n for (let r = 0; r < row; r++) off += lines[r]!.length + 1;\n return off + col;\n}\n","/**\n * ADR-129 · Ink REPL 的历史块模型。\n *\n * 聊天历史 = append-only 的 Block 列表(渲染进 Ink `<Static>`,一旦落块永不重绘——\n * 这是 Ink 对滚动长输出的标准解法,也天然杜绝手搓时代的渲染竞态)。\n * 动态区(流式正文/spinner/交互卡/输入框)不在此列,由 App 的 state 直接驱动。\n */\n\nexport type Block =\n | { kind: 'banner'; text: string }\n | { kind: 'user'; text: string; attachments?: Array<{ fileName: string; documentId: string }> }\n /** 已完成的 assistant 正文段(marked-terminal 渲染后的 ANSI 字符串,与单发模式渲染一致)。 */\n | { kind: 'assistant'; ansi: string }\n | { kind: 'thinking'; seconds: number; chars: number }\n | { kind: 'tool'; name: string; preview: string; success: boolean; durMs: number; nextSteps?: string[] }\n | { kind: 'delegationStart'; agentName: string }\n | { kind: 'delegationEnd'; durMs?: number; toolCount?: number; failCount?: number; success: boolean; nextSteps?: string[] }\n | { kind: 'steering'; text: string }\n | { kind: 'contentPart'; label: string; detail?: string }\n | { kind: 'interactionNote'; tone: 'ok' | 'fail' | 'info'; text: string }\n | { kind: 'resume'; conversationId: string; totalRounds: number; turns: Array<{ role: 'user' | 'assistant'; text: string }> }\n | { kind: 'done'; durMs: number; traceId: string | null; conversationId: string; totalTokens?: number; inputTokens?: number; outputTokens?: number; toolCount?: number; delegationCount?: number }\n | { kind: 'interrupted'; reason: string }\n | { kind: 'error'; text: string };\n\n/** 动态区状态:一轮对话进行中的实时投影。 */\nexport interface StreamingState {\n /** 当前累积的流式正文(原文,落块时再过 marked 渲染)。 */\n text: string;\n /** spinner 文案;null = 不转。 */\n spinner: string | null;\n /** thinking 进行中起始时刻(ms);null = 无。 */\n thinkingSince: number | null;\n active: boolean;\n}\n\nexport const IDLE_STREAMING: StreamingState = {\n text: '',\n spinner: null,\n thinkingSince: null,\n active: false,\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport * as fs from 'node:fs/promises';\nimport { Box, Static, Text, useApp, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport SelectInput from 'ink-select-input';\nimport Spinner from 'ink-spinner';\nimport { marked } from 'marked';\nimport {\n sendMessageAndStream,\n createConversation,\n saveConversationState,\n parseInteractionRequest,\n parseInteractionResolved,\n buildConfirm,\n buildReject,\n buildAnswer,\n fetchConversationTimeline,\n buildResumeSummary,\n replHistoryFile,\n DEFAULT_AGENT_ID,\n uploadDocument,\n type AttachmentMeta,\n type WsClient,\n type HcmClient,\n type InteractionRequest,\n} from '@hcmai/sdk';\nimport { extractAtFileTokens, extractInlineFilePaths, isBareFilePath } from '../utils/attachment-args';\nimport { filterSlashCommands, resolveSlashKey, wrapIndex } from '../utils/slash';\nimport { agentDisplayName } from '../streaming/TerminalRenderer';\nimport { StreamPresenter } from '../streaming/StreamPresenter';\nimport type { TerminalRenderer } from '../streaming/TerminalRenderer';\nimport { createInkRendererBridge } from './InkRendererBridge';\nimport { BlockView } from './BlockView';\nimport { MultilineInput } from './MultilineInput';\nimport { IDLE_STREAMING, type Block, type StreamingState } from './types';\n\nexport interface ReplAppProps {\n ws: WsClient;\n client: HcmClient;\n agentId: string;\n env: string;\n identity: string;\n tenantId: string;\n initialConversationId?: string;\n autoApprove?: boolean;\n}\n\ntype Interaction = { req: InteractionRequest; respond: (d: Decision) => void };\ntype Decision =\n | { kind: 'confirm'; remember?: boolean }\n | { kind: 'reject'; feedback?: string }\n | { kind: 'answer'; text?: string; choiceIndex?: number };\n\n/**\n * ADR-129 · hcm chat REPL 的 Ink 主组件。\n *\n * 终端唯一 owner:历史块进 `<Static>`(append-only 永不重绘),动态区(流式正文/\n * spinner/交互卡/输入框)由 state 驱动——手搓时代的 stdin 共存/渲染竞态范畴病在此\n * 模型下不存在。语义层(reducer/presenter/iterator)经 InkRendererBridge 全复用。\n */\nexport function ReplApp(props: ReplAppProps): React.JSX.Element {\n const { exit } = useApp();\n const [blocks, setBlocks] = useState<Block[]>([{\n kind: 'banner',\n text: `HCM Chat · Enter 发送 · Shift+Enter 换行 · /help 帮助`,\n }]);\n const [streaming, setStreaming] = useState<StreamingState>(IDLE_STREAMING);\n const [interaction, setInteraction] = useState<Interaction | null>(null);\n const [input, setInput] = useState('');\n // slash 命令菜单当前高亮项(对标 Claude Code:默认选中第一个匹配项,回车直接执行)。\n const [slashIndex, setSlashIndex] = useState(0);\n const [busy, setBusy] = useState(false);\n const [conversationId, setConversationId] = useState<string | undefined>(props.initialConversationId);\n const [conversationMode, setConversationMode] = useState<'new' | 'resume' | 'chat'>(\n props.initialConversationId ? 'resume' : 'new',\n );\n // 会话累计 token(输入区底部状态栏显示,对标 Claude Code 的 context 概览)。\n const [sessionTokens, setSessionTokens] = useState(0);\n // issue #64:待发附件(/attach 或裸路径暂存;@路径 在提交时直接上传合并)。\n const [pendingAttachments, setPendingAttachments] = useState<AttachmentMeta[]>([]);\n\n const convRef = useRef<string | undefined>(props.initialConversationId);\n const cancelRef = useRef<((reason: string) => void) | null>(null);\n const replayedRef = useRef(false);\n // 会话级免询问:CONFIRM 卡选「是,本会话不再询问」后置 true,后续 CONFIRM 自动批准\n //(对标 Claude Code「Yes, and don't ask again this session」,纯客户端,不动后端)。\n const sessionAutoApproveRef = useRef(false);\n\n // 输入历史 ↑↓ 回填(readline 时代的 history file 平移,跨进程持久)。\n const historyRef = useRef<string[]>([]);\n const histIdxRef = useRef(-1);\n const draftRef = useRef('');\n useEffect(() => {\n void fs.readFile(replHistoryFile(props.env), 'utf-8')\n .then((c) => { historyRef.current = c.split('\\n').filter(Boolean); })\n .catch(() => { /* 首次无历史 */ });\n }, [props.env]);\n\n // busy 实时计时(动态 hint「esc 打断 · X.Xs」)。\n const [elapsedMs, setElapsedMs] = useState(0);\n useEffect(() => {\n if (!busy) return;\n const t0 = Date.now();\n setElapsedMs(0);\n const timer = setInterval(() => setElapsedMs(Date.now() - t0), 500);\n return () => clearInterval(timer);\n }, [busy]);\n\n const appendBlock = useCallback((b: Block) => setBlocks((prev) => [...prev, b]), []);\n const updateStreaming = useCallback(\n (patch: Partial<StreamingState>) => setStreaming((prev) => ({ ...prev, ...patch })),\n []);\n\n useInput((_input, key) => {\n // interaction 激活时 Esc 交给 InteractionView 处理(=拒绝该交互),不在此硬中断整轮。\n if (key.escape && cancelRef.current && !interaction) { cancelRef.current('user-esc'); return; }\n });\n\n // 历史回填(↑↓ 的按键归 MultilineInput,仅光标到达首/末行边界时回调到这里)。\n const historyUp = useCallback(() => {\n const hist = historyRef.current;\n if (hist.length === 0) return;\n if (histIdxRef.current === -1) { draftRef.current = input; histIdxRef.current = hist.length; }\n histIdxRef.current = Math.max(0, histIdxRef.current - 1);\n setInput(hist[histIdxRef.current] ?? '');\n }, [input]);\n const historyDown = useCallback(() => {\n if (histIdxRef.current === -1) return;\n const hist = historyRef.current;\n histIdxRef.current += 1;\n if (histIdxRef.current >= hist.length) {\n histIdxRef.current = -1;\n setInput(draftRef.current);\n } else {\n setInput(hist[histIdxRef.current] ?? '');\n }\n }, []);\n\n const runTurn = useCallback(async (prompt: string, attachments?: AttachmentMeta[]) => {\n setBusy(true);\n updateStreaming({ active: true, spinner: '思考中…' });\n const bridge = createInkRendererBridge({ appendBlock, updateStreaming }, props.client.endpoint);\n // 续聊回放(刀⑤平移):首轮且续接既有会话时回显最近轮摘要。\n if (!replayedRef.current && convRef.current) {\n replayedRef.current = true;\n const items = await fetchConversationTimeline(props.client.raw(), convRef.current);\n const summary = items ? buildResumeSummary(convRef.current, items) : null;\n if (summary) bridge.showResumeContext(summary);\n }\n try {\n // 长开 REPL 的连接自愈:后端重启/网络闪断后旧 WS 已死,发消息前重建(no-op 若健康)。\n await props.ws.ensureConnected();\n if (!convRef.current) {\n const conv = await createConversation(props.client.raw(), props.agentId);\n convRef.current = conv.id;\n setConversationId(conv.id);\n setConversationMode('chat');\n }\n const presenter = new StreamPresenter(bridge as unknown as TerminalRenderer, {\n showToolCalls: true,\n output: 'text',\n });\n const handle = await sendMessageAndStream(props.ws, prompt, {\n conversationId: convRef.current,\n agentId: props.agentId,\n holdUntilInteractionTerminal: true,\n attachments,\n });\n convRef.current = handle.conversationId;\n setConversationId(handle.conversationId);\n cancelRef.current = (reason) => handle.cancel(reason);\n\n const off = handle.onControl((ev) => {\n if (ev.type === 'control.interaction.resolved') {\n const r = parseInteractionResolved(ev.payload);\n if (r.phase === 'RESUMED') bridge.interactionResumed();\n else if (r.phase === 'TERMINAL') bridge.interactionTerminal((ev.payload.status as string) || undefined);\n return;\n }\n if (ev.type !== 'control.interaction.request') return;\n const req = parseInteractionRequest(ev.payload);\n if ((props.autoApprove || sessionAutoApproveRef.current) && req.kind === 'CONFIRM') {\n bridge.autoApproved(req.toolName, req.summary);\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n return;\n }\n setInteraction({\n req,\n respond: (d) => {\n setInteraction(null);\n if (d.kind === 'confirm') {\n if (d.remember) sessionAutoApproveRef.current = true;\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n } else if (d.kind === 'reject') {\n const reason = d.feedback?.trim();\n handle.sendCommand(buildReject(req.interactionId, handle.conversationId, reason || undefined));\n } else {\n handle.sendCommand(buildAnswer(req.interactionId, handle.conversationId, d.text ?? '', d.choiceIndex));\n }\n },\n });\n });\n\n const t0 = Date.now();\n try {\n const result = await presenter.consume(handle.events);\n const stats = presenter.completionStats;\n if (result.status === 'completed') {\n bridge.showCompleted(Date.now() - t0, result.traceId, convRef.current ?? '', presenter.tokenCount || undefined, stats);\n }\n if (presenter.tokenCount) setSessionTokens((prev) => prev + presenter.tokenCount);\n if (convRef.current) {\n await saveConversationState(props.env, {\n lastConversationId: convRef.current,\n updatedAt: new Date().toISOString(),\n });\n }\n } finally {\n off();\n }\n } catch (e) {\n appendBlock({ kind: 'error', text: (e as Error).message ?? String(e) });\n } finally {\n cancelRef.current = null;\n setBusy(false);\n setStreaming(IDLE_STREAMING);\n setInteraction(null);\n }\n }, [appendBlock, updateStreaming, props]);\n\n /** issue #64:上传单个本地文件为附件,失败转 banner 提示。 */\n const uploadOne = useCallback(async (filePath: string): Promise<AttachmentMeta | null> => {\n try {\n const meta = await uploadDocument(props.client.raw(), filePath);\n return meta;\n } catch (e) {\n appendBlock({ kind: 'banner', text: `📎 上传失败 ${filePath}: ${(e as Error).message}` });\n return null;\n }\n }, [appendBlock, props.client]);\n\n const onSubmit = useCallback((raw: string) => {\n const line = raw.trim();\n setInput('');\n if (!line) return;\n if (line === '/exit' || line === '/quit') { exit(); return; }\n if (line === '/send') return;\n if (line === '/help') {\n appendBlock({ kind: 'banner', text: 'Enter 发送 · Shift/Ctrl+Enter 换行 · /send 兜底发送 · /new 新会话 · /attach <路径> 附件 · /exit 退出' });\n return;\n }\n if (line === '/new') {\n convRef.current = undefined;\n setConversationId(undefined);\n setConversationMode('new');\n replayedRef.current = false;\n appendBlock({ kind: 'banner', text: '· 已切换:下一条消息将开启新会话' });\n return;\n }\n // issue #64 · /attach <path>:上传并暂存,随下一条消息发送。\n if (line.startsWith('/attach')) {\n const arg = line.slice('/attach'.length).trim().replace(/^[\"']|[\"']$/g, '');\n if (!arg) { appendBlock({ kind: 'banner', text: '用法: /attach <本地文件路径>' }); return; }\n void (async () => {\n const meta = await uploadOne(arg);\n if (meta) setPendingAttachments((prev) => [...prev, meta]);\n })();\n return;\n }\n // issue #64 · 粘贴/输入裸文件路径:暂存为待发附件(D4 一期)。\n const bare = isBareFilePath(line);\n if (bare) {\n void (async () => {\n const meta = await uploadOne(bare);\n if (meta) {\n setPendingAttachments((prev) => [...prev, meta]);\n appendBlock({ kind: 'banner', text: `📎 已暂存附件 ${meta.fileName},输入消息后一起发送` });\n }\n })();\n return;\n }\n // 历史入档(内存 + 持久文件,与 readline 时代同一文件跨版本互通;\n // 文件按行存——多行消息落盘时换行折叠为空格,保持单行格式兼容)。\n historyRef.current.push(line);\n histIdxRef.current = -1;\n void fs.appendFile(replHistoryFile(props.env), line.replace(/\\n/g, ' ') + '\\n').catch(() => { /* 忽略 */ });\n // issue #64 · @路径 内联引用:提交时解析、上传、从文本移除(Claude Code @ mention 映射)。\n // 叠加:无 @ 前缀的行内裸绝对路径(粘贴/剪贴板路径 + 同行文字)也识别上传——否则裸路径\n // 漏进消息文本传给 LLM 当散文 → 幻觉成别的路径(实测 bug)。\n void (async () => {\n const at = extractAtFileTokens(line);\n const inline = extractInlineFilePaths(at.cleaned);\n const cleaned = inline.cleaned;\n const paths = [...at.paths, ...inline.paths];\n const uploaded: AttachmentMeta[] = [];\n for (const fp of paths) {\n const meta = await uploadOne(fp);\n if (meta) uploaded.push(meta);\n }\n const attachments = [...pendingAttachments, ...uploaded];\n setPendingAttachments([]);\n const text = cleaned || (attachments.length ? '请处理这些附件' : line);\n appendBlock({ kind: 'user', text, attachments: attachments.length ? attachments : undefined });\n await runTurn(text, attachments.length ? attachments : undefined);\n })();\n }, [appendBlock, exit, runTurn, uploadOne, pendingAttachments, props.env]);\n\n // 流式正文渐进 markdown(Ink 重渲染免费——手搓 append-only 终端做不到的能力):\n // 动态区每帧对未完段做 marked 渲染;半截标记渲染异常时回退原文。\n const streamingAnsi = useMemo(() => {\n if (!streaming.text) return '';\n try {\n return (marked.parse(streaming.text) as string).replace(/\\n+$/, '');\n } catch {\n return streaming.text;\n }\n }, [streaming.text]);\n\n // slash 命令菜单(输入 / 开头、未进参数区时浮现,按前缀过滤)。\n const slashItems = filterSlashCommands(input);\n const slashOpen = slashItems.length > 0;\n const slashSelected = slashOpen ? wrapIndex(slashIndex, slashItems.length) : 0;\n // 命令列右补齐到等宽,描述列对齐(对标 Claude Code 的命令面板)。\n const slashColWidth = slashOpen ? Math.max(...slashItems.map((s) => s.cmd.length)) + 2 : 0;\n\n // 菜单打开时拦截方向键/Tab/回车:↑↓ 切换高亮、Tab 补全、回车补全或直接执行\n //(无参命令直接提交,带参命令仅补全命令名留空格)。返回 true 则输入框不再处理本次按键。\n const handleSlashKey = (_input: string, key: { upArrow?: boolean; downArrow?: boolean; tab?: boolean; return?: boolean }): boolean => {\n if (!slashOpen) return false;\n const action = resolveSlashKey(key, slashItems[slashSelected]);\n switch (action.type) {\n case 'move':\n setSlashIndex(wrapIndex(slashSelected + action.delta, slashItems.length));\n return true;\n case 'complete':\n setSlashIndex(0);\n setInput(action.text);\n return true;\n case 'execute':\n onSubmit(action.text);\n return true;\n default:\n return false;\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Static items={blocks}>\n {(b, i) => <BlockView key={i} block={b} />}\n </Static>\n\n {streamingAnsi ? (\n <Box marginTop={0}><Text>{streamingAnsi}</Text></Box>\n ) : null}\n\n {streaming.spinner ? (\n <Box>\n <Text color=\"gray\"><Spinner type=\"dots\" /> {streaming.spinner}</Text>\n <Text dimColor> esc 打断 · {(elapsedMs / 1000).toFixed(1)}s</Text>\n </Box>\n ) : busy ? (\n <Box><Text dimColor>esc 打断 · {(elapsedMs / 1000).toFixed(1)}s</Text></Box>\n ) : null}\n\n {interaction ? (\n <InteractionView interaction={interaction} />\n ) : !busy ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <ComposerRule />\n <AttachmentChips attachments={pendingAttachments} />\n <MultilineInput\n value={input}\n onChange={(v) => {\n setInput(v);\n // 改写命令文本即把高亮回到第一个匹配项(方向键导航不走 onChange,故选择不丢)。\n if (v.startsWith('/')) setSlashIndex(0); else histIdxRef.current = -1;\n }}\n onSubmit={onSubmit}\n placeholder=\"问 Moirai…\"\n onEscapeClear={() => setPendingAttachments([])}\n onHistoryUp={historyUp}\n onHistoryDown={historyDown}\n captureKey={handleSlashKey}\n />\n {/* 底线:与顶线对称把输入框上下框住,与下方状态栏/slash 菜单分隔(对标 Claude Code) */}\n <ComposerRule />\n {slashOpen ? (\n <Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n {slashItems.map(({ cmd, desc }, i) => {\n const on = i === slashSelected;\n return (\n <Box key={cmd}>\n <Text color={on ? 'cyan' : undefined} bold={on} dimColor={!on}>\n {cmd.padEnd(slashColWidth)}\n </Text>\n <Text dimColor={!on}>{desc}</Text>\n </Box>\n );\n })}\n </Box>\n ) : (\n <StatusBar\n env={props.env} identity={props.identity} tenantId={props.tenantId}\n agentId={props.agentId}\n conversationId={conversationId}\n conversationMode={conversationMode}\n sessionTokens={sessionTokens}\n />\n )}\n </Box>\n ) : null}\n </Box>\n );\n}\n\n/** 输入框上下分隔线(同一组件,顶/底各用一次,把输入框框住,对标 Claude Code 输入区)。 */\nfunction ComposerRule(): React.JSX.Element {\n return (\n <Box\n width=\"100%\"\n borderStyle=\"single\" borderColor=\"white\"\n borderTop borderBottom={false} borderLeft={false} borderRight={false}\n />\n );\n}\n\nfunction AttachmentChips({ attachments }: { attachments: AttachmentMeta[] }): React.JSX.Element | null {\n if (attachments.length === 0) return null;\n return (\n <Box paddingX={1}>\n <Text dimColor>\n attachments {attachments.map((a) => shortLabel(a.fileName, 24)).join(' · ')}\n </Text>\n </Box>\n );\n}\n\n/**\n * 输入框下方常驻环境信息栏(对标 Claude Code 底部状态行):\n * 左侧身份上下文(env · identity · tenant · agent),右侧会话动态(短 id · 累计 token)。\n * slash 菜单浮现时让位(与 Claude Code 同行为),避免底部跳动。\n */\nfunction StatusBar(props: {\n env: string; identity: string; tenantId: string;\n agentId: string; conversationId?: string; conversationMode: 'new' | 'resume' | 'chat'; sessionTokens: number;\n}): React.JSX.Element {\n // identity 命名约定常带「@env」后缀(如 suitj@bay4),与 env 段重复时去掉。\n const identity = props.identity.endsWith(`@${props.env}`)\n ? props.identity.slice(0, -props.env.length - 1)\n : props.identity;\n const left = [\n props.env,\n identity,\n `t${props.tenantId}`,\n agentLabel(props.agentId),\n ].join(' · ');\n const right = [\n conversationStatus(props.conversationMode, props.conversationId),\n `${fmtTokens(props.sessionTokens)} tok`,\n 'Enter 发送',\n ];\n return (\n <Box paddingX={1} width=\"100%\" justifyContent=\"space-between\">\n <Text dimColor>{left}</Text>\n <Text dimColor>{right.join(' · ')}</Text>\n </Box>\n );\n}\n\n/** 状态栏 token 数:1234 → 1.2k(千位以上压缩,避免状态栏溢出换行)。 */\nfunction fmtTokens(n: number): string {\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n\nfunction conversationStatus(mode: 'new' | 'resume' | 'chat', conversationId?: string): string {\n if (!conversationId || mode === 'new') return 'new chat';\n const shortId = shortConversationId(conversationId);\n if (mode === 'resume') return `resume ${shortId}`;\n return `chat ${shortId}`;\n}\n\nfunction shortConversationId(id: string): string {\n return id.length > 14 ? `…${id.slice(-12)}` : id;\n}\n\nfunction shortLabel(value: string, max: number): string {\n return value.length > max ? value.slice(0, Math.max(0, max - 1)) + '…' : value;\n}\n\n/**\n * 状态栏 agent 标签:key 形态走 agentDisplayName;UUID 形态没有本地名册——\n * 默认主 agent 显示 Moirai(与 DEFAULT_AGENT_ID 同一常量层级),其余缩短为尾 4 位。\n */\nfunction agentLabel(agentId: string): string {\n if (agentId === DEFAULT_AGENT_ID) return 'Moirai';\n if (/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(agentId)) return `agent …${agentId.slice(-4)}`;\n return agentDisplayName(agentId);\n}\n\n/** 来源行:agentPath ≥2 段时显示「来自 Moirai › HR 专家」(与 Web originLine 同语义)。 */\nfunction originLine(path: string | undefined): string | null {\n const segs = (path ?? '').split('.').filter(Boolean);\n if (segs.length < 2) return null;\n return `来自 ${segs.map((k) => agentDisplayName(k)).join(' › ')}`;\n}\n\nexport function InteractionView({ interaction }: { interaction: Interaction }): React.JSX.Element {\n const { req, respond } = interaction;\n const [freeText, setFreeText] = useState('');\n const [freeMode, setFreeMode] = useState(false); // ASK「自己输入」\n const [rejectMode, setRejectMode] = useState(false); // CONFIRM「否,并告诉它怎么改」\n const origin = originLine(req.originAgentPath);\n\n const choices = (req.choices ?? []).map((c, i) => ({\n label: typeof c === 'string' ? c : String((c as Record<string, unknown>).label ?? (c as Record<string, unknown>).value ?? JSON.stringify(c)),\n value: String(i),\n }));\n\n // 正在显示自由文本输入框时,数字键/Esc 让位给 TextInput(避免吃掉输入)。\n const askFreeText = req.kind === 'ASK' && (choices.length === 0 || freeMode);\n const textInputActive = rejectMode || askFreeText;\n\n // 数字键直选 + Esc 取消(对标 Claude Code 的 1/2/3 + esc)。\n useInput((input, key) => {\n if (textInputActive) return;\n if (key.escape) { respond({ kind: 'reject' }); return; }\n if (req.kind === 'CONFIRM') {\n if (input === '1') respond({ kind: 'confirm' });\n else if (input === '2') respond({ kind: 'confirm', remember: true });\n else if (input === '3') setRejectMode(true);\n } else {\n const n = Number(input);\n if (Number.isInteger(n) && n >= 1 && n <= choices.length) respond({ kind: 'answer', text: choices[n - 1]!.label, choiceIndex: n - 1 });\n else if (input === String(choices.length + 1)) setFreeMode(true);\n }\n });\n\n if (req.kind === 'CONFIRM') {\n const hi = req.riskLevel === 'HIGH' || req.riskLevel === 'CRITICAL';\n const args = req.argsPreview\n ? Object.entries(req.argsPreview).map(([k, v]) => `${k}=${String(v)}`).join(' · ')\n : '';\n if (rejectMode) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" borderDimColor paddingX={1}>\n <Text>告诉它怎么改(直接回车=仅取消):</Text>\n <Box>\n <Text color=\"cyan\">{'› '}</Text>\n <TextInput value={freeText} onChange={setFreeText} onSubmit={(v) => respond({ kind: 'reject', feedback: v })} />\n </Box>\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={hi ? 'yellow' : 'gray'} borderDimColor={!hi} paddingX={1}>\n <Text bold color={hi ? 'yellow' : undefined}>{hi ? '⚠ ' : '⏺ '}{req.toolName ? `${req.toolName} · ` : ''}{req.summary}</Text>\n {origin ? <Text dimColor>{origin}</Text> : null}\n {args ? <Text color=\"gray\">{args}</Text> : null}\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>是否执行?{hi ? '(高风险)' : ''}</Text>\n <SelectInput\n items={[\n { label: '1. 是,执行', value: 'yes' },\n { label: '2. 是,本会话内同类不再询问', value: 'yes-all' },\n { label: '3. 否,并告诉它怎么改', value: 'no' },\n ]}\n onSelect={(item) => {\n if (item.value === 'yes') respond({ kind: 'confirm' });\n else if (item.value === 'yes-all') respond({ kind: 'confirm', remember: true });\n else setRejectMode(true);\n }}\n />\n <Text dimColor>1/2/3 直选 · esc 取消</Text>\n </Box>\n </Box>\n );\n }\n\n // ASK\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" borderDimColor paddingX={1}>\n <Text color=\"cyan\">? {req.question ?? req.summary}</Text>\n {origin ? <Text dimColor>{origin}</Text> : null}\n {!askFreeText ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <SelectInput\n items={[\n ...choices.map((c, i) => ({ label: `${i + 1}. ${c.label}`, value: c.value })),\n { label: `${choices.length + 1}. 自己输入…`, value: '__free__' },\n ]}\n onSelect={(item) => {\n if (item.value === '__free__') { setFreeMode(true); return; }\n const idx = Number(item.value);\n respond({ kind: 'answer', text: choices[idx]?.label, choiceIndex: idx });\n }}\n />\n <Text dimColor>1-{choices.length + 1} 直选</Text>\n </Box>\n ) : (\n <Box>\n <Text color=\"cyan\">{'› '}</Text>\n <TextInput value={freeText} onChange={setFreeText} onSubmit={(v) => respond({ kind: 'answer', text: v.trim() })} />\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { HcmClient, WsClient, DEFAULT_AGENT_ID } from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\nimport type { ChatArgs } from '../commands/chat';\nimport { ReplApp } from './App';\n\n/**\n * ADR-129 · Ink REPL 入口:会话装配(auth/WS/conversation 续接)后渲染 ReplApp。\n * 取代手搓 readline 版 chat-repl.ts(delete-on-supersede)。\n */\nexport async function runInkRepl(args: ChatArgs): Promise<void> {\n // Composer 快捷键(对标主流聊天输入区):开 xterm modifyOtherKeys=1,\n // 支持的终端(Ghostty/iTerm2/WezTerm/xterm.js)会把 Shift/Ctrl/Option+Enter 编码为\n // 独立序列;MultilineInput 据此实现 Enter 发送、Shift/Ctrl/Option+Enter 换行。mode 1 只影响\n // 本无编码的修饰组合,Esc / Ctrl+C / 裸 Enter 编码不变(裸 Enter 即发送)。任何退出路径都还原。\n if (process.stdout.isTTY) {\n process.stdout.write('\\x1b[>4;1m');\n process.on('exit', () => process.stdout.write('\\x1b[>4;0m'));\n }\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const ws = new WsClient({\n endpoint: ctx.endpoint.replace(/^http/, 'ws') + '/ws/conversation',\n getAccessToken: () => client.getAccessToken(),\n onTokenExpiring: () => client.handleRefresh(),\n });\n await ws.connect();\n\n // 会话续接:显式 --resume / legacy --conversation > 首条消息时新建。\n let initialConversationId: string | undefined;\n if (args.resume && args.conversation) {\n throw new Error('--resume 和 --conversation 不能同时使用;新命令请用 --resume <conversationId>');\n }\n if (args.resume === 'NEW') {\n throw new Error('--resume 需要既存 conversationId;新会话请直接省略 --resume');\n }\n if (args.resume) {\n initialConversationId = args.resume;\n } else if (args.conversation && args.conversation !== 'NEW') {\n initialConversationId = args.conversation;\n }\n\n const { waitUntilExit } = render(\n React.createElement(ReplApp, {\n ws,\n client,\n agentId: args.agent ?? DEFAULT_AGENT_ID,\n env: ctx.env,\n identity: ctx.identity,\n tenantId: String(ctx.tenantId),\n initialConversationId,\n autoApprove: !!args.autoApprove,\n }),\n );\n await waitUntilExit();\n await ws.close();\n process.exit(0);\n } catch (e) {\n exitWithError(e);\n }\n}\n","/**\n * control-prompt — 把 InteractionRequest 解析成一个决策(confirm/reject/answer/error)。\n * 纯决策逻辑:readLine 注入便于测;TTY 检测 + auto-approve fallback。\n * 实际从 process.stdin 读取的 readline 工具在 commands 层(Task 9)注入,本模块不碰 stdin。\n */\nimport type { InteractionRequest } from '@hcmai/sdk';\n\nexport type InteractionDecision =\n | { decision: 'confirm' }\n | { decision: 'reject'; reason?: string }\n | { decision: 'answer'; answer: string; choiceIndex?: number }\n | { decision: 'error'; reason: string };\n\nexport interface ResolveOpts {\n isTty: boolean;\n autoApprove: boolean;\n /** --on-confirm 解析结果;优先级最高(> autoApprove > TTY readLine > 非 TTY 默认 reject)。 */\n onConfirm?: { decision: 'approve' } | { decision: 'reject'; reason?: string };\n /** --on-ask 应答文本;命中 choices 精确文本时回填 choiceIndex。 */\n onAsk?: string;\n readLine: (prompt?: string) => Promise<string>;\n}\n\nexport async function resolveInteraction(\n req: InteractionRequest,\n opts: ResolveOpts,\n): Promise<InteractionDecision> {\n if (req.kind === 'CONFIRM') {\n if (opts.onConfirm) {\n return opts.onConfirm.decision === 'approve'\n ? { decision: 'confirm' }\n : { decision: 'reject', reason: opts.onConfirm.reason };\n }\n if (opts.autoApprove) return { decision: 'confirm' };\n if (!opts.isTty) return { decision: 'reject', reason: 'non-interactive' };\n const ans = (await opts.readLine(' › ')).trim();\n if (ans === '1') return { decision: 'confirm' };\n return { decision: 'reject', reason: ans === '2' ? undefined : `unrecognized:${ans}` };\n }\n // ASK\n if (opts.onAsk !== undefined) {\n const idx = req.choices?.indexOf(opts.onAsk) ?? -1;\n return idx >= 0\n ? { decision: 'answer', answer: opts.onAsk, choiceIndex: idx }\n : { decision: 'answer', answer: opts.onAsk };\n }\n if (!opts.isTty) return { decision: 'error', reason: 'ASK requires interactive TTY (use --on-ask)' };\n const ans = (await opts.readLine(' › ')).trim();\n if (req.choices?.length) {\n const idx = Number(ans) - 1;\n const choice = Number.isInteger(idx) ? req.choices[idx] : undefined;\n if (choice !== undefined) {\n return { decision: 'answer', answer: choice, choiceIndex: idx };\n }\n return { decision: 'answer', answer: ans }; // 非合法编号 → 当自由文本\n }\n return { decision: 'answer', answer: ans };\n}\n","import * as readline from 'node:readline';\n\n/**\n * 从 stdin 读一行——控制通道 confirm/ask 内联交互用(resolveInteraction 的 readLine 注入实现)。\n * 仅在 TTY 交互场景调用;非 TTY 的 fallback 由 resolveInteraction 决策(不会走到这里)。\n */\nexport function readLineFromStdin(prompt = ''): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n","import { Command } from 'commander';\nimport { migrateLegacyProfiles } from '@hcmai/sdk';\nimport { CLI_VERSION } from './package-version';\nimport { loginCommand, logoutCommand } from './commands/login';\nimport {\n configListDeprecated,\n configShowDeprecated,\n configSetProfileDeprecated,\n configDeleteDeprecated,\n configSet,\n configGet,\n} from './commands/config';\nimport { queryCommand } from './commands/query';\nimport { actionCommand } from './commands/action';\nimport { createCommand } from './commands/create';\nimport { updateCommand } from './commands/update';\nimport {\n settingGetCommand,\n settingSetCommand,\n settingResetCommand,\n} from './commands/setting';\nimport { versionCommand } from './commands/version';\nimport { deleteCommand } from './commands/delete';\nimport { importCommand } from './commands/import';\nimport { describeCommand } from './commands/describe';\nimport { chatCommand } from './commands/chat';\nimport { downloadCommand } from './commands/download';\nimport { traceCommand } from './commands/trace';\nimport { cacheStatsCommand, cacheClearCommand, cacheClearMetaCommand } from './commands/cache';\nimport { uploadCommand } from './commands/upload';\nimport {\n skillsListCommand,\n skillsShowCommand,\n skillsInstallCommand,\n skillsSyncCommand,\n skillsUpdateCommand,\n} from './commands/skills';\nimport { tenantBootstrapCommand } from './commands/tenant';\nimport {\n metaListCommand,\n metaGetCommand,\n metaSetCommand,\n metaDeleteCommand,\n} from './commands/meta';\nimport {\n removedMiniCommand,\n workspaceAddMiniCommand,\n workspaceActiveCommand,\n workspaceBindCommand,\n workspaceCreateCommand,\n workspaceListCommand,\n workspacePreviewCommand,\n workspacePullCommand,\n workspacePushCommand,\n workspaceStatusCommand,\n workspaceValidateCommand,\n workspaceVerifyCommand,\n} from './commands/workspace';\nimport {\n envList,\n envCurrent,\n envAdd,\n envUse,\n envRemove,\n envShow,\n envEdit,\n} from './commands/env';\nimport { identityList, identityUse, identityRemove } from './commands/identity';\nimport { deliveryAssessCommand } from './commands/delivery-action-policy';\nimport { deliveryDoctorCommand } from './commands/delivery-doctor';\nimport { deliveryReconCommand, deliveryReconRoundCommand } from './commands/delivery-recon';\nimport type { OutputFormat } from '@hcmai/sdk';\nimport { skillsManifestCommand } from './commands/skills-manifest';\nimport { deliveryExecuteCommand, deliveryPrepareCommand } from './commands/delivery-execution';\nimport { userResetPasswordCommand } from './commands/user';\nimport { needsLegacyProfileMigration } from './startup';\n\nconst program = new Command();\nconst exitOnBrokenPipe = (err: NodeJS.ErrnoException): void => {\n if (err.code === 'EPIPE') process.exit(0);\n throw err;\n};\n\nprocess.stdout.on('error', exitOnBrokenPipe);\nprocess.stderr.on('error', exitOnBrokenPipe);\n\nprogram\n .name('hcm')\n .description('HCM 命令行工具 — 操作 HCM API、与 Moirai 数字员工对话、开发租户开发空间')\n .version(CLI_VERSION);\n\nprogram\n .command('login')\n .description('登录 HCM(配对码 / 用户名密码 / client_credentials / PAT 四种方式)')\n .argument('[endpoint]', '从系统页面「命令行工具」复制来的地址(配对码方式)')\n .option('--code <code>', '配对码,在系统页面用户菜单 →「命令行工具」生成')\n .option('--env <name>', '环境名(默认 activeEnv)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--name <id-name>', '自定义 identity 名(默认按 scheme 推断)')\n .option('--no-activate', 'login 完不切到该环境也不设为 default identity')\n .option('--endpoint <url>', 'HCM 后端地址,例如 http://localhost:8080')\n .option('--username <user>', '用户名(密码登录模式)')\n .option('--password <pwd>', '密码(密码登录模式)')\n .option('--client-id <id>', 'OAuth client_id(client_credentials 模式)')\n .option('--client-secret <secret>', 'OAuth client_secret(client_credentials 模式)')\n .option('--pat <token>', 'PAT 个人访问令牌(注意:会泄漏到 ps/history,建议改用 --pat-stdin)')\n .option('--pat-stdin', '从标准输入读取 PAT(推荐)')\n .option('--new-password <pwd>', '首登强制改密时的新口令(会泄漏到 history/ps,建议 --new-password-stdin)')\n .option('--new-password-stdin', '首登强制改密时从标准输入读新口令(非交互场景)')\n .option('--tenant <tenantId>', '租户 ID(默认 1)')\n .action((endpoint, opts) => loginCommand({ ...opts, endpointArg: endpoint }));\n\nprogram\n .command('logout')\n .description('登出 HCM(清除 identity 的 keychain token)')\n .option('--identity <name>', '指定 identity;默认清当前 env 的 default identity')\n .option('--env <name>', '指定 env(影响 default identity 解析)')\n .action((opts) => logoutCommand(opts));\n\nconst config = program\n .command('config')\n .description('管理全局 defaults(env/identity 用 `hcm env` / `hcm identity`)');\nconfig\n .command('list')\n .description('[deprecated] 用 `hcm env list`')\n .action(() => configListDeprecated());\nconfig\n .command('show')\n .description('[deprecated] 用 `hcm env current`')\n .action(() => configShowDeprecated());\nconfig\n .command('set-profile <name>')\n .description('[deprecated] 用 `hcm env use`')\n .action((n) => configSetProfileDeprecated(n));\nconfig\n .command('delete <name>')\n .description('[deprecated] 用 `hcm env remove --force`')\n .action((n) => configDeleteDeprecated(n));\nconfig\n .command('set <key> <value>')\n .description('设置全局 defaults,例如 `defaults.output json`')\n .action((k, v) => configSet(k, v));\nconfig\n .command('get <key>')\n .description('读取全局 defaults')\n .action((k) => configGet(k));\n\nconst env = program.command('env').description('管理 HCM 环境(多后端连接配置)');\nenv\n .command('list')\n .description('列出全部 env')\n .action(() => envList());\nenv\n .command('current')\n .description('显示当前激活的 env')\n .action(() => envCurrent());\nenv\n .command('add <name>')\n .description('新增 env')\n .option('--endpoint <url>', 'HCM 后端 URL(必填)')\n .option('--tenant <id>', '默认 tenant id', '1')\n .option('--frontend <url>', '对应前端 URL,例如 http://127.0.0.1:5176')\n .option('--force', '覆盖已存在的同名 env')\n .action((name, opts) => envAdd(name, opts));\nenv\n .command('use <name>')\n .description('切到指定 env')\n .option('--no-ping', '跳过 endpoint 健康检查')\n .action((name, opts) => envUse(name, opts));\nenv\n .command('remove <name>')\n .description('删除 env(级联清除该 env 的全部 identity 和 token)')\n .option('--force', '跳过确认提示')\n .action((name, opts) => envRemove(name, opts));\nenv\n .command('show [name]')\n .description('显示 env 详情(含该 env 下的 identity 列表)')\n .action((name) => envShow({ name }));\nenv\n .command('edit <field> <value>')\n .description('编辑 env 字段(endpoint / frontend / tenantId / defaultIdentity / defaultAgent)')\n .option('--env <name>', '目标 env 名(默认当前 activeEnv)')\n .action((field, value, opts) => envEdit(field, value, opts));\n\nconst identity = program.command('identity').description('管理 HCM 身份凭据(env 下的 identity)');\nidentity\n .command('list')\n .description('列出 identity(默认列当前 env,--env all 列全部)')\n .option('--env <name>', '过滤 env;传 \"all\" 列全部', undefined)\n .action((opts) => identityList(opts));\nidentity\n .command('use <name>')\n .description('把 identity 设为其 env 的 default identity')\n .action((name) => identityUse(name));\nidentity\n .command('remove <name>')\n .description('删除 identity(清 token + 若是 env default 则清空)')\n .action((name) => identityRemove(name));\n\nconst user = program.command('user').description('管理租户用户的专用凭据流程');\nuser\n .command('reset-password')\n .description('由 admin.system 安全重置用户密码,并使既有会话失效')\n .option('--id <uuid>', '目标用户 ID(与 --username 二选一)')\n .option('--username <user>', '目标用户名(与 --id 二选一)')\n .option('--password-stdin', '从标准输入读取新密码(Agent/受控交付必须使用)')\n .option('--no-force-change', '下次登录不强制改密(仅限已批准的隔离测试环境)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(必须具备 admin.system)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => userResetPasswordCommand(opts));\n\nconst delivery = program\n .command('delivery')\n .description('顾问交付:现场探活、风险评估与一次性受控执行合同');\ndelivery\n .command('assess')\n .description('评估一次 HCM CLI argv;Action 风控声明读取自目标 Core,用 -- 分隔被评估命令')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .allowUnknownOption(true)\n .argument('<command...>', '被评估的 HCM 子命令与参数,不包含 hcm 本身')\n .action((command, opts) => deliveryAssessCommand(command, opts));\ndelivery\n .command('doctor')\n .description('四条锚点探活:连通 / 我是谁 / configAdmin / 站在哪一层')\n .option('--env <name>', '目标环境别名')\n .option('--as <identity>', '临时换身份')\n .option('--capabilities <s>', '爬取时声明的 capability 串(会随四元组留档)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => deliveryDoctorCommand(opts));\nconst recon = delivery\n .command('recon')\n .description('爬一份可带走的基线:模型 / 字段 / 只读闸 / 依赖图 / 码表 / 可写性画像')\n .option('--env <name>', '目标环境别名')\n .option('--as <identity>', '临时换身份')\n .option('--out <dir>', '产物根目录(产物落在 <out>/recon/<租户段>/<来源段>)', '.')\n .option('--state <s>', '只读闸的 state(产品里 state 不可枚举,闸的覆盖面永远是 state-scoped)')\n .option('--model <key>', '定向重爬:只重爬这一个模型,其余沿用上一轮产物')\n .option('--capabilities <s>', '爬取时声明的 capability 串(会随四元组留档)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => deliveryReconCommand(opts));\nrecon\n .command('round')\n .description('零网络:读一份已落盘的基线,判断它是不是一轮完整跑出来的(complete/mixed/unknown)')\n .option('--dir <dir>', '产物目录(<out>/recon/<租户段>/<来源段>)', '.')\n // 🔴 **这里不声明 `--output`**,理由见 delivery-recon.ts 里那段注释(实测缺陷):\n // commander 会把子命令名之后的 `--output` 判给父命令,子命令再声明一个只会是装饰。\n .action((opts, cmd) =>\n deliveryReconRoundCommand({\n ...opts,\n output: (cmd.parent?.opts() as { output?: OutputFormat } | undefined)?.output,\n }),\n );\ndelivery\n .command('prepare')\n .description('把受支持的 R2 argv 与锁、运行时和变更/回滚说明绑定为短时执行计划')\n .requiredOption('--change-ref <file>', '项目 work/ 或 decisions/ 下的变更说明')\n .requiredOption('--rollback-ref <file>', '项目 work/ 或 decisions/ 下的回滚说明')\n .requiredOption('--evidence-dir <dir>', '项目 evidence/ 下的收据目录')\n .option('--project <dir>', 'HCM 顾问项目根目录', '.')\n .option('--ttl-seconds <n>', '有效期秒数(60-3600)', '900')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .allowUnknownOption(true)\n .argument('<command...>', '被绑定的 R2 HCM 子命令与参数,不包含 hcm 本身')\n .action((command, opts) => deliveryPrepareCommand(command, opts));\ndelivery\n .command('execute <planId>')\n .description('逐次批准后消费短时计划,并执行一次与计划完全相同的 R2 argv')\n .option('--project <dir>', 'HCM 顾问项目根目录', '.')\n .option('--output <fmt>', '收据输出格式:table | json | yaml', 'json')\n .allowUnknownOption(true)\n .argument('<command...>', '与 prepare 完全相同的 R2 HCM 子命令与参数')\n .action((planId, command, opts) => deliveryExecuteCommand(planId, command, opts));\n\nprogram\n .command('query <Model>')\n .description('查询 Model 列表数据(通过 ModelQueryDsl JSON 表达过滤/排序/分页)')\n .option(\n '--filter <JSON>',\n '过滤 AST(ModelQueryDsl):叶子 \\'{\"field\":\"status\",\"op\":\"eq\",\"value\":\"ACTIVE\"}\\','\n + '多条件用 \\'{\"and\":[叶子,…]}\\'。⚠️ 不接受 {\"字段\":\"值\"} 简写,schema 层会拒',\n )\n .option('--sort <JSON>', '排序条件 JSON,例如 \\'[{\"field\":\"hireDate\",\"direction\":\"desc\"}]\\'')\n .option('--fields <list>', '返回字段列表(逗号分隔),例如 name,code,email')\n .option('--keyword <text>', '全文检索关键字')\n .option('--limit <n>', '每页大小', '20')\n .option('--offset <n>', '偏移量(按 limit 自动换算 page)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((m, opts) => queryCommand(m, opts));\n\nprogram\n .command('action <Model.Action>')\n .description('调用 Model 上的 Action(业务方法),例如 Employee.regularize')\n .option('--id <id>', '目标实体 ID(object Action 必填)')\n .option('--ids <csv>', '批量 ID(逗号分隔,bulk Action 用)')\n .option('--method <method>', 'HTTP 方法:GET | POST | PUT | DELETE', 'POST')\n .option('--scope <scope>', '强制 Action scope:class | object(默认:有 --id 为 object,否则 class)')\n .option('--params <JSON>', 'Action 入参 JSON,例如 \\'{\"effectDate\":\"2026-06-01\"}\\'')\n .option('--params-file <path>', '从 UTF-8 JSON 文件读取 Action 入参(与 --params 互斥)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((spec, opts) => actionCommand(spec, opts));\n\nprogram\n .command('create <Model>')\n .description('创建一条 Model 记录(走后端完整校验)')\n .option('--data <JSON>', '记录字段 JSON,例如 \\'{\"code\":\"ORG_SALES\",\"name\":\"销售部\"}\\'')\n .option('--data-file <path>', '从 UTF-8 JSON 文件读取记录字段(与 --data 互斥)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((m, opts) => createCommand(m, opts));\n\nprogram\n .command('delete <Model>')\n .description('删除一条 Model 记录(走后端完整校验;部分 Model 会执行业务撤销)')\n .option('--id <id>', '目标实体 ID(必填)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((m, opts) => deleteCommand(m, opts));\n\nprogram\n .command('import <path>')\n .description('注入 DataPackage YAML 数据集(目录或单文件,走后端完整校验)')\n .option('--dry-run', '只跑客户端静态校验,不落库(见 spec §8 限制)')\n .option('--update-only', '已存在(按 key_field)则 PUT 更新,否则 create')\n .option('--on-error <mode>', 'stop | continue(默认 continue)', 'continue')\n .option('--report <path>', '写 JSON 注入报告(逐行结果 + key→id 映射)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((p, opts) => importCommand(p, opts));\n\nprogram\n .command('describe <Model>')\n .description('查看 Model 元数据(字段、关系、Action 列表)')\n .option('-v, --verbose', '显示字段描述与 enum 取值')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((m, opts) => describeCommand(m, opts));\n\nprogram\n .command('chat [prompt]')\n .description('与数字员工 Moirai 对话;有 prompt 单发后退出,不带 prompt 进入 REPL')\n .option('--agent <key>', '指定 agent UUID(默认使用 analyst 内置 agent)')\n .option('--resume <id>', '续接指定 conversation;不传则默认开新会话')\n .option('--conversation <id>', '[deprecated] 用 --resume 替代;传 NEW 等价默认新会话')\n .option('--list', '列出最近会话,不进入聊天')\n .option('--events [conversationId]', '只读查看指定 conversation 的 timeline/event 流;也可配 --resume <id>')\n .option('--limit <N>', '配合 --list:显示最近 N 条会话', '10')\n .option('--stream', '流式输出(默认开启,逐 token 打印 + thinking/tools 实时显示)', true)\n .option('--no-stream', '关闭流式,等 LLM 全文返回后一次性显示(CI / 脚本管道场景)')\n .option('--show-tool-calls', '展示工具调用详细参数(默认显示工具名 + 状态,verbose 时显示完整参数)', true)\n .option('--no-show-tool-calls', '完全隐藏工具调用')\n .option('--prompt-file <path>', '从文件读取 prompt 内容')\n .option('--timeout <sec>', '请求超时秒数', '60')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:text | json', 'text')\n .option('--no-markdown', '关闭流式末态 markdown 渲染(CI / pipe 友好)')\n .option('--no-thinking', '关闭 thinking 段显示')\n .option('--verbose-thinking', '展开 thinking 完整内容(默认仅单行总结)')\n .option('--verbose-tools', '展示工具调用完整参数(默认仅工具名 + 状态)')\n .option('--no-spinner', '关闭 spinner(CI 友好)')\n .option('--no-color', '关闭颜色(CI / accessibility)')\n .option('--raw', '逐行打印原始 v4/control envelope(协议示波器,不渲染)')\n .option('--auto-approve', '自动批准高风险 confirm(仍打印审计行;批量 / 非交互场景)')\n .option('--on-confirm <decision>', '非交互 confirm 决策:approve | reject | reject:<reason>(优先于 --auto-approve)')\n .option('--on-ask <answer>', '非交互 ASK 应答文本(命中 choices 时自动回填 choiceIndex)')\n .option(\n '--inject-on <spec>',\n '流中途注入命令(仅 --raw):<eventType>:<action>[:<content>],action ∈ {interrupt, steer}(P0 S-interrupt / S-steer)',\n )\n .option(\n '--regenerate-from <seq>',\n '重新生成(ADR-089):发 response.regenerate 重跑指定 assistant 段;取正整数 seq 或 last-assistant,必须配 --resume <id>',\n )\n .option(\n '--attach <path>',\n '附件:上传本地文件随消息发送(可重复;REPL 内也可用 @路径 内联或 /attach)',\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .action((prompt, opts) => chatCommand(prompt, opts));\n\nprogram\n .command('download <documentId>')\n .description('下载 HCM 文档到本地(会话附件 / 报表产物;默认 ~/Downloads/hcm)')\n .option('-o, --output <path>', '输出文件或目录')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .action((documentId, opts) => downloadCommand(documentId, opts));\n\nconst workspace = program\n .command('workspace')\n .description('开发租户开发空间文件包(mini_apps / menus / metas / scripts)');\nworkspace\n .command('list')\n .description('列出当前用户可访问的租户开发空间')\n .option('--keyword <text>', '按空间 Key / 说明 / Owner 搜索')\n .option('--limit <n>', '返回条数', '50')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceListCommand(opts));\nworkspace\n .command('active')\n .description('查看当前 HCM 开发模式激活空间,并对比本地目录绑定')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceActiveCommand(opts));\nworkspace\n .command('bind <workspaceKey>')\n .description('把当前目录绑定到一个租户开发空间')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--tenant <tenantId>', '租户 ID(默认使用 env 配置)')\n .option('--endpoint <url>', 'HCM 后端地址(默认使用 env 配置)')\n .option('--force', '强制覆盖已有绑定')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((workspaceKey, opts) => workspaceBindCommand(workspaceKey, opts));\nworkspace\n .command('create <workspaceKey>')\n .description('新建租户开发空间,并在本地目录写入 workspace 绑定')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--description <text>', '开发空间说明')\n .option('--activate', '创建后绑定为当前开发空间')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--force', '本地目录已有不同 workspace 绑定时强制覆盖')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((workspaceKey, opts) => workspaceCreateCommand(workspaceKey, opts));\nworkspace\n .command('pull')\n .description('从开发空间拉取文件包到本地;mini_apps 会生成可验证的 artifact 上下文')\n .option('--workspace <key>', '租户开发空间 key;未提供时读取本地绑定')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--force', '强制覆盖已有的本地文件')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspacePullCommand(opts));\n\nconst workspaceAdd = workspace.command('add').description('向已绑定开发空间添加 artifact');\nworkspaceAdd\n .command('mini <appCode>')\n .description('新增轻应用 artifact(写入 mini_apps/<appCode>/)')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--name <name>', '轻应用展示名')\n .option('--template <kind>', '模板:dashboard | multi-page | writable-workbench', 'dashboard')\n .option('--model <Model>', '可写工作台绑定的 Model,例如 OrgUnit')\n .option('--fields <csv|auto>', '可写工作台表单字段列表;传 auto 时根据 Model 元数据推断')\n .option('--defaults <JSON|auto>', '可写工作台创建默认值;传 auto 时根据 Model 元数据推断')\n .option(\n '--surface <surface>',\n '运行形态:embedded(嵌入业务页)| standalone(独立页)',\n 'embedded',\n )\n .option('--scopes <csv>', 'manifest.requiredScopes 列表(逗号分隔;默认随模板选择)')\n .option('--tenant <tenantId>', 'manifest.bundleObjectRef 中绑定的租户 ID')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--force', '强制覆盖已有的本地文件')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((appCode, opts) => workspaceAddMiniCommand(appCode, opts));\nworkspace\n .command('status')\n .description('查看开发空间本地 artifact 与上次 pull/push 的差异')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceStatusCommand(opts));\nworkspace\n .command('validate')\n .description('校验开发空间本地 artifact(push 前必跑)')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceValidateCommand(opts));\nworkspace\n .command('push')\n .description('把本地开发空间 artifact 推送回租户开发空间')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--dry-run', '只计算待执行的操作,不真正写远端文件')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspacePushCommand(opts));\nworkspace\n .command('preview')\n .description('打印开发空间中轻应用 artifact 的预览 URL')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--frontend <url>', '前端地址', 'http://127.0.0.1:5179')\n .option('--surface <surface>', '展示哪种形态:all | bare | standalone | embedded', 'all')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspacePreviewCommand(opts));\nworkspace\n .command('verify')\n .description(\n '一键验收:串联 validate + status + push --dry-run + preview,全程只读不写远端,push 前必跑',\n )\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,dry-run 阶段需要)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--frontend <url>', '前端地址', 'http://127.0.0.1:5179')\n .option('--surface <surface>', '预览形态:all | bare | standalone | embedded', 'all')\n .option('--smoke', '对预览入口与基础资源执行只读 HTTP GET 可达检查')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceVerifyCommand(opts));\n\nprogram\n .command('trace [traceId]')\n .description('查看 trace:不传 traceId 列最近记录,传 traceId 显示人类可读详情')\n .option('--conv <convId>', '查会话的 LLM 逐调用 trace(PG llm_call_trace,ADR-134 D2)')\n .option('--llm-calls', '把位置参当 convId 查 LLM 逐调用(等价 --conv <convId>)')\n .option('--span <N>', '查看第 N 个 span 的详情')\n .option('-n, --limit <N>', '列表模式显示条数', '10')\n .option('--events', '按事件时间线展示 spans/logs/LLM 内容摘要')\n .option('--raw', '输出原始 trace 聚合 JSON(协议/P0 调试用)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '兼容输出格式:table | json | yaml;调试原文优先用 --raw', 'table')\n .action((traceId, opts) => traceCommand(traceId ?? null, opts));\n\nprogram\n .command('mini')\n .description('已移除:请改用 hcm workspace')\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .argument('[args...]')\n .action(() => removedMiniCommand());\n\n// ─── cache:两级缓存运维(改 meta / 改数据后必用) ───────────────────────\nconst cache = program.command('cache').description('模型缓存运维(Caffeine 本地 + Redis 远程,须走 API)');\ncache\n .command('stats <Model>')\n .description('查看模型缓存统计')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => cacheStatsCommand(model, opts));\ncache\n .command('clear <Model>')\n .description('清模型实体缓存(幂等,不破坏数据)')\n .option('--id <id>', '只清单条(默认清全部)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => cacheClearCommand(model, opts));\ncache\n .command('clear-meta <Model>')\n .description('清元数据缓存(Code 级 YAML + Action 定义)——改 meta YAML 后必跑')\n .option('--type <type>', '元数据类型:list | info | view | filter | page…(默认全清)')\n .option('--state <state>', '状态变体(如 self),配合 --type')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => cacheClearMetaCommand(model, opts));\n\n// ─── upload:与 download 成对,报表/套打/导入模板的入口 ──────────────────\nprogram\n .command('upload <file>')\n .description('上传本地文件到 HCM 文档服务,返回 documentId')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .option(\n '--category <name>',\n '存储分类(须是目标环境里真实存在的分类,如 flex-report / template / attachment)',\n 'attachment',\n )\n .action((file, opts) => uploadCommand(file, opts));\n\n// ─── tenant:交付旅程第一步,唯一「无租户无用户」时可用的写入口 ──────────\nconst tenant = program.command('tenant').description('租户开通与生命周期');\ntenant\n .command('bootstrap')\n .description('开通新租户(建租户 + admin 用户 + 结构 reconcile)——不可逆,默认过确认闸')\n .requiredOption('--tenant-id <id>', '租户 ID')\n .requiredOption('--admin-username <user>', '管理员用户名')\n .option('--admin-password <pwd>', '管理员密码(会泄漏到 history/ps,建议 --admin-password-stdin)')\n .option('--admin-password-stdin', '从标准输入读管理员密码(推荐)')\n .option('--tenant-name <name>', '租户名称(默认取 tenantId)')\n .option('--bootstrap-key <key>', 'bootstrap 密钥(建议用 HCM_BOOTSTRAP_KEY 环境变量)')\n .option('--bootstrap-key-stdin', '从标准输入读 bootstrap 密钥')\n .option('--endpoint <url>', '后端地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('-y, --yes', '跳过确认(CI 用)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => tenantBootstrapCommand(opts));\n\n// ─── meta:租户元数据读写(配置面的主战场) ─────────────────────────────\nconst meta = program.command('meta').description('租户元数据读写(页面/字段/列表配置)');\nmeta\n .command('list')\n .description('列出租户元数据文件')\n .option('--keyword <kw>', '搜索关键词')\n .option('--type <type>', '类型:yml | properties | all', 'all')\n .option('--page <n>', '页码(从 0 开始)')\n .option('--page-size <n>', '每页条数')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => metaListCommand(opts));\nmeta\n .command('get <path>')\n .description('打印 meta 原文(如 metas/Employee.list.yml)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .action((p, opts) => metaGetCommand(p, opts));\nmeta\n .command('set <path>')\n .description('写入 meta 原文;写完须 hcm cache clear-meta <Model> 才生效')\n .requiredOption('--file <file>', '从文件读取原文(- 表示 stdin)')\n .option('--dry-run', '只显示将写入的内容,不实际写入')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((p, opts) => metaSetCommand(p, opts));\nmeta\n .command('delete <path>')\n .description('删除 meta(不可逆,默认过确认闸)')\n .option('-y, --yes', '跳过确认')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((p, opts) => metaDeleteCommand(p, opts));\n\n// ─── skills:交付技能(睿戎 Chiron 技能库 + CLI 自带;免认证,空环境即可用) ───\nconst skills = program\n .command('skills')\n .description('交付技能:睿戎 Chiron 技能库 + CLI 自带技能(免认证,无需先 login)');\nskills\n .command('list [keyword]')\n .description('列出目标环境这一版的交付技能;--installed 改看本地装了哪些(不连网)')\n .option('--installed', '只看本地已装的技能(读 .hcm-skills.json,不连网)')\n .option('--target <agent>', '配合 --installed:claude | codex | auto', 'auto')\n .option('--global', '配合 --installed:看用户级目录')\n .option('--dir <path>', '配合 --installed:看指定目录')\n .option('--category <key>', '只看某个分类')\n .option('--stage <key>', '只看某个交付阶段:handover | baseline | configure | migrate | integrate | golive | operate')\n .option('--by-stage', '按交付生命周期分组展示(默认按功能分类)')\n .option('--source <kind>', '这一趟看哪些来源:cli(只看自带,不连网)| chiron | all', 'all')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((kw, opts) => skillsListCommand(kw, opts));\nskills\n .command('manifest')\n .description('打印本 CLI 的命令面与自带技能清单(不连网,供守卫与外部工具比对)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => skillsManifestCommand(program, opts));\nskills\n .command('show <id>')\n .description('打印技能原文(管道友好);自带技能直接读本地,不连网')\n .option('--source <kind>', '这一趟看哪些来源:cli(只看自带,不连网)| chiron | all', 'all')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .action((id, opts) => skillsShowCommand(id, opts));\nskills\n .command('install [id]')\n .description('连同 requires 前置技能与参考文件装到 agent 技能目录;--all 装整个技能库')\n .option('--all', '装整个技能库,并记为「跟随全集」(往后 update 会自动补上产品新增的技能)')\n .option('--target <agent>', '装给哪个 agent:claude(.claude/skills/)| codex(hcm-skills/ + AGENTS.md)| auto', 'auto')\n .option('--global', '装到用户级目录而非当前项目')\n .option('--dir <path>', '装到指定目录')\n .option('--from <dir>', '从本地目录装(现场改过的版本),不走网络')\n .option('--source <kind>', '这一趟看哪些来源:cli(只看自带,不连网)| chiron | all', 'all')\n .option('--force', '覆盖已存在的同名技能')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((id: string | undefined, opts) => skillsInstallCommand(id, opts));\nskills\n .command('sync <id>')\n .description('从目标实例同步 Skill 闭包到 WorkBuddy 项目并写 chiron.lock')\n .requiredOption('--target <agent>', '目标 Agent 宿主;当前支持 workbuddy')\n .requiredOption('--project <path>', 'WorkBuddy 项目根目录')\n .option('--cli <path>', '显式指定要锁定到项目的 HCM CLI;默认使用当前这份 CLI')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((id, opts) => skillsSyncCommand(id, opts));\nskills\n .command('update')\n .description('把装过的技能升到目标环境这一版(产品升级后跑它)')\n .option('--all', '连产品新增的技能一起装上,并记为「跟随全集」')\n .option('--check', '只看会变什么,不写盘')\n .option('--target <agent>', 'claude | codex | auto(默认按已安装目录探)', 'auto')\n .option('--global', '升级用户级目录里的技能')\n .option('--dir <path>', '升级指定目录里的技能')\n .option('--force', '连本地改过的技能一起覆盖成产品这一版')\n .option('--source <kind>', '这一趟看哪些来源:cli(只看自带,不连网)| chiron | all', 'all')\n .option('--endpoint <url>', '技能库地址(默认取安装时记录的地址)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => skillsUpdateCommand(opts));\n\nprogram\n .command('update <Model>')\n .description('更新一条 Model 记录(走后端完整校验)')\n .requiredOption('--id <id>', '记录 ID')\n .option('--data <JSON>', '要更新的字段 JSON,例如 \\'{\"name\":\"新名称\"}\\'')\n .option('--data-file <path>', '从 UTF-8 JSON 文件读取更新字段(与 --data 互斥)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => updateCommand(model, opts));\n\nprogram\n .command('version')\n .description('查后端版本(commit / tag / 构建时间)——免认证,无需先 login')\n .option('--endpoint <url>', '后端地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => versionCommand(opts));\n\n// ─── setting:租户系统参数(受控 PATCH 路径,不是标准 Model 的 PUT)───────\nconst setting = program\n .command('setting')\n .description('租户系统参数(登录策略 / 密码策略 / 功能开关 / 集成参数)');\nsetting\n .command('get <domain>')\n .description('读某域参数(定义 + 租户覆盖值合并,缺失回落默认值)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((d, opts) => settingGetCommand(d, opts));\nsetting\n .command('set <domain>')\n .description('改参数,可重复 --set;走受控校验路径而非标准 CRUD')\n .option('--set <assignment...>', 'namespace.key=value,例如 security.password.passwordPolicy=complex')\n .option('--dry-run', '只显示将写入什么,不实际写入')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((d, opts) => settingSetCommand(d, opts));\nsetting\n .command('reset <domain> <namespace> <key>')\n .description('清除租户覆盖,回落到默认值')\n .option('--revision <n>', '乐观锁版本号')\n .option('-y, --yes', '跳过确认')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((d, ns, k, opts) => settingResetCommand(d, ns, k, opts));\n\nasync function main(): Promise<void> {\n // 帮助/版本与 delivery 不读取 env/identity;execute 的真实子命令会在独立进程里正常迁移。\n if (needsLegacyProfileMigration(process.argv)) {\n try {\n await migrateLegacyProfiles();\n } catch (e) {\n // Migration should never fully throw (it catches per-profile failures),\n // but guard the top-level just in case to avoid breaking unrelated commands.\n process.stderr.write(\n `[hcm] event=migration_error reason=${JSON.stringify(String((e as Error).message))}\\n`,\n );\n }\n }\n await program.parseAsync(process.argv);\n}\n\n/**\n * 导出 commander 注册表,供守卫读取**真实命令面**(刀 5.5 spec §8 / §12.1 的 C4)。\n * 🔴 抄一份命令表来比对是没有意义的——那正是 ADR-319 §7.1 G8 缺口的成因。\n */\nexport { program };\n\n// 🔴 极性刻意如此:**默认照常执行**,只有显式设了 HCM_CLI_IMPORT_ONLY=1 才跳过。\n// 反过来写(默认不执行、由入口显式调用)会让「变量没设对」直接表现为 CLI 什么都不做,\n// 而这个开关只有测试会用——生产路径上它恒不存在,行为与本刀之前逐字相同。\nif (process.env.HCM_CLI_IMPORT_ONLY !== '1') {\n main().catch((e: unknown) => {\n process.stderr.write(`[hcm] fatal: ${String((e as Error).message)}\\n`);\n process.exit(1);\n });\n}\n","import { readFileSync } from 'node:fs';\n\ninterface PackageManifest {\n version: string;\n}\n\nconst manifest = JSON.parse(\n readFileSync(new URL('../package.json', import.meta.url), 'utf8'),\n) as PackageManifest;\n\nexport const CLI_VERSION = manifest.version;\n","import axios from 'axios';\nimport {\n loginClientCredentials,\n loginPairing,\n loginPat,\n loginPassword,\n inferEnvName,\n toOrigin,\n changePassword,\n detectPasswordChangeChallenge,\n loadEnv,\n saveEnv,\n saveIdentity,\n loadIdentity,\n loadGlobalConfig,\n saveGlobalConfig,\n TokenStore,\n isServerSlidingSession,\n CliError,\n CliErrorCode,\n describePrincipal,\n type IdentityMeta,\n type Principal,\n} from '@hcmai/sdk';\nimport { promptText, promptSecret, readStdin } from '../utils/prompt';\nimport { exitOk, exitWithError } from '../utils/exit';\n\nexport interface LoginArgs {\n env?: string;\n profile?: string; // [deprecated] transpile to --env with stderr warning\n name?: string; // custom identity name (overrides auto inference)\n /**\n * Commander quirk: `--no-activate` sets `opts.activate = false` (not\n * `opts.noActivate = true`). Default (no flag) → undefined → treat as true.\n * Use `args.activate !== false` to mean \"should activate\".\n */\n activate?: boolean;\n endpoint?: string;\n username?: string;\n password?: string;\n clientId?: string;\n clientSecret?: string;\n pat?: string;\n patStdin?: boolean;\n /** 首登强制改密时的新口令(非交互场景)。见 loginPasswordWithFirstLoginChange。 */\n newPassword?: string;\n newPasswordStdin?: boolean;\n tenant?: string;\n /** 配对码(ADR-308 第四轨)。与位置参数 <endpoint> 搭配使用。 */\n code?: string;\n /** 位置参数:从页面复制来的地址,可带路径与查询串。 */\n endpointArg?: string;\n}\n\n/**\n * 密码登录,并接管 fresh tenant 的**首登强制改密**。\n *\n * `hcm tenant bootstrap` 建出来的租户,admin 用初始口令登录会被后端拒(403\n * `AUTH_PASSWORD_CHANGE_REQUIRED`)并返回一个 300 秒有效的 changePasswordToken——\n * 不改密就拿不到正式 token,新租户等于登不进去。这是交付第一步上的硬阻塞,\n * 所以由 login 自己走完,而不是让顾问去拼两条 curl。\n *\n * 非该挑战的失败(口令错、账号锁定 423、网络错)原样抛出,不做任何吞咽。\n */\nasync function loginPasswordWithFirstLoginChange(\n input: Parameters<typeof loginPassword>[0],\n args: LoginArgs,\n): Promise<Awaited<ReturnType<typeof loginPassword>>> {\n try {\n return await loginPassword(input);\n } catch (e) {\n const challenge = detectPasswordChangeChallenge(e);\n if (!challenge) throw e;\n\n process.stderr.write(\n `[hcm] 该账号首次登录必须改密(临时凭据 ${challenge.expiresInSeconds ?? 300}s 内有效)\\n`,\n );\n let next: string;\n if (args.newPasswordStdin) next = (await readStdin()).trim();\n else if (args.newPassword) {\n process.stderr.write(\n '[hcm] WARNING: --new-password <p> 会泄漏到 shell history / ps aux。推荐 --new-password-stdin。\\n',\n );\n next = args.newPassword;\n } else {\n next = await promptSecret('设置新密码: ');\n const again = await promptSecret('再输一次: ');\n if (next !== again) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '两次输入的新密码不一致',\n });\n }\n }\n if (!next) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '新密码不能为空' });\n }\n\n await changePassword({\n endpoint: input.endpoint,\n changePasswordToken: challenge.changePasswordToken,\n oldPassword: input.password,\n newPassword: next,\n httpClient: input.httpClient,\n });\n process.stderr.write('[hcm] 密码已更新,正在用新密码登录\\n');\n return loginPassword({ ...input, password: next });\n }\n}\n\nfunction inferIdentityName(\n scheme: 'password' | 'client_credentials' | 'pat' | 'pairing',\n env: string,\n extra: { username?: string; clientId?: string },\n): string {\n if (scheme === 'password' && extra.username) return `${extra.username}@${env}`;\n if (scheme === 'client_credentials' && extra.clientId) {\n return `${extra.clientId.slice(0, 6)}@${env}`;\n }\n if (scheme === 'pairing' && extra.username) return `${extra.username}@${env}`;\n if (scheme === 'pat') {\n const name = `pat-${Math.random().toString(36).slice(2, 6)}@${env}`;\n process.stderr.write(\n `[hcm] event=pat_identity_auto_named name=${name} hint=\"pass --name <id> for a stable identity name across re-logins\"\\n`,\n );\n return name;\n }\n return `default@${env}`;\n}\n\n/**\n * Migrate token + meta from a profile-scoped TokenStore (legacy path used by\n * @hcmai/sdk loginPassword/Pat/ClientCredentials helpers) into an\n * identity-scoped TokenStore. Once @hcmai/sdk helpers accept a TokenStore arg\n * (Phase 2 follow-up), this shim can be removed.\n */\nasync function migrateProfileTokenToIdentity(\n envName: string,\n identityName: string,\n): Promise<void> {\n const oldStore = new TokenStore(envName);\n const oldMeta = await oldStore.readMeta();\n if (!oldMeta) throw new Error('login helper did not write token meta');\n\n const rawAccess = await oldStore.getAccessToken();\n const rawRefresh = await oldStore.getRefreshToken();\n\n const newStore = TokenStore.forIdentity(identityName);\n // Seed meta first so subsequent setAccessToken/setRefreshToken can update\n // the accessTokenRef/refreshTokenRef in place via writeMeta.\n await newStore.writeMeta(oldMeta);\n try {\n if (rawAccess) {\n const ref = await newStore.setAccessToken(rawAccess);\n const cur = (await newStore.readMeta()) ?? oldMeta;\n cur.accessTokenRef = ref;\n await newStore.writeMeta(cur);\n }\n if (rawRefresh) {\n const ref = await newStore.setRefreshToken(rawRefresh);\n const cur = (await newStore.readMeta()) ?? oldMeta;\n cur.refreshTokenRef = ref;\n await newStore.writeMeta(cur);\n }\n // Wipe legacy keychain + credentials.json so the profile-scoped path is\n // no longer authoritative for this token.\n await oldStore.clear();\n } catch (err) {\n // Partial migration: identity meta exists but token may not have made it\n // to identity-scoped keychain (or legacy path may still linger). Surface a\n // recovery hint so user knows to re-run login.\n process.stderr.write(\n `[hcm] event=migration_partial_failure direction=profile-to-identity identity=${identityName} reason=${JSON.stringify(String((err as Error).message))} hint=\"re-run hcm login --env ${envName}\"\\n`,\n );\n throw err;\n }\n}\n\nexport async function loginCommand(args: LoginArgs): Promise<void> {\n // deprecated --profile transpile\n if (args.profile && args.env) {\n process.stderr.write(\n '[hcm] event=deprecated_flag_ignored flag=--profile reason=\"--env also passed; --env wins\"\\n',\n );\n } else if (args.profile && !args.env) {\n process.stderr.write(\n '[hcm] event=deprecated_flag flag=--profile replacement=--env\\n',\n );\n args.env = args.profile;\n }\n\n const g = await loadGlobalConfig();\n // 🔴 配对轨的 env 名从**粘贴进来的地址**推,而不是 activeEnv:这条轨存在的全部理由\n // 就是「使用者不知道自己该用哪个 env / endpoint / 租户」,落到 activeEnv 等于又把那个\n // 前提搬了回来——而且会把新环境的凭据默默写进旧环境。\n const pairingOrigin = args.code ? toOrigin(args.endpointArg ?? args.endpoint ?? '') : null;\n const envName = args.env ?? (pairingOrigin ? inferEnvName(pairingOrigin) : g.activeEnv);\n\n try {\n // Load existing env or prompt for endpoint\n let envCfg = await loadEnv(envName).catch(() => null);\n if (pairingOrigin && !envCfg) {\n // 配对轨:地址来自那一行命令,租户随兑换响应回来,两样都不必问人。\n envCfg = { endpoint: pairingOrigin };\n await saveEnv(envName, envCfg);\n }\n if (pairingOrigin && envCfg && envCfg.endpoint !== pairingOrigin) {\n // 🔴 同名不同址不许静默覆盖:那会把另一个环境的配置改掉,而使用者只是粘贴了\n // 一行命令、根本不知道自己动了什么。\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n `env '${envName}' 已存在且指向 ${envCfg.endpoint},与本次的 ${pairingOrigin} 不同。` +\n `用 --env <name> 显式指定一个新名字。`,\n });\n }\n if (!envCfg) {\n const endpoint = args.endpoint ?? (await promptText('endpoint: '));\n if (!endpoint) {\n throw new CliError({\n code: CliErrorCode.ENV_ENDPOINT_REQUIRED,\n message:\n 'env not configured; pass --endpoint or run `hcm env add` first',\n });\n }\n envCfg = { endpoint, tenantId: args.tenant ?? '1' };\n await saveEnv(envName, envCfg);\n }\n const endpoint = envCfg.endpoint;\n const tenantId = args.tenant ?? envCfg.tenantId ?? '1';\n const http = axios.create({ baseURL: endpoint, timeout: 30_000 });\n\n // Resolve PAT input (if any)\n let pat: string | undefined;\n if (args.patStdin) pat = await readStdin();\n else if (args.pat) {\n pat = args.pat;\n process.stderr.write(\n '[hcm] WARNING: --pat <token> may leak via shell history / ps aux. Prefer --pat-stdin.\\n',\n );\n }\n\n let scheme: 'password' | 'client_credentials' | 'pat' | 'pairing';\n let scopes: string[];\n let username: string | undefined;\n let clientId: string | undefined;\n // 服务端认定的归属。三条 track 里只有 PAT 与口令能拿到(client_credentials 是机器身份)。\n let principal: Principal | undefined;\n\n if (args.code) {\n // ─── Track 4: 配对码(ADR-308)───\n // 放在最前:它自带地址与租户,不与下面三条的任何参数组合冲突。\n const { record, principal: p } = await loginPairing({\n endpoint,\n code: args.code,\n profile: envName,\n httpClient: http,\n });\n scheme = 'pairing';\n scopes = record.scopes;\n principal = p;\n username = p?.username;\n } else if (pat) {\n // ─── Track 1: PAT ───\n const { record, principal: p } = await loginPat({\n endpoint,\n tenantId,\n pat,\n profile: envName,\n httpClient: http,\n });\n scheme = 'pat';\n scopes = record.scopes;\n principal = p;\n } else if (args.clientId || args.clientSecret) {\n // ─── Track 2: client_credentials ───\n clientId = args.clientId ?? (await promptText('client_id: '));\n const clientSecret =\n args.clientSecret ?? (await promptSecret('client_secret: '));\n if (!clientId || !clientSecret) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: 'client_id and client_secret required',\n });\n }\n const { record } = await loginClientCredentials({\n endpoint,\n tenantId,\n clientId,\n clientSecret,\n profile: envName,\n httpClient: http,\n });\n scheme = 'client_credentials';\n scopes = record.scopes;\n } else {\n // ─── Track 3 (default): password ───\n username = args.username ?? (await promptText('username: '));\n const password = args.password ?? (await promptSecret('password: '));\n if (!username || !password) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: 'username and password required',\n });\n }\n const { record, principal: p } = await loginPasswordWithFirstLoginChange(\n { endpoint, tenantId, username, password, profile: envName, httpClient: http },\n args,\n );\n scheme = 'password';\n scopes = record.scopes;\n principal = p;\n }\n\n // Pick identity name (auto-inferred or --name override)\n const idName =\n args.name ?? inferIdentityName(scheme, envName, { username, clientId });\n\n // Move token from profile-scoped to identity-scoped store\n await migrateProfileTokenToIdentity(envName, idName);\n\n // Write IdentityMeta JSON (env FK validated inside saveIdentity)\n const newStore = TokenStore.forIdentity(idName);\n const newMeta = await newStore.readMeta();\n const identityMeta: IdentityMeta = {\n env: envName,\n scheme,\n scopes,\n expiresAt: newMeta?.expiresAt,\n // 服务端回了用户名就用服务端的:`--user` 传的只是登录入参,大小写/别名都可能与\n // 账号真名不同。\n username: principal?.username ?? username,\n accessTokenRef: newMeta?.accessTokenRef,\n refreshTokenRef: newMeta?.refreshTokenRef,\n tenantId: principal?.tenantId,\n // saveIdentity 写的是 IdentityMeta 形状,且和 TokenStore 共用同一个文件、\n // 最后写 —— 不在这里显式带上,上一步 writeMeta 存的 ttlSeconds 会被抹掉。\n ttlSeconds: newMeta?.ttlSeconds,\n };\n await saveIdentity(idName, identityMeta);\n\n // 🔴 「我要的租户」vs「token 实际归属的租户」不一致时必须让人看见:不一致意味着\n // 后面每一条命令都打在另一个租户上,而返回的数据看起来完全正常。\n if (principal?.tenantId && String(principal.tenantId) !== String(tenantId)) {\n process.stderr.write(\n `[hcm] WARNING: 请求的租户是 ${tenantId},但 token 实际归属租户 ${principal.tenantId}。` +\n `后续命令按 ${principal.tenantId} 执行。\\n`,\n );\n }\n\n // Commander quirk: `--no-activate` sets opts.activate=false, NOT\n // opts.noActivate=true. Default (no flag) → undefined → treat as true.\n const shouldActivate = args.activate !== false;\n // Point defaultIdentity at the identity we just logged in as (unless --no-activate).\n // This used to fire only when the env had NO defaultIdentity, so logging in as a second\n // user on the same env left defaultIdentity pinned to the first one — every later command\n // then ran silently as the wrong identity. Skip the write when it already matches.\n if (shouldActivate && envCfg.defaultIdentity !== idName) {\n envCfg.defaultIdentity = idName;\n await saveEnv(envName, envCfg);\n }\n // Auto-switch activeEnv unless --no-activate\n if (shouldActivate) {\n const gl = await loadGlobalConfig();\n gl.activeEnv = envName;\n await saveGlobalConfig(gl);\n }\n\n // 回显里必须有**服务端说的**身份,而不只是我们自己传进去的参数 —— 后者登错租户时\n // 长得和登对了一模一样。\n exitOk(\n `✅ logged in (env=${envName}, identity=${idName}, scheme=${scheme}, ` +\n `${describePrincipal(principal)}, scopes=${scopes.join(' ')})`,\n );\n } catch (e) {\n const err = e as { isAxiosError?: boolean };\n if (err.isAxiosError) {\n const { fromAxiosError } = await import('@hcmai/sdk');\n exitWithError(\n fromAxiosError(\n e as Parameters<typeof fromAxiosError>[0],\n envName,\n ),\n );\n }\n exitWithError(e);\n }\n}\n\n/**\n * 登出。\n *\n * 🔴 **先让服务端吊销,再清本地**——此前这里只做了后半截(`TokenStore.clear()`),\n * 于是 `hcm logout` 删掉的只是**本机的一份副本**,服务端那个 token 在 Redis 里继续\n * 有效最多 24 小时。名字叫 logout 而实际不 logout,在两个场景下会直接骗人:\n *\n * 1. **在别人的机器上跑过 CLI**(顾问 SSH 进客户服务器是常态):你以为退出了,\n * 实际上那台机器的 root / 备份快照里可能早已复制走一份仍然有效的 token。\n * 2. **凭据可能已泄漏时**:logout 是人第一反应会执行的补救动作,而它什么都没补救。\n *\n * 服务端 `POST /api/auth/logout` 走 `tokenManager.revokeToken(token)` 真吊销,且该路径\n * 在 `SecurityPathConfig.PUBLIC_PATHS` 里、带自己的 Bearer 就能调——能力一直都在,\n * 只是没接线。\n *\n * **失败不阻断清本地**:服务端不可达时仍然清掉本地凭据,但**如实说明**服务端那份可能\n * 还活着。反过来(服务端失败就不清本地)会让人在断网时连登出都做不了。\n */\nexport async function logoutCommand(args: {\n identity?: string;\n env?: string;\n}): Promise<void> {\n try {\n let target = args.identity;\n let envName = args.env;\n if (!target) {\n const g = await loadGlobalConfig();\n envName = args.env ?? g.activeEnv;\n const envCfg = await loadEnv(envName).catch(() => null);\n const dflt = envCfg?.defaultIdentity;\n if (!dflt) {\n exitOk('(no active identity to log out)');\n return;\n }\n target = dflt;\n }\n // Throw IDENTITY_NOT_FOUND for nonexistent identity instead of silently\n // succeeding (which would falsely report \"logged out\" of something that\n // never existed).\n const idMeta = await loadIdentity(target);\n const store = TokenStore.forIdentity(target);\n\n const revoked = await revokeOnServer(store, envName ?? idMeta.env);\n await store.clear();\n\n if (revoked) {\n exitOk(`✅ logged out (identity: ${target})`);\n } else {\n // 🔴 不许把这一支也报成 ✅:本地清了,服务端那份可能还有效。\n exitOk(\n `⚠️ 已清除本地凭据 (identity: ${target}),但服务端吊销未确认——` +\n `该 token 可能仍然有效直至自然过期。若凭据可能已泄漏,请改密以吊销全部会话。`,\n );\n }\n } catch (e) {\n exitWithError(e);\n }\n}\n\n/**\n * 请服务端吊销这条 token。返回是否确认吊销。\n *\n * 🔴 **只对服务端会话 token 生效**,走 `isServerSlidingSession` 谓词而不是逐个列举:\n * - `pat` —— 别处颁发的长期凭据,由后端管失效,`logout` 只该断开本机引用,\n * 不该把别人的 PAT 吊销掉\n * - `client_credentials` —— `hcmt_` 不是 Redis 会话 token,`/api/auth/logout` 对它无效\n * - `password` / `pairing` —— 这两条才是 `TokenManager.createToken` 铸的会话 token\n *\n * 此前这里写的是 `meta.scheme === 'pat'` 取反,等于把 client_credentials 也发出去\n * 打一次注定无效的请求;更要命的是新增第四轨时,只要 scheme 记错就会**静默跳过吊销**。\n */\nasync function revokeOnServer(store: TokenStore, envName: string): Promise<boolean> {\n try {\n const meta = await store.readMeta();\n if (!meta || !isServerSlidingSession(meta.scheme)) return false;\n const token = await store.getAccessToken();\n if (!token) return false;\n const envCfg = await loadEnv(envName).catch(() => null);\n if (!envCfg?.endpoint) return false;\n\n await axios.create({ baseURL: envCfg.endpoint, timeout: 15_000 }).post(\n `${envCfg.endpoint}/api/auth/logout`,\n undefined,\n { headers: { Authorization: `Bearer ${token}` } },\n );\n return true;\n } catch {\n // 服务端不可达 / token 已失效 —— 两种都不该阻断本地清理。\n return false;\n }\n}\n","import * as readline from 'node:readline';\n\nexport async function promptText(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n}\n\nexport async function promptSecret(question: string): Promise<string> {\n return new Promise((resolve) => {\n process.stdout.write(question);\n const stdin = process.stdin;\n stdin.setRawMode?.(true);\n stdin.resume();\n let buf = '';\n const onData = (data: Buffer) => {\n const s = data.toString('utf-8');\n for (const ch of s) {\n if (ch === '\\r' || ch === '\\n') {\n stdin.setRawMode?.(false);\n stdin.pause();\n stdin.removeListener('data', onData);\n process.stdout.write('\\n');\n resolve(buf);\n return;\n }\n if (ch === '\\x03') process.exit(130); // Ctrl+C\n if (ch === '\\x7f') {\n buf = buf.slice(0, -1);\n continue;\n }\n buf += ch;\n process.stdout.write('*');\n }\n };\n stdin.on('data', onData);\n });\n}\n\nexport async function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString('utf-8').trim();\n}\n\n/**\n * 从标准输入读取秘密值,只移除管道输入通常附带的一个行结束符。\n * 密码本身的前后空格属于有效字符,不能像普通文本那样 trim。\n */\nexport async function readSecretFromStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks)\n .toString('utf-8')\n .replace(/\\r?\\n$/, '');\n}\n\nexport async function promptConfirm(question: string): Promise<boolean> {\n const ans = await promptText(question);\n return /^y(es)?$/i.test(ans.trim());\n}\n","import {\n loadGlobalConfig,\n saveGlobalConfig,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { envList, envCurrent, envUse, envRemove } from './env';\nimport { exitOk, exitWithError } from '../utils/exit';\n\nfunction warnDeprecated(oldCmd: string, newCmd: string): void {\n process.stderr.write(\n `[hcm] event=deprecated_cmd old=${JSON.stringify(oldCmd)} replacement=${JSON.stringify(newCmd)}\\n`,\n );\n}\n\nexport async function configListDeprecated(): Promise<void> {\n warnDeprecated('hcm config list', 'hcm env list');\n await envList();\n}\n\nexport async function configShowDeprecated(): Promise<void> {\n warnDeprecated('hcm config show', 'hcm env current');\n await envCurrent();\n}\n\nexport async function configSetProfileDeprecated(name: string): Promise<void> {\n warnDeprecated('hcm config set-profile', 'hcm env use');\n // Legacy 行为不 ping endpoint\n await envUse(name, { ping: false });\n}\n\nexport async function configDeleteDeprecated(name: string): Promise<void> {\n warnDeprecated('hcm config delete', 'hcm env remove --force');\n // legacy `hcm config delete` 没有确认提示, 转译时透传 --force 保持行为一致\n await envRemove(name, { force: true });\n}\n\nexport async function configSet(key: string, value: string): Promise<void> {\n try {\n if (!key.startsWith('defaults.')) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n \"hcm config set only accepts defaults.*. For env fields use 'hcm env edit <field> <value>'.\",\n });\n }\n const sub = key.slice('defaults.'.length);\n const g = await loadGlobalConfig();\n g.defaults = g.defaults ?? {};\n (g.defaults as unknown as Record<string, string>)[sub] = value;\n await saveGlobalConfig(g);\n exitOk(`✅ defaults.${sub} = ${value}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function configGet(key: string): Promise<void> {\n try {\n if (!key.startsWith('defaults.')) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n \"hcm config get only accepts defaults.*. For env fields use 'hcm env show'.\",\n });\n }\n const sub = key.slice('defaults.'.length);\n const g = await loadGlobalConfig();\n exitOk(String((g.defaults as unknown as Record<string, string>)?.[sub] ?? ''));\n } catch (e) {\n exitWithError(e);\n }\n}\n","import axios from 'axios';\nimport {\n loadEnv,\n saveEnv,\n listEnvs,\n deleteEnv,\n loadGlobalConfig,\n saveGlobalConfig,\n loadIdentity,\n listIdentities,\n deleteIdentity,\n TokenStore,\n CliError,\n CliErrorCode,\n toYaml,\n} from '@hcmai/sdk';\nimport { exitOk, exitWithError } from '../utils/exit';\nimport { promptConfirm } from '../utils/prompt';\nimport { formatTable } from '../utils/table';\n\nexport async function envList(): Promise<void> {\n try {\n const envs = await listEnvs();\n const g = await loadGlobalConfig();\n if (envs.length === 0) {\n exitOk('(no envs; run `hcm env add <name> --endpoint <url>`)');\n return;\n }\n const rows = await Promise.all(\n envs.map(async (name) => {\n const cfg = await loadEnv(name);\n return {\n active: name === g.activeEnv ? '*' : ' ',\n name,\n endpoint: cfg.endpoint,\n frontend: cfg.frontend ?? '(none)',\n tenant: cfg.tenantId ?? '1',\n identity: cfg.defaultIdentity ?? '(none)',\n };\n }),\n );\n exitOk(formatTable(rows));\n } catch (e) {\n exitWithError(e);\n }\n}\nexport async function envCurrent(): Promise<void> {\n try {\n const g = await loadGlobalConfig();\n const cfg = await loadEnv(g.activeEnv).catch(() => null);\n if (!cfg) {\n exitOk('(no active env; run `hcm env add <name> --endpoint <url>`)');\n return;\n }\n const idName = cfg.defaultIdentity ?? '(none)';\n const frontend = cfg.frontend ? ` frontend=${cfg.frontend}` : '';\n exitOk(`→ ${g.activeEnv} ${cfg.endpoint}${frontend} tenant=${cfg.tenantId ?? '1'} identity=${idName}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envAdd(\n name: string,\n args: { endpoint?: string; frontend?: string; tenant?: string; force?: boolean },\n): Promise<void> {\n try {\n if (!args.endpoint) {\n throw new CliError({\n code: CliErrorCode.ENV_ENDPOINT_REQUIRED,\n message: 'env add requires --endpoint <url>',\n });\n }\n const existing = await loadEnv(name).catch(() => null);\n if (existing && !args.force) {\n throw new CliError({\n code: CliErrorCode.ENV_ALREADY_EXISTS,\n message: `env '${name}' already exists. Use --force to overwrite.`,\n });\n }\n await saveEnv(name, {\n endpoint: args.endpoint,\n frontend: args.frontend,\n tenantId: args.tenant ?? '1',\n });\n // If this is the first env (or active env points to a non-existent env), make this the active env\n const allEnvs = await listEnvs();\n const g = await loadGlobalConfig();\n const activeExists = allEnvs.includes(g.activeEnv);\n if (!activeExists) {\n g.activeEnv = name;\n await saveGlobalConfig(g);\n }\n exitOk(`✅ env '${name}' added. Run: hcm login --env ${name}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envUse(name: string, args: { ping?: boolean }): Promise<void> {\n try {\n const cfg = await loadEnv(name);\n const g = await loadGlobalConfig();\n g.activeEnv = name;\n await saveGlobalConfig(g);\n // commander --no-ping sets args.ping = false. Default is undefined → treat as true.\n const shouldPing = args.ping !== false;\n if (shouldPing && !process.env.CI) {\n try {\n await axios.get(`${cfg.endpoint}/api/version/backend`, { timeout: 2000 });\n } catch (e) {\n const reason = String((e as Error).message).slice(0, 60).replace(/\\s+/g, '-');\n process.stderr.write(\n `[hcm] event=env_ping_failed env=${name} reason=${reason} hint=token-may-need-re-login\\n`,\n );\n }\n }\n if (cfg.defaultIdentity) {\n const id = await loadIdentity(cfg.defaultIdentity).catch(() => null);\n if (id?.expiresAt && new Date(id.expiresAt) < new Date()) {\n process.stderr.write(\n `[hcm] event=token_expired identity=${cfg.defaultIdentity} hint=\"hcm login --env ${name}\"\\n`,\n );\n }\n }\n exitOk(`✅ active env: ${name}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envRemove(name: string, args: { force?: boolean }): Promise<void> {\n try {\n if (!args.force) {\n const ok = await promptConfirm(`remove env '${name}' and all its identities? [y/N] `);\n if (!ok) {\n exitOk('aborted');\n return;\n }\n }\n const ids = await listIdentities(name);\n const failed: string[] = [];\n for (const id of ids) {\n try {\n await TokenStore.forIdentity(id).clear();\n await deleteIdentity(id);\n } catch (err) {\n failed.push(id);\n process.stderr.write(\n `[hcm] event=identity_cleanup_failed identity=${id} reason=${JSON.stringify(String((err as Error).message))}\\n`,\n );\n }\n }\n await deleteEnv(name);\n const g = await loadGlobalConfig();\n if (g.activeEnv === name) {\n g.activeEnv = 'default';\n await saveGlobalConfig(g);\n }\n const removedCount = ids.length - failed.length;\n const noun = (n: number): string => (n === 1 ? 'identity' : 'identities');\n const failPart =\n failed.length > 0\n ? `, ${failed.length} ${noun(failed.length)} failed: ${failed.join(', ')}`\n : '';\n exitOk(`✅ env '${name}' removed (${removedCount} ${noun(removedCount)} removed${failPart})`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envShow(args: { name?: string }): Promise<void> {\n try {\n const g = await loadGlobalConfig();\n const target = args.name ?? g.activeEnv;\n const cfg = await loadEnv(target);\n const ids = await listIdentities(target);\n exitOk(\n toYaml({\n name: target,\n active: target === g.activeEnv,\n ...cfg,\n identities: ids,\n }),\n );\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envEdit(\n field: string,\n value: string,\n args: { env?: string },\n): Promise<void> {\n try {\n const ALLOWED = new Set(['endpoint', 'frontend', 'tenantId', 'defaultIdentity', 'defaultAgent']);\n if (!ALLOWED.has(field)) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `unknown field '${field}'. Allowed: ${[...ALLOWED].join(', ')}`,\n });\n }\n const g = await loadGlobalConfig();\n const name = args.env ?? g.activeEnv;\n const cfg = await loadEnv(name);\n // FK validation: defaultIdentity must point to an existing identity\n if (field === 'defaultIdentity') {\n await loadIdentity(value); // throws IDENTITY_NOT_FOUND if missing\n }\n (cfg as unknown as Record<string, string>)[field] = value;\n await saveEnv(name, cfg);\n exitOk(`✅ ${name}.${field} = ${value}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\n","/**\n * Render an array of homogeneous string-record rows as a fixed-width text table.\n * Uses code-unit length (no CJK width adjustment) — acceptable for current ASCII-only fields.\n */\nexport function formatTable(rows: Array<Record<string, string>>): string {\n if (rows.length === 0) return '';\n const keys = Object.keys(rows[0]!);\n const widths = keys.map((k) =>\n Math.max(k.length, ...rows.map((r) => String(r[k] ?? '').length)),\n );\n const header = keys.map((k, i) => k.padEnd(widths[i]!)).join(' ');\n const body = rows.map((r) =>\n keys.map((k, i) => String(r[k] ?? '').padEnd(widths[i]!)).join(' '),\n );\n return [header, '-'.repeat(header.length), ...body].join('\\n');\n}\n","import {\n HcmClient,\n formatRows,\n fromAxiosError,\n type OutputFormat,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface QueryArgs {\n filter?: string;\n sort?: string;\n fields?: string;\n keyword?: string;\n limit?: number;\n offset?: number;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport async function queryCommand(model: string, args: QueryArgs): Promise<void> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dsl: any = {};\n if (args.filter) dsl.filter = parseJsonOrThrow(args.filter, '--filter');\n if (args.sort) dsl.sort = parseJsonOrThrow(args.sort, '--sort');\n if (args.fields) dsl.fields = args.fields.split(',').map((s) => s.trim());\n if (args.keyword) dsl.keyword = args.keyword;\n if (args.limit) dsl.limit = Number(args.limit);\n if (args.offset) dsl.offset = Number(args.offset);\n if (!dsl.limit) dsl.limit = 20;\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await client.query(model, dsl);\n const fmt: OutputFormat = args.output ?? 'table';\n const out = formatRows(result.rows as Record<string, unknown>[], { format: fmt });\n process.stdout.write(out + '\\n');\n if (fmt === 'table' && result.total !== undefined) {\n process.stdout.write(`Showing ${result.rows.length} of ${result.total} results.\\n`);\n }\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n\nfunction parseJsonOrThrow(text: string, flag: string): unknown {\n try {\n return JSON.parse(text);\n } catch (e) {\n throw new CliError({\n code: CliErrorCode.INVALID_JSON,\n message: `${flag} is not valid JSON: ${(e as Error).message}`,\n });\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n type ActionHttpMethod,\n type ActionScope,\n type OutputFormat,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { readJsonObjectInput } from '../utils/json-input';\n\nexport interface ActionArgs {\n id?: string;\n ids?: string;\n params?: string;\n paramsFile?: string;\n method?: string;\n scope?: string;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport async function actionCommand(spec: string, args: ActionArgs): Promise<void> {\n try {\n const [model, action] = spec.split('.');\n if (!model || !action) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: 'expected <Model>.<Action> (e.g. Employee.regularize)',\n });\n }\n if (args.id && args.ids) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--id and --ids are mutually exclusive',\n });\n }\n const method = normalizeMethod(args.method);\n const scope = normalizeScope(args.scope);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const input: any = { method };\n if (scope) input.scope = scope;\n if (args.id) input.id = args.id;\n if (args.ids) input.ids = args.ids.split(',').map((s) => s.trim());\n const params = await readJsonObjectInput({\n inline: args.params,\n file: args.paramsFile,\n inlineFlag: '--params',\n fileFlag: '--params-file',\n required: false,\n });\n if (params) input.params = params;\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await client.action(model, action, input);\n const fmt: OutputFormat = args.output ?? 'json';\n\n if (fmt !== 'json' && result.taskId) {\n process.stdout.write(\n `⏳ task created: ${result.taskId} (use \\`hcm task ${result.taskId}\\` to follow up — coming Phase 1)\\n`,\n );\n } else if (fmt !== 'json') {\n process.stdout.write('✅ action succeeded\\n');\n }\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n\nfunction normalizeMethod(value?: string): ActionHttpMethod {\n const raw = (value ?? 'POST').toUpperCase();\n if (raw === 'GET' || raw === 'POST' || raw === 'PUT' || raw === 'DELETE') return raw;\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--method 取值 GET | POST | PUT | DELETE,收到 \"${value}\"`,\n });\n}\n\nfunction normalizeScope(value?: string): ActionScope | undefined {\n if (value === undefined) return undefined;\n if (value === 'class' || value === 'object') return value;\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--scope 取值 class | object,收到 \"${value}\"`,\n });\n}\n","import * as fs from 'node:fs/promises';\nimport { CliError, CliErrorCode } from '@hcmai/sdk';\n\nexport interface JsonObjectInputOptions {\n inline?: string;\n file?: string;\n inlineFlag: string;\n fileFlag: string;\n required?: boolean;\n}\n\n/**\n * 读取 Agent 友好的 JSON 对象输入。\n * 小对象可直接放命令行;复杂报表配置应走文件,避免 shell 转义和命令长度限制。\n */\nexport async function readJsonObjectInput(\n options: JsonObjectInputOptions,\n): Promise<Record<string, unknown> | undefined> {\n const { inline, file, inlineFlag, fileFlag, required = true } = options;\n if (inline && file) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `${inlineFlag} 与 ${fileFlag} 不能同时使用`,\n });\n }\n if (!inline && !file) {\n if (!required) return undefined;\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: `${inlineFlag} <JSON> 或 ${fileFlag} <path> 必填`,\n });\n }\n\n let raw: string;\n let sourceFlag: string;\n if (file) {\n sourceFlag = fileFlag;\n try {\n raw = await fs.readFile(file, 'utf-8');\n } catch (error) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `${fileFlag}: 无法读取 ${file}: ${(error as Error).message}`,\n });\n }\n } else {\n sourceFlag = inlineFlag;\n raw = inline!;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new CliError({\n code: CliErrorCode.INVALID_JSON,\n message: `${sourceFlag}: ${(error as Error).message}`,\n });\n }\n if (parsed === null || Array.isArray(parsed) || typeof parsed !== 'object') {\n throw new CliError({\n code: CliErrorCode.INVALID_JSON,\n message: `${sourceFlag}: 顶层必须是 JSON 对象`,\n });\n }\n return parsed as Record<string, unknown>;\n}\n","import { HcmClient, formatObject, fromAxiosError, type OutputFormat } from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { readJsonObjectInput } from '../utils/json-input';\n\nexport interface CreateArgs {\n data?: string;\n dataFile?: string;\n env?: string;\n as?: string;\n profile?: string;\n output?: OutputFormat;\n}\n\nexport async function createCommand(model: string, args: CreateArgs): Promise<void> {\n try {\n const data = await readJsonObjectInput({\n inline: args.data,\n file: args.dataFile,\n inlineFlag: '--data',\n fileFlag: '--data-file',\n });\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const res = await client.create(model, data!);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write('✅ created\\n');\n process.stdout.write(formatObject(res, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.profile));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { readJsonObjectInput } from '../utils/json-input';\n\nexport interface UpdateArgs {\n id?: string;\n data?: string;\n dataFile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\n/**\n * `hcm update <Model> --id <id> --data '{...}'` —— 更新一条记录(走后端完整校验)。\n *\n * 与 create/delete 成对:配置类交付动作里「改一条已有记录」是基本盘,\n * 之前只能退回 curl -X PUT。\n */\nexport async function updateCommand(model: string, args: UpdateArgs): Promise<void> {\n try {\n if (!args.id) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '--id <id> 必填' });\n }\n const data = await readJsonObjectInput({\n inline: args.data,\n file: args.dataFile,\n inlineFlag: '--data',\n fileFlag: '--data-file',\n });\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await client.update(model, args.id, data!);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`✅ ${model}#${args.id} 已更新\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n formatRows,\n fromAxiosError,\n getSettingDomain,\n patchSettingDomain,\n resetSettingItem,\n parseSettingAssignment,\n CliError,\n CliErrorCode,\n type OutputFormat,\n type SettingWrite,\n} from '@hcmai/sdk';\nimport { promptConfirm } from '../utils/prompt';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface SettingArgs {\n set?: string[];\n revision?: string;\n dryRun?: boolean;\n yes?: boolean;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nasync function client(args: SettingArgs): Promise<HcmClient> {\n return HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n}\n\nfunction fail(e: unknown, args: SettingArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 404) {\n exitWithError(new Error('没有这个参数域 —— 用 `hcm setting get <域>` 看现有域,常见有 security / feature / integration'));\n }\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm setting get <domain>` —— 读某域的全部参数(定义 + 租户覆盖值合并)。 */\nexport async function settingGetCommand(domain: string, args: SettingArgs): Promise<void> {\n try {\n const c = await client(args);\n const { items } = await getSettingDomain(c.raw(), domain);\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'table') {\n const rows = items.map((i) => ({\n namespace: i.namespace,\n key: i.settingKey,\n value: i.value ?? i.defaultValue,\n overridden: i.value !== undefined && i.value !== null ? 'yes' : '',\n revision: i.revision ?? '',\n }));\n process.stdout.write(formatRows(rows as Record<string, unknown>[], { format: 'table' }) + '\\n');\n } else {\n process.stdout.write(formatObject(items, { format: fmt }) + '\\n');\n }\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm setting set <domain> --set ns.key=value [--set ...]` —— 改参数。\n *\n * 走受控的 PATCH 路径(按定义校验 + 乐观锁 + 写历史),不是标准 Model 的 PUT。\n * 默认对着**客户环境**写,故支持 --dry-run 先看要改什么。\n */\nexport async function settingSetCommand(domain: string, args: SettingArgs): Promise<void> {\n try {\n const raw = args.set ?? [];\n if (raw.length === 0) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '至少要一个 --set namespace.key=value,例如 --set security.password.passwordPolicy=complex',\n });\n }\n let items: SettingWrite[];\n try {\n items = raw.map(parseSettingAssignment);\n } catch (e) {\n throw new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message: (e as Error).message });\n }\n\n if (args.dryRun) {\n process.stdout.write(`[dry-run] 将在域 ${domain} 写入 ${items.length} 项,未实际写入:\\n`);\n for (const i of items) process.stdout.write(` ${i.namespace}.${i.settingKey} = ${String(i.value)}\\n`);\n process.exit(0);\n }\n\n const c = await client(args);\n const result = await patchSettingDomain(c.raw(), domain, items);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`✅ ${domain} 已更新 ${items.length} 项\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm setting reset <domain> <namespace> <key>` —— 清除租户覆盖,回落到默认值。\n *\n * 是「恢复默认」而非「删除」——下次 set 就能写回,故不是不可逆操作;\n * 但它会改变客户环境的现行行为,所以仍过确认闸。\n */\nexport async function settingResetCommand(\n domain: string,\n namespace: string,\n key: string,\n args: SettingArgs,\n): Promise<void> {\n try {\n if (!args.yes) {\n const ok = await promptConfirm(`将清除 ${domain} / ${namespace}.${key} 的租户覆盖,回落到默认值。继续?`);\n if (!ok) {\n process.stderr.write('已取消\\n');\n process.exit(1);\n }\n }\n const c = await client(args);\n const revision = args.revision === undefined ? undefined : Number(args.revision);\n const result = await resetSettingItem(c.raw(), domain, namespace, key, revision);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`✅ ${namespace}.${key} 已回落到默认值\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n","import {\n createHttpClient,\n formatObject,\n fromAxiosError,\n loadEnv,\n loadGlobalConfig,\n resolveActiveEnv,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\n\nexport interface VersionArgs {\n endpoint?: string;\n env?: string;\n output?: OutputFormat;\n}\n\n/**\n * `hcm version` —— 查后端版本(commit / tag / 构建时间)。\n *\n * 与 `hcm skills` 一样走**免认证**端点(`/api/version/**` 在公开白名单里):\n * 「客户环境到底是哪一版」经常是在还没拿到账号的时候就要回答的第一问。\n */\nexport async function versionCommand(args: VersionArgs): Promise<void> {\n try {\n let endpoint = args.endpoint;\n if (!endpoint) {\n const g = await loadGlobalConfig();\n const env = await loadEnv(resolveActiveEnv({ envFlag: args.env }, process.env, g)).catch(() => null);\n if (!env?.endpoint) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`',\n });\n }\n endpoint = env.endpoint;\n }\n const http = createHttpClient({\n endpoint: endpoint.replace(/\\/+$/, ''),\n getAccessToken: async () => null,\n onRefresh: async () => {},\n });\n const resp = await http.get('/api/version/backend');\n const info = resp.data?.data ?? resp.data;\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`${endpoint}\\n`);\n process.stdout.write(formatObject(info, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n type OutputFormat,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DeleteArgs {\n id?: string;\n env?: string;\n as?: string;\n profile?: string;\n output?: OutputFormat;\n}\n\nexport async function deleteCommand(model: string, args: DeleteArgs): Promise<void> {\n try {\n if (!args.id) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '--id <id> 必填' });\n }\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const res = await client.remove(model, args.id);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write('✅ deleted\\n');\n process.stdout.write(formatObject(res, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.profile));\n exitWithError(e);\n }\n}\n","import { readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport {\n HcmClient, parseFixture, runImport, formatObject, fromAxiosError,\n type Fixture, type ImportClient, type ImportOptions, type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface ImportArgs {\n dryRun?: boolean;\n updateOnly?: boolean;\n onError?: string;\n report?: string;\n env?: string;\n as?: string;\n profile?: string;\n output?: OutputFormat;\n}\n\n/** 递归收集 *.yml/*.yaml,按相对路径字典序(对齐 spec §4 拓扑约定)。 */\nfunction collectYmlFiles(path: string): string[] {\n if (statSync(path).isFile()) return [path];\n const out: string[] = [];\n const walk = (dir: string): void => {\n for (const name of readdirSync(dir).sort()) {\n const full = join(dir, name);\n if (statSync(full).isDirectory()) walk(full);\n else if (full.endsWith('.yml') || full.endsWith('.yaml')) out.push(full);\n }\n };\n walk(path);\n return out.sort();\n}\n\n// dry-run 不触达后端,用一个永不被调用的 stub(runner 的 dryRun 分支不调 client),免去 auth 依赖\nconst DRY_RUN_CLIENT: ImportClient = {\n findIdByKey: async () => null,\n create: async () => ({ id: '' }),\n update: async () => ({}),\n};\n\nexport async function importCommand(path: string, args: ImportArgs): Promise<void> {\n try {\n const files = collectYmlFiles(path);\n const fixtures: Fixture[] = files.map((f) =>\n parseFixture(readFileSync(f, 'utf8'), relative(process.cwd(), f)),\n );\n\n const opts: ImportOptions = {\n dryRun: !!args.dryRun,\n updateOnly: !!args.updateOnly,\n onError: args.onError === 'stop' ? 'stop' : 'continue',\n };\n\n const client: ImportClient = opts.dryRun\n ? DRY_RUN_CLIENT\n : HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await runImport(client, fixtures, opts);\n\n if (args.report) writeFileSync(args.report, JSON.stringify(result, null, 2));\n\n const fmt: OutputFormat = args.output ?? 'json';\n const tag = opts.dryRun ? '🔍 dry-run' : '📦 import';\n process.stdout.write(\n `${tag}: created=${result.created} updated=${result.updated} skipped=${result.skipped} failed=${result.failed}\\n`,\n );\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(result.failed > 0 ? 3 : 0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.profile));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n type ModelDescription,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface DescribeArgs {\n verbose?: boolean;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport async function describeCommand(model: string, args: DescribeArgs): Promise<void> {\n try {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const desc = await client.describe(model, { verbose: !!args.verbose });\n\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt !== 'table') {\n process.stdout.write(formatObject(desc, { format: fmt }) + '\\n');\n process.exit(0);\n }\n\n process.stdout.write(formatDescriptionTable(desc, !!args.verbose) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n\nexport function formatDescriptionTable(desc: ModelDescription, verbose = false): string {\n const lines: string[] = [`=== ${desc.model} ===`];\n if (desc.labels.zh_CN) lines.push(`zh_CN: ${desc.labels.zh_CN}`);\n if (desc.labels.en) lines.push(`en: ${desc.labels.en}`);\n lines.push(`fields (${desc.fields.length}):`);\n for (const f of desc.fields) {\n const req = f.required ? ' required' : ' ';\n const lbl = verbose ? ` ${f.label ?? ''} ${f.description ?? ''}` : ` ${f.label ?? ''}`;\n lines.push(` ${f.name.padEnd(20)} ${f.type.padEnd(10)} ${req}${lbl}`);\n }\n lines.push(`actions (${desc.actions.length}):`);\n for (const a of desc.actions) {\n const call = [a.scope, a.httpMethod].filter(Boolean).join(' ');\n const params = a.params?.length\n ? ` params: ${a.params.map((p) => `${p.name}:${p.type}`).join(', ')}`\n : '';\n const description = verbose && a.description ? ` ${a.description}` : '';\n lines.push(` ${a.name.padEnd(20)} ${call.padEnd(12)} ${a.label ?? ''}${params}${description}`);\n }\n if (desc.relations.length) {\n lines.push(`relations: ${desc.relations.map((r) => `${r.key}(via ${r.via})`).join(', ')}`);\n }\n return lines.join('\\n');\n}\n","import type { AttachmentMeta } from '@hcmai/sdk';\nimport {\n HcmClient,\n WsClient,\n oneShot,\n sendMessageAndStream,\n createConversation,\n DEFAULT_AGENT_ID,\n saveConversationState,\n formatObject,\n formatRows,\n fetchConversationTimeline,\n fetchConversationTimelineStrict,\n fetchRecentConversations,\n findLastAssistantSeq,\n CliError,\n CliErrorCode,\n parseInteractionRequest,\n parseInteractionResolved,\n buildConfirm,\n buildReject,\n buildAnswer,\n buildInterrupt,\n buildSteer,\n} from '@hcmai/sdk';\nimport chalk from 'chalk';\nimport * as fs from 'node:fs/promises';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport type ChatOutputFormat = 'text' | 'json';\n\nexport interface ChatArgs {\n agent?: string;\n resume?: string;\n conversation?: string;\n list?: boolean;\n events?: boolean | string;\n limit?: string;\n stream?: boolean;\n noStream?: boolean;\n showToolCalls?: boolean;\n promptFile?: string;\n timeout?: number;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: ChatOutputFormat;\n // ADR-085: streaming display flags. commander `--no-xxx` 在解析时把 args.xxx 设 false.\n markdown?: boolean;\n thinking?: boolean;\n verboseThinking?: boolean;\n verboseTools?: boolean;\n spinner?: boolean;\n color?: boolean;\n raw?: boolean;\n autoApprove?: boolean;\n onConfirm?: string;\n onAsk?: string;\n /** P0 测试接口:流中途注入命令,格式 <eventType>:<action>[:<arg>](仅 --raw 分支生效)。 */\n injectOn?: string;\n /** 重新生成(ADR-089):发 response.regenerate 重跑指定 assistant 段,不发新 prompt;必须配 --resume/--conversation。 */\n regenerateFrom?: string;\n /** issue #64:附件路径(可重复),上传后随消息发送。 */\n attach?: string[];\n}\n\n/** parseInjectOn 结果:收到首个 eventType 事件后触发一次注入。 */\nexport interface InjectSpec {\n eventType: string;\n action: 'interrupt' | 'steer';\n /** steer 的 content(必填);interrupt 无此字段。 */\n arg?: string;\n}\n\n/**\n * 解析 --inject-on 取值;格式 `<eventType>:<action>[:<arg>]`。\n * - action ∈ {interrupt, steer}\n * - steer 必须带 arg(content);arg 内可含冒号(只 split 前两段,剩余整体为 arg)\n * - 非法值抛 CliError INVALID_ARGUMENT(fail-fast 在发请求前)\n */\nexport function parseInjectOn(s: string): InjectSpec {\n const fail = (detail: string): never => {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--inject-on 格式 <eventType>:<action>[:<arg>],action ∈ {interrupt, steer}(steer 必须带 content);${detail},收到 \"${s}\"`,\n });\n };\n // 只 split 前两段,剩余整体(含冒号)作为 arg,支持 steer content 内含冒号。\n const firstColon = s.indexOf(':');\n if (firstColon < 0) return fail('缺少 action 段');\n const eventType = s.slice(0, firstColon);\n const rest = s.slice(firstColon + 1);\n const secondColon = rest.indexOf(':');\n const action = secondColon < 0 ? rest : rest.slice(0, secondColon);\n const arg = secondColon < 0 ? undefined : rest.slice(secondColon + 1);\n\n if (!eventType) return fail('eventType 段为空');\n if (action === 'interrupt') {\n if (arg !== undefined) return fail('interrupt 不接受 arg');\n return { eventType, action: 'interrupt' };\n }\n if (action === 'steer') {\n if (arg === undefined || arg === '') return fail('steer 必须带 content(arg)');\n return { eventType, action: 'steer', arg };\n }\n return fail(`未知 action \"${action}\"`);\n}\n\n/** 解析 --on-confirm 取值;非法值在发请求前 fail-fast。 */\nexport function parseOnConfirm(s: string): { decision: 'approve' } | { decision: 'reject'; reason?: string } {\n if (s === 'approve') return { decision: 'approve' };\n if (s === 'reject') return { decision: 'reject' };\n if (s.startsWith('reject:')) return { decision: 'reject', reason: s.slice('reject:'.length) };\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--on-confirm 取值 approve | reject | reject:<reason>,收到 \"${s}\"`,\n });\n}\n\nexport function resolveResumeConversation(args: Pick<ChatArgs, 'resume' | 'conversation'>): string | undefined {\n if (args.resume && args.conversation) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--resume 和 --conversation 不能同时使用;新命令请用 --resume <conversationId>',\n });\n }\n if (args.resume === 'NEW') {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--resume 需要既存 conversationId;新会话请直接省略 --resume',\n });\n }\n const id = args.resume ?? args.conversation;\n if (!id || id === 'NEW') return undefined;\n return id;\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number, flag: string): number {\n const n = Number(value ?? fallback);\n if (!Number.isInteger(n) || n <= 0) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `${flag} 需要正整数,收到 \"${value}\"`,\n });\n }\n return n;\n}\n\nfunction formatShortDate(value: unknown): string {\n if (typeof value !== 'string' || value.trim() === '') return '-';\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return value.replace('T', ' ').slice(0, 16);\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\nfunction oneLine(value: unknown, max = 36): string {\n const text = String(value ?? '').replace(/\\s+/g, ' ').trim();\n if (!text) return '-';\n return text.length > max ? text.slice(0, Math.max(0, max - 1)) + '…' : text;\n}\n\nexport function resolveEventsConversation(\n args: Pick<ChatArgs, 'events' | 'resume' | 'conversation'>,\n): string | undefined {\n if (!args.events) return undefined;\n const resumeConversationId = resolveResumeConversation(args);\n const eventConversationId = typeof args.events === 'string' ? args.events.trim() : undefined;\n if (eventConversationId === 'NEW') {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--events 需要既存 conversationId;新会话没有可查询的事件流',\n });\n }\n if (eventConversationId && resumeConversationId && eventConversationId !== resumeConversationId) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--events <conversationId> 与 --resume/--conversation 指向不同会话;请只保留一个 id',\n });\n }\n const id = eventConversationId || resumeConversationId;\n if (!id) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '查询事件流请传 `hcm chat --events <conversationId>`,或 `hcm chat --resume <conversationId> --events`',\n });\n }\n return id;\n}\n\nfunction eventAgent(value: Record<string, unknown>): string {\n return oneLine(value.agentPath ?? value.agent ?? value.delegationAgent, 24);\n}\n\nfunction eventScope(value: Record<string, unknown>): string {\n if (value.subLoop === true) return 'sub';\n if (value.subLoop === false) return 'root';\n return '-';\n}\n\nfunction eventStatus(value: Record<string, unknown>): string {\n if (typeof value.status === 'string' && value.status.trim()) return oneLine(value.status, 18);\n if (value.live === true) return 'live';\n const tools = value.tools;\n if (Array.isArray(tools) && tools.length) {\n if (tools.some((tool) => String((tool as Record<string, unknown>).state ?? '').toLowerCase() === 'failed')) {\n return 'failed';\n }\n if (tools.some((tool) => String((tool as Record<string, unknown>).state ?? '').toLowerCase() === 'running')) {\n return 'running';\n }\n return 'done';\n }\n return '-';\n}\n\nfunction stableJson(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value ?? '');\n }\n}\n\nfunction eventPreview(value: Record<string, unknown>): string {\n for (const key of ['text', 'content', 'summary', 'question', 'detail', 'message']) {\n if (typeof value[key] === 'string' && value[key].trim()) return oneLine(value[key], 86);\n }\n const tools = value.tools;\n if (Array.isArray(tools) && tools.length) {\n return oneLine(\n tools.map((tool) => {\n const t = tool as Record<string, unknown>;\n return `${String(t.toolName ?? t.name ?? '-')}:${String(t.state ?? t.status ?? '-')}`;\n }).join(' · '),\n 86,\n );\n }\n const activityLog = value.activityLog;\n if (Array.isArray(activityLog) && activityLog.length) {\n return oneLine(\n activityLog.map((item) => {\n const a = item as Record<string, unknown>;\n return String(a.detail ?? a.label ?? a.kind ?? '');\n }).filter(Boolean).join(' · '),\n 86,\n );\n }\n const part = value.part;\n if (part && typeof part === 'object') return oneLine(stableJson(part), 86);\n return oneLine(stableJson(value), 86);\n}\n\nasync function printConversationEvents(conversationId: string, args: ChatArgs): Promise<void> {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const items = await fetchConversationTimelineStrict(client.raw(), conversationId);\n const fmt: ChatOutputFormat = args.output ?? 'text';\n\n if (args.raw) {\n for (const item of items) {\n process.stdout.write(JSON.stringify({ conversationId, ...item }) + '\\n');\n }\n return;\n }\n\n if (fmt === 'json') {\n process.stdout.write(formatObject({ conversationId, count: items.length, events: items }, { format: 'json' }) + '\\n');\n return;\n }\n\n process.stdout.write(`conversation events: ${conversationId}\\n`);\n if (!items.length) {\n process.stdout.write('No timeline events.\\n');\n return;\n }\n\n const rows = items.map((item) => {\n const value = item as unknown as Record<string, unknown>;\n return {\n SEQ: value.seq ?? '-',\n KIND: oneLine(value.kind, 18),\n AGENT: eventAgent(value),\n SCOPE: eventScope(value),\n STATUS: eventStatus(value),\n EVENT: eventPreview(value),\n };\n });\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n process.stdout.write(`Showing ${items.length} event${items.length === 1 ? '' : 's'}.\\n`);\n process.stdout.write(`raw: hcm chat --events ${conversationId} --raw\\n`);\n}\n\nasync function printConversationList(args: ChatArgs): Promise<void> {\n if (args.events || args.resume || args.conversation || args.regenerateFrom || args.promptFile) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--list 只用于列会话;不要同时传 --events/--resume/--conversation/--regenerate-from/--prompt-file',\n });\n }\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const limit = parsePositiveInt(args.limit, 10, '--limit');\n const result = await fetchRecentConversations(client.raw(), limit);\n const fmt: ChatOutputFormat = args.output ?? 'text';\n if (fmt === 'json') {\n process.stdout.write(formatObject(result, { format: 'json' }) + '\\n');\n return;\n }\n const rows = result.rows.map((row) => ({\n UPDATED: formatShortDate(row.lastActiveAt ?? row.updateTime ?? row.createTime),\n MSGS: row.messageCount ?? 0,\n TOKENS: row.totalTokens ?? 0,\n TITLE: oneLine(row.title ?? row.lastMessagePreview ?? row.summary, 34),\n CONVERSATION: row.id ?? '-',\n }));\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n if (result.total !== undefined) {\n process.stdout.write(`Showing ${result.rows.length} of ${result.total} conversations.\\n`);\n }\n}\n\nexport async function chatCommand(prompt: string | undefined, args: ChatArgs): Promise<void> {\n try {\n if (args.list) {\n if (prompt) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--list 不接受 prompt;用 `hcm chat --list` 查看最近会话',\n });\n }\n await printConversationList(args);\n process.exit(0);\n }\n\n const eventsConversationId = resolveEventsConversation(args);\n if (eventsConversationId) {\n if (prompt || args.promptFile || args.regenerateFrom || args.attach?.length) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--events 是只读查询;不要同时传 prompt/--prompt-file/--regenerate-from/--attach',\n });\n }\n await printConversationEvents(eventsConversationId, args);\n process.exit(0);\n }\n\n // --regenerate-from:不发新 prompt(重跑用原 user message),不进 REPL;\n // fail-fast:seq 必须正整数,且必须指定既存 conversation(缺省会开新会话,无段可重跑)。\n let regenerateFromSeq: number | undefined;\n let regenerateFromLastAssistant = false;\n const regenerateMode = args.regenerateFrom !== undefined;\n const requestedConversationId = resolveResumeConversation(args);\n if (args.regenerateFrom !== undefined) {\n if (args.regenerateFrom === 'last-assistant') {\n regenerateFromLastAssistant = true;\n } else {\n regenerateFromSeq = Number(args.regenerateFrom);\n if (!Number.isInteger(regenerateFromSeq) || regenerateFromSeq <= 0) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--regenerate-from 需要正整数 journal seq 或 last-assistant,收到 \"${args.regenerateFrom}\"`,\n });\n }\n }\n if (!requestedConversationId) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--regenerate-from 必须配合 --resume <既存会话 id>(重跑既存段,无新 prompt)',\n });\n }\n prompt = prompt ?? '';\n }\n if (!prompt && !args.promptFile && !regenerateMode) {\n // ADR-129:REPL = Ink App(手搓 readline 版已退役,delete-on-supersede)。\n const { runInkRepl } = await import('../repl/run');\n return runInkRepl(args);\n }\n if (args.promptFile) {\n prompt = await fs.readFile(args.promptFile, 'utf-8');\n }\n if (prompt === undefined || (!prompt && !regenerateMode)) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: 'prompt is required (positional or --prompt-file)',\n });\n }\n\n // --on-confirm 在发任何请求前校验(非法值 fail-fast),渲染 / raw 两分支复用解析结果。\n const onConfirm = args.onConfirm ? parseOnConfirm(args.onConfirm) : undefined;\n // --inject-on 同样在发请求前 fail-fast(仅 --raw 分支会消费;渲染分支忽略不崩)。\n const injectOn = args.injectOn ? parseInjectOn(args.injectOn) : undefined;\n\n const ctx = await getActiveAuthContextFromCli(args);\n const wsUrl = ctx.endpoint.replace(/^http/, 'ws') + '/ws/conversation';\n const client = HcmClient.fromAuthContext(ctx);\n // Conversation state key — keyed on env name (T15: was `profile`).\n const stateKey = ctx.env;\n\n // Resolve agentId: --agent <UUID> wins, else default analyst.\n const agentId = args.agent ?? DEFAULT_AGENT_ID;\n\n // Resolve conversationId: explicit --resume / legacy --conversation > create new.\n let resumeConversationId = requestedConversationId;\n // 刀⑤ 续聊回放:仅显式续接已有会话时回显上下文摘要;默认 chat 一律开新会话。\n const resumedExisting = !!resumeConversationId;\n if (!resumeConversationId) {\n const conv = await createConversation(client.raw(), agentId);\n resumeConversationId = conv.id;\n }\n if (regenerateFromLastAssistant) {\n const items = await fetchConversationTimeline(client.raw(), resumeConversationId);\n const lastSeq = findLastAssistantSeq(items);\n if (lastSeq == null) {\n throw new CliError({\n code: CliErrorCode.BUSINESS_RULE_VIOLATION,\n message: `--regenerate-from last-assistant 找不到可重跑的 chat-text seq: conversation=${resumeConversationId}`,\n });\n }\n regenerateFromSeq = lastSeq;\n }\n\n const ws = new WsClient({\n endpoint: wsUrl,\n getAccessToken: () => client.getAccessToken(),\n onTokenExpiring: () => client.handleRefresh(),\n });\n await ws.connect();\n\n const fmt: ChatOutputFormat = args.output ?? 'text';\n\n // `--output json` is the script-friendly final result object. Raw protocol\n // JSONL remains available through `--raw`.\n const streamOutput = !!args.stream && (fmt !== 'json' || !!args.raw);\n if (streamOutput) {\n const { StreamPresenter } = await import('../streaming/StreamPresenter');\n const { TerminalRenderer } = await import('../streaming/TerminalRenderer');\n\n const isTty = !!process.stdout.isTTY;\n // commander `--no-xxx` 把 args.xxx 设 false, 未传时 undefined.\n // 默认: tty 自动开 (markdown/spinner/color); thinking 默认开; showToolCalls 由独立 flag 控.\n // commander `--no-xxx` 设 args.xxx=false, --xxx 设 true, 未传 undefined.\n // 默认: tty 自动开 markdown/spinner/color; thinking 默认开 (折叠); tool calls 默认显示 name.\n // verbose 由 args.verboseThinking / args.verboseTools 控制 (传了 → 展开内容).\n const renderer = new TerminalRenderer({\n markdown: args.markdown === false ? false : isTty,\n showThinking: args.thinking === false ? false : true,\n verboseThinking: !!args.verboseThinking,\n showToolCalls: args.showToolCalls !== false,\n verboseTools: !!args.verboseTools,\n spinner: args.spinner === false ? false : isTty,\n color: args.color === false ? false : isTty,\n apiBase: client.endpoint,\n });\n const presenter = new StreamPresenter(renderer, {\n showToolCalls: args.showToolCalls !== false,\n output: fmt,\n });\n\n // 刀⑤ 续聊回放(对标 Claude Code resume):续接已有会话时回显「↻ 续接 + 最近\n // 轮摘要」。仅 TTY + text 渲染分支——管道/CI/--raw 输出保持纯净;拉取失败静默跳过。\n if (resumedExisting && isTty && fmt === 'text' && !args.raw) {\n const { fetchConversationTimeline, buildResumeSummary } = await import('@hcmai/sdk');\n const items = await fetchConversationTimeline(client.raw(), resumeConversationId);\n const summary = items ? buildResumeSummary(resumeConversationId, items) : null;\n if (summary) renderer.showResumeContext(summary);\n }\n\n // issue #64:--attach 上传本地文件,元数据随 message.create 发送。\n let chatAttachments: AttachmentMeta[] | undefined;\n if (args.attach?.length) {\n const { uploadDocument } = await import('@hcmai/sdk');\n chatAttachments = [];\n for (const fp of args.attach) {\n const meta = await uploadDocument(client.raw(), fp);\n chatAttachments.push(meta);\n if (fmt === 'text' && !args.raw) process.stderr.write(`📎 已上传 ${meta.fileName} (${meta.documentId})\\n`);\n }\n }\n // 行内裸绝对路径(无 @ 前缀)也自动上传,与 REPL 同手势——防裸路径漏进 prompt 文本被\n // 当散文传给 LLM → 幻觉成别的路径。剥离路径、文本为空时给占位。\n if (prompt) {\n const { extractInlineFilePaths } = await import('../utils/attachment-args');\n const inline = extractInlineFilePaths(prompt);\n if (inline.paths.length) {\n const { uploadDocument } = await import('@hcmai/sdk');\n chatAttachments = chatAttachments ?? [];\n for (const fp of inline.paths) {\n const meta = await uploadDocument(client.raw(), fp);\n chatAttachments.push(meta);\n if (fmt === 'text' && !args.raw) process.stderr.write(`📎 已上传 ${meta.fileName} (${meta.documentId})\\n`);\n }\n prompt = inline.cleaned || '请处理这些附件';\n }\n }\n const handle = await sendMessageAndStream(ws, prompt, {\n agentId,\n conversationId: resumeConversationId,\n attachments: chatAttachments,\n // 决策回发后继续消费 resume 流到真终态(B3):--raw 与渲染分支同享。\n // 凡可能回发决策的路径都要 hold(否则 HALT 的 ROOT message.stop 被当终态,\n // resume 段内容 + control.interaction.resolved 反馈丢失)。\n // - --raw:仅 --on-confirm/--on-ask 会回发决策(--inject-on 走 interrupt/steer 不 HALT);\n // - 渲染分支:交互式 TTY / --auto-approve / 覆盖项均可能回发 → 一律 hold(G4 终局反馈依赖 resume 段可达)。\n holdUntilInteractionTerminal: args.raw\n ? !!onConfirm || args.onAsk !== undefined\n : true,\n regenerateFromSeq,\n });\n\n // --raw 示波器:逐行打印原始 v4/control envelope(L1 ground truth),不渲染。\n if (args.raw) {\n handle.onControl((ev) => process.stdout.write(JSON.stringify(ev) + '\\n'));\n // --on-confirm / --on-ask:raw 模式也程序化回发决策(P0 runner 依赖),打印与注入互不干扰。\n if (onConfirm || args.onAsk !== undefined) {\n const { resolveInteraction } = await import('../streaming/control-prompt');\n handle.onControl((ev) => {\n if (ev.type !== 'control.interaction.request') return;\n void (async () => {\n const req = parseInteractionRequest(ev.payload);\n const d = await resolveInteraction(req, {\n isTty: false,\n autoApprove: false,\n onConfirm,\n onAsk: args.onAsk,\n readLine: async () => {\n throw new Error('unreachable: override decisions never read stdin');\n },\n });\n if (d.decision === 'confirm') {\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n } else if (d.decision === 'reject') {\n handle.sendCommand(buildReject(req.interactionId, handle.conversationId, d.reason));\n } else if (d.decision === 'answer') {\n handle.sendCommand(buildAnswer(req.interactionId, handle.conversationId, d.answer, d.choiceIndex));\n }\n })();\n });\n }\n // --inject-on:流中途注入命令(P0 S-interrupt / S-steer 前置)。收到首个匹配\n // eventType 且非 control 通道的展示流事件后,发对应命令并打印 _cli marker(只触发一次)。\n let injected = false;\n for await (const ev of handle.events) {\n process.stdout.write(JSON.stringify(ev) + '\\n');\n if (\n injectOn &&\n !injected &&\n ev.type === injectOn.eventType &&\n (ev as { channel?: string }).channel !== 'control'\n ) {\n injected = true;\n if (injectOn.action === 'interrupt') {\n handle.sendCommand(buildInterrupt(handle.conversationId));\n } else {\n // parseInjectOn 已保证 steer 必有 arg(content)。\n handle.sendCommand(buildSteer(injectOn.arg as string, handle.conversationId));\n }\n // marker:channel=\"_cli\" 让 P0 断言层可过滤;payload 采用统一 envelope 形态。\n // 顶层 action/at 暂留兼容旧 P0 断言。\n const at = Date.now();\n process.stdout.write(\n JSON.stringify({\n channel: '_cli',\n type: '_cli.inject.sent',\n action: injectOn.action,\n at,\n conversationId: handle.conversationId,\n payload: {\n eventType: injectOn.eventType,\n action: injectOn.action,\n content: injectOn.action === 'steer' ? injectOn.arg : undefined,\n at,\n },\n }) + '\\n',\n );\n }\n }\n await ws.close();\n await saveConversationState(stateKey, {\n lastConversationId: handle.conversationId,\n updatedAt: new Date().toISOString(),\n });\n // 显式 drain stdout 防 process.exit 截断末行(pipe/CI 模式,与渲染分支同款)。\n await new Promise<void>((resolve) => {\n if (process.stdout.writableNeedDrain) {\n process.stdout.once('drain', resolve);\n } else {\n resolve();\n }\n });\n process.exit(0);\n }\n\n // 控制通道:confirm/ask 内联 stdin 交互;决策回发 approval.* / interaction.answer。\n const { resolveInteraction } = await import('../streaming/control-prompt');\n const { readLineFromStdin } = await import('../io/readline');\n handle.onControl((ev) => {\n // G4:决策受理 / 终局反馈(ADR-125)——用户 approve/reject/answer 后不再视觉空白。\n if (ev.type === 'control.interaction.resolved') {\n const r = parseInteractionResolved(ev.payload);\n if (r.phase === 'RESUMED') renderer.interactionResumed();\n else if (r.phase === 'TERMINAL') renderer.interactionTerminal((ev.payload.status as string) || undefined);\n return;\n }\n if (ev.type !== 'control.interaction.request') return;\n void (async () => {\n const req = parseInteractionRequest(ev.payload);\n if (req.kind === 'CONFIRM') renderer.confirmCard(req);\n else renderer.askCard(req);\n const decision = await resolveInteraction(req, {\n isTty: !!process.stdin.isTTY,\n autoApprove: !!args.autoApprove,\n onConfirm,\n onAsk: args.onAsk,\n readLine: readLineFromStdin,\n });\n if (decision.decision === 'confirm') {\n if (args.autoApprove) renderer.autoApproved(req.toolName, req.summary);\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n } else if (decision.decision === 'reject') {\n handle.sendCommand(buildReject(req.interactionId, handle.conversationId, decision.reason));\n } else if (decision.decision === 'answer') {\n handle.sendCommand(\n buildAnswer(req.interactionId, handle.conversationId, decision.answer, decision.choiceIndex),\n );\n } else {\n // 关键发现#1 RCA + 真流实测证实:ASK 在非交互(非 TTY)且无 --on-ask 兜底时\n // decision='error'。旧逻辑只 showInterrupted 打印、不回发命令 → 引擎挂起等应答、\n // consume 因 holdUntilInteractionTerminal 永等 interaction terminal → 双向死等挂死。\n // 实测发现仅发 response.interrupt(handle.cancel)不足以救场——后端在 ASK HALT\n // 状态对 interrupt 不回终态事件;且 ws.close() 主动关不广播 disconnect、不解\n // iterator hold。唯一可靠兜底:best-effort 通知后端中止 + CLI 主动退出进程\n // (130=中断语义),杜绝挂死,让自动化/CI 调用能以非零码感知「ASK 未应答」。\n renderer.showInterrupted(decision.reason);\n handle.cancel('ASK_UNANSWERABLE');\n await ws.close().catch(() => undefined);\n process.exit(130);\n }\n })();\n });\n\n // Ctrl+C abort handler — handle.cancel 发 response.interrupt(buildInterrupt);后端回 message.stop(interrupted) 后 iterator 终态.\n const sigintHandler = (): void => {\n process.stderr.write(chalk.yellow('\\n^C 中断中...\\n'));\n handle.cancel('USER_CANCEL');\n };\n process.once('SIGINT', sigintHandler);\n\n const t0 = Date.now();\n try {\n const result = await presenter.consume(handle.events);\n // G6:终态行带 in/out token 分解 + 工具/委派计数(流中统计)。\n const stats = presenter.completionStats;\n renderer.showCompleted(Date.now() - t0, result.traceId, handle.conversationId, presenter.tokenCount || undefined, {\n inputTokens: stats.inputTokens,\n outputTokens: stats.outputTokens,\n toolCount: stats.toolCount,\n delegationCount: stats.delegationCount,\n });\n await ws.close();\n await saveConversationState(stateKey, {\n lastConversationId: handle.conversationId,\n lastStreamId: result.streamId,\n lastTraceId: result.traceId ?? undefined,\n lastAgentKey: args.agent,\n updatedAt: new Date().toISOString(),\n });\n process.removeListener('SIGINT', sigintHandler);\n // 显式 drain stdout 防 process.exit 提前关掉 pipe (CI / pipe 模式下 0-byte bug)\n await new Promise<void>((resolve) => {\n if (process.stdout.writableNeedDrain) {\n process.stdout.once('drain', resolve);\n } else {\n resolve();\n }\n });\n process.exit(result.status === 'interrupted' ? 130 : 0);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n process.removeListener('SIGINT', sigintHandler);\n await ws.close();\n throw new CliError({\n code: e.code ?? CliErrorCode.BUSINESS_RULE_VIOLATION,\n message: e.message,\n traceId: e.traceId ?? undefined,\n });\n }\n }\n\n // 非流式\n const r = await oneShot(ws, prompt, {\n agentId,\n conversationId: resumeConversationId,\n collectEvents: fmt === 'json',\n });\n await ws.close();\n await saveConversationState(stateKey, {\n lastConversationId: r.conversationId,\n lastStreamId: r.streamId,\n lastTraceId: r.traceId ?? undefined,\n lastAgentKey: args.agent,\n updatedAt: new Date().toISOString(),\n });\n\n if (fmt === 'json') {\n process.stdout.write(\n formatObject(\n {\n conversationId: r.conversationId,\n streamId: r.streamId,\n traceId: r.traceId,\n messages: [{ role: 'assistant', content: r.content, toolCalls: r.toolCalls }],\n elapsedMs: r.elapsedMs,\n stopReason: r.stopReason,\n tokens: r.tokens,\n events: r.events,\n },\n { format: 'json' },\n ) + '\\n',\n );\n } else {\n if (args.showToolCalls) {\n for (const tc of r.toolCalls) {\n const mark = tc.success ? '✓' : '✗';\n const label = tc.argsPreview ? ` ${tc.argsPreview}` : '';\n process.stdout.write(\n chalk.gray(`[tool] ${tc.name}${label} ${mark} ${tc.elapsedMs}ms\\n`),\n );\n }\n }\n process.stdout.write(r.content + '\\n');\n process.stdout.write(\n chalk.dim(\n `\\n✓ done (${r.elapsedMs}ms · traceId ${r.traceId} · conversation ${r.conversationId})\\n`,\n ),\n );\n }\n process.exit(0);\n } catch (e) {\n exitWithError(e);\n }\n}\n","import { downloadDocument } from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { HcmClient } from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DownloadArgs {\n output?: string;\n env?: string;\n as?: string;\n}\n\n/**\n * `hcm download <documentId>`(issue #64):认证下载 HCM 文档到本地。\n * 会话附件 / 报表产物的 documentId 均可(timeline 回放与 ⬇ 行打印的 id 直接复用)。\n */\nexport async function downloadCommand(documentId: string, args: DownloadArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const saved = await downloadDocument(client.raw(), { documentId }, args.output);\n process.stdout.write(saved + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const status = (e as any)?.response?.status;\n if (status === 401 || status === 403) {\n exitWithError(new Error(`下载未授权(${status})——请 hcm login 后重试`));\n } else if (status === 404) {\n exitWithError(new Error('文档不存在或已清理(404)——核对 documentId'));\n } else {\n exitWithError(e);\n }\n }\n}\n","import { HcmClient, formatObject, formatRows, fromAxiosError, type OutputFormat } from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface TraceArgs {\n span?: string;\n limit?: string;\n events?: boolean;\n raw?: boolean;\n output?: OutputFormat;\n /** 会话 UUID:查 PG llm_call_trace 逐调用详情(ADR-134 D2) */\n conv?: string;\n /** 与 `hcm trace <convId> --llm-calls` 等价:把位置参当 convId 查 LLM 逐调用 */\n llmCalls?: boolean;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n}\n\n/** ADR-134 D2 · /api/moirai/conversations/{convId}/llm-trace 单行(后端干净投影)。 */\ninterface LlmTraceRow {\n roundNumber?: number | null;\n agentPath?: string | null;\n modelName?: string | null;\n finishReason?: string | null;\n promptTokens?: number | null;\n completionTokens?: number | null;\n totalTokens?: number | null;\n latencyMs?: number | null;\n responseToolCalls?: unknown;\n calledAt?: number | null;\n code?: string | null;\n}\n\ninterface TempoSpan {\n service?: string;\n operation?: string;\n durationMs?: number;\n status?: string;\n errorMessage?: string | null;\n [k: string]: unknown;\n}\n\ninterface LokiLog {\n time?: string;\n level?: string;\n service?: string;\n msg?: string;\n exception?: string;\n [k: string]: unknown;\n}\n\ninterface LlmContent {\n agentKey?: string;\n callType?: string;\n model?: string;\n roundNumber?: number;\n systemPromptHash?: string;\n systemPromptLen?: number;\n [k: string]: unknown;\n}\n\ninterface SourceResult {\n found?: boolean;\n reason?: string;\n spans?: TempoSpan[];\n logs?: LokiLog[];\n llmContent?: LlmContent[];\n [k: string]: unknown;\n}\n\ninterface TraceAggregate {\n traceId?: string;\n sources?: { ssoAudit?: SourceResult; loki?: SourceResult; tempo?: SourceResult };\n}\n\ninterface TraceSummary {\n traceId?: string;\n rootService?: string;\n rootOperation?: string;\n startTimeMs?: number;\n durationMs?: number;\n}\n\ninterface RecentResult {\n found?: boolean;\n reason?: string;\n traces?: TraceSummary[];\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number, flag: string): number {\n const n = Number(value ?? fallback);\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(`${flag} 需要正整数,收到 \"${value}\"`);\n }\n return n;\n}\n\nfunction fmtDuration(ms: number | undefined): string {\n const n = Number(ms ?? 0);\n if (!Number.isFinite(n) || n <= 0) return '-';\n if (n < 1000) return `${Math.round(n)}ms`;\n return `${(n / 1000).toFixed(1)}s`;\n}\n\nfunction toLocalTime(ms: number | undefined): string {\n if (!ms) return '-';\n const d = new Date(ms);\n if (Number.isNaN(d.getTime())) return '-';\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\nfunction short(value: unknown, max: number = 72): string {\n const text = String(value ?? '').replace(/\\s+/g, ' ').trim();\n if (!text) return '-';\n return text.length > max ? text.slice(0, Math.max(0, max - 1)) + '…' : text;\n}\n\nfunction sourceMark(src: SourceResult | undefined): string {\n if (src?.found) return 'yes';\n return src?.reason ? `no: ${short(src.reason, 40)}` : 'no';\n}\n\nfunction deriveStatus(spans: TempoSpan[]): string {\n if (spans.some((sp) => String(sp.status ?? '').toUpperCase() === 'ERROR')) return 'ERROR';\n if (spans.length > 0) return 'OK';\n return 'UNKNOWN';\n}\n\nfunction traceDuration(spans: TempoSpan[]): string {\n const root = spans.find((sp) => Number(sp.durationMs ?? 0) > 0) ?? spans[0];\n return fmtDuration(root?.durationMs);\n}\n\nfunction printRecent(data: RecentResult, limit: number): void {\n const traces = data.traces ?? [];\n if (!traces.length) {\n process.stdout.write(`No recent traces${data.reason ? `: ${data.reason}` : ''}.\\n`);\n return;\n }\n\n const rows = traces.slice(0, limit).map((t) => ({\n TIME: toLocalTime(t.startTimeMs),\n DURATION: fmtDuration(t.durationMs),\n SERVICE: short(t.rootService, 18),\n OPERATION: short(t.rootOperation, 36),\n TRACE: t.traceId ?? '-',\n }));\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n process.stdout.write(`Showing ${rows.length} trace${rows.length === 1 ? '' : 's'}.\\n`);\n process.stdout.write('next: hcm trace <traceId> | hcm trace <traceId> --events | hcm trace <traceId> --raw\\n');\n}\n\nfunction printTraceDetail(traceId: string, agg: TraceAggregate): void {\n const tempo = agg.sources?.tempo;\n const loki = agg.sources?.loki;\n const sso = agg.sources?.ssoAudit;\n const spans = tempo?.spans ?? [];\n const logs = loki?.logs ?? [];\n const llm = loki?.llmContent ?? [];\n\n process.stdout.write(`trace: ${traceId}\\n`);\n process.stdout.write(`status: ${deriveStatus(spans)}\\n`);\n process.stdout.write(`duration: ${traceDuration(spans)}\\n`);\n process.stdout.write(`sources: tempo=${sourceMark(tempo)} · loki=${sourceMark(loki)} · ssoAudit=${sourceMark(sso)}\\n`);\n process.stdout.write(`spans: ${spans.length} · logs: ${logs.length} · llmContent: ${llm.length}\\n`);\n\n if (spans.length) {\n const rows = spans.slice(0, 12).map((sp, i) => ({\n '#': i + 1,\n STATUS: sp.status ?? '-',\n DURATION: fmtDuration(sp.durationMs),\n SERVICE: short(sp.service, 20),\n OPERATION: short(sp.operation, 48),\n }));\n process.stdout.write('\\nTempo spans:\\n');\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n if (spans.length > rows.length) process.stdout.write(`... ${spans.length - rows.length} more spans\\n`);\n } else if (tempo?.reason) {\n process.stdout.write(`\\nTempo: ${tempo.reason}\\n`);\n }\n\n if (logs.length) {\n const rows = logs.slice(0, 8).map((log) => ({\n TIME: short(log.time, 19),\n LEVEL: short(log.level, 8),\n MESSAGE: short(log.msg ?? log.exception, 90),\n }));\n process.stdout.write('\\nLoki logs:\\n');\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n if (logs.length > rows.length) process.stdout.write(`... ${logs.length - rows.length} more logs\\n`);\n } else if (loki?.reason) {\n process.stdout.write(`\\nLoki: ${loki.reason}\\n`);\n }\n\n process.stdout.write('\\nnext: hcm trace <traceId> --events | hcm trace <traceId> --raw\\n');\n}\n\nfunction printTraceEvents(traceId: string, agg: TraceAggregate): void {\n const spans = agg.sources?.tempo?.spans ?? [];\n const logs = agg.sources?.loki?.logs ?? [];\n const llm = agg.sources?.loki?.llmContent ?? [];\n const rows: Record<string, unknown>[] = [];\n\n spans.forEach((sp, i) => rows.push({\n '#': i + 1,\n TYPE: 'span',\n STATUS: sp.status ?? '-',\n DURATION: fmtDuration(sp.durationMs),\n EVENT: short(`${sp.service ?? '-'} · ${sp.operation ?? '-'}`, 84),\n }));\n logs.forEach((log, i) => rows.push({\n '#': `L${i + 1}`,\n TYPE: 'log',\n STATUS: short(log.level, 8),\n DURATION: short(log.time, 19),\n EVENT: short(log.msg ?? log.exception, 84),\n }));\n llm.forEach((item, i) => rows.push({\n '#': `M${i + 1}`,\n TYPE: 'llm',\n STATUS: short(item.callType, 12),\n DURATION: item.roundNumber == null ? '-' : `round ${item.roundNumber}`,\n EVENT: short(`${item.agentKey ?? '-'} · ${item.model ?? '-'} · prompt ${item.systemPromptHash ?? '?'} (${item.systemPromptLen ?? 0})`, 84),\n }));\n\n process.stdout.write(`trace events: ${traceId}\\n`);\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n}\n\n/** ConversationModel 列表行(PG 兜底视图,字段来自 dev-machine 实测)。 */\ninterface ConversationRow {\n id?: string;\n title?: string | null;\n createTime?: string | null;\n lastActiveAt?: string | null;\n messageCount?: number | null;\n totalTokens?: number | null;\n}\n\n/**\n * list 模式:优先 Tempo `/api/trace/recent`;Tempo 不可用(未起观测栈 / 空结果)时回退\n * PG 会话视图(查 ConversationModel,离线可用)。回退给出的是「最近会话」而非 Tempo trace,\n * 用户可据此 `hcm trace --conv <CONV>` 看逐调用。\n */\nasync function listRecentTraces(\n client: InstanceType<typeof HcmClient>,\n limit: number,\n): Promise<void> {\n const http = client.raw();\n try {\n const resp = await http.get('/api/trace/recent', { params: { limit } });\n const data = (resp.data ?? {}) as RecentResult;\n if (data.traces && data.traces.length) {\n printRecent(data, limit);\n return;\n }\n process.stdout.write(\n `Tempo 无最近 trace${data.reason ? `(${short(data.reason, 60)})` : ''},回退 PG 会话视图:\\n\\n`,\n );\n } catch (e) {\n const reason = (e as { message?: string })?.message ?? 'Tempo 不可用';\n process.stdout.write(`Tempo 不可用(${short(reason, 60)}),回退 PG 会话视图:\\n\\n`);\n }\n await listRecentConversationsPg(client, limit);\n}\n\n/** PG 兜底:列最近会话(ConversationModel),供 `hcm trace --conv <id>` 深入。 */\nasync function listRecentConversationsPg(\n client: InstanceType<typeof HcmClient>,\n limit: number,\n): Promise<void> {\n let rows: ConversationRow[];\n try {\n const res = await client.query<ConversationRow>('ConversationModel', {\n sort: [{ field: 'lastActiveAt', direction: 'desc' }],\n limit,\n });\n rows = res.rows;\n } catch (e) {\n process.stdout.write(`PG 会话视图也失败:${short((e as { message?: string })?.message, 80)}\\n`);\n return;\n }\n if (!rows.length) {\n process.stdout.write('无最近会话。\\n');\n return;\n }\n const table = rows.map((c) => ({\n TIME: short(c.lastActiveAt ?? c.createTime, 19),\n TITLE: short(c.title, 28),\n MSGS: c.messageCount ?? '-',\n TOKENS: c.totalTokens ?? '-',\n CONV: c.id ?? '-',\n }));\n process.stdout.write(formatRows(table, { format: 'table' }) + '\\n');\n process.stdout.write(`Showing ${rows.length} conversation${rows.length === 1 ? '' : 's'}(PG 视图)。\\n`);\n process.stdout.write('next: hcm trace --conv <CONV>(看该会话 LLM 逐调用,含委派子会话)\\n');\n}\n\n/**\n * 从 response_tool_calls(后端已解析成对象/数组,或解析失败的原始字符串)抽 tool name 列表。\n * 兼容多种 provider 形状:`{name}` / `{function:{name}}` / 顶层包 `{toolCalls:[...]}`。\n */\nfunction extractToolNames(raw: unknown): string {\n if (raw == null) return '-';\n let value: unknown = raw;\n if (typeof value === 'string') {\n const text = value.trim();\n if (!text) return '-';\n try {\n value = JSON.parse(text);\n } catch {\n return short(text, 24);\n }\n }\n let list: unknown[];\n if (Array.isArray(value)) {\n list = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const nested = obj.toolCalls ?? obj.tool_calls ?? obj.calls;\n list = Array.isArray(nested) ? nested : [value];\n } else {\n return '-';\n }\n const names = list\n .map((item) => {\n if (!item || typeof item !== 'object') return null;\n const o = item as Record<string, unknown>;\n const fn = o.function as Record<string, unknown> | undefined;\n const name = o.name ?? fn?.name ?? o.toolName;\n return typeof name === 'string' && name ? name : null;\n })\n .filter((n): n is string => n != null);\n return names.length ? names.join(', ') : '-';\n}\n\nfunction buildLlmTable(rows: LlmTraceRow[]): {\n table: Record<string, unknown>[];\n inSum: number;\n outSum: number;\n} {\n let inSum = 0;\n let outSum = 0;\n const table = rows.map((r) => {\n const pIn = Number(r.promptTokens ?? 0);\n const pOut = Number(r.completionTokens ?? 0);\n inSum += pIn;\n outSum += pOut;\n return {\n ROUND: r.roundNumber ?? '-',\n AGENT: short(r.agentPath, 22),\n MODEL: short(r.modelName, 22),\n TOOLS: short(extractToolNames(r.responseToolCalls), 30),\n 'TOKENS(in/out)': `${pIn}/${pOut}`,\n LATENCY: fmtDuration(r.latencyMs ?? undefined),\n FINISH: short(r.finishReason, 12),\n };\n });\n return { table, inSum, outSum };\n}\n\n/**\n * 打印会话 LLM 逐调用树:根会话 + 递归展开的委派子会话(BUG#2:委派 specialist 的轮次/\n * 工具在离线 PG trace 里可见,不必依赖 Tempo)。子会话 id 由根会话 timeline 的 delegate\n * tool.result(childConversationId)发现。\n */\nfunction printLlmTraceTree(nodes: TraceNode[]): void {\n const root = nodes[0]!;\n const childCount = nodes.length - 1;\n if (!root.rows.length && childCount === 0) {\n process.stdout.write(`No LLM calls for conversation ${root.convId}.\\n`);\n process.stdout.write('next: 确认 convId 正确,或该会话尚无 LLM 调用落库(dev always-on,ADR-134 D2)。\\n');\n return;\n }\n for (const node of nodes) {\n if (node.depth === 0) {\n process.stdout.write(\n `conversation: ${node.convId}${childCount ? `(+${childCount} 委派子会话)` : ''}\\n`,\n );\n } else {\n process.stdout.write(\n `\\n${' '.repeat(node.depth)}└─ 委派 → ${node.label} · ${node.convId}(depth ${node.depth})\\n`,\n );\n }\n const { table, inSum, outSum } = buildLlmTable(node.rows);\n process.stdout.write(`llm calls: ${node.rows.length} · tokens(in/out): ${inSum}/${outSum}\\n\\n`);\n if (table.length) {\n process.stdout.write(formatRows(table, { format: 'table' }) + '\\n');\n } else {\n process.stdout.write('(无 LLM 调用)\\n');\n }\n }\n process.stdout.write('\\nnext: hcm trace --conv <convId> --raw(看完整逐调用 JSON)\\n');\n}\n\nasync function fetchLlmTrace(\n http: ReturnType<InstanceType<typeof HcmClient>['raw']>,\n convId: string,\n): Promise<LlmTraceRow[]> {\n const resp = await http.get(`/api/moirai/conversations/${encodeURIComponent(convId)}/llm-trace`);\n return (resp.data ?? []) as LlmTraceRow[];\n}\n\ninterface TraceNode {\n convId: string;\n depth: number;\n /** 委派该子会话的 agentKey / 工具名(根为 'root')。 */\n label: string;\n rows: LlmTraceRow[];\n}\n\n/**\n * 从会话 timeline 抽出被委派的子会话(kind='tools' 项内 tools[].childConversationId)。\n * timeline 走 ConversationModel action(PG,离线可用);任何失败返回空(递归 best-effort)。\n */\n/**\n * 从 timeline items 抽出被委派子会话(纯函数,供单测守 timeline schema 契约):\n * kind='tools' 项内 tools[].childConversationId,按出现序去重,label 取 agentKey/name/toolName。\n */\nexport function extractChildConvs(\n items: Array<Record<string, unknown>>,\n): Array<{ childConvId: string; label: string }> {\n const out: Array<{ childConvId: string; label: string }> = [];\n const seen = new Set<string>();\n for (const it of items) {\n if (it.kind !== 'tools' || !Array.isArray(it.tools)) continue;\n for (const t of it.tools as Array<Record<string, unknown>>) {\n const child = t.childConversationId;\n if (typeof child === 'string' && child && !seen.has(child)) {\n seen.add(child);\n const label =\n (typeof t.agentKey === 'string' && t.agentKey) ||\n (typeof t.name === 'string' && t.name) ||\n (typeof t.toolName === 'string' && t.toolName) ||\n 'delegate';\n out.push({ childConvId: child, label });\n }\n }\n }\n return out;\n}\n\nasync function fetchChildConvs(\n http: ReturnType<InstanceType<typeof HcmClient>['raw']>,\n convId: string,\n): Promise<Array<{ childConvId: string; label: string }>> {\n let items: Array<Record<string, unknown>> = [];\n try {\n const resp = await http.get(\n `/api/models/ConversationModel/${encodeURIComponent(convId)}/action/timeline`,\n );\n const body = resp.data as unknown;\n if (Array.isArray(body)) items = body as Array<Record<string, unknown>>;\n else if (body && typeof body === 'object' && Array.isArray((body as { data?: unknown }).data)) {\n items = (body as { data: Array<Record<string, unknown>> }).data;\n }\n } catch {\n return [];\n }\n return extractChildConvs(items);\n}\n\n/** DFS 收集根会话 + 委派子会话的 LLM trace(深度上限防环 / 无限递归)。 */\nasync function gatherLlmTraceTree(\n http: ReturnType<InstanceType<typeof HcmClient>['raw']>,\n rootConvId: string,\n maxDepth = 3,\n): Promise<TraceNode[]> {\n const nodes: TraceNode[] = [];\n const visited = new Set<string>();\n async function walk(convId: string, depth: number, label: string): Promise<void> {\n if (visited.has(convId) || depth > maxDepth) return;\n visited.add(convId);\n nodes.push({ convId, depth, label, rows: await fetchLlmTrace(http, convId) });\n if (depth === maxDepth) return;\n for (const c of await fetchChildConvs(http, convId)) {\n await walk(c.childConvId, depth + 1, c.label);\n }\n }\n await walk(rootConvId, 0, 'root');\n return nodes;\n}\n\nexport async function traceCommand(traceId: string | null, args: TraceArgs): Promise<void> {\n try {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const http = client.raw();\n\n // ADR-134 D2:LLM 逐调用模式 — `hcm trace --conv <convId>` 或 `hcm trace <convId> --llm-calls`\n const convId = args.conv ?? (args.llmCalls ? traceId ?? undefined : undefined);\n if (convId) {\n // raw/json/yaml:保持单会话扁平数组(机器契约不变)。\n if (args.raw || args.output === 'json' || args.output === 'yaml') {\n const rows = await fetchLlmTrace(http, convId);\n const fmt = args.raw ? 'json' : (args.output as OutputFormat);\n process.stdout.write(formatObject(rows, { format: fmt }) + '\\n');\n process.exit(0);\n }\n // 人读表格:递归展开委派子会话(BUG#2)。\n printLlmTraceTree(await gatherLlmTraceTree(http, convId));\n process.exit(0);\n }\n\n if (!traceId) {\n if (args.events || args.raw || args.span) {\n exitWithError('traceId is required for --events, --raw, and --span');\n return;\n }\n await listRecentTraces(client, parsePositiveInt(args.limit, 10, '--limit'));\n process.exit(0);\n }\n\n const resp = await http.get(`/api/trace/${traceId}`);\n const agg: TraceAggregate = resp.data ?? {};\n\n if (args.raw) {\n process.stdout.write(formatObject(agg, { format: 'json' }) + '\\n');\n process.exit(0);\n }\n\n if (args.output === 'json' || args.output === 'yaml') {\n process.stdout.write(formatObject(agg, { format: args.output }) + '\\n');\n process.exit(0);\n }\n\n const spans = agg.sources?.tempo?.spans ?? [];\n if (args.span) {\n const idx = parsePositiveInt(args.span, 1, '--span') - 1;\n if (idx < 0 || idx >= spans.length) {\n exitWithError(`Span #${args.span} 越界(共 ${spans.length} 条 Tempo span)`);\n return;\n }\n process.stdout.write(formatObject(spans[idx], { format: 'yaml' }) + '\\n');\n process.exit(0);\n }\n\n if (args.events) {\n printTraceEvents(traceId, agg);\n } else {\n printTraceDetail(traceId, agg);\n }\n process.exit(0);\n } catch (e) {\n const err = e as Record<string, unknown>;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n getCacheStats,\n clearModelCache,\n clearMetaCache,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface CacheArgs {\n id?: string;\n type?: string;\n state?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nasync function withClient<T>(args: CacheArgs, fn: (c: HcmClient) => Promise<T>): Promise<T> {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n return fn(client);\n}\n\nfunction emit(result: unknown, args: CacheArgs, human: string): void {\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(human + '\\n');\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n}\n\nfunction fail(e: unknown, args: CacheArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm cache stats <Model>` —— 查看两级缓存命中统计。 */\nexport async function cacheStatsCommand(model: string, args: CacheArgs): Promise<void> {\n try {\n const stats = await withClient(args, (c) => getCacheStats(c.raw(), model));\n emit(stats, args, `📊 ${model} 缓存统计`);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm cache clear <Model> [--id <id>]` —— 清实体缓存。\n * 幂等且不破坏数据,故不设确认闸。\n */\nexport async function cacheClearCommand(model: string, args: CacheArgs): Promise<void> {\n try {\n const result = await withClient(args, (c) => clearModelCache(c.raw(), model, args.id));\n emit(result, args, args.id ? `🧹 已清 ${model}#${args.id} 缓存` : `🧹 已清 ${model} 全部实体缓存`);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm cache clear-meta <Model> [--type <t>] [--state <s>]` —— 清元数据缓存\n * (Code 级 YAML 配置 + Action 定义)。改 meta YAML 后必跑,否则读到旧配置。\n */\nexport async function cacheClearMetaCommand(model: string, args: CacheArgs): Promise<void> {\n try {\n const result = await withClient(args, (c) =>\n clearMetaCache(c.raw(), model, { type: args.type, state: args.state }),\n );\n const scope = args.type ? `${args.type}${args.state ? `.${args.state}` : ''}` : '全部';\n emit(result, args, `🧹 已清 ${model} 元数据缓存(${scope})`);\n } catch (e) {\n fail(e, args);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n uploadDocument,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface UploadArgs {\n env?: string;\n as?: string;\n output?: OutputFormat;\n /**\n * 存储分类。**必须是目标环境里真实存在的分类**(服务端数据,不是枚举)。\n * 不传时用 `attachment` —— 通用附件分类,比聊天专用的 `ai-conversation` 中性。\n */\n category?: string;\n}\n\n/**\n * 通用上传的缺省分类。\n *\n * <p>🔴 此前 `uploadDocument` 硬编码聊天专用的 `ai-conversation`,于是\n * `hcm upload <任意文件>` 在没有该分类的环境上一律 404。而本命令的注释自己就\n * 写着「报表 xlsx 模板、套打 docx 模板、导入 Excel 都要先拿到 documentId」——\n * 它明知自己在交付路径上,却在用聊天分类。\n */\nconst DEFAULT_UPLOAD_CATEGORY = 'attachment';\n\n/**\n * `hcm upload <file>` —— 上传本地文件到 HCM 文档服务,返回 documentId。\n *\n * 交付路径上的必用动作:报表 xlsx 模板、套打 docx 模板、导入 Excel 都要先拿到\n * documentId 才能挂到业务对象上。与 `hcm download <documentId>` 成对。\n */\nexport async function uploadCommand(filePath: string, args: UploadArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const meta = await uploadDocument(\n client.raw(),\n filePath,\n args.category ?? DEFAULT_UPLOAD_CATEGORY,\n );\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') {\n process.stdout.write(\n `⬆️ ${meta.fileName} (${meta.fileSize} B) → documentId ${meta.documentId}\\n`,\n );\n }\n process.stdout.write(formatObject(meta, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n const status = err?.response?.status;\n if (err?.code === 'ENOENT') {\n exitWithError(new Error(`文件不存在:${filePath}`));\n } else if (status === 413) {\n exitWithError(new Error('文件超出服务端大小上限(413)'));\n } else if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.env));\n } else {\n exitWithError(e);\n }\n }\n}\n","import { promises as fsp } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport {\n createHttpClient,\n fetchSkillCatalog,\n fetchSkillFile,\n fetchSkillMarkdown,\n fetchSkillReference,\n resolveChironBase,\n assertSafeSkillId,\n assertSafeReferencePath,\n normalizeReferences,\n parseSkillRequirements,\n parseSkillFrontmatter,\n resolveSkillInstallOrder,\n resolveAllSkillsInstallOrder,\n matchSkills,\n filterByStage,\n formatObject,\n fromAxiosError,\n loadEnv,\n loadGlobalConfig,\n resolveActiveEnv,\n CliError,\n CliErrorCode,\n type ChironCategory,\n type ChironManifest,\n type ChironSkill,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport {\n buildUnifiedCatalog,\n checkCrossSourceRequires,\n classifyInstalledSource,\n conflictMessage,\n detectIdConflicts,\n parseSourceFilter,\n unconfirmedConflictNote,\n CLI_CATEGORY_KEY,\n CLI_CATEGORY_NAME,\n SOURCE_STATUS_NOTE,\n type SourceFilter,\n type UnifiedCatalog,\n} from './skills-catalog';\nimport { listBundledSkills, readBundledSkillDocument, resolveBundledClosure } from './skills-bundled';\nimport { CLI_VERSION } from '../package-version';\nimport { prepareSkillDocuments, syncWorkBuddyProject } from './skills-sync';\nimport { prepareWorkBuddyRuntime } from './skills-runtime';\n\nexport interface SkillsArgs {\n endpoint?: string;\n env?: string;\n dir?: string;\n global?: boolean;\n from?: string;\n force?: boolean;\n category?: string;\n stage?: string;\n byStage?: boolean;\n /** 装给哪个 agent:claude = .claude/skills/;codex = hcm-skills/ + AGENTS.md 索引;auto = 探目录 */\n target?: 'claude' | 'codex' | 'auto';\n /** `skills update --check`:只报会变什么,不写盘 */\n check?: boolean;\n /**\n * `install --all` / `update --all`:要的是**整个技能库**。\n *\n * 🔴 这是订阅不是快照——它会记进 `.hcm-skills.json`,往后 `update` 按产品**当前**全集\n * 重算,产品新增的技能自动补上。只装一次快照的话,下个版本新增的技能永远不会来。\n */\n all?: boolean;\n /** `skills list --installed`:只读本地清单,不连网 */\n installed?: boolean;\n /**\n * 这一趟看哪些来源:`cli`(只看自带,不连网)/ `chiron`(只看睿戎)/ `all`(缺省)。\n *\n * 🔴 **它是「这一趟」的过滤器,不写进状态文件**(spec §7.3)。\n * 让它把 `state.all` 的订阅缩成半边,这个订阅的含义就取决于它当初是怎么建的,\n * 而状态文件里看不出来——下一个人跑 update 时拿到的行为无法从文件解释。\n * 🔴 它也**不是**冲突消解手段(spec §5.2):那会让同一条命令在两台机器上装出不同内容。\n */\n source?: SourceFilter;\n output?: OutputFormat;\n}\n\nexport interface SkillsSyncArgs extends Omit<SkillsArgs, 'target'> {\n target?: string;\n project?: string;\n cli?: string;\n}\n\n/** 装到哪个 agent。Codex 不发现 `.claude/skills/`,它读 `AGENTS.md`——装错地方等于没装。 */\nexport type SkillTarget = 'claude' | 'codex';\n\nexport interface SkillReferenceDocument {\n /** 相对 `<skill>/references/` 的路径 */\n path: string;\n content: string;\n}\n\nexport interface SkillDocument {\n id: string;\n markdown: string;\n /** 精确定位符:睿戎是 URL,本地是绝对路径,自带是 `@hcmai/cli@<版本>:skills/<id>`。 */\n source: string;\n /** 来源种类。缺省按睿戎处理(历史路径全是睿戎)。 */\n sourceKind?: RecordSourceKind;\n /** 技能自带的参考文件。正文里 `[x](references/x.md)` 引的就是它们,不带下来就是死链。 */\n references?: SkillReferenceDocument[];\n}\n\n/**\n * catalog 只有两个半边;状态文件比它多一档 `local`(`install --from` 那条路)。\n *\n * 🔴 两个名字不能合成一个:没有任何一趟会去「扫 local 来源」,合成一个要么让 catalog\n * 多出一个永远空的半边,要么状态文件装不下 `local`。\n */\nexport type CatalogSourceKind = 'chiron' | 'cli';\nexport type RecordSourceKind = CatalogSourceKind | 'local';\n\n/** 一条已安装记录。`sha256` 是**安装当时**写下去的内容指纹,用来区分「产品更新了」和「本地改过」。 */\nexport interface InstalledSkillRecord {\n /**\n * 🔴 **保留原字段名与原语义(精确定位符)**,另起新键存来源种类。\n *\n * 把 `source` 改成枚举会丢掉溯源信息,而且有一条真会腐化数据的链:\n * v2 文件被旧 CLI 跑一次 `update` ⇒ 它硬写 `version = 1` 且只覆盖本次改动的那几条\n * ⇒ 盘上出现「version:1 但带枚举值」的混合体 ⇒ 新 CLI 见 `version !== 2` 触发迁移\n * ⇒ 枚举值 `\"bundled\"` 不以 http 开头 ⇒ 判成 local ⇒ **这份技能从此再不更新**,\n * 且 locator 已被覆盖丢失,全程无提示。\n * 新键名没有这个洞:旧 CLI 不认识 `sourceKind` 就不会写它,新 CLI 见到它存在即知已迁移。\n */\n source: string;\n /** 迁移后必然存在;类型上可选是为了能读进 v1 的老文件。 */\n sourceKind?: RecordSourceKind;\n /** 与 `source` 同值同语义(URL / 包内路径 / 本地绝对路径),新代码一律读这个。 */\n sourceLocator?: string;\n sha256: string;\n installedAt: string;\n /** true = 顾问显式装的;false = 作为 requires 被带进来的 */\n direct: boolean;\n references: Record<string, string>;\n}\n\n/** `<baseDir>/.hcm-skills.json`——升级的依据。没有它就只能靠人记住装过什么。 */\nexport interface SkillsStateFile {\n /** 读得进 1,写出去恒为 2。旧 CLI 会把它写回 1——见 `migrateSkillsState`。 */\n version: 1 | 2;\n target: SkillTarget;\n endpoint?: string;\n /** 装的时候探到的技能库前缀('' 或 '/api'),仅供排查用 */\n base?: string;\n /**\n * true = 这个目录订阅了**全集**(装的时候用的 `--all`)。\n *\n * 🔴 `update` 只遍历清单里已记录技能的依赖闭包,所以产品新增的技能永远不会被带进来。\n * 这个标记就是修那个洞:它在,`update` 就按产品当前全集重算。\n */\n all?: boolean;\n updatedAt: string;\n skills: Record<string, InstalledSkillRecord>;\n}\n\nexport const SKILLS_STATE_FILE = '.hcm-skills.json';\n\n/**\n * v1 → v2 的**逐条**迁移:给每条记录补上 `sourceKind` / `sourceLocator`。\n *\n * 🔴 **幂等判据是「这条记录有没有 `sourceKind`」,不是「`version` 等于几」。**\n * 版本号会被旧 CLI 写回 1,于是盘上会出现「version:1 但部分记录已是 v2 形态」的混合体;\n * 按 version 判会把那些已迁移的记录**再判一次**——而 `sourceLocator` 此时可能已被\n * 旧 CLI 覆盖成别的东西,重判的结果是把 `cli` 记录判成 `local`,从此不再升级且无提示。\n * 按「键在不在」判,混合体里已迁移的那部分原样保留。\n *\n * 🔴 **不写盘**:迁移只发生在内存里,等下一次真正的 install/update 落盘时一起写。\n * 单是读一次清单就改写顾问的文件,是本仓「读操作不许有副作用」的反面。\n */\nexport function migrateSkillsState(state: SkillsStateFile): SkillsStateFile {\n const skills: Record<string, InstalledSkillRecord> = {};\n for (const [id, record] of Object.entries(state.skills ?? {})) {\n if (record.sourceKind) {\n skills[id] = record;\n continue;\n }\n // 唯一可用的线索就是 v1 的 `source`:它是 URL ⇒ 睿戎;否则 ⇒ 本地目录装的。\n // 🔴 v1 时代没有「自带技能」这条路,所以迁移**永远不会**产出 `cli`——\n // 那一档只能由新版 CLI 装的时候写下,不能靠猜。\n const kind: RecordSourceKind = /^https?:\\/\\//i.test(record.source ?? '') ? 'chiron' : 'local';\n skills[id] = { ...record, sourceKind: kind, sourceLocator: record.source };\n }\n return { ...state, skills };\n}\n\nexport function sha256(text: string): string {\n return createHash('sha256').update(text, 'utf8').digest('hex');\n}\n\nexport interface SkillInstallationResult {\n /** 本次显式请求的技能;`--all` 时是整个目录 */\n ids: string[];\n /** 落点目录 */\n baseDir: string;\n installed: string[];\n unchanged: string[];\n files: Array<{ id: string; target: string; source: string; bytes: number; status: 'installed' | 'unchanged' }>;\n}\n\n/**\n * 解析 endpoint。技能库端点**免认证**,故只需要连接信息,不解析 identity——\n * 这正是冷启动能成立的原因:空环境、无租户、无账号也能装技能。\n */\nasync function resolveEndpoint(args: SkillsArgs): Promise<string> {\n if (args.endpoint) return args.endpoint.replace(/\\/+$/, '');\n const g = await loadGlobalConfig();\n const envName = resolveActiveEnv({ envFlag: args.env }, process.env, g);\n const env = await loadEnv(envName).catch(() => null);\n if (!env?.endpoint) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message:\n '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`。'\n + '(技能库免认证,不需要先 login)',\n });\n }\n return env.endpoint.replace(/\\/+$/, '');\n}\n\n/** 去掉尾斜杠,两个 endpoint 才比得起来。 */\nexport function normalizeEndpoint(endpoint: string): string {\n return endpoint.replace(/\\/+$/, '');\n}\n\n/**\n * 决定这次连哪个环境,并挡住**静默跨环境**。\n *\n * 一个装过技能的目录是绑在它的来源环境上的:技能随产品版本走,拿另一个客户环境的版本\n * 盖上去,顾问不会收到任何信号,而两边的产品版本很可能不同。\n *\n * 🔴 两个方向都不许静默。只把优先级反过来(记录的来源赢)不是修复——那只是把\n * 「静默用了当前 env」换成「静默还用旧来源」,顾问真想改指向时反而被闷住。所以:\n * 显式给了 `--endpoint` / `--env` 才算改指向(调用方随后把新来源记下来),\n * 没给而两边不一致就报错,让人明说要哪个。\n *\n * 纯函数:网络与配置读取留在调用方,这里只做判定,好测。\n */\nexport function decideTrackedEndpoint(options: {\n /** 命令行显式给了 --endpoint 或 --env */\n explicit: boolean;\n /** 显式指定或当前 env 解析出来的地址;当前 env 解析不出来时为 undefined */\n current?: string;\n /** 安装清单里记的来源;老清单可能没有 */\n recorded?: string;\n}): string {\n const { explicit } = options;\n const current = options.current ? normalizeEndpoint(options.current) : undefined;\n const recorded = options.recorded ? normalizeEndpoint(options.recorded) : undefined;\n\n // 显式改指向:听命令行的\n if (explicit) {\n if (!current) throw invalid('未解析到 endpoint —— 传 --endpoint <url>,或用 --env <name> 指一个配好的环境');\n return current;\n }\n // 老清单没记来源,或这个目录还没装过东西:只能听当前 env\n if (!recorded) {\n if (!current) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message:\n '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`。'\n + '(技能库免认证,不需要先 login)',\n });\n }\n return current;\n }\n // 当前 env 没配/读不出来:跟安装时记的那个,这是既有行为\n if (!current || current === recorded) return recorded;\n\n throw invalid(\n `这个目录的技能装自 ${recorded},当前 env 指向 ${current} —— 不是同一个环境。\\n`\n + '技能随产品版本走,跨环境升级会拿另一个环境的版本盖掉现在这份,且不会有任何提示。\\n'\n + '明说要哪个:\\n'\n + ` · 继续跟 ${recorded} → 加 --endpoint ${recorded}\\n`\n + ` · 改跟当前这个 → 加 --endpoint ${current}(来源会改成它,之后不用再带)`,\n );\n}\n\nasync function exists(target: string): Promise<boolean> {\n try {\n await fsp.stat(target);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 没显式指定 --target 时探当前目录:`.claude/` 在就是 Claude Code,`AGENTS.md` / `.codex/`\n * 在就是 Codex。两个都没有时**退回 claude**——保持改造前的默认落点不变。\n */\nexport async function detectTarget(cwd: string): Promise<SkillTarget | undefined> {\n if (await exists(path.join(cwd, '.claude'))) return 'claude';\n if (await exists(path.join(cwd, 'AGENTS.md'))) return 'codex';\n if (await exists(path.join(cwd, '.codex'))) return 'codex';\n return undefined;\n}\n\nexport interface InstallLayout {\n target: SkillTarget;\n baseDir: string;\n /** Codex 的技能索引文件;claude 目标为 undefined(它自己发现 .claude/skills/) */\n agentsFile?: string;\n}\n\n/**\n * 算出这次装到哪儿。\n *\n * - `claude`:`.claude/skills/<id>/SKILL.md`(`--global` 落 `~/.claude/skills/`)——Claude Code 自动发现\n * - `codex`:`hcm-skills/<id>/SKILL.md` + 同级 `AGENTS.md` 里维护一段索引(`--global` 落 `~/.codex/`)——\n * 🔴 Codex **没有**技能目录自动发现这回事,只读 `AGENTS.md`,所以索引块是它能用上的唯一途径\n * - `--dir` 显式指定时只覆盖 baseDir,索引文件仍按 target 走\n */\nexport async function resolveInstallLayout(args: SkillsArgs, cwd = process.cwd()): Promise<InstallLayout> {\n const requested = args.target && args.target !== 'auto' ? args.target : undefined;\n const target: SkillTarget = requested ?? (await detectTarget(cwd)) ?? 'claude';\n\n if (target === 'codex') {\n const root = args.global ? path.join(os.homedir(), '.codex') : cwd;\n return {\n target,\n baseDir: args.dir ? path.resolve(args.dir) : path.join(root, 'hcm-skills'),\n agentsFile: path.join(root, 'AGENTS.md'),\n };\n }\n return {\n target,\n baseDir: args.dir\n ? path.resolve(args.dir)\n : args.global\n ? path.join(os.homedir(), '.claude', 'skills')\n : path.join(cwd, '.claude', 'skills'),\n };\n}\n\n/**\n * 技能库客户端。**唯一**拿到 http 的途径,因为它顺带把前缀探好了。\n *\n * 🔴 不要绕过它直接 createHttpClient:真实部署下根路径归前端 SPA,漏探前缀的命令会拿到\n * 一段 HTML 然后解析出满屏空目录——本刀第一版就漏改了 list/show 两个命令,实测才发现。\n * core 那边 `base` 已是必填参数,配合本工厂让「忘了探」变成编译期错误而不是线上现象。\n */\nasync function chironClient(args: SkillsArgs): Promise<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n http: any;\n endpoint: string;\n base: string;\n}> {\n const endpoint = await resolveEndpoint(args);\n const http = createHttpClient({\n endpoint,\n getAccessToken: async () => null,\n onRefresh: async () => {},\n });\n return { http, endpoint, base: await resolveChironBase(http) };\n}\n\nfunction fail(e: unknown, args: SkillsArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 404) {\n exitWithError(new Error('该环境没有这个技能 —— 跑 `hcm skills list` 看目录(技能随产品版本走)'));\n }\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm skills list [keyword]` —— 列出目标环境这一版的交付技能。 */\nexport async function skillsListCommand(keyword: string | undefined, args: SkillsArgs): Promise<void> {\n try {\n if (args.installed) return await listInstalledSkills(keyword, args);\n const source: SourceFilter = parseSourceFilter(args.source);\n let manifest: ChironManifest | undefined;\n let endpoint: string | undefined;\n // 🔴 `--source cli` **不连网**:自带技能就在这份 CLI 里,为了列它去连一次网,\n // 会让顾问在断网现场连「我这版 CLI 自带了什么」都问不出来。\n if (source !== 'cli') {\n const client = await chironClient(args);\n endpoint = client.endpoint;\n manifest = await fetchSkillCatalog(client.http, client.base);\n }\n const bundled = source === 'chiron' ? undefined : listBundledSkills();\n const catalog = buildUnifiedCatalog({ source, chironManifest: manifest, bundled, cliVersion: CLI_VERSION });\n const conflicts = detectIdConflicts(catalog);\n if (conflicts.ids.length > 0) {\n throw new CliError({\n code: CliErrorCode.SKILL_ID_CONFLICT,\n message: conflictMessage(conflicts.ids, endpoint ?? '(未知环境)'),\n });\n }\n const fmt: OutputFormat = args.output ?? 'table';\n\n // 自带技能合成一个一等分类塞进目录;它不出现在睿戎 manifest 里。\n const cliCategory: ChironCategory | undefined =\n catalog.cli.entries.size > 0\n ? {\n key: CLI_CATEGORY_KEY,\n name: CLI_CATEGORY_NAME,\n description: '随这份 CLI 发布的技能,讲的是本 CLI 的命令;升级 CLI 就是升级它们',\n skills: [...catalog.cli.entries.values()].map((entry) => ({\n id: entry.meta.id,\n title: entry.meta.title,\n category: CLI_CATEGORY_KEY,\n actionSurface: 'cli' as const,\n description: entry.meta.description,\n stages: entry.meta.stages,\n requires: entry.meta.requires,\n bytes: entry.meta.bytes,\n markdownUrl: '',\n })),\n }\n : undefined;\n\n let cats = [...(manifest?.categories ?? []), ...(cliCategory ? [cliCategory] : [])];\n if (args.category) cats = cats.filter((c) => c.key === args.category);\n if (keyword) {\n cats = cats\n .map((c) => ({ ...c, skills: matchSkills(c.skills ?? [], keyword) }))\n .filter((c) => c.skills.length > 0);\n }\n if (args.stage) {\n cats = cats\n .map((c) => ({ ...c, skills: filterByStage(c.skills ?? [], args.stage) }))\n .filter((c) => c.skills.length > 0);\n }\n\n if (fmt === 'json' || fmt === 'yaml') {\n // 🔴 `sources` 里带的是**半边状态**,不只是计数:\n // 「这一半没看」和「这一半是空的」在输出里必须分得开。\n process.stdout.write(\n formatObject(\n {\n ...(manifest ?? {}),\n categories: cats,\n sources: {\n cli: { status: catalog.cli.status, count: catalog.cli.entries.size },\n chiron: { status: catalog.chiron.status, count: catalog.chiron.entries.size },\n },\n conflictCheck: conflicts.checked ? { checked: true } : { checked: false, note: unconfirmedConflictNote(source) },\n },\n { format: fmt },\n ) + '\\n',\n );\n process.exit(0);\n }\n\n const shown = cats.flatMap((c) => c.skills);\n const total = (manifest?.skillCount ?? 0) + catalog.cli.entries.size;\n if (shown.length === 0) {\n // 🔴 空集如实输出「0 个」,不报错:`--source cli --category business` 本来就是空集。\n process.stdout.write(`没有匹配的技能(这一趟看的来源共 ${total} 个)\\n`);\n process.exit(0);\n }\n process.stdout.write(`${manifest?.title ?? 'HCM 技能'} — ${endpoint ?? `@hcmai/cli@${CLI_VERSION}`}\\n\\n`);\n\n // 按交付生命周期看:顾问的心智是「现在第几周,该干什么」\n if (args.byStage) {\n const all = cats.flatMap((c) => c.skills);\n // 🔴 阶段清单的权威源是睿戎 manifest。`--source cli` 没有它时,\n // **不许**在 CLI 里抄一份七个键的常量——那是一张会和产品漂移的手工登记表。\n // 退而由被列出的技能**自己声明的 stages** 生成分组:它只覆盖看得到的东西,\n // 但不会说出与产品不一致的话。\n const stageList = manifest?.stages\n ?? [...new Set(all.flatMap((skill) => skill.stages ?? []))].sort().map((key) => ({\n key,\n name: key,\n description: '',\n skillCount: 0,\n }));\n for (const st of stageList) {\n const inStage = filterByStage(all, st.key);\n if (inStage.length === 0 && !args.stage) {\n process.stdout.write(` ${st.name} (无技能覆盖)\\n\\n`);\n continue;\n }\n if (inStage.length === 0) continue;\n process.stdout.write(` ${st.name}\\n`);\n for (const s of inStage) {\n const flag = s.actionSurface === 'cli' ? '●' : '○';\n process.stdout.write(` ${flag} ${s.id.padEnd(30)} ${s.title}\\n`);\n }\n process.stdout.write('\\n');\n }\n process.stdout.write(` ● CLI 就绪 ○ 待改写动作面 共 ${shown.length} 个\\n`);\n process.stdout.write(` 装一个:hcm skills install <id>\\n`);\n process.exit(0);\n }\n\n for (const c of cats) {\n process.stdout.write(` ${c.name}\\n`);\n for (const s of c.skills) {\n const flag = s.actionSurface === 'cli' ? '●' : '○';\n process.stdout.write(` ${flag} ${s.id.padEnd(30)} ${s.title}\\n`);\n }\n process.stdout.write('\\n');\n }\n process.stdout.write(` ● CLI 就绪 ○ 待改写动作面 共 ${shown.length} 个\\n`);\n process.stdout.write(` 装一个:hcm skills install <id>\\n`);\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm skills list --installed` —— 我这个目录里到底装了哪些。\n *\n * 🔴 全程不连网:顾问在客户现场问「我装了哪些」时,环境可能正是连不上的那个。\n * 标题从本地 SKILL.md 的 frontmatter 读,「本地改过」靠清单里记的安装时指纹比对。\n */\nasync function listInstalledSkills(keyword: string | undefined, args: SkillsArgs): Promise<void> {\n const layout = await resolveInstallLayout(args);\n const state = await readSkillsState(layout.baseDir);\n const fmt: OutputFormat = args.output ?? 'table';\n\n if (!state || Object.keys(state.skills).length === 0) {\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(formatObject({ baseDir: layout.baseDir, target: layout.target, all: false, skills: [] }, { format: fmt }) + '\\n');\n process.exit(0);\n }\n process.stdout.write(`${path.join(layout.baseDir, SKILLS_STATE_FILE)} 不存在或为空 —— 这个目录下还没用本 CLI 装过技能。\\n`);\n process.stdout.write(' 装全部:hcm skills install --all\\n');\n process.exit(0);\n }\n\n const rows = [];\n for (const [id, record] of Object.entries(state.skills).sort(([a], [b]) => a.localeCompare(b))) {\n const markdown = await readInstalled(layout.baseDir, id);\n let title = id;\n if (markdown !== undefined) {\n const raw = parseSkillFrontmatter(markdown, id).title;\n if (typeof raw === 'string' && raw.trim()) title = raw.trim();\n }\n rows.push({\n id,\n title,\n // 迁移保证它必然有值;`?? 'chiron'` 只是让类型闭合,不是业务缺省。\n sourceKind: record.sourceKind ?? 'chiron',\n sourceLocator: record.sourceLocator ?? record.source,\n direct: record.direct,\n installedAt: record.installedAt,\n // 三种状态互斥:文件没了 / 本地改过 / 和装的时候一致\n status: markdown === undefined\n ? ('missing' as const)\n : sha256(markdown) !== record.sha256 ? ('locally-modified' as const) : ('installed' as const),\n });\n }\n const byKeyword = keyword\n ? rows.filter((row) => row.id.includes(keyword) || row.title.includes(keyword))\n : rows;\n // 🔴 `--installed` 下 `--source` **只做过滤,不触发连网**(spec §7.1):\n // 顾问问「我装了哪些」的时候,环境可能正是连不上的那个。\n const sourceFilter: SourceFilter = parseSourceFilter(args.source);\n const shown = sourceFilter === 'all' ? byKeyword : byKeyword.filter((row) => row.sourceKind === sourceFilter);\n const groupOf = (kind: string): string =>\n kind === 'cli' ? 'CLI 自带' : kind === 'local' ? '本地目录装的' : '睿戎技能库';\n\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(formatObject({\n baseDir: layout.baseDir,\n target: layout.target,\n endpoint: state.endpoint,\n all: Boolean(state.all),\n updatedAt: state.updatedAt,\n // 按来源分组的小计:顾问要能一眼看出「这份是跟着 CLI 走的还是跟着后端走的」\n bySource: {\n cli: shown.filter((r) => r.sourceKind === 'cli').length,\n chiron: shown.filter((r) => r.sourceKind === 'chiron').length,\n local: shown.filter((r) => r.sourceKind === 'local').length,\n },\n skills: shown,\n }, { format: fmt }) + '\\n');\n process.exit(0);\n }\n\n process.stdout.write(`已安装的技能 — ${layout.baseDir}(${layout.target})\\n`);\n process.stdout.write(`来源 ${state.endpoint ?? '(未记录)'}`\n + (state.all ? ' 跟随全集:是\\n\\n' : '\\n\\n'));\n if (shown.length === 0) {\n process.stdout.write(` 没有匹配「${keyword}」的技能(共装了 ${rows.length} 个)\\n`);\n process.exit(0);\n }\n for (const kind of ['chiron', 'cli', 'local'] as const) {\n const group = shown.filter((row) => row.sourceKind === kind);\n if (group.length === 0) continue;\n process.stdout.write(` ${groupOf(kind)}(${group.length})\\n`);\n for (const row of group) {\n const mark = row.status === 'missing' ? '?' : row.status === 'locally-modified' ? '!' : row.direct ? '●' : '○';\n const note = row.status === 'missing'\n ? '文件不见了(update 会装回)'\n : row.status === 'locally-modified' ? '本地改过' : row.direct ? '' : '依赖带入';\n process.stdout.write(` ${mark} ${row.id.padEnd(30)} ${row.title.padEnd(24)} ${note}\\n`);\n }\n process.stdout.write('\\n');\n }\n const modified = shown.filter((row) => row.status === 'locally-modified').length;\n const missing = shown.filter((row) => row.status === 'missing').length;\n const indirect = shown.filter((row) => row.direct === false).length;\n process.stdout.write('\\n');\n process.stdout.write(` ● 直接安装 ○ 依赖带入 ! 本地改过 ? 文件缺失\\n`);\n process.stdout.write(` 共 ${shown.length} 个`\n + [\n indirect > 0 ? `${indirect} 个是依赖带入` : '',\n modified > 0 ? `${modified} 个本地改过` : '',\n missing > 0 ? `${missing} 个文件缺失` : '',\n ].filter(Boolean).map((t) => `,${t}`).join('') + '\\n');\n process.stdout.write(` 升级:hcm skills update${state.all ? '' : '(想跟随全集加 --all)'}\\n`);\n process.exit(0);\n}\n\n/** `hcm skills show <id>` —— 打印技能原文(管道友好)。 */\nexport async function skillsShowCommand(id: string, args: SkillsArgs): Promise<void> {\n try {\n assertSafeSkillId(id);\n const source: SourceFilter = parseSourceFilter(args.source);\n // 🔴 自带技能**不连网**:它就在这份 CLI 里,连一次网只会让顾问在断网现场看不到它。\n if (source !== 'chiron' && listBundledSkills().some((s) => s.id === id)) {\n const document = await readBundledSkillDocument(id);\n process.stdout.write(document.markdown.endsWith('\\n') ? document.markdown : document.markdown + '\\n');\n process.exit(0);\n }\n if (source === 'cli') {\n throw invalid(`这一版 CLI 没有自带 ${id} 这个技能(--source cli 不看睿戎目录)`);\n }\n const { http, base } = await chironClient(args);\n const md = await fetchSkillMarkdown(http, id, base);\n process.stdout.write(md.endsWith('\\n') ? md : md + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/** `hcm skills sync <id>` —— 将同实例依赖闭包同步到 WorkBuddy 项目并写所有权锁。 */\nexport async function skillsSyncCommand(id: string, args: SkillsSyncArgs): Promise<void> {\n try {\n assertSafeSkillId(id);\n if (args.target !== 'workbuddy') {\n throw invalid(`sync --target 当前只支持 workbuddy,收到 \"${args.target ?? ''}\"`);\n }\n if (!args.project?.trim()) throw invalid('sync 必须传 --project <path>');\n\n // 🔴 自带技能:**显式**不支持,不静默跳过、也不硬塞一个假 endpoint。\n // `chiron.lock.json` 的 source 三个字段(endpointOriginSha256 / catalogPath /\n // catalogSha256)全是必填且全绑睿戎,自带技能三者皆无。要开这一格得先做\n // 锁文件 schemaVersion 1→2,并回答旧锁读到新 kind 时的行为——本期按 YAGNI 不做。\n if (listBundledSkills().some((one) => one.id === id)) {\n throw new CliError({\n code: CliErrorCode.SYNC_SOURCE_UNSUPPORTED,\n message:\n `\\`${id}\\` 是 CLI 自带技能;skills sync 的锁文件(chiron.lock.json)` +\n '此刻只能记录睿戎来源的出处。装到本地用 `hcm skills install ' + id + '`。',\n });\n }\n\n // 先做纯本地能力探针。候选不兼容时不访问 Chiron,也不触碰项目文件。\n const project = path.resolve(args.project);\n const runtime = await prepareWorkBuddyRuntime({\n candidate: args.cli,\n currentEntryHasRequiredCapabilities: !args.cli?.trim(),\n forbiddenCandidatePaths: [\n path.join(project, '.hcm-delivery', 'bin', 'hcm'),\n path.join(project, '.hcm-delivery', 'bin', 'hcm.cmd'),\n ],\n });\n const connectionArgs: SkillsArgs = { endpoint: args.endpoint, env: args.env };\n const { http, endpoint, base } = await chironClient(connectionArgs);\n const catalog = await fetchSkillCatalog(http, base);\n const documents = await prepareSkillDocuments(\n catalog,\n id,\n async (skillId) => fetchSkillMarkdown(http, skillId, base),\n async (skillId, relativePath) => fetchSkillFile(http, skillId, relativePath, base),\n async (skillId, relativePath) => fetchSkillReference(http, skillId, relativePath, base),\n );\n const result = await syncWorkBuddyProject({\n project,\n endpoint,\n catalog,\n requestedSkill: id,\n documents,\n runtime,\n });\n\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(`${formatObject(result, { format: fmt })}\\n`);\n } else if (result.changed) {\n process.stdout.write(`✅ ${id} → ${result.skillsDir}\\n`);\n process.stdout.write(` 闭包 ${result.resolvedSkills.join(' → ')}\\n`);\n process.stdout.write(` 入口 ${result.runnerPath}\\n`);\n process.stdout.write(` CLI 能力 ${result.capabilitiesSha256.slice(0, 12)}\\n`);\n process.stdout.write(` 锁 ${result.lockPath}\\n`);\n } else {\n process.stdout.write(`✓ ${id} 已是当前目标实例版本,无需更新\\n`);\n process.stdout.write(` 入口 ${result.runnerPath}\\n`);\n process.stdout.write(` 锁 ${result.lockPath}\\n`);\n }\n process.exit(0);\n } catch (e) {\n fail(e, { endpoint: args.endpoint, env: args.env });\n }\n}\n\n/**\n * `hcm skills install <id>` —— 装到 agent 的技能目录。\n *\n * 默认落当前项目 `.claude/skills/<id>/SKILL.md`;`--global` 落 `~/.claude/skills/`。\n * `--from <dir>` 从本地目录装(现场发现技能有问题时先本地改,再回流主库提 PR)。\n */\nexport async function skillsInstallCommand(id: string | undefined, args: SkillsArgs): Promise<void> {\n try {\n const all = Boolean(args.all);\n if (all && id) throw invalid('`--all` 是装整个技能库,不要再带技能 id;只装一个就去掉 --all');\n if (!all && !id) throw invalid('要装哪个技能?给个 id(`hcm skills list` 看目录),或用 `--all` 装全部');\n if (id) assertSafeSkillId(id);\n\n const layout = await resolveInstallLayout(args);\n\n let documents: SkillDocument[];\n let requestedIds: string[];\n let endpoint: string | undefined;\n let base: string | undefined;\n let manifest: ChironManifest | undefined;\n let conflictNote: string | undefined;\n if (args.from) {\n const root = path.resolve(args.from);\n requestedIds = all ? await listLocalSkillIds(root) : [id!];\n const seen = new Set<string>();\n documents = [];\n for (const one of requestedIds) {\n for (const document of await resolveLocalSkillDocuments(root, one)) {\n if (seen.has(document.id)) continue;\n seen.add(document.id);\n documents.push(document);\n }\n }\n } else {\n const source: SourceFilter = parseSourceFilter(args.source);\n const bundled = source === 'chiron' ? undefined : listBundledSkills();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let http: any;\n if (source !== 'cli') {\n // 往一个已经装着别的环境的技能的目录里装,和跨环境升级是同一个坑\n const tracked = decideTrackedEndpoint({\n explicit: Boolean(args.endpoint || args.env),\n current: await resolveEndpoint(args).catch(() => undefined),\n recorded: (await readSkillsState(layout.baseDir))?.endpoint,\n });\n const client = await chironClient({ ...args, endpoint: tracked });\n endpoint = client.endpoint;\n base = client.base;\n http = client.http;\n manifest = await fetchSkillCatalog(http, base);\n }\n\n const catalog = buildUnifiedCatalog({ source, chironManifest: manifest, bundled, cliVersion: CLI_VERSION });\n const conflicts = detectIdConflicts(catalog);\n if (conflicts.ids.length > 0) {\n throw new CliError({\n code: CliErrorCode.SKILL_ID_CONFLICT,\n message: conflictMessage(conflicts.ids, endpoint ?? '(未知环境)'),\n });\n }\n conflictNote = conflicts.checked ? undefined : unconfirmedConflictNote(source);\n\n // 🔴 「睿戎技能依赖自带技能」是禁止方向(spec §6)。在这里当场点名,\n // 否则顾问看到的是一句「技能目录里没有 X」,会去查自己的环境,而缺陷在产品侧。\n for (const v of checkCrossSourceRequires(catalog)) {\n throw invalid(`${v.from} 声明依赖 ${v.to},但 ${v.to} 是 CLI 自带技能。${v.reason}`);\n }\n\n const wantBundled = (one: string): boolean => catalog.cli.entries.has(one);\n const seen = new Set<string>();\n documents = [];\n const pushAll = (docs: SkillDocument[]): void => {\n for (const d of docs) {\n if (seen.has(d.id)) continue;\n seen.add(d.id);\n documents.push(d);\n }\n };\n\n /** 装一份自带技能:自带侧闭包本地解,跨到睿戎的那几条连网解(spec §6 允许的方向)。 */\n const installBundled = async (one: string): Promise<void> => {\n const { documents: local, external } = await resolveBundledClosure(one);\n for (const need of external) {\n if (catalog.chiron.status !== 'fetched') {\n // 🔴 装不全就明确失败并说出缺哪一份,不装半套:半套技能不会报错,\n // 只会让 agent 照着断链的正文干活。\n throw invalid(\n `自带技能 ${one} 依赖睿戎技能 ${need},但这一趟没连网取睿戎目录(--source ${source})。` +\n '联网后重跑,或先单独装上它。',\n );\n }\n if (!catalog.chiron.entries.has(need)) {\n throw invalid(`自带技能 ${one} 依赖 ${need},但 ${endpoint} 的技能目录里没有它`);\n }\n pushAll(\n await mapWithConcurrency(\n resolveSkillInstallOrder(manifest!, need),\n FETCH_CONCURRENCY,\n (skill: ChironSkill) => fetchSkillDocument(http, skill, endpoint!, base!),\n ),\n );\n }\n pushAll(local);\n };\n\n if (all) {\n const order = manifest ? resolveAllSkillsInstallOrder(manifest) : [];\n const bundledIds = [...catalog.cli.entries.keys()].sort();\n if (order.length === 0 && bundledIds.length === 0) {\n throw invalid(`${endpoint ?? '这一趟看的来源'} 里没有可装的技能`);\n }\n requestedIds = [...order.map((skill: ChironSkill) => skill.id), ...bundledIds];\n if (order.length > 0) {\n pushAll(\n await mapWithConcurrency(\n order,\n FETCH_CONCURRENCY,\n (skill: ChironSkill) => fetchSkillDocument(http, skill, endpoint!, base!),\n ),\n );\n }\n for (const one of bundledIds) await installBundled(one);\n } else if (wantBundled(id!)) {\n requestedIds = [id!];\n await installBundled(id!);\n } else {\n if (source === 'cli') {\n throw invalid(`这一版 CLI 没有自带 ${id} 这个技能(--source cli 不看睿戎目录)`);\n }\n requestedIds = [id!];\n pushAll(\n await mapWithConcurrency(\n resolveSkillInstallOrder(manifest!, id!),\n FETCH_CONCURRENCY,\n (skill: ChironSkill) => fetchSkillDocument(http, skill, endpoint!, base!),\n ),\n );\n }\n }\n\n const result = await installSkillDocuments(documents, requestedIds, layout.baseDir, Boolean(args.force), {\n endpoint,\n base,\n target: layout.target,\n all,\n });\n\n const agents = layout.agentsFile\n ? await syncAgentsIndex(layout, manifest)\n : undefined;\n\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(formatObject({ ...result, all, target_agent: layout.target, agentsFile: layout.agentsFile, agents, conflictCheck: conflictNote ? { checked: false, note: conflictNote } : { checked: true } }, { format: fmt }) + '\\n');\n } else {\n const headline = all\n ? `✅ 全部 ${requestedIds.length} 个技能 → ${result.baseDir}`\n : `✅ ${id} → ${path.join(result.baseDir, id!, 'SKILL.md')}`;\n process.stdout.write(`${headline}\\n`);\n if (result.installed.length > 0) {\n process.stdout.write(all\n ? ` 新写入 ${result.installed.length} 个\\n`\n : ` 已安装 ${result.installed.join(' → ')}\\n`);\n }\n if (result.unchanged.length > 0) {\n process.stdout.write(all\n ? ` 已是这一版、未改动 ${result.unchanged.length} 个\\n`\n : ` 已存在且版本一致 ${result.unchanged.join(', ')}\\n`);\n }\n const referenceCount = documents.reduce((n, d) => n + (d.references?.length ?? 0), 0);\n if (referenceCount > 0) {\n process.stdout.write(` 参考文件 ${referenceCount} 个(references/ 下)\\n`);\n }\n if (layout.agentsFile) {\n process.stdout.write(` 已${agents === 'created' ? '创建' : '更新'} ${layout.agentsFile} 里的技能索引(Codex 读这里)\\n`);\n }\n process.stdout.write(` 来源 ${endpoint ?? (args.from ? path.resolve(args.from) : `@hcmai/cli@${CLI_VERSION}`)}\\n`);\n // 🔴 必须说出来:不说的话,「这一趟没查冲突」和「查过了没冲突」在顾问眼里一模一样。\n if (conflictNote) process.stdout.write(` ⚠️ ${conflictNote}\\n`);\n process.stdout.write(all\n ? ' 已记为「跟随全集」:以后跑 hcm skills update,产品新增的技能会自动补上\\n'\n : ' 产品更新后跑 hcm skills update 升级\\n');\n }\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/** 远程取技能内容时的并发上限。38 个技能各带参考文件,全并发会把客户环境打出一串连接。 */\nconst FETCH_CONCURRENCY = 6;\n\nasync function mapWithConcurrency<T, R>(\n items: readonly T[],\n limit: number,\n fn: (item: T) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n let cursor = 0;\n const worker = async (): Promise<void> => {\n for (;;) {\n const index = cursor++;\n if (index >= items.length) return;\n results[index] = await fn(items[index]!);\n }\n };\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));\n return results;\n}\n\n/** `--from <dir> --all`:本地目录里所有带 SKILL.md 的子目录就是可装的技能。 */\nasync function listLocalSkillIds(root: string): Promise<string[]> {\n let entries;\n try {\n entries = await fsp.readdir(root, { withFileTypes: true });\n } catch {\n throw invalid(`读不到本地技能目录:${root}`);\n }\n const ids: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (await exists(path.join(root, entry.name, 'SKILL.md'))) ids.push(entry.name);\n }\n if (ids.length === 0) throw invalid(`本地目录里没有任何 <id>/SKILL.md:${root}`);\n return ids.sort();\n}\n\n/** 远程取一个技能的完整内容:正文 + 它自带的全部参考文件。 */\nasync function fetchSkillDocument(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n http: any,\n skill: ChironSkill,\n endpoint: string,\n base: string,\n): Promise<SkillDocument> {\n const relatives = normalizeReferences(skill.references, skill.id);\n const references = await Promise.all(relatives.map(async (relative) => ({\n path: relative,\n content: await fetchSkillReference(http, skill.id, relative, base),\n })));\n return {\n id: skill.id,\n markdown: await fetchSkillMarkdown(http, skill.id, base),\n source: `${endpoint}${base}/skills/${skill.id}.md`,\n sourceKind: 'chiron',\n references,\n };\n}\n\n/**\n * 重建 Codex 的 AGENTS.md 索引。\n *\n * 每次都按**清单里现有的全部技能**整块重写,而不是往后追加一条——否则升级、改装目录\n * 之后索引会和实际装的东西漂移,而漂移了没有任何东西会报错。\n */\nasync function syncAgentsIndex(\n layout: InstallLayout,\n manifest?: ChironManifest,\n): Promise<'created' | 'replaced' | 'appended' | undefined> {\n if (!layout.agentsFile) return undefined;\n const state = await readSkillsState(layout.baseDir);\n if (!state) return undefined;\n\n const catalog = new Map<string, ChironSkill>();\n for (const category of manifest?.categories ?? []) {\n for (const skill of category.skills ?? []) catalog.set(skill.id, skill);\n }\n\n const agentsDir = path.dirname(layout.agentsFile);\n const entries = Object.keys(state.skills).sort().map((id) => {\n const known = catalog.get(id);\n const absolute = path.join(layout.baseDir, id, 'SKILL.md');\n let relative = path.relative(agentsDir, absolute);\n if (!relative.startsWith('.')) relative = `./${relative}`;\n return {\n id,\n title: known?.title ?? id,\n description: known?.description ?? '',\n relativePath: relative.split(path.sep).join('/'),\n };\n });\n return upsertAgentsBlock(layout.agentsFile, renderAgentsBlock(entries));\n}\n\n/** 从本地作者源递归读取依赖;用于 --from,顺序同远程目录:依赖在前、目标在后。 */\nexport async function resolveLocalSkillDocuments(sourceRoot: string, targetId: string): Promise<SkillDocument[]> {\n assertSafeSkillId(targetId);\n const state = new Map<string, 'visiting' | 'done'>();\n const pathStack: string[] = [];\n const order: SkillDocument[] = [];\n\n const visit = async (id: string, requiredBy?: string): Promise<void> => {\n const current = state.get(id);\n if (current === 'done') return;\n if (current === 'visiting') {\n const start = pathStack.indexOf(id);\n throw invalid(`技能依赖存在环: ${[...pathStack.slice(Math.max(0, start)), id].join(' -> ')}`);\n }\n assertSafeSkillId(id);\n const local = path.join(sourceRoot, id, 'SKILL.md');\n let markdown: string;\n try {\n markdown = await fsp.readFile(local, 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') {\n throw invalid(requiredBy\n ? `本地技能 ${requiredBy} 依赖不存在: ${id}(${local})`\n : `本地目录里没有 ${id}/SKILL.md:${path.join(sourceRoot, id)}`);\n }\n throw cause;\n }\n if (!markdown.trim()) throw invalid(`技能 ${id} 内容为空`);\n\n state.set(id, 'visiting');\n pathStack.push(id);\n const document: SkillDocument = {\n id,\n markdown,\n source: local,\n sourceKind: 'local',\n references: await readLocalReferences(path.join(sourceRoot, id)),\n };\n for (const required of parseSkillRequirements(markdown, id)) {\n await visit(required, id);\n }\n pathStack.pop();\n state.set(id, 'done');\n order.push(document);\n };\n\n await visit(targetId);\n return order;\n}\n\n// ================= 安装清单(.hcm-skills.json)=================\n\n/** 读安装清单;不存在或损坏都返回 undefined——升级命令据此提示「先装一个」而不是崩掉。 */\nexport async function readSkillsState(baseDir: string): Promise<SkillsStateFile | undefined> {\n try {\n const raw = await fsp.readFile(path.join(baseDir, SKILLS_STATE_FILE), 'utf8');\n const parsed = JSON.parse(raw) as SkillsStateFile;\n if (!parsed || typeof parsed !== 'object' || !parsed.skills) return undefined;\n return migrateSkillsState(parsed);\n } catch {\n return undefined;\n }\n}\n\nexport async function writeSkillsState(baseDir: string, state: SkillsStateFile): Promise<void> {\n await fsp.mkdir(baseDir, { recursive: true });\n const file = path.join(baseDir, SKILLS_STATE_FILE);\n const temp = `${file}.${process.pid}.tmp`;\n await fsp.writeFile(temp, JSON.stringify(state, null, 2) + '\\n', 'utf8');\n await fsp.rename(temp, file);\n}\n\n// ================= Codex 的 AGENTS.md 索引块 =================\n\nexport const AGENTS_BLOCK_BEGIN = '<!-- hcm-skills:begin -->';\nexport const AGENTS_BLOCK_END = '<!-- hcm-skills:end -->';\n\n/**\n * 生成 AGENTS.md 里那段索引。\n *\n * Codex 只读 AGENTS.md,不会去扫技能目录——所以每个技能得在这里被点名,并写清\n * 「什么时候读它」,否则装了也不会被用上。块用注释标记包起来,重装/升级时整段替换,\n * 不碰用户自己写的内容。\n */\nexport function renderAgentsBlock(\n entries: Array<{ id: string; title: string; description: string; relativePath: string }>,\n): string {\n const lines = [\n AGENTS_BLOCK_BEGIN,\n '## HCMnext 交付技能(由 `hcm skills install` 维护,勿手工编辑本块)',\n '',\n '遇到下面这些活儿,**先读对应文件再动手**——里面是这套产品的正确做法,',\n '照着做不用翻源码,也不用猜 API。',\n '',\n ];\n for (const e of entries) {\n lines.push(`- \\`${e.relativePath}\\` — **${e.title}**`);\n if (e.description) lines.push(` ${e.description}`);\n }\n lines.push('', AGENTS_BLOCK_END);\n return lines.join('\\n');\n}\n\n/** 把索引块写进 AGENTS.md:没有文件就建,有块就整段换,有文件没块就追加。 */\nexport async function upsertAgentsBlock(agentsFile: string, block: string): Promise<'created' | 'replaced' | 'appended'> {\n let existing = '';\n try {\n existing = await fsp.readFile(agentsFile, 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code !== 'ENOENT') throw cause;\n await fsp.mkdir(path.dirname(agentsFile), { recursive: true });\n await fsp.writeFile(agentsFile, block + '\\n', 'utf8');\n return 'created';\n }\n\n const begin = existing.indexOf(AGENTS_BLOCK_BEGIN);\n const end = existing.indexOf(AGENTS_BLOCK_END);\n if (begin >= 0 && end > begin) {\n const next = existing.slice(0, begin) + block + existing.slice(end + AGENTS_BLOCK_END.length);\n await fsp.writeFile(agentsFile, next, 'utf8');\n return 'replaced';\n }\n const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n';\n await fsp.writeFile(agentsFile, existing + separator + block + '\\n', 'utf8');\n return 'appended';\n}\n\n/**\n * 全部正文和冲突先检查完,再开始写入;网络失败、缺失依赖或版本冲突不会留下半套技能。\n * 已存在且内容完全一致的前置技能可复用,目标技能仍保持旧行为:未传 --force 时拒绝覆盖。\n */\nexport async function installSkillDocuments(\n documents: SkillDocument[],\n requestedIds: string[],\n baseDir: string,\n force: boolean,\n meta?: { endpoint?: string; base?: string; target?: SkillTarget; all?: boolean },\n): Promise<SkillInstallationResult> {\n if (requestedIds.length === 0) throw invalid('没有指定要装的技能');\n for (const id of requestedIds) assertSafeSkillId(id);\n\n const seen = new Set<string>();\n const candidates = documents.map((document) => {\n assertSafeSkillId(document.id);\n if (seen.has(document.id)) throw invalid(`安装闭包包含重复技能: ${document.id}`);\n seen.add(document.id);\n if (!document.markdown.trim()) throw invalid(`技能 ${document.id} 内容为空`);\n return {\n ...document,\n target: path.join(baseDir, document.id, 'SKILL.md'),\n bytes: Buffer.byteLength(document.markdown),\n };\n });\n for (const id of requestedIds) {\n if (!seen.has(id)) throw invalid(`安装闭包不包含目标技能: ${id}`);\n }\n\n // 🔴 判据只看「盘上这一份和要装的这一份一不一样」,**不看**它是显式请求的还是被依赖带进来的。\n // 之前对显式请求的技能一律报「已存在」,导致重装完全一致的内容也必须 --force——\n // 全装因此只能靠 shell 循环加 --force,而 --force 会连顾问现场改过的技能一起冲掉。\n const unchanged = new Set<string>();\n for (const candidate of candidates) {\n if (force) continue;\n const same = await sameOnDisk(baseDir, candidate);\n if (same === undefined) continue;\n if (same) {\n unchanged.add(candidate.id);\n continue;\n }\n throw invalid(\n `${candidate.target} 已存在,且和目标环境这一版不一致。`\n + '用 --force 覆盖(会丢掉本地改动),或 --dir <path> 装到别处;'\n + '只想跟上产品版本用 hcm skills update',\n );\n }\n\n const pending = candidates.filter((candidate) => !unchanged.has(candidate.id));\n await writeSkillDocuments(pending, baseDir);\n await recordInstalled(baseDir, candidates, {\n ...meta,\n directIds: new Set(requestedIds),\n keepInstalledAt: unchanged,\n });\n\n return {\n ids: [...requestedIds],\n baseDir,\n installed: pending.map((candidate) => candidate.id),\n unchanged: candidates.filter((candidate) => unchanged.has(candidate.id)).map((candidate) => candidate.id),\n files: candidates.map((candidate) => ({\n id: candidate.id,\n target: candidate.target,\n source: candidate.source,\n bytes: candidate.bytes,\n status: unchanged.has(candidate.id) ? 'unchanged' : 'installed',\n })),\n };\n}\n\n/**\n * 盘上那一份和要装的这一份是不是同一个东西。\n *\n * 返回 `undefined` = 还没装。🔴 参考文件也要比:正文一样但 references 变了同样是「不一样」,\n * 只比 SKILL.md 会把变更的参考文件判成「已是最新」然后永远不写进去。\n */\nasync function sameOnDisk(\n baseDir: string,\n candidate: { id: string; markdown: string; references?: SkillReferenceDocument[] },\n): Promise<boolean | undefined> {\n const existing = await readInstalled(baseDir, candidate.id);\n if (existing === undefined) return undefined;\n if (existing !== candidate.markdown) return false;\n for (const reference of candidate.references ?? []) {\n if ((await readInstalledReference(baseDir, candidate.id, reference.path)) !== reference.content) return false;\n }\n return true;\n}\n\n/** 读本地技能目录下的 references/(含一层子目录);没有该目录就是空。 */\nasync function readLocalReferences(skillDir: string): Promise<SkillReferenceDocument[]> {\n const root = path.join(skillDir, 'references');\n const out: SkillReferenceDocument[] = [];\n const walk = async (dir: string, prefix: string): Promise<void> => {\n let items;\n try {\n items = await fsp.readdir(dir, { withFileTypes: true });\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') return;\n throw cause;\n }\n for (const item of items.sort((a, b) => a.name.localeCompare(b.name))) {\n const relative = prefix ? `${prefix}/${item.name}` : item.name;\n if (item.isDirectory()) {\n await walk(path.join(dir, item.name), relative);\n continue;\n }\n if (!item.isFile()) continue;\n assertSafeReferencePath(relative);\n out.push({ path: relative, content: await fsp.readFile(path.join(dir, item.name), 'utf8') });\n }\n };\n await walk(root, '');\n return out;\n}\n\nexport interface StaleReference {\n id: string;\n /** 相对 `<skill>/references/` */\n path: string;\n}\n\nexport interface StaleReferencePlan {\n /** 该删的:盘上内容与安装当时记的指纹一致 ⇒ 是产品的旧文件。 */\n remove: StaleReference[];\n /** 不删的:本地改过。与 SKILL.md 同一策略——不默默删掉顾问在现场改过的文件。 */\n keptLocallyModified: StaleReference[];\n}\n\n/**\n * 算出哪些参考文件已经被产品这一版撤掉了。\n *\n * 🔴 为什么必须有这一步:`writeSkillDocuments` **只写不删**,而 `sameOnDisk`\n * 只遍历新文档**有**的 references,永远发现不了多出来的那些。\n * ⇒ CLI 从 0.6 升 0.7 时若某份技能少了一个 `references/x.md`,\n * 那个陈旧文件会**永久留在顾问盘上**,agent 照样会读到它。\n *\n * 待删 = 状态里记的路径集合 − 新文档的路径集合。数据是现成的\n * (`recordInstalled` 早就把 `references: {path: sha256}` 存进了状态),不新造机制。\n */\nexport async function planStaleReferences(\n state: SkillsStateFile,\n documents: SkillDocument[],\n baseDir: string,\n): Promise<StaleReferencePlan> {\n const remove: StaleReference[] = [];\n const keptLocallyModified: StaleReference[] = [];\n for (const document of documents) {\n const recorded = state.skills[document.id]?.references ?? {};\n const fresh = new Set((document.references ?? []).map((r) => r.path));\n for (const [relative, recordedSha] of Object.entries(recorded)) {\n if (fresh.has(relative)) continue;\n const onDisk = await readInstalledReference(baseDir, document.id, relative);\n if (onDisk === undefined) continue; // 盘上本来就没有,无事可做\n if (sha256(onDisk) !== recordedSha) {\n keptLocallyModified.push({ id: document.id, path: relative });\n continue;\n }\n remove.push({ id: document.id, path: relative });\n }\n }\n const byKey = (a: StaleReference, b: StaleReference): number =>\n `${a.id}/${a.path}`.localeCompare(`${b.id}/${b.path}`);\n return { remove: remove.sort(byKey), keptLocallyModified: keptLocallyModified.sort(byKey) };\n}\n\n/**\n * 原子写盘:全部内容先暂存成临时文件,再统一 rename。\n *\n * 参考文件与 SKILL.md 在**同一批**里 —— 中途失败不会留下「正文更新了但参考文件还是旧的」\n * 这种半套状态,那种状态没有任何东西会报错,只会让 agent 照着不一致的两份内容干活。\n */\nexport async function writeSkillDocuments(\n documents: SkillDocument[],\n baseDir: string,\n removals: StaleReference[] = [],\n): Promise<void> {\n const staged: Array<{ temp: string; target: string }> = [];\n /**\n * 🔴 删除走 **rename 到暂存名**,不是直接 unlink:\n * 直接删掉之后这一批里任何一步失败都回滚不了——本函数的 catch 原本只 unlink 暂存文件,\n * 没有任何恢复能力。rename 让「已删」在提交前一直是可逆的。\n */\n const removed: Array<{ parked: string; original: string }> = [];\n try {\n for (const document of documents) {\n const target = path.join(baseDir, document.id, 'SKILL.md');\n await fsp.mkdir(path.dirname(target), { recursive: true });\n const temp = path.join(path.dirname(target), `.SKILL.md.${process.pid}.${Date.now()}.tmp`);\n await fsp.writeFile(temp, document.markdown, 'utf8');\n staged.push({ temp, target });\n\n for (const reference of document.references ?? []) {\n assertSafeReferencePath(reference.path);\n const referenceTarget = path.join(baseDir, document.id, 'references', reference.path);\n await fsp.mkdir(path.dirname(referenceTarget), { recursive: true });\n const referenceTemp = `${referenceTarget}.${process.pid}.${Date.now()}.tmp`;\n await fsp.writeFile(referenceTemp, reference.content, 'utf8');\n staged.push({ temp: referenceTemp, target: referenceTarget });\n }\n }\n // 先把要删的挪到暂存名(可逆),再统一提交写入。\n for (const stale of removals) {\n assertSafeReferencePath(stale.path);\n const original = path.join(baseDir, stale.id, 'references', stale.path);\n const parked = `${original}.${process.pid}.${Date.now()}.removed`;\n await fsp.rename(original, parked);\n removed.push({ parked, original });\n }\n for (const file of staged) await fsp.rename(file.temp, file.target);\n // 全部成功,暂存的删除项这才真的消失。\n await Promise.all(removed.map((r) => fsp.unlink(r.parked).catch(() => undefined)));\n } catch (cause) {\n await Promise.all(staged.map((file) => fsp.unlink(file.temp).catch(() => undefined)));\n // 🔴 把已挪走的原样搬回去。少了这条,一次失败的升级会把参考文件删得只剩一半,\n // 而这种半套状态不会报错,只会让 agent 照着断链的正文干活。\n await Promise.all(removed.map((r) => fsp.rename(r.parked, r.original).catch(() => undefined)));\n throw cause;\n }\n}\n\n/** 清单在文件落地之后写:中途失败时清单不会声称装了实际没装的东西。 */\nasync function recordInstalled(\n baseDir: string,\n documents: SkillDocument[],\n meta: {\n endpoint?: string;\n base?: string;\n target?: SkillTarget;\n /** true = 这个目录订阅全集;一旦置上就不再回落(要退订就删清单重装) */\n all?: boolean;\n directIds: Set<string>;\n keepInstalledAt?: Set<string>;\n },\n): Promise<SkillsStateFile> {\n const state: SkillsStateFile = (await readSkillsState(baseDir)) ?? {\n version: 2,\n target: meta.target ?? 'claude',\n updatedAt: new Date().toISOString(),\n skills: {},\n };\n state.version = 2;\n if (meta.target) state.target = meta.target;\n if (meta.endpoint) state.endpoint = meta.endpoint;\n if (meta.base !== undefined) state.base = meta.base;\n if (meta.all) state.all = true;\n state.updatedAt = new Date().toISOString();\n for (const document of documents) {\n const previous = state.skills[document.id];\n state.skills[document.id] = {\n source: document.source,\n // 🔴 两个键同值:`source` 留给旧 CLI 读(降级不炸),新代码只读 `sourceLocator`。\n sourceKind: document.sourceKind ?? previous?.sourceKind ?? 'chiron',\n sourceLocator: document.source,\n sha256: sha256(document.markdown),\n installedAt: meta.keepInstalledAt?.has(document.id) && previous ? previous.installedAt : state.updatedAt,\n // 已经是直接安装的,不因为这次作为依赖被带进来就降级\n direct: meta.directIds.has(document.id) || Boolean(previous?.direct),\n references: Object.fromEntries(\n (document.references ?? []).map((reference) => [reference.path, sha256(reference.content)]),\n ),\n };\n }\n await writeSkillsState(baseDir, state);\n return state;\n}\n\nfunction invalid(message: string): CliError {\n return new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message });\n}\n\n// ================= hcm skills update =================\n\nexport type SkillUpdateStatus =\n | 'unchanged'\n | 'updated'\n | 'added'\n | 'locally-modified'\n | 'removed-upstream'\n /** 这一版 CLI 不再自带它。与 `removed-upstream` 严格对称,不是同一件事。 */\n | 'removed-in-cli'\n /** 本轮没核对它的来源(那个半边这一趟没看)。**不是**一个业务结论。 */\n | 'not-checked'\n /** `install --from` 装的:update 不管它。 */\n | 'local';\n\nexport interface SkillUpdateEntry {\n id: string;\n status: SkillUpdateStatus;\n note?: string;\n}\n\nexport interface SkillUpdatePlan {\n entries: SkillUpdateEntry[];\n /** 需要写盘的技能(status 为 added / updated) */\n documents: SkillDocument[];\n}\n\n/** 读磁盘上现有的 SKILL.md;不存在返回 undefined。 */\nasync function readInstalled(baseDir: string, id: string): Promise<string | undefined> {\n try {\n return await fsp.readFile(path.join(baseDir, id, 'SKILL.md'), 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') return undefined;\n throw cause;\n }\n}\n\nasync function readInstalledReference(baseDir: string, id: string, relative: string): Promise<string | undefined> {\n try {\n return await fsp.readFile(path.join(baseDir, id, 'references', relative), 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') return undefined;\n throw cause;\n }\n}\n\n/**\n * 算出这次升级会变什么。\n *\n * 🔴 三种「不一样」必须分开,否则升级会悄悄吃掉顾问在现场改过的技能:\n * - 磁盘内容 == 安装时记下的指纹,但和服务端不同 → **产品更新了**,覆盖\n * - 磁盘内容 != 安装时记下的指纹 → **本地改过**,不覆盖(除非 --force)\n * - 磁盘上没有 → 新增(多半是产品新加的依赖)\n *\n * 只按「和服务端一不一样」判断的话,第二种会被当成第一种直接冲掉,而且不会有任何提示。\n */\nexport async function planSkillUpdate(options: {\n state: SkillsStateFile;\n manifest?: ChironManifest;\n /**\n * 本轮的统一 catalog。不传时按「只看了睿戎那一半」构造——\n * 🔴 这不是兼容垫片,是**如实**:没给 catalog 就等于没看自带那一半,\n * 于是自带记录判 `not-checked` 而不是 `removed-in-cli`。\n */\n catalog?: UnifiedCatalog;\n baseDir: string;\n force: boolean;\n /** 订阅全集:把产品当前目录里的技能一并纳入,补上新增的 */\n all?: boolean;\n fetchDocument: (skill: ChironSkill) => Promise<SkillDocument>;\n /** 取一份自带技能的当前内容。缺省实现读这份 CLI 的 dist/skills。 */\n fetchBundled?: (id: string) => Promise<SkillDocument>;\n}): Promise<SkillUpdatePlan> {\n const { state, baseDir, force, fetchDocument } = options;\n const manifest = options.manifest;\n const catalog =\n options.catalog\n ?? buildUnifiedCatalog({ source: 'chiron', chironManifest: manifest, cliVersion: CLI_VERSION });\n const fetchBundled = options.fetchBundled ?? ((id: string) => readBundledSkillDocument(id));\n const all = options.all ?? Boolean(state.all);\n\n const recorded = Object.entries(state.skills);\n // 老清单里可能没有 direct 标记;那就把记下来的都当直接安装,宁可多查不要漏\n const directIds = recorded.some(([, r]) => r.direct)\n ? recorded.filter(([, r]) => r.direct).map(([id]) => id)\n : recorded.map(([id]) => id);\n\n const entries: SkillUpdateEntry[] = [];\n\n // ① 先按**来源**分档。这一步产出的每一档都不进闭包:\n // local 不参与升级;not-checked 是「这一趟没核」;两个 removed 是「真没了」。\n const live: Array<{ id: string; kind: 'chiron' | 'cli' }> = [];\n for (const id of directIds.sort()) {\n const record = state.skills[id]!;\n const status = classifyInstalledSource(id, record, catalog);\n if (status === 'present') {\n live.push({ id, kind: (record.sourceKind ?? 'chiron') === 'cli' ? 'cli' : 'chiron' });\n continue;\n }\n entries.push({ id, status, note: SOURCE_STATUS_NOTE[status] });\n }\n\n // ② 订阅全集:并上**两个半边各自取到的**全集。没取到的半边不并——\n // 否则「这一趟没看」会被当成「产品这一版没有」。\n if (all) {\n const known = new Set(live.map((x) => x.id));\n for (const kind of ['chiron', 'cli'] as const) {\n const half = kind === 'chiron' ? catalog.chiron : catalog.cli;\n if (half.status !== 'fetched') continue;\n for (const id of half.entries.keys()) {\n if (known.has(id)) continue;\n known.add(id);\n live.push({ id, kind });\n }\n }\n }\n\n // ③ 展开依赖闭包(各走各的半边;自带 → 睿戎那几条交给睿戎侧解)\n const closure = new Map<string, { kind: 'chiron' | 'cli'; skill?: ChironSkill }>();\n const chironNeeded = new Set<string>();\n for (const item of live) {\n if (item.kind === 'cli') {\n // 🔴 自带侧闭包从 **catalog 的 requires** 展开,不再回盘上读一遍:\n // 盘上那份读法(`resolveBundledClosure`)是**装**的时候用的,\n // 升级判定这里再走一遍等于同一件事有两条路径,而它们会各自漂移。\n // 用 visited 收敛,成环不会转不出来(成环本身由内容契约 C3 在作者面拦)。\n const queue = [item.id];\n while (queue.length > 0) {\n const id = queue.shift()!;\n if (closure.has(id)) continue;\n const entry = catalog.cli.entries.get(id);\n if (!entry) {\n // 半边里没有它 —— ① 里已经判过的那些不会走到这儿;这里是**依赖**指向了\n // 自带侧不存在的 id,那就是一条跨到睿戎的边(spec §6 允许的方向)。\n chironNeeded.add(id);\n continue;\n }\n closure.set(id, { kind: 'cli' });\n for (const need of entry.meta.requires ?? []) queue.push(need);\n }\n continue;\n }\n chironNeeded.add(item.id);\n }\n for (const id of chironNeeded) {\n if (!manifest) continue;\n try {\n for (const skill of resolveSkillInstallOrder(manifest, id)) {\n if (!closure.has(skill.id)) closure.set(skill.id, { kind: 'chiron', skill });\n }\n } catch {\n // 已装记录的那些在 ① 里判过了;这里能走到的是**依赖**解不出来。\n if (!entries.some((e) => e.id === id)) {\n entries.push({ id, status: 'removed-upstream', note: SOURCE_STATUS_NOTE['removed-upstream'] });\n }\n }\n }\n\n const documents: SkillDocument[] = [];\n for (const [id, item] of closure) {\n const record = state.skills[id];\n const onDisk = await readInstalled(baseDir, id);\n const fetch = async (): Promise<SkillDocument> =>\n item.kind === 'cli' ? await fetchBundled(id) : await fetchDocument(item.skill!);\n if (onDisk === undefined) {\n documents.push(await fetch());\n entries.push({\n id,\n status: 'added',\n note: record\n ? '本地文件缺失,重新装回'\n : all ? '产品这一版新增的技能' : '产品新增的前置技能',\n });\n continue;\n }\n\n const remote = await fetch();\n const remoteReferences = remote.references ?? [];\n let differsFromRemote = remote.markdown !== onDisk;\n let editedLocally = record !== undefined && sha256(onDisk) !== record.sha256;\n for (const reference of remoteReferences) {\n const installed = await readInstalledReference(baseDir, id, reference.path);\n if (installed !== reference.content) differsFromRemote = true;\n const recordedSha = record?.references?.[reference.path];\n if (installed !== undefined && recordedSha && sha256(installed) !== recordedSha) editedLocally = true;\n }\n\n if (!differsFromRemote) {\n entries.push({ id, status: 'unchanged' });\n continue;\n }\n if (editedLocally && !force) {\n entries.push({\n id,\n status: 'locally-modified',\n note: '本地改过,没有覆盖;确定要用产品这一版就加 --force',\n });\n continue;\n }\n documents.push(remote);\n entries.push({\n id,\n status: 'updated',\n note: editedLocally ? '本地改过,--force 已覆盖' : undefined,\n });\n }\n\n entries.sort((a, b) => a.id.localeCompare(b.id));\n return { entries, documents };\n}\n\nconst UPDATE_STATUS_LABEL: Record<SkillUpdateStatus, string> = {\n updated: '已更新',\n added: '已补装',\n unchanged: '已是最新',\n 'locally-modified': '本地改过·跳过',\n 'removed-upstream': '产品已移除',\n 'removed-in-cli': 'CLI 不再自带',\n // 🔴 这一档不是结论,是「这一趟没核」。文案上必须看得出区别,\n // 否则顾问会把它读成「没问题」,而它可能正藏着一份真的被移除了的技能。\n 'not-checked': '本轮未核',\n local: '本地来源·不管',\n};\n\n/**\n * `hcm skills update` —— 把装过的技能升到目标环境这一版。\n *\n * 依据是 `<baseDir>/.hcm-skills.json`:装的时候记下了「装了哪些、来自哪里、当时的内容指纹」,\n * 所以升级不需要顾问自己记得装过什么,也能分清「产品更新了」和「我在现场改过」。\n */\nexport async function skillsUpdateCommand(args: SkillsArgs): Promise<void> {\n try {\n const layout = await resolveInstallLayout(args);\n const state = await readSkillsState(layout.baseDir);\n if (!state || Object.keys(state.skills).length === 0) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n `${path.join(layout.baseDir, SKILLS_STATE_FILE)} 不存在或为空 —— 这个目录下还没有用本 CLI 装过技能。`\n + '先 `hcm skills install <id>`;如果技能是手工拷进来的,重装一次即可接管升级。',\n });\n }\n\n const source: SourceFilter = parseSourceFilter(args.source);\n const endpoint = decideTrackedEndpoint({\n explicit: Boolean(args.endpoint || args.env),\n current: await resolveEndpoint(args).catch(() => undefined),\n recorded: state.endpoint,\n });\n let manifest: ChironManifest | undefined;\n let base: string | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let http: any;\n if (source !== 'cli') {\n const client = await chironClient({ ...args, endpoint });\n http = client.http;\n base = client.base;\n manifest = await fetchSkillCatalog(http, base);\n }\n const bundled = source === 'chiron' ? undefined : listBundledSkills();\n const catalog = buildUnifiedCatalog({ source, chironManifest: manifest, bundled, cliVersion: CLI_VERSION });\n\n // `--all` 既是「这次也把没装的补齐」,也是「从今往后跟随全集」——后者要落盘\n const all = Boolean(args.all) || Boolean(state.all);\n const plan = await planSkillUpdate({\n state,\n manifest,\n catalog,\n baseDir: layout.baseDir,\n force: Boolean(args.force),\n all,\n fetchDocument: (skill) => fetchSkillDocument(http, skill, endpoint, base!),\n });\n\n // 订阅刚打开时即使一个字节都不用写,也要把标记落下去,否则下次 update 又退回只看清单\n // 陈旧参考文件:产品这一版撤掉的那些。与写入**同一个**提交窗口。\n const stale = await planStaleReferences(state, plan.documents, layout.baseDir);\n\n const subscriptionChanged = all && !state.all;\n if (!args.check && (plan.documents.length > 0 || subscriptionChanged)) {\n await writeSkillDocuments(plan.documents, layout.baseDir, stale.remove);\n await recordInstalled(layout.baseDir, plan.documents, {\n endpoint,\n base,\n target: layout.target,\n all,\n directIds: all ? new Set(plan.documents.map((document) => document.id)) : new Set<string>(),\n });\n if (layout.agentsFile) await syncAgentsIndex(layout, manifest);\n }\n\n const changed = plan.entries.filter((e) => e.status === 'updated' || e.status === 'added');\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(formatObject({\n endpoint,\n baseDir: layout.baseDir,\n target: layout.target,\n dryRun: Boolean(args.check),\n all,\n changed: changed.length,\n sources: {\n cli: { status: catalog.cli.status, count: catalog.cli.entries.size },\n chiron: { status: catalog.chiron.status, count: catalog.chiron.entries.size },\n },\n cliVersion: CLI_VERSION,\n staleReferences: stale,\n entries: plan.entries,\n }, { format: fmt }) + '\\n');\n process.exit(0);\n }\n\n process.stdout.write(`技能升级 — ${source === 'cli' ? `@hcmai/cli@${CLI_VERSION}(未连网)` : endpoint}\\n`);\n process.stdout.write(`落点 ${layout.baseDir}(${layout.target})`\n + (all ? ' 跟随全集:产品新增的技能会自动补上\\n\\n' : '\\n\\n'));\n for (const entry of plan.entries) {\n const mark = entry.status === 'unchanged' ? ' ' : entry.status === 'locally-modified' ? '!' : '·';\n process.stdout.write(` ${mark} ${entry.id.padEnd(30)} ${UPDATE_STATUS_LABEL[entry.status]}\\n`);\n if (entry.note) process.stdout.write(` ${entry.note}\\n`);\n }\n process.stdout.write('\\n');\n // 🔴 「没有写入」不等于「全部最新」:被跳过的那些正是最需要顾问知道的\n const skipped = plan.entries.filter((e) => e.status === 'locally-modified').length;\n const removed = plan.entries.filter((e) => e.status === 'removed-upstream').length;\n const removedInCli = plan.entries.filter((e) => e.status === 'removed-in-cli').length;\n const notChecked = plan.entries.filter((e) => e.status === 'not-checked').length;\n const tail = [\n skipped > 0 ? `${skipped} 个本地改过被跳过(--force 覆盖)` : '',\n removed > 0 ? `${removed} 个产品已移除(本地文件保留)` : '',\n removedInCli > 0 ? `${removedInCli} 个这一版 CLI 不再自带(本地文件保留)` : '',\n notChecked > 0 ? `${notChecked} 个本轮未核(那一半这趟没看)` : '',\n ].filter(Boolean).join(',');\n\n // 🔴 必须说出来的两句(spec §7.4 / §7.3):\n // ① 升级 CLI 本身**不会**改动已装的技能文件(`npm i -g` 不碰 .claude/skills/),\n // 所以「我升了 CLI」和「我的技能跟上了」是两回事;\n // ② `--source cli` 装了一半,但订阅的是全库——不说的话下次 update 的行为无从解释。\n const cliCount = plan.entries.filter(\n (e) => (state.skills[e.id]?.sourceKind ?? 'chiron') === 'cli',\n ).length;\n if (cliCount > 0) {\n process.stdout.write(` 自带技能 ${cliCount} 个已跟随当前 CLI ${CLI_VERSION}\\n`);\n }\n if (source === 'cli' && all) {\n process.stdout.write(\n ' 本趟只看了自带那一半;这个目录订阅的是全库,联网后 update 会补齐睿戎那一半\\n',\n );\n }\n if (stale.remove.length > 0) {\n process.stdout.write(\n ` ${args.check ? '会删掉' : '已删掉'} ${stale.remove.length} 个产品这一版撤掉的参考文件`\n + `(${stale.remove.map((r) => `${r.id}/references/${r.path}`).join('、')})\\n`,\n );\n }\n if (stale.keptLocallyModified.length > 0) {\n // 🔴 本地改过的不删,但必须报出来:不报的话顾问不知道盘上留着一份产品已经不认的文件。\n process.stdout.write(\n ` ${stale.keptLocallyModified.length} 个产品已撤掉但本地改过的参考文件保留了`\n + `(${stale.keptLocallyModified.map((r) => `${r.id}/references/${r.path}`).join('、')})\\n`,\n );\n }\n\n if (changed.length === 0 && skipped === 0 && removed === 0) {\n process.stdout.write(args.check ? ' 全部已是最新(--check 只看不动)\\n' : ' 全部已是最新,没有改动\\n');\n } else {\n const head = args.check\n ? (changed.length > 0 ? `有 ${changed.length} 个可以更新,去掉 --check 就会写入` : '没有可写入的更新')\n : (changed.length > 0 ? `已更新 ${changed.length} 个` : '没有写入任何改动');\n process.stdout.write(` ${[head, tail].filter(Boolean).join(';')}\\n`);\n }\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n","/**\n * 统一 catalog:把「睿戎技能库」与「CLI 自带技能」两个半边并成一份目录(刀 5.5 spec §5)。\n *\n * 🔴 **每个半边都带着自己的 `status`**,这不是可有可无的元数据,是判据的前提:\n * `--source cli` 不连网 ⇒ 睿戎那一半是**空的**。若判据只写「不在睿戎半边 ⇒ 产品已移除」,\n * 离线跑一次 `update --source cli` 会把顾问装的**每一份**睿戎技能报成「产品已移除」——\n * 一次报 40 份,而它们一个都没被移除。前提不成立时要说「本轮未核」,\n * 不能给一个像业务结论的答案。\n *\n * 🔴 `HalfStatus` 只有两值,**没有 `unreachable`**:取目录失败是硬失败(根本走不到判定这一步),\n * 包内资源读不到报 `E_SKILL_SOURCE_UNREACHABLE`。留一个走不到的枚举值,\n * 下一个人就会给它写一条恒不触发的分支。\n */\nimport type { ChironManifest, ChironSkill } from '@hcmai/sdk';\nimport { flattenSkills, CliError, CliErrorCode } from '@hcmai/sdk';\nimport type { CatalogSourceKind, InstalledSkillRecord, RecordSourceKind } from './skills';\nimport type { BundledSkillEntry } from './skills-manifest';\n\nexport type HalfStatus = 'fetched' | 'skipped';\n\n/** `--source` 的取值域。🔴 **不含 `local`**——没有任何一趟会去「扫 local 来源」。 */\nexport type SourceFilter = CatalogSourceKind | 'all';\n\n/** 两来源共有的那一半元信息。 */\nexport interface SkillMeta {\n id: string;\n title: string;\n description: string;\n category: string;\n stages: string[];\n actionSurface: 'cli' | 'curl';\n requires?: string[];\n bytes: number;\n files?: Array<{ path: string; bytes: number; sha256: string }>;\n}\n\nexport type SkillLocator =\n | { kind: 'chiron'; markdownUrl: string }\n | { kind: 'cli'; packagePath: string; cliVersion: string };\n\nexport interface CatalogEntry {\n meta: SkillMeta;\n locator: SkillLocator;\n}\n\nexport interface CatalogHalf {\n status: HalfStatus;\n entries: Map<string, CatalogEntry>;\n}\n\nexport interface UnifiedCatalog {\n chiron: CatalogHalf;\n cli: CatalogHalf;\n}\n\n/**\n * 自带技能的一等分类。\n *\n * 🔴 **不能叫 `operations`**:睿戎现有 9 个分类里第 9 个就叫 `operations`,\n * 只差一个前缀。撞上的后果不是静默合并,是 §5.2 那条报错。\n */\nexport const CLI_CATEGORY_KEY = 'cli-operations';\nexport const CLI_CATEGORY_NAME = 'CLI 操作';\n\nexport function chironEntry(skill: ChironSkill): CatalogEntry {\n return {\n meta: {\n id: skill.id,\n title: skill.title,\n description: skill.description,\n category: skill.category,\n stages: skill.stages ?? [],\n actionSurface: skill.actionSurface,\n requires: skill.requires,\n bytes: skill.bytes,\n files: skill.files,\n },\n locator: { kind: 'chiron', markdownUrl: skill.markdownUrl },\n };\n}\n\nexport function bundledEntry(entry: BundledSkillEntry, cliVersion: string): CatalogEntry {\n return {\n meta: {\n id: entry.id,\n title: entry.title ?? entry.id,\n description: entry.description ?? '',\n category: entry.category ?? CLI_CATEGORY_KEY,\n stages: entry.stages ?? [],\n // 自带技能讲的就是本 CLI 的命令,恒为 cli。\n actionSurface: 'cli',\n requires: entry.requires,\n bytes: entry.bytes,\n files: entry.files,\n },\n locator: { kind: 'cli', packagePath: `skills/${entry.id}`, cliVersion },\n };\n}\n\n/** 自带技能的 `sourceLocator` 写法:带版本,看得出它是跟着哪一版 CLI 装的。 */\nexport function cliLocatorString(id: string, cliVersion: string): string {\n return `@hcmai/cli@${cliVersion}:skills/${id}`;\n}\n\n/** `--source` 的取值域是**闭集**:写错一个词不能被当成缺省的 `all` 悄悄放过。 */\nexport const SOURCE_FILTERS: readonly SourceFilter[] = ['cli', 'chiron', 'all'];\n\nexport function parseSourceFilter(raw: string | undefined): SourceFilter {\n if (raw === undefined) return 'all';\n if ((SOURCE_FILTERS as readonly string[]).includes(raw)) return raw as SourceFilter;\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n `--source 只认 ${SOURCE_FILTERS.join(' / ')},收到 \"${raw}\"。` +\n '(`local` 不是取值:没有哪一趟会去「扫 local 来源」,' +\n 'install --from 装的那些在任何 --source 下都单列、都不参与升级。)',\n });\n}\n\nexport function emptyHalf(): CatalogHalf {\n return { status: 'skipped', entries: new Map() };\n}\n\nexport function buildUnifiedCatalog(input: {\n source: SourceFilter;\n /** 传了就表示这一半真的取到了;没传就是这一趟没看它。 */\n chironManifest?: ChironManifest;\n bundled?: BundledSkillEntry[];\n cliVersion: string;\n}): UnifiedCatalog {\n const chiron = emptyHalf();\n const cli = emptyHalf();\n if (input.source !== 'cli' && input.chironManifest) {\n chiron.status = 'fetched';\n for (const skill of flattenSkills(input.chironManifest)) chiron.entries.set(skill.id, chironEntry(skill));\n }\n if (input.source !== 'chiron' && input.bundled) {\n cli.status = 'fetched';\n for (const entry of input.bundled) cli.entries.set(entry.id, bundledEntry(entry, input.cliVersion));\n }\n return { chiron, cli };\n}\n\n// ================= id 冲突:确定性拒绝 =================\n\nexport interface ConflictReport {\n /** false = 这一趟没做跨来源冲突检查(有半边没看)。 */\n checked: boolean;\n ids: string[];\n}\n\n/**\n * 同 id ⇒ 报错退出,不静默取其一。\n *\n * 🔴 **检测本身也有前提**:「同 id ⇒ 报错」隐含两个半边都 `fetched`。\n * `--source cli` 时睿戎半边 `skipped` ⇒ 冲突永远检测不出来 ⇒ 静默装上自带那份。\n * 于是机器 A(缺省 all,在线)拒绝、机器 B(`--source cli`)装上且无提示——\n * **同一条命令在两台机器上装出不同内容,而顾问看不出差别**,\n * 正是本设计用来否决「来源优先级」的那句话,只是换了个触发条件。\n * ⇒ 任一半 `skipped` 时**不做**跨来源冲突判定,并且**说出来**(`checked: false`)。\n */\nexport function detectIdConflicts(catalog: UnifiedCatalog): ConflictReport {\n if (catalog.chiron.status !== 'fetched' || catalog.cli.status !== 'fetched') {\n return { checked: false, ids: [] };\n }\n const ids = [...catalog.cli.entries.keys()].filter((id) => catalog.chiron.entries.has(id)).sort();\n return { checked: true, ids };\n}\n\nexport function conflictMessage(ids: string[], endpoint: string): string {\n return (\n `技能 id \\`${ids.join('`、`')}\\` 在 CLI 自带与 ${endpoint} 的睿戎目录里同时存在。\\n` +\n '两边各自主张的东西不同,取任何一份都会让另一份的读者拿到错的合同。\\n' +\n '出路只有两条:① 升级 CLI(产品把它收编了,新版 CLI 会撤掉自带的那份);\\n' +\n '② 这是一次归属未定,把 id 与两处出处报给产品侧裁决。'\n );\n}\n\n/** 半边没看全时要说的那句话(§5.2 结论)。 */\nexport function unconfirmedConflictNote(source: SourceFilter): string {\n return `本趟只看了${source === 'cli' ? 'CLI 自带' : '睿戎'}来源,未做跨来源冲突检查`;\n}\n\n// ================= update 的三态判定(§9.3)=================\n\nexport type SourceCheckStatus = 'present' | 'removed-upstream' | 'removed-in-cli' | 'not-checked' | 'local';\n\n/**\n * 一条已装记录在本轮 catalog 下的来源判定。\n *\n * 🔴 **两侧严格对称**:不许给 cli 那一侧写「恒为 fetched——它是包内资源」。\n * 那句话有两个毛病:① 它与 `--source chiron` 直接冲突(那一趟的意思就是「不看 cli 这一半」),\n * 照「恒 fetched」往下走,顾问装的每一份自带技能都会报「这一版 CLI 不再自带它」;\n * ② 恒真前置等于没有前置——它不会报错,只会在假设被打破的那天给出一个像业务结论的答案。\n */\nexport function classifyInstalledSource(\n id: string,\n record: Pick<InstalledSkillRecord, 'sourceKind'>,\n catalog: UnifiedCatalog,\n): SourceCheckStatus {\n const kind: RecordSourceKind = record.sourceKind ?? 'chiron';\n if (kind === 'local') return 'local';\n const half = kind === 'cli' ? catalog.cli : catalog.chiron;\n if (half.status !== 'fetched') return 'not-checked';\n if (half.entries.has(id)) return 'present';\n return kind === 'cli' ? 'removed-in-cli' : 'removed-upstream';\n}\n\nexport const SOURCE_STATUS_NOTE: Record<Exclude<SourceCheckStatus, 'present'>, string> = {\n 'removed-upstream': '产品这一版的技能目录里已经没有它了;本地文件保留不动',\n 'removed-in-cli': '这一版 CLI 不再自带它(多半是被产品收编了,跑 hcm skills list 看看)',\n 'not-checked': '本轮没连网核对它的来源(--source cli),它是不是还在产品目录里这一趟不知道',\n local: '本地来源(install --from 装的),update 不管它;要更新就再 install --from 一次',\n};\n\n// ================= 跨来源 requires(§6)=================\n\nexport interface RequiresViolation {\n from: string;\n to: string;\n reason: string;\n}\n\n/**\n * 「睿戎 → 自带」是**禁止**方向:产品知识不得依赖客户端某个版本才存在的东西。\n * 允许它,等于产品的可读性取决于顾问装了哪版 CLI。\n *\n * 另三个方向都允许:自带→睿戎(`hcm delivery recon` 的用法自然要先懂 model-query-dsl)、\n * 自带→自带、睿戎→睿戎。\n */\nexport function checkCrossSourceRequires(catalog: UnifiedCatalog): RequiresViolation[] {\n if (catalog.chiron.status !== 'fetched' || catalog.cli.status !== 'fetched') return [];\n const out: RequiresViolation[] = [];\n for (const [id, entry] of catalog.chiron.entries) {\n for (const need of entry.meta.requires ?? []) {\n if (catalog.chiron.entries.has(need)) continue;\n if (catalog.cli.entries.has(need)) {\n out.push({\n from: id,\n to: need,\n reason: '睿戎技能不得依赖 CLI 自带技能:产品知识的可读性不能取决于顾问装了哪版 CLI',\n });\n }\n }\n }\n return out;\n}\n","/**\n * 自带技能的**运行时读取**:从这份 CLI 自己的 `dist/skills/` 里取正文与参考文件。\n *\n * 🔴 与 `skills-manifest.ts` 的分工:那边负责**导出清单**(构建期与 `hcm skills manifest`),\n * 这边负责**装的时候读内容**。两边共用同一个 `bundledSkillsDir()`,\n * 所以「清单里有、装的时候找不到」这种不一致在构造上不可能。\n *\n * 🔴 读不到不是网络问题:报 `SKILL_SOURCE_UNREACHABLE`(安装损坏),\n * 让顾问去重装 `@hcmai/cli`,而不是去查 VPN。\n */\nimport { promises as fsp } from 'node:fs';\nimport * as path from 'node:path';\nimport { CliError, CliErrorCode, assertSafeReferencePath, parseSkillRequirements } from '@hcmai/sdk';\nimport { bundledSkillsDir, collectBundledSkills, type BundledSkillEntry } from './skills-manifest';\nimport { cliLocatorString } from './skills-catalog';\nimport { CLI_VERSION } from '../package-version';\nimport type { SkillDocument, SkillReferenceDocument } from './skills';\n\nexport function listBundledSkills(dir = bundledSkillsDir()): BundledSkillEntry[] {\n return collectBundledSkills(dir);\n}\n\nfunction unreachable(id: string, detail: string): CliError {\n return new CliError({\n code: CliErrorCode.SKILL_SOURCE_UNREACHABLE,\n message:\n `装在这份 CLI 里的技能资源读不到(${detail}),重装 @hcmai/cli。` +\n `\\n技能 id:${id};找的位置:${bundledSkillsDir()}`,\n });\n}\n\nasync function readBundledReferences(skillDir: string): Promise<SkillReferenceDocument[]> {\n const root = path.join(skillDir, 'references');\n const out: SkillReferenceDocument[] = [];\n const walk = async (dir: string, prefix: string): Promise<void> => {\n let items;\n try {\n items = await fsp.readdir(dir, { withFileTypes: true });\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') return;\n throw cause;\n }\n for (const item of items.sort((a, b) => a.name.localeCompare(b.name))) {\n const relative = prefix ? `${prefix}/${item.name}` : item.name;\n if (item.isDirectory()) {\n await walk(path.join(dir, item.name), relative);\n continue;\n }\n if (!item.isFile()) continue;\n assertSafeReferencePath(relative);\n out.push({ path: relative, content: await fsp.readFile(path.join(dir, item.name), 'utf8') });\n }\n };\n await walk(root, '');\n return out;\n}\n\nexport async function readBundledSkillDocument(\n id: string,\n dir = bundledSkillsDir(),\n): Promise<SkillDocument> {\n const skillDir = path.join(dir, id);\n let markdown: string;\n try {\n markdown = await fsp.readFile(path.join(skillDir, 'SKILL.md'), 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') throw unreachable(id, 'SKILL.md 不存在');\n throw cause;\n }\n if (!markdown.trim()) throw unreachable(id, 'SKILL.md 是空的');\n return {\n id,\n markdown,\n source: cliLocatorString(id, CLI_VERSION),\n sourceKind: 'cli',\n references: await readBundledReferences(skillDir),\n };\n}\n\n/**\n * 自带技能的**自带侧**依赖闭包(自带 → 自带)。\n *\n * 🔴 解不到的 id **不在这里报错**:它可能是一条合法的「自带 → 睿戎」依赖(spec §6 允许),\n * 该由调用方连网去睿戎那边解。这里只把解不到的原样回给调用方。\n * 在这里就报错,等于把一条允许的方向判成断链。\n */\nexport async function resolveBundledClosure(\n targetId: string,\n dir = bundledSkillsDir(),\n): Promise<{ documents: SkillDocument[]; external: string[] }> {\n const documents: SkillDocument[] = [];\n const external = new Set<string>();\n const state = new Map<string, 'visiting' | 'done'>();\n const stack: string[] = [];\n const available = new Set(listBundledSkills(dir).map((s) => s.id));\n\n const visit = async (id: string): Promise<void> => {\n if (state.get(id) === 'done') return;\n if (state.get(id) === 'visiting') {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `自带技能依赖成环:${[...stack, id].join(' → ')}`,\n });\n }\n state.set(id, 'visiting');\n stack.push(id);\n const document = await readBundledSkillDocument(id, dir);\n for (const need of parseSkillRequirements(document.markdown, id)) {\n if (available.has(need)) await visit(need);\n else external.add(need);\n }\n stack.pop();\n state.set(id, 'done');\n documents.push(document);\n };\n\n await visit(targetId);\n return { documents, external: [...external].sort() };\n}\n","/**\n * `hcm skills manifest` —— 机器可读的**命令面 + 自带技能**清单(刀 5.5 spec §8)。\n *\n * 🔴 **必须从 commander 注册表导出,不许手抄**。再手抄一份只是把 ADR-319 §7.1 的 G8\n * 缺口(核心仓 `ChironCliCommandArchTest` 抄的命令表与真实 CLI 无绑定)从核心仓挪到 CLI 仓。\n *\n * 清单随包发布在 `dist/skills/manifest.json`,由构建脚本**执行本命令**产出——\n * 也就是说清单是 CLI 自己吐的,与注册表漂移在构造上不可能。\n *\n * 🔴 本命令**不连网、不读凭据**:它是给守卫和外部工具用的静态事实。\n */\nimport { readFileSync, readdirSync, statSync, existsSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { Command } from 'commander';\nimport { formatObject, parseSkillFrontmatter, type OutputFormat } from '@hcmai/sdk';\nimport { CLI_VERSION } from '../package-version';\n\nexport interface CommandSurface {\n /** 空格分隔的完整路径,如 `delivery doctor`。不含 `hcm` 本身。 */\n path: string;\n options: string[];\n}\n\nexport interface BundledSkillEntry {\n id: string;\n title?: string;\n description?: string;\n category?: string;\n stages?: string[];\n actionSurface?: string;\n requires?: string[];\n bytes: number;\n files: Array<{ path: string; bytes: number; sha256: string }>;\n}\n\nexport interface SkillsManifest {\n schemaVersion: 1;\n cliVersion: string;\n commands: CommandSurface[];\n skills: BundledSkillEntry[];\n}\n\n/**\n * 遍历 commander 注册表,导出**完整命令面 + 每条的 option 名单**。\n *\n * 🔴 `option.flags` 形如 `--output <fmt>` / `-y, --yes`。只取长选项名,\n * 因为守卫要判的是「正文里点名的 `--flag` 存在吗」。\n */\nexport function collectCommandSurface(root: Command): CommandSurface[] {\n const out: CommandSurface[] = [];\n const walk = (cmd: Command, prefix: string[]): void => {\n for (const sub of cmd.commands) {\n const segs = [...prefix, sub.name()];\n const options = sub.options\n .map((o) => /(--[a-zA-Z0-9][\\w-]*)/.exec(o.flags)?.[1] ?? '')\n .filter((s) => s.length > 0);\n out.push({ path: segs.join(' '), options: [...new Set(options)].sort() });\n walk(sub, segs);\n }\n };\n walk(root, []);\n // 排序让清单在两次构建之间逐字稳定——否则 diff 全是噪声,守卫也没法比。\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/**\n * 自带技能的落点。\n *\n * 🔴 **从安装后的 CLI 出发定位**,不依赖仓库 cwd:顾问是在客户目录里敲这条命令的,\n * 用 `process.cwd()` 找资源会在仓库外面全部落空(刀 5.5 spec §12.2 的 R3)。\n */\nexport function bundledSkillsDir(): string {\n // 本文件构建后落在 `dist/index.js` 里,技能在 `dist/skills/`。\n const here = path.dirname(fileURLToPath(import.meta.url));\n return path.join(here, 'skills');\n}\n\nfunction sha256(buf: Buffer): string {\n return createHash('sha256').update(buf).digest('hex');\n}\n\nfunction listFiles(dir: string, rel = ''): string[] {\n const out: string[] = [];\n for (const name of readdirSync(dir)) {\n const p = path.join(dir, name);\n const r = rel ? `${rel}/${name}` : name;\n if (statSync(p).isDirectory()) out.push(...listFiles(p, r));\n else out.push(r);\n }\n return out;\n}\n\n/** 扫自带技能目录,产出 `skills[]`。目录不存在时回空数组(还没落任何自带技能)。 */\nexport function collectBundledSkills(dir = bundledSkillsDir()): BundledSkillEntry[] {\n if (!existsSync(dir)) return [];\n const out: BundledSkillEntry[] = [];\n for (const id of readdirSync(dir).sort()) {\n const skillDir = path.join(dir, id);\n if (!statSync(skillDir).isDirectory()) continue;\n const files = listFiles(skillDir).sort();\n if (!files.includes('SKILL.md')) continue;\n let bytes = 0;\n const fileRows = files.map((rel) => {\n const buf = readFileSync(path.join(skillDir, rel));\n bytes += buf.byteLength;\n return { path: rel, bytes: buf.byteLength, sha256: sha256(buf) };\n });\n const body = readFileSync(path.join(skillDir, 'SKILL.md'), 'utf8');\n const fm = parseSkillFrontmatter(body, id) as Record<string, unknown>;\n out.push({\n id,\n title: str(fm.title),\n description: str(fm.description),\n category: str(fm.category),\n stages: strArray(fm.stages),\n actionSurface: str(fm.actionSurface),\n requires: strArray(fm.requires),\n bytes,\n files: fileRows,\n });\n }\n return out;\n}\n\nexport function buildManifest(root: Command, skillsDir = bundledSkillsDir()): SkillsManifest {\n return {\n schemaVersion: 1,\n cliVersion: CLI_VERSION,\n commands: collectCommandSurface(root),\n skills: collectBundledSkills(skillsDir),\n };\n}\n\nexport interface SkillsManifestArgs {\n output?: OutputFormat;\n}\n\nexport function skillsManifestCommand(root: Command, args: SkillsManifestArgs): void {\n const manifest = buildManifest(root);\n process.stdout.write(formatObject(manifest, { format: args.output ?? 'json' }) + '\\n');\n}\n\nfunction str(v: unknown): string | undefined {\n return typeof v === 'string' && v ? v : undefined;\n}\nfunction strArray(v: unknown): string[] | undefined {\n return Array.isArray(v) ? v.map(String) : undefined;\n}\n","import { createHash } from 'node:crypto';\nimport { promises as fs } from 'node:fs';\nimport type { Dirent } from 'node:fs';\nimport path from 'node:path';\nimport {\n CliError,\n CliErrorCode,\n assertSafeSkillFilePath,\n assertSafeSkillId,\n normalizeReferences,\n resolveSkillInstallOrder,\n type ChironManifest,\n} from '@hcmai/sdk';\nimport type { PreparedRuntimeFile, WorkBuddyRuntime } from './skills-runtime';\n\nexport interface PreparedSkillFile {\n path: string;\n content: Buffer;\n bytes: number;\n sha256: string;\n}\n\nexport interface PreparedSkillDocument {\n id: string;\n markdown: string;\n bytes: number;\n sha256: string;\n files: PreparedSkillFile[];\n}\n\nexport interface ChironLock {\n schemaVersion: 1;\n source: {\n endpointOriginSha256: string;\n catalogPath: '/skills.json';\n catalogSha256: string;\n };\n selection: { requestedSkill: string };\n resolvedSkills: Array<{\n id: string;\n bytes: number;\n sha256: string;\n /** 旧锁没有该字段;新写锁始终逐文件记录。 */\n files?: Array<{ path: string; bytes: number; sha256: string }>;\n }>;\n /** 旧锁没有该字段;WP2 新写锁记录能力与启动文件摘要,不记录本机绝对路径。 */\n runtime?: {\n capabilities: string[];\n capabilitiesSha256: string;\n launch: WorkBuddyRuntime['launch'];\n files: Array<{ path: string; bytes: number; sha256: string; mode: number }>;\n };\n ownedFiles: string[];\n syncedAt: string;\n}\n\nexport interface WorkBuddySyncInput {\n project: string;\n endpoint: string;\n catalog: ChironManifest;\n requestedSkill: string;\n documents: PreparedSkillDocument[];\n runtime: WorkBuddyRuntime;\n now?: string;\n}\n\nexport interface WorkBuddySyncResult {\n changed: boolean;\n requestedSkill: string;\n resolvedSkills: string[];\n project: string;\n skillsDir: string;\n lockPath: string;\n runnerPath: string;\n capabilitiesSha256: string;\n installed: string[];\n removed: string[];\n}\n\ninterface PreparedOwnedFile {\n content: Buffer;\n bytes: number;\n sha256: string;\n mode?: number;\n}\n\ninterface LockedOwnedFile {\n sha256: string;\n mode?: number;\n}\n\ninterface SyncJournal {\n schemaVersion: 1;\n project: string;\n affectedFiles: string[];\n oldLockExisted: boolean;\n}\n\n/**\n * 下载前先解析完整依赖闭包;全部下载成功、动作面与字节数都通过后才返回。\n * 调用方只有拿到完整返回值后才进入文件系统同步,所以网络失败不会留下半套 Skill。\n */\nexport async function prepareSkillDocuments(\n catalog: ChironManifest,\n requestedSkill: string,\n fetchMarkdown: (id: string) => Promise<string>,\n fetchFile?: (id: string, relativePath: string) => Promise<Buffer>,\n fetchReference?: (id: string, relativePath: string) => Promise<string | Buffer>,\n): Promise<PreparedSkillDocument[]> {\n const order = resolveSkillInstallOrder(catalog, requestedSkill);\n for (const skill of order) {\n if (skill.actionSurface !== 'cli') {\n throw invalid(`技能 ${skill.id} 尚未收敛到 hcm CLI,不能同步为 WorkBuddy 正式执行 Skill`);\n }\n }\n\n return Promise.all(\n order.map(async (skill) => {\n let files: PreparedSkillFile[];\n if (skill.files === undefined) {\n const markdown = await fetchMarkdown(skill.id);\n const content = Buffer.from(markdown, 'utf8');\n const references = normalizeReferences(skill.references, skill.id);\n if (references.length > 0 && !fetchReference) {\n throw invalid(`技能 ${skill.id} 声明了 references,但调用方没有参考文件下载能力`);\n }\n const referenceFiles = await Promise.all(\n references.map(async (relativePath) => {\n const targetPath = `references/${relativePath}`;\n assertSafeSkillFilePath(targetPath);\n const fetched = await fetchReference!(skill.id, relativePath);\n const referenceContent = Buffer.isBuffer(fetched)\n ? Buffer.from(fetched)\n : Buffer.from(fetched, 'utf8');\n return {\n path: targetPath,\n content: referenceContent,\n bytes: referenceContent.length,\n sha256: sha256(referenceContent),\n };\n }),\n );\n files = [\n {\n path: 'SKILL.md',\n content,\n bytes: content.length,\n sha256: sha256(content),\n },\n ...referenceFiles,\n ];\n } else {\n if (!Array.isArray(skill.files) || skill.files.length === 0) {\n throw invalid(`技能 ${skill.id} 的 files 目录为空`);\n }\n if (!fetchFile) throw invalid(`技能 ${skill.id} 提供完整目录,但调用方没有文件下载能力`);\n const seen = new Set<string>();\n for (const file of skill.files) {\n assertSafeSkillFilePath(file.path);\n if (seen.has(file.path))\n throw invalid(`技能 ${skill.id} 的 files 包含重复路径: ${file.path}`);\n seen.add(file.path);\n if (\n !Number.isInteger(file.bytes) ||\n file.bytes < 0 ||\n !/^[a-f0-9]{64}$/.test(file.sha256)\n ) {\n throw invalid(`技能 ${skill.id} 的文件目录元数据非法: ${file.path}`);\n }\n }\n if (!seen.has('SKILL.md')) throw invalid(`技能 ${skill.id} 的完整目录缺少 SKILL.md`);\n files = await Promise.all(\n skill.files.map(async (file) => {\n const content = Buffer.from(await fetchFile(skill.id, file.path));\n if (content.length !== file.bytes) {\n throw invalid(\n `技能 ${skill.id}/${file.path} 字节数与目录不一致:目录=${file.bytes},实际=${content.length}`,\n );\n }\n const digest = sha256(content);\n if (digest !== file.sha256) {\n throw invalid(`技能 ${skill.id}/${file.path} 摘要与目录不一致`);\n }\n return { path: file.path, content, bytes: content.length, sha256: digest };\n }),\n );\n }\n\n const root = files.find((file) => file.path === 'SKILL.md');\n if (!root) throw invalid(`技能 ${skill.id} 的完整目录缺少 SKILL.md`);\n const markdown = root.content.toString('utf8');\n if (!markdown.trim()) throw invalid(`技能 ${skill.id} 内容为空`);\n validateWorkBuddyFrontmatter(markdown, skill.id);\n const bytes = root.bytes;\n if (Number.isFinite(skill.bytes) && skill.bytes > 0 && skill.bytes !== bytes) {\n throw invalid(`技能 ${skill.id} 字节数与目录不一致:目录=${skill.bytes},实际=${bytes}`);\n }\n return { id: skill.id, markdown, bytes, sha256: root.sha256, files };\n }),\n );\n}\n\n/** 把一组已完整校验的 Skill 同步进项目,并由一份锁文件明确所有权。 */\nexport async function syncWorkBuddyProject(\n input: WorkBuddySyncInput,\n): Promise<WorkBuddySyncResult> {\n const project = path.resolve(input.project);\n const metaDir = path.join(project, '.hcm-delivery');\n const skillsDir = path.join(project, '.codebuddy', 'skills');\n const lockPath = path.join(metaDir, 'chiron.lock.json');\n assertSafeSkillId(input.requestedSkill);\n validatePreparedDocuments(input.documents, input.requestedSkill);\n validatePreparedRuntime(input.runtime);\n\n await recoverInterruptedSyncs(project, metaDir, lockPath);\n\n const oldLock = await readLock(lockPath);\n const skillEntries = input.documents.flatMap((document) =>\n document.files.map((file) => [ownedFile(document.id, file.path), file] as const),\n );\n const runtimeEntries = input.runtime.files.map((file) => [file.path, file] as const);\n const desiredEntries: Array<readonly [string, PreparedOwnedFile]> = [\n ...skillEntries,\n ...runtimeEntries,\n ];\n const desiredFiles = desiredEntries.map(([file]) => file);\n const desiredByFile = new Map(desiredEntries);\n const oldOwned = new Set(oldLock?.ownedFiles ?? []);\n const oldDigestByFile = lockDigests(oldLock);\n\n for (const file of oldOwned) validateOwnedFile(file);\n for (const file of desiredFiles) {\n const absolute = path.join(project, file);\n const current = await readOptionalBytes(absolute);\n if (current !== undefined && !oldOwned.has(file)) {\n throw invalid(`目标文件不属于上一份 Chiron 锁,拒绝覆盖顾问文件:${file}`);\n }\n }\n\n for (const file of oldOwned) {\n const absolute = path.join(project, file);\n const current = await readOptionalBytes(absolute);\n if (current === undefined) continue;\n const expected = oldDigestByFile.get(file);\n if (\n !expected ||\n sha256(current) !== expected.sha256 ||\n !(await fileModeMatches(absolute, expected.mode))\n ) {\n throw invalid(`上一份锁拥有的生成文件已被人工修改,拒绝覆盖或清理:${file}`);\n }\n }\n\n const newLock: ChironLock = {\n schemaVersion: 1,\n source: {\n endpointOriginSha256: sha256(normalizeEndpoint(input.endpoint)),\n catalogPath: '/skills.json',\n catalogSha256: sha256(stableJson(input.catalog)),\n },\n selection: { requestedSkill: input.requestedSkill },\n resolvedSkills: input.documents.map(({ id, bytes, sha256: digest, files: skillFiles }) => ({\n id,\n bytes,\n sha256: digest,\n files: skillFiles.map(({ path: filePath, bytes: fileBytes, sha256: fileSha256 }) => ({\n path: filePath,\n bytes: fileBytes,\n sha256: fileSha256,\n })),\n })),\n runtime: {\n capabilities: input.runtime.capabilities,\n capabilitiesSha256: input.runtime.capabilitiesSha256,\n launch: input.runtime.launch,\n files: input.runtime.files.map(({ path: filePath, bytes, sha256: digest, mode }) => ({\n path: filePath,\n bytes,\n sha256: digest,\n mode,\n })),\n },\n ownedFiles: desiredFiles,\n syncedAt: input.now ?? new Date().toISOString(),\n };\n\n if (\n oldLock &&\n sameLockContent(oldLock, newLock) &&\n (await desiredFilesMatch(project, desiredByFile))\n ) {\n return result(false, input, project, skillsDir, lockPath, [], []);\n }\n\n const obsolete = [...oldOwned].filter((file) => !desiredByFile.has(file));\n await fs.mkdir(metaDir, { recursive: true });\n const staging = await fs.mkdtemp(path.join(metaDir, '.staging-'));\n const stagedFiles = path.join(staging, 'new');\n const backups = path.join(staging, 'backup');\n const stagedLock = path.join(staging, 'chiron.lock.json');\n const journalPath = path.join(staging, 'journal.json');\n let journalReady = false;\n\n try {\n for (const [file, preparedFile] of desiredByFile) {\n const staged = path.join(stagedFiles, file);\n await fs.mkdir(path.dirname(staged), { recursive: true });\n await fs.writeFile(\n staged,\n preparedFile.content,\n preparedFile.mode === undefined ? undefined : { mode: preparedFile.mode },\n );\n }\n await fs.writeFile(stagedLock, `${JSON.stringify(newLock, null, 2)}\\n`, 'utf8');\n\n const affected = [...new Set([...desiredFiles, ...obsolete])];\n for (const file of affected) {\n const target = path.join(project, file);\n if (!(await exists(target))) continue;\n const backup = path.join(backups, file);\n await fs.mkdir(path.dirname(backup), { recursive: true });\n await fs.copyFile(target, backup);\n }\n\n const oldLockExisted = await exists(lockPath);\n if (oldLockExisted) {\n const backupLock = path.join(backups, '.hcm-delivery', 'chiron.lock.json');\n await fs.mkdir(path.dirname(backupLock), { recursive: true });\n await fs.copyFile(lockPath, backupLock);\n }\n const journal: SyncJournal = {\n schemaVersion: 1,\n project,\n affectedFiles: affected,\n oldLockExisted,\n };\n await fs.writeFile(journalPath, `${JSON.stringify(journal, null, 2)}\\n`, 'utf8');\n journalReady = true;\n\n for (const file of desiredFiles) {\n const target = path.join(project, file);\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.rm(target, { force: true });\n await fs.rename(path.join(stagedFiles, file), target);\n }\n for (const file of obsolete) await fs.unlink(path.join(project, file)).catch(ignoreMissing);\n await fs.rm(lockPath, { force: true });\n await fs.rename(stagedLock, lockPath);\n\n // 锁最后替换;删除 journal 表示整组文件已经提交。若在此前被中断,下次运行会回滚。\n await fs.unlink(journalPath);\n journalReady = false;\n } catch (cause) {\n if (journalReady) await recoverStaging(project, staging, lockPath);\n throw cause;\n } finally {\n await fs.rm(staging, { recursive: true, force: true });\n }\n\n return result(\n true,\n input,\n project,\n skillsDir,\n lockPath,\n input.documents.map((document) => document.id),\n [...new Set(obsolete.map(idFromOwnedFile).filter((id): id is string => id !== undefined))],\n );\n}\n\n/** 启动同步前回滚上一次未提交的文件组,避免 kill/crash 后留下混合版本。 */\nasync function recoverInterruptedSyncs(\n project: string,\n metaDir: string,\n lockPath: string,\n): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(metaDir, { withFileTypes: true });\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw cause;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith('.staging-')) continue;\n const staging = path.join(metaDir, entry.name);\n if (await exists(path.join(staging, 'journal.json'))) {\n await recoverStaging(project, staging, lockPath);\n }\n await fs.rm(staging, { recursive: true, force: true });\n }\n}\n\nasync function recoverStaging(project: string, staging: string, lockPath: string): Promise<void> {\n const journalPath = path.join(staging, 'journal.json');\n const journal = parseJournal(await fs.readFile(journalPath, 'utf8'), project);\n const backups = path.join(staging, 'backup');\n\n for (const file of journal.affectedFiles) {\n const target = path.join(project, file);\n const backup = path.join(backups, file);\n if (await exists(backup)) {\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.rm(target, { force: true });\n await fs.rename(backup, target);\n } else {\n await fs.rm(target, { force: true });\n }\n }\n\n const backupLock = path.join(backups, '.hcm-delivery', 'chiron.lock.json');\n if (journal.oldLockExisted) {\n if (!(await exists(backupLock))) throw invalid(`同步恢复缺少旧锁备份:${backupLock}`);\n await fs.mkdir(path.dirname(lockPath), { recursive: true });\n await fs.rm(lockPath, { force: true });\n await fs.rename(backupLock, lockPath);\n } else {\n await fs.rm(lockPath, { force: true });\n }\n}\n\nfunction parseJournal(content: string, project: string): SyncJournal {\n let journal: Partial<SyncJournal>;\n try {\n journal = JSON.parse(content) as Partial<SyncJournal>;\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.CONFIG_PARSE_ERROR,\n message: 'Chiron 同步恢复日志损坏',\n cause,\n });\n }\n if (\n journal.schemaVersion !== 1 ||\n journal.project !== project ||\n !Array.isArray(journal.affectedFiles) ||\n typeof journal.oldLockExisted !== 'boolean'\n ) {\n throw invalid('Chiron 同步恢复日志合同不匹配,拒绝猜测恢复范围');\n }\n for (const file of journal.affectedFiles) validateOwnedFile(file);\n return journal as SyncJournal;\n}\n\nfunction validatePreparedDocuments(\n documents: PreparedSkillDocument[],\n requestedSkill: string,\n): void {\n const seen = new Set<string>();\n for (const document of documents) {\n assertSafeSkillId(document.id);\n if (seen.has(document.id)) throw invalid(`同步闭包包含重复技能: ${document.id}`);\n seen.add(document.id);\n if (!document.markdown.trim()) throw invalid(`技能 ${document.id} 内容为空`);\n const paths = new Set<string>();\n for (const file of document.files) {\n assertSafeSkillFilePath(file.path);\n if (paths.has(file.path)) throw invalid(`技能 ${document.id} 包含重复文件: ${file.path}`);\n paths.add(file.path);\n if (file.content.length !== file.bytes || sha256(file.content) !== file.sha256) {\n throw invalid(`技能 ${document.id}/${file.path} 的已准备内容摘要不一致`);\n }\n }\n const root = document.files.find((file) => file.path === 'SKILL.md');\n if (\n !root ||\n !root.content.equals(Buffer.from(document.markdown, 'utf8')) ||\n root.bytes !== document.bytes ||\n root.sha256 !== document.sha256\n ) {\n throw invalid(`技能 ${document.id} 的已准备内容摘要不一致`);\n }\n }\n if (!seen.has(requestedSkill)) throw invalid(`同步闭包不包含目标技能: ${requestedSkill}`);\n}\n\nfunction validatePreparedRuntime(runtime: WorkBuddyRuntime): void {\n if (!Array.isArray(runtime.capabilities) || runtime.capabilities.length === 0) {\n throw invalid('WorkBuddy CLI 能力集合为空');\n }\n const capabilities = new Set<string>();\n for (const capability of runtime.capabilities) {\n if (!/^[a-z0-9]+(?:[.-][a-z0-9]+)*$/.test(capability) || capabilities.has(capability)) {\n throw invalid(`WorkBuddy CLI 能力标识非法或重复:${capability}`);\n }\n capabilities.add(capability);\n }\n if (\n !validDigest(runtime.capabilitiesSha256) ||\n runtime.capabilitiesSha256 !== sha256(`${runtime.capabilities.join('\\n')}\\n`)\n ) {\n throw invalid('WorkBuddy CLI 能力摘要不一致');\n }\n if (!validDigest(runtime.launch.executableSha256)) {\n throw invalid('WorkBuddy CLI 可执行文件摘要非法');\n }\n if (runtime.launch.kind === 'node-entry' && !validDigest(runtime.launch.entrySha256)) {\n throw invalid('WorkBuddy CLI 入口摘要非法');\n }\n if (!Array.isArray(runtime.files) || runtime.files.length !== 2) {\n throw invalid('WorkBuddy 运行入口必须同时包含 Unix 与 Windows 文件');\n }\n const files = new Set<string>();\n for (const file of runtime.files) {\n validateRuntimeFile(file);\n if (files.has(file.path)) throw invalid(`WorkBuddy 运行入口重复:${file.path}`);\n files.add(file.path);\n }\n if (!files.has('.hcm-delivery/bin/hcm') || !files.has('.hcm-delivery/bin/hcm.cmd')) {\n throw invalid('WorkBuddy 运行入口合同不完整');\n }\n}\n\nfunction validateRuntimeFile(file: PreparedRuntimeFile): void {\n validateOwnedFile(file.path);\n if (\n file.content.length !== file.bytes ||\n sha256(file.content) !== file.sha256 ||\n !Number.isInteger(file.mode) ||\n file.mode < 0 ||\n file.mode > 0o777\n ) {\n throw invalid(`WorkBuddy 运行入口摘要或权限不一致:${file.path}`);\n }\n}\n\nfunction validateWorkBuddyFrontmatter(markdown: string, skillId: string): void {\n const match = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/.exec(markdown);\n if (!match) throw invalid(`技能 ${skillId} 缺少 YAML frontmatter`);\n const frontmatter = match[1] ?? '';\n const name = /^name:\\s*['\"]?([^'\"\\s]+)['\"]?\\s*$/m.exec(frontmatter)?.[1];\n const description = /^description:\\s*(.+)$/m.exec(frontmatter)?.[1]?.trim();\n if (name !== skillId) throw invalid(`技能 ${skillId} 的 frontmatter name 不一致`);\n if (!description) throw invalid(`技能 ${skillId} 缺少 description,WorkBuddy 无法发现`);\n}\n\nasync function readLock(lockPath: string): Promise<ChironLock | undefined> {\n const content = await readOptional(lockPath);\n if (content === undefined) return undefined;\n try {\n const lock = JSON.parse(content) as Partial<ChironLock>;\n if (\n lock.schemaVersion !== 1 ||\n !lock.source ||\n !lock.selection?.requestedSkill ||\n !Array.isArray(lock.resolvedSkills) ||\n !Array.isArray(lock.ownedFiles)\n ) {\n throw new Error('schema mismatch');\n }\n assertSafeSkillId(lock.selection.requestedSkill);\n for (const skill of lock.resolvedSkills) {\n assertSafeSkillId(skill.id);\n if (\n !Number.isInteger(skill.bytes) ||\n skill.bytes < 0 ||\n !/^[a-f0-9]{64}$/.test(skill.sha256)\n ) {\n throw new Error('invalid skill digest');\n }\n if (skill.files !== undefined) {\n if (!Array.isArray(skill.files) || skill.files.length === 0)\n throw new Error('invalid files');\n const seen = new Set<string>();\n for (const file of skill.files) {\n assertSafeSkillFilePath(file.path);\n if (\n seen.has(file.path) ||\n !Number.isInteger(file.bytes) ||\n file.bytes < 0 ||\n !/^[a-f0-9]{64}$/.test(file.sha256)\n ) {\n throw new Error('invalid file digest');\n }\n seen.add(file.path);\n }\n if (!seen.has('SKILL.md')) throw new Error('missing SKILL.md');\n }\n }\n if (lock.runtime !== undefined) validateLockedRuntime(lock.runtime);\n for (const file of lock.ownedFiles) validateOwnedFile(file);\n return lock as ChironLock;\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.CONFIG_PARSE_ERROR,\n message: `Chiron 锁文件损坏,拒绝猜测文件所有权:${lockPath}`,\n cause,\n });\n }\n}\n\nfunction validateLockedRuntime(runtime: NonNullable<ChironLock['runtime']>): void {\n if (\n !Array.isArray(runtime.capabilities) ||\n runtime.capabilities.length === 0 ||\n !validDigest(runtime.capabilitiesSha256) ||\n runtime.capabilitiesSha256 !== sha256(`${runtime.capabilities.join('\\n')}\\n`) ||\n !runtime.launch ||\n !validDigest(runtime.launch.executableSha256) ||\n !Array.isArray(runtime.files) ||\n runtime.files.length !== 2\n ) {\n throw new Error('invalid runtime');\n }\n if (runtime.launch.kind === 'node-entry') {\n if (!validDigest(runtime.launch.entrySha256)) throw new Error('invalid runtime entry');\n } else if (runtime.launch.kind !== 'executable') {\n throw new Error('invalid runtime launch kind');\n }\n const capabilities = new Set<string>();\n for (const capability of runtime.capabilities) {\n if (!/^[a-z0-9]+(?:[.-][a-z0-9]+)*$/.test(capability) || capabilities.has(capability)) {\n throw new Error('invalid runtime capability');\n }\n capabilities.add(capability);\n }\n const files = new Set<string>();\n for (const file of runtime.files) {\n validateOwnedFile(file.path);\n if (\n files.has(file.path) ||\n !Number.isInteger(file.bytes) ||\n file.bytes < 0 ||\n !validDigest(file.sha256) ||\n !Number.isInteger(file.mode) ||\n file.mode < 0 ||\n file.mode > 0o777\n ) {\n throw new Error('invalid runtime file');\n }\n files.add(file.path);\n }\n if (!files.has('.hcm-delivery/bin/hcm') || !files.has('.hcm-delivery/bin/hcm.cmd')) {\n throw new Error('missing runtime file');\n }\n}\n\nfunction sameLockContent(left: ChironLock, right: ChironLock): boolean {\n const withoutTime = (lock: ChironLock) => ({ ...lock, syncedAt: undefined });\n return stableJson(withoutTime(left)) === stableJson(withoutTime(right));\n}\n\nasync function desiredFilesMatch(\n project: string,\n desired: Map<string, PreparedOwnedFile>,\n): Promise<boolean> {\n for (const [file, preparedFile] of desired) {\n const absolute = path.join(project, file);\n const current = await readOptionalBytes(absolute);\n if (\n current === undefined ||\n sha256(current) !== preparedFile.sha256 ||\n !(await fileModeMatches(absolute, preparedFile.mode))\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction result(\n changed: boolean,\n input: WorkBuddySyncInput,\n project: string,\n skillsDir: string,\n lockPath: string,\n installed: string[],\n removed: string[],\n): WorkBuddySyncResult {\n return {\n changed,\n requestedSkill: input.requestedSkill,\n resolvedSkills: input.documents.map((document) => document.id),\n project,\n skillsDir,\n lockPath,\n runnerPath: path.join(project, '.hcm-delivery', 'bin', 'hcm'),\n capabilitiesSha256: input.runtime.capabilitiesSha256,\n installed,\n removed,\n };\n}\n\nfunction ownedFile(id: string, relativePath = 'SKILL.md'): string {\n assertSafeSkillId(id);\n assertSafeSkillFilePath(relativePath);\n return `.codebuddy/skills/${id}/${relativePath}`;\n}\n\nfunction idFromOwnedFile(file: string): string | undefined {\n validateOwnedFile(file);\n if (!file.startsWith('.codebuddy/skills/')) return undefined;\n return file.split('/')[2] ?? '';\n}\n\nfunction validateOwnedFile(file: string): void {\n if (file === '.hcm-delivery/bin/hcm' || file === '.hcm-delivery/bin/hcm.cmd') return;\n const match = /^\\.codebuddy\\/skills\\/([a-z0-9][a-z0-9-]{0,63})\\/(.+)$/.exec(file);\n if (!match) throw invalid(`锁文件包含非法所有权路径:${file}`);\n const id = match[1];\n const relativePath = match[2];\n if (!id || !relativePath) throw invalid(`锁文件包含非法所有权路径:${file}`);\n assertSafeSkillId(id);\n try {\n assertSafeSkillFilePath(relativePath);\n } catch {\n throw invalid(`锁文件包含非法所有权路径:${file}`);\n }\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n let url: URL;\n try {\n url = new URL(endpoint);\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `非法 endpoint:${endpoint}`,\n cause,\n });\n }\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n url.pathname = url.pathname.replace(/\\/+$/, '');\n return url.toString().replace(/\\/$/, '');\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction stableJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableJson).join(',')}]`;\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n return `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${stableJson(item)}`).join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nasync function readOptional(file: string): Promise<string | undefined> {\n try {\n return await fs.readFile(file, 'utf8');\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw cause;\n }\n}\n\nasync function readOptionalBytes(file: string): Promise<Buffer | undefined> {\n try {\n return await fs.readFile(file);\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw cause;\n }\n}\n\nasync function exists(file: string): Promise<boolean> {\n try {\n await fs.access(file);\n return true;\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === 'ENOENT') return false;\n throw cause;\n }\n}\n\nfunction lockDigests(lock: ChironLock | undefined): Map<string, LockedOwnedFile> {\n const digests = new Map<string, LockedOwnedFile>();\n for (const skill of lock?.resolvedSkills ?? []) {\n if (skill.files === undefined) {\n digests.set(ownedFile(skill.id), { sha256: skill.sha256 });\n continue;\n }\n for (const file of skill.files) {\n digests.set(ownedFile(skill.id, file.path), { sha256: file.sha256 });\n }\n }\n for (const file of lock?.runtime?.files ?? []) {\n digests.set(file.path, { sha256: file.sha256, mode: file.mode });\n }\n return digests;\n}\n\nasync function fileModeMatches(file: string, expected: number | undefined): Promise<boolean> {\n if (expected === undefined || process.platform === 'win32') return true;\n const stat = await fs.stat(file);\n return (stat.mode & 0o777) === expected;\n}\n\nfunction validDigest(value: unknown): value is string {\n return typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);\n}\n\nfunction ignoreMissing(cause: unknown): void {\n if ((cause as NodeJS.ErrnoException).code !== 'ENOENT') throw cause;\n}\n\nfunction invalid(message: string): CliError {\n return new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message });\n}\n","import { execFile } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { createReadStream, promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\nimport { CliError, CliErrorCode } from '@hcmai/sdk';\n\nconst execFileAsync = promisify(execFile);\nconst REQUIRED_CAPABILITIES = [\n 'hcm.help.skills',\n 'hcm.skills.help.sync',\n 'hcm.skills.sync.option.project',\n 'hcm.skills.sync.option.target',\n] as const;\n\nexport interface RuntimeProbeInput {\n /** 显式 CLI 入口;相对路径按当前工作目录解析。 */\n candidate?: string;\n /** 默认使用当前 Node,测试和受管包装器可显式传入。 */\n nodeExecutable?: string;\n /** 未传 candidate 时使用的当前 CLI 入口;默认 process.argv[1]。 */\n currentEntry?: string;\n /** 调用方已在当前 CLI 的 skills sync action 内,命令注册本身即能力证明。 */\n currentEntryHasRequiredCapabilities?: boolean;\n /** 禁止作为上游候选的项目入口,避免生成会执行自身的包装器。 */\n forbiddenCandidatePaths?: string[];\n timeoutMs?: number;\n}\n\nexport interface PreparedRuntimeFile {\n path: '.hcm-delivery/bin/hcm' | '.hcm-delivery/bin/hcm.cmd';\n content: Buffer;\n bytes: number;\n sha256: string;\n mode: number;\n}\n\nexport interface WorkBuddyRuntime {\n capabilities: string[];\n capabilitiesSha256: string;\n launch:\n | {\n kind: 'node-entry';\n executableSha256: string;\n entrySha256: string;\n }\n | {\n kind: 'executable';\n executableSha256: string;\n };\n files: PreparedRuntimeFile[];\n}\n\ninterface ResolvedLaunch {\n kind: 'node-entry' | 'executable';\n executable: string;\n entry?: string;\n}\n\n/**\n * 只通过本地帮助命令确认 WorkBuddy 所需合同,再生成不依赖 PATH 的项目启动入口。\n * 不读取 HCM 配置,不登录,也不向后端发请求。\n */\nexport async function prepareWorkBuddyRuntime(\n input: RuntimeProbeInput = {},\n): Promise<WorkBuddyRuntime> {\n const candidate = input.candidate?.trim() || input.currentEntry || process.argv[1];\n if (!candidate) throw invalid('无法解析当前 HCM CLI 入口;请传 --cli <path>');\n\n const launch = await resolveLaunch(candidate, input.nodeExecutable ?? process.execPath);\n const launchTarget = launch.kind === 'node-entry' ? launch.entry! : launch.executable;\n for (const forbidden of input.forbiddenCandidatePaths ?? []) {\n if ((await comparablePath(forbidden)) === launchTarget) {\n throw invalid('候选 HCM CLI 不能指向待生成的项目稳定入口');\n }\n }\n if (!(input.currentEntryHasRequiredCapabilities && !input.candidate?.trim())) {\n const beforeProbe = await launchIdentity(launch);\n // 一个成功的嵌套帮助调用已经同时证明顶层 skills、sync 子命令和选项合同。\n // 避免为同一事实启动三次短命 Node,WorkBuddy/macOS 的冷启动成本会被放大。\n const syncHelp = await runProbe(launch, ['skills', 'sync', '--help'], input.timeoutMs).catch(\n () => '',\n );\n const missing: string[] = [];\n if (!/\\bhcm\\s+skills\\s+sync\\b/.test(syncHelp)) {\n missing.push(REQUIRED_CAPABILITIES[0], REQUIRED_CAPABILITIES[1]);\n }\n if (!/--project(?:\\s|=|<|\\[|$)/.test(syncHelp)) missing.push(REQUIRED_CAPABILITIES[2]);\n if (!/--target(?:\\s|=|<|\\[|$)/.test(syncHelp)) missing.push(REQUIRED_CAPABILITIES[3]);\n if (missing.length > 0) {\n throw invalid(`候选 HCM CLI 缺少 WorkBuddy 所需能力:${missing.join(', ')}`);\n }\n if ((await launchIdentity(launch)) !== beforeProbe) {\n throw invalid('候选 HCM CLI 在能力探针期间发生变化,请重试同步');\n }\n }\n\n const capabilities = [...REQUIRED_CAPABILITIES];\n const capabilitiesSha256 = sha256(`${capabilities.join('\\n')}\\n`);\n const executableSha256 = await sha256File(launch.executable);\n const launchRecord: WorkBuddyRuntime['launch'] =\n launch.kind === 'node-entry'\n ? {\n kind: 'node-entry',\n executableSha256,\n entrySha256: await sha256File(launch.entry!),\n }\n : { kind: 'executable', executableSha256 };\n const unixContent = Buffer.from(unixLauncher(launch), 'utf8');\n const windowsContent = Buffer.from(windowsLauncher(launch), 'utf8');\n\n return {\n capabilities,\n capabilitiesSha256,\n launch: launchRecord,\n files: [\n preparedFile('.hcm-delivery/bin/hcm', unixContent, 0o755),\n preparedFile('.hcm-delivery/bin/hcm.cmd', windowsContent, 0o644),\n ],\n };\n}\n\nasync function resolveLaunch(candidate: string, nodeExecutable: string): Promise<ResolvedLaunch> {\n const requested = path.resolve(candidate);\n const resolvedCandidate = await realFile(requested, '候选 HCM CLI');\n const header = (await readPrefix(resolvedCandidate, 256)).toString('utf8');\n const nodeEntry = /^(?:#![^\\r\\n]*\\bnode\\b)|\\.(?:c|m)?js$/i.test(\n header.startsWith('#!') ? (header.split(/\\r?\\n/, 1)[0] ?? '') : resolvedCandidate,\n );\n\n if (nodeEntry) {\n return {\n kind: 'node-entry',\n executable: await realFile(path.resolve(nodeExecutable), 'Node 可执行文件'),\n entry: resolvedCandidate,\n };\n }\n return { kind: 'executable', executable: resolvedCandidate };\n}\n\nasync function realFile(file: string, label: string): Promise<string> {\n try {\n const resolved = await fs.realpath(file);\n const stat = await fs.stat(resolved);\n if (!stat.isFile()) throw new Error('not a regular file');\n return resolved;\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `${label}不可用:${file}`,\n cause,\n });\n }\n}\n\nasync function comparablePath(file: string): Promise<string> {\n const absolute = path.resolve(file);\n return fs.realpath(absolute).catch(() => absolute);\n}\n\nasync function launchIdentity(launch: ResolvedLaunch): Promise<string> {\n const files =\n launch.kind === 'node-entry' ? [launch.executable, launch.entry!] : [launch.executable];\n const identities = await Promise.all(\n files.map(async (file) => {\n const stat = await fs.stat(file, { bigint: true });\n return [file, stat.dev, stat.ino, stat.size, stat.mtimeNs, stat.ctimeNs]\n .map(String)\n .join('\\0');\n }),\n );\n return identities.join('\\n');\n}\n\nasync function readPrefix(file: string, bytes: number): Promise<Buffer> {\n const handle = await fs.open(file, 'r');\n try {\n const buffer = Buffer.alloc(bytes);\n const result = await handle.read(buffer, 0, bytes, 0);\n return buffer.subarray(0, result.bytesRead);\n } finally {\n await handle.close();\n }\n}\n\nasync function runProbe(\n launch: ResolvedLaunch,\n args: string[],\n timeoutMs = 5_000,\n): Promise<string> {\n const command = launch.executable;\n const commandArgs = launch.kind === 'node-entry' ? [launch.entry!, ...args] : args;\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n CI: '1',\n NO_COLOR: '1',\n HCM_RUNTIME_PROBE: '1',\n };\n const nodeOptions = normalizeWorkBuddyNodeOptions(env.NODE_OPTIONS);\n if (nodeOptions === undefined) delete env.NODE_OPTIONS;\n else env.NODE_OPTIONS = nodeOptions;\n try {\n const { stdout, stderr } = await execFileAsync(command, commandArgs, {\n encoding: 'utf8',\n timeout: timeoutMs,\n maxBuffer: 256 * 1024,\n windowsHide: true,\n env,\n });\n return `${stdout}\\n${stderr}`;\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `候选 HCM CLI 能力探针失败:hcm ${args.join(' ')}`,\n cause,\n });\n }\n}\n\nfunction unixLauncher(launch: ResolvedLaunch): string {\n const command = shellQuote(launch.executable);\n const entry = launch.kind === 'node-entry' ? ` ${shellQuote(launch.entry!)}` : '';\n return `#!/bin/sh\nset -eu\n\n# WorkBuddy on macOS may inject --use-system-ca. Node can then spend minutes\n# evaluating the Keychain when a short-lived CLI process exits. Preserve every\n# other host option (including safety --require hooks) and change only this CA mode.\nwb_node_options=\"\\${NODE_OPTIONS-}\"\nif [ \"$(uname -s 2>/dev/null || printf '%s' unknown)\" = 'Darwin' ] && \\\n printf '%s\\n' \"$wb_node_options\" | grep -Eq '(^|[[:space:]])--use-system-ca([[:space:]]|$)'; then\n while printf '%s\\n' \"$wb_node_options\" | grep -Eq '(^|[[:space:]])--use-system-ca([[:space:]]|$)'; do\n wb_next_options=\"$(printf '%s\\n' \"$wb_node_options\" | sed -E 's/(^|[[:space:]])--use-system-ca([[:space:]]|$)/\\\\1\\\\2/g')\"\n [ \"$wb_next_options\" != \"$wb_node_options\" ] || break\n wb_node_options=\"$wb_next_options\"\n done\n if ! printf '%s\\n' \"$wb_node_options\" | grep -Eq '(^|[[:space:]])--use-bundled-ca([[:space:]]|$)'; then\n wb_node_options=\"\\${wb_node_options:+$wb_node_options }--use-bundled-ca\"\n fi\n NODE_OPTIONS=\"$wb_node_options\"\n export NODE_OPTIONS\nfi\n\nexec ${command}${entry} \"$@\"\n`;\n}\n\n/**\n * WorkBuddy 的其他 NODE_OPTIONS 属于宿主能力,不能整体清空。\n * 这里只在 macOS 精确替换已确认会触发 Keychain 慢路径的 CA 选项。\n */\nexport function normalizeWorkBuddyNodeOptions(\n value: string | undefined,\n platform: NodeJS.Platform = process.platform,\n): string | undefined {\n if (platform !== 'darwin' || value === undefined) return value;\n const systemCa = /(^|[\\t\\n\\r ])--use-system-ca(?=$|[\\t\\n\\r ])/;\n if (!systemCa.test(value)) return value;\n\n let normalized = value;\n while (systemCa.test(normalized)) normalized = normalized.replace(systemCa, '$1');\n normalized = normalized.trim();\n const bundledCa = /(^|[\\t\\n\\r ])--use-bundled-ca(?=$|[\\t\\n\\r ])/;\n if (!bundledCa.test(normalized)) {\n normalized = `${normalized}${normalized ? ' ' : ''}--use-bundled-ca`;\n }\n return normalized;\n}\n\nfunction windowsLauncher(launch: ResolvedLaunch): string {\n const command = cmdQuote(launch.executable);\n const entry = launch.kind === 'node-entry' ? ` ${cmdQuote(launch.entry!)}` : '';\n return `@echo off\\r\\n${command}${entry} %*\\r\\n`;\n}\n\nfunction shellQuote(value: string): string {\n if (/[\\r\\n\\0]/.test(value)) throw invalid('CLI 启动路径包含非法控制字符');\n return `'${value.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction cmdQuote(value: string): string {\n if (/[\\r\\n\\0\"]/g.test(value)) throw invalid('CLI 启动路径包含非法控制字符');\n return `\"${value.replace(/%/g, '%%')}\"`;\n}\n\nfunction preparedFile(\n filePath: PreparedRuntimeFile['path'],\n content: Buffer,\n mode: number,\n): PreparedRuntimeFile {\n return { path: filePath, content, bytes: content.length, sha256: sha256(content), mode };\n}\n\nasync function sha256File(file: string): Promise<string> {\n const hash = createHash('sha256');\n await new Promise<void>((resolve, reject) => {\n const stream = createReadStream(file);\n stream.on('data', (chunk) => hash.update(chunk));\n stream.on('error', reject);\n stream.on('end', resolve);\n });\n return hash.digest('hex');\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction invalid(message: string): CliError {\n return new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message });\n}\n","import {\n bootstrapTenant,\n createHttpClient,\n formatObject,\n fromAxiosError,\n loadEnv,\n loadGlobalConfig,\n resolveActiveEnv,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { promptSecret, promptConfirm, readStdin } from '../utils/prompt';\nimport { exitWithError } from '../utils/exit';\n\nexport interface TenantBootstrapArgs {\n tenantId?: string;\n adminUsername?: string;\n adminPassword?: string;\n adminPasswordStdin?: boolean;\n tenantName?: string;\n bootstrapKey?: string;\n bootstrapKeyStdin?: boolean;\n endpoint?: string;\n env?: string;\n yes?: boolean;\n output?: OutputFormat;\n}\n\n/**\n * 解析 bootstrap key。优先级:env var → --bootstrap-key-stdin → --bootstrap-key(警告)→ 交互。\n *\n * 🔴 key 是「无租户无用户」时刻的唯一凭据,等价于建租户的权限。绝不接受写进\n * skill 正文或提交进仓库的用法——命令行明文传参会警告。\n */\nasync function resolveBootstrapKey(args: TenantBootstrapArgs, stdinTaken: boolean): Promise<string> {\n const fromEnv = process.env.HCM_BOOTSTRAP_KEY;\n if (fromEnv) return fromEnv;\n if (args.bootstrapKeyStdin) {\n if (stdinTaken) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--bootstrap-key-stdin 与 --admin-password-stdin 不能同时用(stdin 只有一路);'\n + '把其中一个改走 HCM_BOOTSTRAP_KEY 环境变量或交互输入',\n });\n }\n return (await readStdin()).trim();\n }\n if (args.bootstrapKey) {\n process.stderr.write(\n '[hcm] WARNING: --bootstrap-key <k> 会泄漏到 shell history / ps aux。'\n + '推荐 HCM_BOOTSTRAP_KEY 环境变量或 --bootstrap-key-stdin。\\n',\n );\n return args.bootstrapKey;\n }\n return promptSecret('Bootstrap key: ');\n}\n\nasync function resolveAdminPassword(args: TenantBootstrapArgs): Promise<{ pwd: string; stdinTaken: boolean }> {\n if (args.adminPasswordStdin) return { pwd: (await readStdin()).trim(), stdinTaken: true };\n if (args.adminPassword) {\n process.stderr.write(\n '[hcm] WARNING: --admin-password <p> 会泄漏到 shell history / ps aux。推荐 --admin-password-stdin。\\n',\n );\n return { pwd: args.adminPassword, stdinTaken: false };\n }\n return { pwd: await promptSecret('Admin password: '), stdinTaken: false };\n}\n\nasync function resolveEndpoint(args: TenantBootstrapArgs): Promise<string> {\n if (args.endpoint) return args.endpoint;\n const g = await loadGlobalConfig();\n const envName = resolveActiveEnv({ envFlag: args.env }, process.env, g);\n const env = await loadEnv(envName).catch(() => null);\n if (!env?.endpoint) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`',\n });\n }\n return env.endpoint;\n}\n\n/**\n * `hcm tenant bootstrap` —— 开通新租户(建租户 + admin 用户 + 租户结构 reconcile)。\n *\n * 交付旅程的第一步,且是**唯一在没有任何租户/用户时可用**的写入口。不可逆,\n * 故默认过确认闸(`--yes` 跳过,供 CI 用)。\n */\nexport async function tenantBootstrapCommand(args: TenantBootstrapArgs): Promise<void> {\n try {\n if (!args.tenantId || !args.adminUsername) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '--tenant-id 与 --admin-username 必填',\n });\n }\n const endpoint = await resolveEndpoint(args);\n const { pwd, stdinTaken } = await resolveAdminPassword(args);\n const key = await resolveBootstrapKey(args, stdinTaken);\n\n if (!args.yes) {\n const ok = await promptConfirm(\n `将在 ${endpoint} 创建租户 \"${args.tenantId}\"(admin: ${args.adminUsername})。此操作不可逆,继续?`,\n );\n if (!ok) {\n process.stderr.write('已取消\\n');\n process.exit(1);\n }\n }\n\n // bootstrap 端点不走 Bearer —— 用无认证 client,凭 X-Bootstrap-Key 通过\n const http = createHttpClient({\n endpoint,\n getAccessToken: async () => null,\n onRefresh: async () => {},\n });\n const result = await bootstrapTenant(http, key, {\n tenantId: args.tenantId,\n adminUsername: args.adminUsername,\n adminPassword: pwd,\n tenantName: args.tenantName,\n });\n\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') {\n process.stdout.write(\n `✅ 租户 ${result.tenantId} 已开通(adminUserId ${result.adminUserId ?? '-'})\\n`\n + ` 下一步:hcm env add <name> --endpoint ${endpoint} && hcm login --env <name>\\n`,\n );\n }\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 403) {\n exitWithError(new Error('bootstrap key 无效(403)—— 核对部署方提供的 key,勿复用其他环境的'));\n } else if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.env));\n } else {\n exitWithError(e);\n }\n }\n}\n","import { promises as fsp } from 'node:fs';\nimport {\n HcmClient,\n formatObject,\n fromAxiosError,\n listTenantMeta,\n getTenantMeta,\n saveTenantMeta,\n deleteTenantMeta,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { promptConfirm } from '../utils/prompt';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface MetaArgs {\n keyword?: string;\n type?: string;\n page?: string;\n pageSize?: string;\n file?: string;\n dryRun?: boolean;\n yes?: boolean;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nasync function client(args: MetaArgs): Promise<HcmClient> {\n return HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n}\n\nfunction fail(e: unknown, args: MetaArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 403) {\n exitWithError(\n new Error('元数据写入被拒(403)—— 需 config-admin 身份且当前 source 可写;'\n + '若在租户开发空间外,先 `hcm workspace bind <key>`'),\n );\n }\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm meta list` —— 列出租户元数据文件。 */\nexport async function metaListCommand(args: MetaArgs): Promise<void> {\n try {\n const c = await client(args);\n const { items, total } = await listTenantMeta(c.raw(), {\n keyword: args.keyword,\n type: args.type,\n page: args.page ? Number(args.page) : undefined,\n pageSize: args.pageSize ? Number(args.pageSize) : undefined,\n });\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`📄 ${items.length} 份${total ? ` / 共 ${total}` : ''}\\n`);\n process.stdout.write(formatObject(items, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/** `hcm meta get <path>` —— 打印 meta 原文(YAML/properties 原样,便于管道消费)。 */\nexport async function metaGetCommand(path: string, args: MetaArgs): Promise<void> {\n try {\n const c = await client(args);\n const content = await getTenantMeta(c.raw(), path);\n process.stdout.write(content.endsWith('\\n') ? content : content + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm meta set <path> --file <f> [--dry-run]` —— 写入 meta 原文。\n *\n * 默认对着**客户环境**写配置,故支持 `--dry-run` 先看要写什么。\n * 写完须清元数据缓存才生效:`hcm cache clear-meta <Model>`。\n */\nexport async function metaSetCommand(path: string, args: MetaArgs): Promise<void> {\n try {\n if (!args.file) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '--file <path> 必填(从文件读取 meta 原文;用 - 表示 stdin)',\n });\n }\n const content =\n args.file === '-'\n ? await new Promise<string>((resolve, reject) => {\n let buf = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (d) => (buf += d));\n process.stdin.on('end', () => resolve(buf));\n process.stdin.on('error', reject);\n })\n : await fsp.readFile(args.file, 'utf8');\n\n if (args.dryRun) {\n process.stdout.write(\n `[dry-run] 将写入 ${path}(${Buffer.byteLength(content)} B)——未实际写入\\n---\\n${content}\\n`,\n );\n process.exit(0);\n }\n\n const c = await client(args);\n const result = await saveTenantMeta(c.raw(), path, content);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') {\n process.stdout.write(`✅ 已写入 ${path}\\n 记得清缓存:hcm cache clear-meta <Model>\\n`);\n }\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((e as any)?.code === 'ENOENT') exitWithError(new Error(`文件不存在:${args.file}`));\n fail(e, args);\n }\n}\n\n/** `hcm meta delete <path> [--yes]` —— 删除 meta(不可逆,默认过确认闸)。 */\nexport async function metaDeleteCommand(path: string, args: MetaArgs): Promise<void> {\n try {\n if (!args.yes) {\n const ok = await promptConfirm(`将删除元数据 ${path},此操作不可逆。继续?`);\n if (!ok) {\n process.stderr.write('已取消\\n');\n process.exit(1);\n }\n }\n const c = await client(args);\n const result = await deleteTenantMeta(c.raw(), path);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`🗑️ 已删除 ${path}\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n","import * as crypto from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n buildMiniPreviewTargets,\n buildMiniVerifyAgentReport,\n createWorkspaceFile,\n deleteWorkspaceFile,\n formatMiniVerifyReport,\n formatObject,\n formatRows,\n getMiniStatus,\n HcmClient,\n initMiniAppProject,\n inferMiniWritableTemplateOptionsFromModel,\n listWorkspaceFiles,\n loadWorkspaceFileContent,\n pullMiniAppProject,\n pushMiniAppProject,\n runMiniSmokeChecks,\n saveWorkspaceFileContent,\n validateMiniProject,\n fromAxiosError,\n type MiniPreviewTarget,\n type MiniPushConflict,\n type MiniPushPlanItem,\n type MiniPushResult,\n type MiniStatusEntry,\n type MiniSurface,\n type MiniTemplateKind,\n type MiniValidationResult,\n type MiniVerifyReport,\n type OutputFormat,\n type WorkspaceFileItem,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport {\n toWorkspaceListRows,\n type TenantExtensionWorkspaceRow,\n} from './workspace-format';\n\nconst DEFAULT_FRONTEND_URL = 'http://127.0.0.1:5179';\nconst WORKSPACE_CONTEXT_FILE = 'hcm.workspace.json';\nconst WORKSPACE_CONTEXT_KIND = 'hcm-workspace';\nconst WORKSPACE_CONTEXT_VERSION = 1;\nconst WORKSPACE_STATE_DIR = '.hcm';\nconst WORKSPACE_PULL_MANIFEST_FILE = 'workspace-manifest.json';\nconst MINI_APPS_DIR = 'mini_apps';\nconst RAW_WORKSPACE_EXCLUDED_DIRS = new Set([\n '.git',\n WORKSPACE_STATE_DIR,\n MINI_APPS_DIR,\n 'node_modules',\n 'dist',\n]);\nconst RAW_WORKSPACE_EXCLUDED_FILES = new Set([WORKSPACE_CONTEXT_FILE, '.DS_Store']);\n\ninterface WorkspaceContext {\n kind: typeof WORKSPACE_CONTEXT_KIND;\n version: typeof WORKSPACE_CONTEXT_VERSION;\n workspaceKey: string;\n tenantId?: string;\n endpoint?: string;\n profile?: string;\n updatedAt: string;\n}\n\ninterface WorkspaceDirArgs {\n dir?: string;\n output?: OutputFormat;\n}\n\n/**\n * Common env/identity flags accepted by every business sub-command (T15).\n * `profile` is kept as a deprecated alias of `env`; transpiled in\n * `getActiveAuthContextFromCli`.\n */\ninterface CommonAuthArgs {\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n}\n\ninterface WorkspaceListArgs extends CommonAuthArgs {\n keyword?: string;\n limit?: string | number;\n output?: OutputFormat;\n}\n\ninterface WorkspaceActiveArgs extends WorkspaceDirArgs, CommonAuthArgs {}\n\ninterface WorkspaceBindArgs extends WorkspaceDirArgs, CommonAuthArgs {\n tenant?: string;\n endpoint?: string;\n force?: boolean;\n}\n\ninterface WorkspaceCreateArgs extends WorkspaceDirArgs, CommonAuthArgs {\n description?: string;\n activate?: boolean;\n force?: boolean;\n}\n\ninterface WorkspacePullArgs extends WorkspaceDirArgs, CommonAuthArgs {\n workspace?: string;\n force?: boolean;\n}\n\ninterface WorkspaceAddMiniArgs extends WorkspaceDirArgs, CommonAuthArgs {\n name?: string;\n template?: string;\n model?: string;\n fields?: string;\n defaults?: string;\n surface?: string;\n scopes?: string;\n tenant?: string;\n force?: boolean;\n}\n\ninterface WorkspacePushArgs extends WorkspaceDirArgs, CommonAuthArgs {\n dryRun?: boolean;\n}\n\ninterface WorkspacePreviewArgs extends WorkspaceDirArgs {\n frontend?: string;\n surface?: string;\n}\n\ninterface WorkspaceVerifyArgs extends WorkspaceDirArgs, CommonAuthArgs {\n frontend?: string;\n surface?: string;\n smoke?: boolean;\n}\n\ninterface MiniAppDir {\n appCode: string;\n dir: string;\n}\n\ninterface WorkspaceMiniVerifyItem {\n appCode: string;\n dir: string;\n report: MiniVerifyReport;\n agentReport: ReturnType<typeof buildMiniVerifyAgentReport>;\n}\n\ninterface WorkspaceRawLocalFile {\n localPath: string;\n absolutePath: string;\n content: string;\n sha256: string;\n size: number;\n}\n\ninterface WorkspaceRawFileSnapshot {\n localPath: string;\n remotePath: string;\n fileId?: string;\n sha256: string;\n size: number;\n lastModified?: number | string | null;\n}\n\ninterface WorkspaceRawPullManifest {\n version: typeof WORKSPACE_CONTEXT_VERSION;\n workspaceKey: string;\n profile?: string;\n pulledAt: string;\n files: WorkspaceRawFileSnapshot[];\n}\n\ninterface WorkspaceRawPushResult {\n workspaceKey: string;\n dryRun: boolean;\n operations: MiniPushPlanItem[];\n conflicts: MiniPushConflict[];\n}\n\ninterface WorkspaceActiveView {\n activeWorkspaceKey: string | null;\n localWorkspaceKey: string | null;\n matchesLocal: boolean | null;\n profile: string;\n tenantId: string;\n endpoint: string;\n rootDir: string;\n}\n\nexport async function workspaceListCommand(args: WorkspaceListArgs): Promise<void> {\n try {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const limit = parsePositiveInt(args.limit, 50, '--limit');\n const result = await client.query<TenantExtensionWorkspaceRow>('TenantExtensionWorkspace', {\n keyword: args.keyword,\n fields: [\n 'workspaceKey',\n 'description',\n 'ownerUserName',\n 'sharedUsers',\n 'filesCount',\n 'myLockCount',\n 'devModeEnabled',\n 'updateTime',\n ],\n sort: [{ field: 'devModeEnabled', desc: true }, { field: 'updateTime', desc: true }],\n limit,\n });\n writeWorkspaceListResult(result.rows, args.output ?? 'table', result.total);\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceActiveCommand(args: WorkspaceActiveArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const localContext = await readWorkspaceContext(rootDir);\n // Fallback: if user did not pass --env / --profile but local hcm.workspace.json\n // remembers the env this dir was bound to, honor that.\n const ctx = await getActiveAuthContextFromCli(args, {\n fallbackEnv: localContext?.profile,\n });\n const client = HcmClient.fromAuthContext(ctx);\n const result = await client.query<TenantExtensionWorkspaceRow>('TenantExtensionWorkspace', {\n filter: { devModeEnabled: true },\n fields: ['workspaceKey', 'devModeEnabled'],\n limit: 1,\n });\n const activeWorkspaceKey = optionalText(result.rows[0]?.workspaceKey) ?? null;\n const view: WorkspaceActiveView = {\n activeWorkspaceKey,\n localWorkspaceKey: localContext?.workspaceKey ?? null,\n matchesLocal:\n activeWorkspaceKey && localContext?.workspaceKey\n ? activeWorkspaceKey === localContext.workspaceKey\n : null,\n profile: client.profile,\n tenantId: client.tenantId,\n endpoint: client.endpoint,\n rootDir,\n };\n writeWorkspaceActiveResult(view, args.output ?? 'table');\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceBindCommand(\n workspaceKey: string,\n args: WorkspaceBindArgs,\n): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const existing = await readWorkspaceContext(rootDir);\n if (existing && !args.force && existing.workspaceKey !== workspaceKey) {\n throw new Error(\n `${WORKSPACE_CONTEXT_FILE} already binds workspace '${existing.workspaceKey}'; use --force to rebind`,\n );\n }\n const client = await loadProfileClient(args);\n const context = buildWorkspaceContext({\n workspaceKey,\n profile: args.env ?? args.profile ?? client?.profile,\n tenantId: args.tenant ?? client?.tenantId,\n endpoint: args.endpoint ?? client?.endpoint,\n });\n await fs.mkdir(rootDir, { recursive: true });\n await writeWorkspaceContext(rootDir, context);\n writeWorkspaceBindResult(context, rootDir, args.output ?? 'table');\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceCreateCommand(\n workspaceKey: string,\n args: WorkspaceCreateArgs,\n): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const existing = await readWorkspaceContext(rootDir);\n if (existing && !args.force && existing.workspaceKey !== workspaceKey) {\n throw new Error(\n `${WORKSPACE_CONTEXT_FILE} already binds workspace '${existing.workspaceKey}'; use --force to rebind`,\n );\n }\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const normalizedWorkspaceKey = normalizeWorkspaceKey(workspaceKey);\n const resp = await client.raw().post('/api/models/TenantExtensionWorkspace', {\n workspaceKey: normalizedWorkspaceKey,\n description: args.description ?? '',\n });\n const created = asRecord(unwrapData(resp.data));\n const id = stringOptional(created.id);\n if (args.activate) {\n if (!id) throw new Error('created workspace response does not include id');\n await client.action('TenantExtensionWorkspace', 'activate', { id });\n }\n const context = buildWorkspaceContext({\n workspaceKey: normalizedWorkspaceKey,\n profile: args.profile ?? client.profile,\n tenantId: client.tenantId,\n endpoint: client.endpoint,\n });\n await fs.mkdir(rootDir, { recursive: true });\n await writeWorkspaceContext(rootDir, context);\n writeWorkspaceCreateResult(\n {\n workspaceKey: normalizedWorkspaceKey,\n id: id ?? '-',\n rootDir,\n activated: !!args.activate,\n profile: client.profile,\n tenantId: client.tenantId,\n },\n args.output ?? 'table',\n );\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspacePullCommand(args: WorkspacePullArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const existing = await readWorkspaceContext(rootDir);\n const workspaceKey = args.workspace ?? existing?.workspaceKey;\n if (!workspaceKey) {\n throw new Error(\n `workspace key is required; pass --workspace <key> or run hcm workspace bind <key> first`,\n );\n }\n const client = HcmClient.fromAuthContext(\n await getActiveAuthContextFromCli(args, { fallbackEnv: existing?.profile }),\n );\n const context = buildWorkspaceContext({\n workspaceKey,\n profile: args.profile ?? existing?.profile ?? client.profile,\n tenantId: client.tenantId ?? existing?.tenantId,\n endpoint: client.endpoint ?? existing?.endpoint,\n });\n await fs.mkdir(rootDir, { recursive: true });\n await writeWorkspaceContext(rootDir, context);\n\n const files = await listWorkspaceFiles(client.raw(), workspaceKey, { pageSize: 5000 });\n const miniApps = detectRemoteMiniApps(files.data);\n const pulledMiniApps = [];\n for (const appCode of miniApps) {\n const result = await pullMiniAppProject({\n http: client.raw(),\n appCode,\n workspaceKey,\n targetDir: path.join(rootDir, MINI_APPS_DIR, appCode),\n tenantId: client.tenantId,\n endpoint: client.endpoint,\n profile: args.profile ?? client.profile,\n force: !!args.force,\n });\n pulledMiniApps.push(result);\n }\n\n const rawFiles = files.data.filter(\n (file) => !isDirectoryMarker(file.relativePath) && !isMiniAppPath(file.relativePath),\n );\n const pulledRawFiles = [];\n const rawRemoteByLocalPath = new Map<string, WorkspaceFileItem>();\n for (const file of rawFiles) {\n const content = await loadWorkspaceFileContent(client.raw(), file.id);\n const target = path.join(rootDir, content.relativePath);\n await writeTextFile(target, content.content, !!args.force);\n pulledRawFiles.push(content.relativePath);\n rawRemoteByLocalPath.set(content.relativePath, file);\n }\n await writeWorkspaceRawState(\n rootDir,\n context,\n await readWorkspaceRawLocalFiles(rootDir),\n rawRemoteByLocalPath,\n );\n\n writeWorkspacePullResult(\n {\n workspaceKey,\n rootDir,\n totalRemoteFiles: files.data.length,\n miniApps: pulledMiniApps.map((item) => ({\n appCode: item.appCode,\n files: item.files.length,\n })),\n rawFiles: pulledRawFiles,\n },\n args.output ?? 'table',\n );\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceAddMiniCommand(\n appCode: string,\n args: WorkspaceAddMiniArgs,\n): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const templateKind = parseTemplateKind(args.template);\n validateWritableOptions(templateKind, args);\n const model = parseModelKey(args.model);\n const client = await loadProfileClient({\n ...args,\n env: args.env ?? args.profile ?? context.profile,\n });\n const autoOptions = await resolveWritableAutoOptions({\n client,\n templateKind,\n model,\n fields: args.fields,\n defaults: args.defaults,\n });\n const result = await initMiniAppProject({\n appCode,\n workspaceKey: context.workspaceKey,\n targetDir: path.join(rootDir, MINI_APPS_DIR, appCode),\n name: args.name,\n defaultSurface: parseSurface(args.surface),\n templateKind,\n writableModel: model,\n writableFields: autoOptions.fields ?? parseCsv(args.fields),\n writableDefaults: autoOptions.defaults ?? parseJsonObject(args.defaults, '--defaults'),\n writableTodayDefaultFields: autoOptions.todayDefaultFields,\n requiredScopes: parseScopes(args.scopes),\n tenantId: args.tenant ?? client?.tenantId ?? context.tenantId,\n endpoint: client?.endpoint ?? context.endpoint,\n profile: args.env ?? args.profile ?? client?.profile ?? context.profile,\n force: !!args.force,\n });\n writeWorkspaceAddMiniResult(result, rootDir, args.output ?? 'table');\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceStatusCommand(args: WorkspaceDirArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const rawStatus = await getWorkspaceRawStatus(rootDir, context);\n const rows: Array<Record<string, unknown>> = rawStatus.map((item) => ({\n artifact: 'workspace',\n status: item.status,\n file: item.localPath,\n remote: item.remotePath,\n }));\n for (const app of miniApps) {\n try {\n const status = await getMiniStatus(app.dir);\n rows.push(\n ...status.map((item) => ({\n artifact: `mini:${app.appCode}`,\n status: item.status,\n file: item.localPath,\n remote: item.remotePath,\n })),\n );\n } catch (e) {\n rows.push({\n artifact: `mini:${app.appCode}`,\n status: 'invalid',\n file: '-',\n remote: (e as Error).message,\n });\n }\n }\n if (args.output === 'json' || args.output === 'yaml') {\n process.stdout.write(\n formatObject({ rootDir, miniApps: rows }, { format: args.output }) + '\\n',\n );\n } else {\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n }\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e);\n }\n}\n\nexport async function workspaceValidateCommand(args: WorkspaceDirArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const results = await Promise.all(\n miniApps.map(async (app) => ({ app, result: await validateMiniProject(app.dir) })),\n );\n writeWorkspaceValidateResult(results, args.output ?? 'table');\n process.exit(results.every((item) => item.result.valid) ? 0 : 1);\n } catch (e) {\n exitWorkspaceError(e);\n }\n}\n\nexport async function workspacePushCommand(args: WorkspacePushArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const client = HcmClient.fromAuthContext(\n await getActiveAuthContextFromCli(args, { fallbackEnv: context.profile }),\n );\n const rawResult = await pushWorkspaceRawFiles({\n http: client.raw(),\n rootDir,\n context,\n dryRun: !!args.dryRun,\n });\n const results = [];\n for (const app of miniApps) {\n const result = await pushMiniAppProject({\n http: client.raw(),\n rootDir: app.dir,\n dryRun: !!args.dryRun,\n });\n results.push({ app, result });\n }\n writeWorkspacePushResult(rawResult, results, args.output ?? 'table');\n process.exit(\n rawResult.conflicts.length || results.some((item) => item.result.conflicts.length) ? 3 : 0,\n );\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspacePreviewCommand(args: WorkspacePreviewArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const frontend = args.frontend ?? process.env.HCM_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n const rows = [];\n for (const app of miniApps) {\n const targets = filterPreviewTargets(\n await buildMiniPreviewTargets(app.dir, frontend),\n args.surface ?? 'all',\n );\n rows.push(\n ...targets.map((item) => ({\n artifact: `mini:${app.appCode}`,\n surface: item.key,\n url: item.url,\n })),\n );\n }\n if (args.output === 'json' || args.output === 'yaml') {\n process.stdout.write(formatObject(rows, { format: args.output }) + '\\n');\n } else {\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n }\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e);\n }\n}\n\nexport async function workspaceVerifyCommand(args: WorkspaceVerifyArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const frontend = args.frontend ?? process.env.HCM_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n const authArgs: CommonAuthArgs = {\n ...args,\n env: args.env ?? args.profile ?? context.profile,\n };\n const client = await loadProfileClient(authArgs);\n const smokeAccessToken = args.smoke\n ? await loadSmokeAccessToken(client, authArgs)\n : null;\n const rawStatus = await getWorkspaceRawStatus(rootDir, context);\n let rawPlan: WorkspaceRawPushResult | null = null;\n let rawPlanSkipped: string | undefined;\n if (!client) {\n rawPlanSkipped = 'profile not configured';\n } else {\n try {\n rawPlan = await pushWorkspaceRawFiles({\n http: client.raw(),\n rootDir,\n context,\n dryRun: true,\n });\n } catch (planErr) {\n rawPlanSkipped = (planErr as Error).message ?? 'workspace raw dry-run failed';\n }\n }\n const reports: WorkspaceMiniVerifyItem[] = [];\n\n for (const app of miniApps) {\n const validation = await validateMiniProject(app.dir);\n const status = await readMiniStatusSafely(app);\n let plan: MiniVerifyReport['plan'] = null;\n let planSkipped: string | undefined;\n\n if (!validation.valid) {\n planSkipped = 'validation failed';\n } else if (!client) {\n planSkipped = 'profile not configured';\n } else {\n try {\n const pushResult = await pushMiniAppProject({\n http: client.raw(),\n rootDir: app.dir,\n dryRun: true,\n });\n plan = { operations: pushResult.operations, conflicts: pushResult.conflicts };\n } catch (planErr) {\n planSkipped = (planErr as Error).message ?? 'push dry-run failed';\n }\n }\n\n const previewTargets = await buildMiniPreviewTargets(app.dir, frontend).catch(\n () => [] as MiniPreviewTarget[],\n );\n const preview = filterPreviewTargets(previewTargets, args.surface ?? 'all');\n const smoke = args.smoke\n ? await runMiniSmokeChecks({\n rootDir: app.dir,\n frontendBaseUrl: frontend,\n previewTargets: preview,\n accessToken: smokeAccessToken,\n })\n : null;\n const ok = validation.valid && !!plan && plan.conflicts.length === 0 && (!smoke || smoke.ok);\n const report: MiniVerifyReport = {\n ok,\n validate: validation,\n status,\n plan,\n planSkipped,\n preview,\n smoke,\n };\n reports.push({\n appCode: app.appCode,\n dir: app.dir,\n report,\n agentReport: buildMiniVerifyAgentReport(report),\n });\n }\n\n writeWorkspaceVerifyResult(\n context,\n rootDir,\n { status: rawStatus, plan: rawPlan, planSkipped: rawPlanSkipped },\n reports,\n args.output ?? 'table',\n );\n const rawOk = !!rawPlan && rawPlan.conflicts.length === 0;\n process.exit(rawOk && reports.every((item) => item.report.ok) ? 0 : 1);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport function removedMiniCommand(): never {\n exitWithError(\n new Error(\n [\n 'hcm mini has been removed.',\n 'Use hcm workspace bind <workspaceKey>, hcm workspace add mini <appCode>, hcm workspace verify, and hcm workspace push.',\n ].join(' '),\n ),\n );\n}\n\nfunction resolveRootDir(dir?: string): string {\n return path.resolve(dir ?? '.');\n}\n\nfunction buildWorkspaceContext(args: {\n workspaceKey: string;\n tenantId?: string;\n endpoint?: string;\n profile?: string;\n}): WorkspaceContext {\n return {\n kind: WORKSPACE_CONTEXT_KIND,\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: normalizeWorkspaceKey(args.workspaceKey),\n tenantId: args.tenantId,\n endpoint: args.endpoint,\n profile: args.profile,\n updatedAt: new Date().toISOString(),\n };\n}\n\nasync function readWorkspaceContext(rootDir: string): Promise<WorkspaceContext | null> {\n try {\n const parsed = JSON.parse(\n await fs.readFile(path.join(rootDir, WORKSPACE_CONTEXT_FILE), 'utf-8'),\n ) as Record<string, unknown>;\n if (parsed.kind !== WORKSPACE_CONTEXT_KIND || parsed.version !== WORKSPACE_CONTEXT_VERSION) {\n throw new Error(`${WORKSPACE_CONTEXT_FILE} is not an HCM workspace context`);\n }\n return {\n kind: WORKSPACE_CONTEXT_KIND,\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: normalizeWorkspaceKey(stringRequired(parsed.workspaceKey, 'workspaceKey')),\n tenantId: stringOptional(parsed.tenantId),\n endpoint: stringOptional(parsed.endpoint),\n profile: stringOptional(parsed.profile),\n updatedAt: stringOptional(parsed.updatedAt) ?? new Date(0).toISOString(),\n };\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw e;\n }\n}\n\nasync function requireWorkspaceContext(rootDir: string): Promise<WorkspaceContext> {\n const context = await readWorkspaceContext(rootDir);\n if (!context) {\n throw new Error(\n `${WORKSPACE_CONTEXT_FILE} not found; run hcm workspace bind <workspaceKey> first`,\n );\n }\n return context;\n}\n\nasync function writeWorkspaceContext(rootDir: string, context: WorkspaceContext): Promise<void> {\n await fs.writeFile(\n path.join(rootDir, WORKSPACE_CONTEXT_FILE),\n JSON.stringify(context, null, 2) + '\\n',\n );\n}\n\nasync function writeTextFile(file: string, content: string, force: boolean): Promise<void> {\n try {\n await fs.access(file);\n if (!force) throw new Error(`${file} already exists; use --force to overwrite`);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') throw e;\n }\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content);\n}\n\nasync function readWorkspaceRawManifest(rootDir: string, context: WorkspaceContext): Promise<WorkspaceRawPullManifest> {\n try {\n const parsed = JSON.parse(\n await fs.readFile(path.join(rootDir, WORKSPACE_STATE_DIR, WORKSPACE_PULL_MANIFEST_FILE), 'utf-8'),\n ) as WorkspaceRawPullManifest;\n if (parsed.version !== WORKSPACE_CONTEXT_VERSION || parsed.workspaceKey !== context.workspaceKey) {\n throw new Error(`${WORKSPACE_PULL_MANIFEST_FILE} does not match workspace ${context.workspaceKey}`);\n }\n return parsed;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') throw e;\n return {\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: context.workspaceKey,\n profile: context.profile,\n pulledAt: new Date(0).toISOString(),\n files: [],\n };\n }\n}\n\nasync function writeWorkspaceRawState(\n rootDir: string,\n context: WorkspaceContext,\n files: WorkspaceRawLocalFile[],\n remoteByLocalPath: Map<string, WorkspaceFileItem>,\n): Promise<void> {\n const stateDir = path.join(rootDir, WORKSPACE_STATE_DIR);\n await fs.mkdir(stateDir, { recursive: true });\n const snapshots = files.map((file): WorkspaceRawFileSnapshot => ({\n localPath: file.localPath,\n remotePath: file.localPath,\n fileId: remoteByLocalPath.get(file.localPath)?.id,\n sha256: file.sha256,\n size: file.size,\n lastModified: remoteByLocalPath.get(file.localPath)?.lastModified,\n }));\n await fs.writeFile(\n path.join(stateDir, WORKSPACE_PULL_MANIFEST_FILE),\n JSON.stringify(\n {\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: context.workspaceKey,\n profile: context.profile,\n pulledAt: new Date().toISOString(),\n files: snapshots,\n } satisfies WorkspaceRawPullManifest,\n null,\n 2,\n ) + '\\n',\n 'utf-8',\n );\n}\n\nasync function readWorkspaceRawLocalFiles(rootDir: string): Promise<WorkspaceRawLocalFile[]> {\n const files: WorkspaceRawLocalFile[] = [];\n await walkWorkspaceRawFiles(rootDir, '', files);\n files.sort((a, b) => a.localPath.localeCompare(b.localPath));\n return files;\n}\n\nasync function walkWorkspaceRawFiles(\n rootDir: string,\n relativeDir: string,\n files: WorkspaceRawLocalFile[],\n): Promise<void> {\n const absoluteDir = path.join(rootDir, relativeDir);\n let entries;\n try {\n entries = await fs.readdir(absoluteDir, { withFileTypes: true });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw e;\n }\n for (const entry of entries) {\n if (entry.isDirectory() && RAW_WORKSPACE_EXCLUDED_DIRS.has(entry.name)) continue;\n if (entry.isFile() && RAW_WORKSPACE_EXCLUDED_FILES.has(entry.name)) continue;\n const localPath = normalizeRelativePath(path.posix.join(toPosix(relativeDir), entry.name));\n const absolutePath = path.join(rootDir, localPath);\n if (entry.isDirectory()) {\n await walkWorkspaceRawFiles(rootDir, localPath, files);\n continue;\n }\n if (!entry.isFile()) continue;\n const content = await fs.readFile(absolutePath, 'utf-8');\n files.push({\n localPath,\n absolutePath,\n content,\n sha256: sha256(content),\n size: Buffer.byteLength(content, 'utf-8'),\n });\n }\n}\n\nasync function getWorkspaceRawStatus(\n rootDir: string,\n context: WorkspaceContext,\n): Promise<MiniStatusEntry[]> {\n const manifest = await readWorkspaceRawManifest(rootDir, context);\n return computeWorkspaceRawStatus(manifest, await readWorkspaceRawLocalFiles(rootDir));\n}\n\nasync function pushWorkspaceRawFiles(args: {\n http: ReturnType<HcmClient['raw']>;\n rootDir: string;\n context: WorkspaceContext;\n dryRun: boolean;\n}): Promise<WorkspaceRawPushResult> {\n const manifest = await readWorkspaceRawManifest(args.rootDir, args.context);\n const localFiles = await readWorkspaceRawLocalFiles(args.rootDir);\n const remoteFiles = await loadWorkspaceRawRemoteFiles(args.http, args.context.workspaceKey);\n const plan = buildWorkspaceRawPushPlan(manifest, localFiles, remoteFiles);\n const result: WorkspaceRawPushResult = {\n workspaceKey: args.context.workspaceKey,\n dryRun: args.dryRun,\n operations: plan.operations,\n conflicts: plan.conflicts,\n };\n if (args.dryRun || plan.conflicts.length) return result;\n\n const localByPath = new Map(localFiles.map((file) => [file.localPath, file] as const));\n for (const operation of plan.operations) {\n if (operation.operation === 'skip') continue;\n if (operation.operation === 'delete') {\n if (operation.fileId) await deleteWorkspaceFile(args.http, operation.fileId);\n continue;\n }\n const localFile = localByPath.get(operation.localPath);\n if (!localFile) continue;\n if (operation.operation === 'create') {\n await createWorkspaceFile(\n args.http,\n args.context.workspaceKey,\n operation.remotePath,\n localFile.content,\n );\n continue;\n }\n if (operation.operation === 'update' && operation.fileId) {\n await saveWorkspaceFileContent(args.http, operation.fileId, localFile.content);\n }\n }\n\n const latestRemoteFiles = await loadWorkspaceRawRemoteFiles(args.http, args.context.workspaceKey);\n const latestRemoteByLocalPath = new Map(latestRemoteFiles.map((file) => [file.item.relativePath, file.item] as const));\n await writeWorkspaceRawState(args.rootDir, args.context, localFiles, latestRemoteByLocalPath);\n return result;\n}\n\nasync function loadWorkspaceRawRemoteFiles(\n http: ReturnType<HcmClient['raw']>,\n workspaceKey: string,\n): Promise<Array<{ item: WorkspaceFileItem; content: string }>> {\n const list = await listWorkspaceFiles(http, workspaceKey, { pageSize: 5000 });\n const result: Array<{ item: WorkspaceFileItem; content: string }> = [];\n for (const item of list.data) {\n if (isDirectoryMarker(item.relativePath) || isMiniAppPath(item.relativePath)) continue;\n const content = await loadWorkspaceFileContent(http, item.id);\n result.push({ item, content: content.content });\n }\n return result;\n}\n\nfunction buildWorkspaceRawPushPlan(\n manifest: WorkspaceRawPullManifest,\n localFiles: WorkspaceRawLocalFile[],\n remoteFiles: Array<{ item: WorkspaceFileItem; content: string }>,\n): { operations: MiniPushPlanItem[]; conflicts: MiniPushConflict[] } {\n const status = computeWorkspaceRawStatus(manifest, localFiles);\n const baseByLocal = new Map(manifest.files.map((file) => [file.localPath, file] as const));\n const remoteByLocal = new Map(remoteFiles.map((file) => [file.item.relativePath, file] as const));\n const operations: MiniPushPlanItem[] = [];\n const conflicts: MiniPushConflict[] = [];\n for (const entry of status) {\n const remote = remoteByLocal.get(entry.localPath);\n const base = baseByLocal.get(entry.localPath);\n const remoteSha = remote ? sha256(remote.content) : undefined;\n if (entry.status === 'added') {\n if (remote) {\n conflicts.push(workspaceRawConflict(entry, 'remote file already exists but was not in local snapshot'));\n } else {\n operations.push({ operation: 'create', localPath: entry.localPath, remotePath: entry.remotePath });\n }\n continue;\n }\n if (entry.status === 'modified') {\n if (!remote) {\n conflicts.push(workspaceRawConflict(entry, 'remote file was deleted after last pull'));\n } else if (base && remoteSha !== base.sha256) {\n conflicts.push(workspaceRawConflict(entry, 'remote file changed after last pull'));\n } else {\n operations.push({\n operation: 'update',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n fileId: remote.item.id,\n });\n }\n continue;\n }\n if (entry.status === 'deleted') {\n if (!remote) {\n operations.push({\n operation: 'skip',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n reason: 'already deleted remotely',\n });\n } else if (base && remoteSha !== base.sha256) {\n conflicts.push(workspaceRawConflict(entry, 'remote file changed after last pull'));\n } else {\n operations.push({\n operation: 'delete',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n fileId: remote.item.id,\n });\n }\n continue;\n }\n operations.push({\n operation: 'skip',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n fileId: remote?.item.id,\n reason: 'unchanged',\n });\n }\n return { operations, conflicts };\n}\n\nfunction computeWorkspaceRawStatus(\n manifest: WorkspaceRawPullManifest,\n localFiles: WorkspaceRawLocalFile[],\n): MiniStatusEntry[] {\n const baseByLocal = new Map(manifest.files.map((file) => [file.localPath, file] as const));\n const localByPath = new Map(localFiles.map((file) => [file.localPath, file] as const));\n const paths = [...new Set([...baseByLocal.keys(), ...localByPath.keys()])].sort();\n return paths.map((localPath) => {\n const base = baseByLocal.get(localPath);\n const local = localByPath.get(localPath);\n const remotePath = base?.remotePath ?? localPath;\n if (!base && local) {\n return { localPath, remotePath, status: 'added', sha256: local.sha256 };\n }\n if (base && !local) {\n return {\n localPath,\n remotePath,\n status: 'deleted',\n fileId: base.fileId,\n baseSha256: base.sha256,\n };\n }\n if (base && local && base.sha256 !== local.sha256) {\n return {\n localPath,\n remotePath,\n status: 'modified',\n fileId: base.fileId,\n sha256: local.sha256,\n baseSha256: base.sha256,\n };\n }\n return {\n localPath,\n remotePath,\n status: 'unchanged',\n fileId: base?.fileId,\n sha256: local?.sha256,\n baseSha256: base?.sha256,\n };\n });\n}\n\nfunction workspaceRawConflict(entry: MiniStatusEntry, reason: string): MiniPushConflict {\n return {\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n reason,\n };\n}\n\nasync function discoverMiniApps(rootDir: string): Promise<MiniAppDir[]> {\n const appsRoot = path.join(rootDir, MINI_APPS_DIR);\n let entries;\n try {\n entries = await fs.readdir(appsRoot, { withFileTypes: true });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw e;\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({ appCode: entry.name, dir: path.join(appsRoot, entry.name) }))\n .sort((a, b) => a.appCode.localeCompare(b.appCode));\n}\n\nfunction detectRemoteMiniApps(files: WorkspaceFileItem[]): string[] {\n const appCodes = new Set<string>();\n for (const file of files) {\n const match = /^mini_apps\\/([^/]+)\\//.exec(file.relativePath);\n if (match?.[1]) appCodes.add(match[1]);\n }\n return Array.from(appCodes).sort();\n}\n\nfunction isMiniAppPath(relativePath: string): boolean {\n return relativePath === MINI_APPS_DIR || relativePath.startsWith(`${MINI_APPS_DIR}/`);\n}\n\nfunction isDirectoryMarker(relativePath: string): boolean {\n return relativePath.endsWith('/');\n}\n\nasync function readMiniStatusSafely(app: MiniAppDir) {\n try {\n return await getMiniStatus(app.dir);\n } catch {\n return [];\n }\n}\n\n/**\n * Tolerant variant of `getActiveAuthContextFromCli` + `HcmClient.fromAuthContext`:\n * returns `null` (instead of throwing) when no env/identity is configured,\n * so workspace bind / add mini / verify can still run partially without auth.\n *\n * If the caller explicitly passed an env (`--env` or legacy `--profile`) and\n * resolution fails, we still throw — the user asked for that env, so silent\n * fallback would be wrong.\n */\nasync function loadProfileClient(\n args: CommonAuthArgs,\n): Promise<HcmClient | null> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n return HcmClient.fromAuthContext(ctx);\n } catch (e) {\n if (args.env || args.profile) throw e;\n return null;\n }\n}\n\nasync function loadSmokeAccessToken(\n client: HcmClient | null,\n args: CommonAuthArgs,\n): Promise<string | null> {\n try {\n const smokeClient = client ?? (await loadProfileClient(args));\n return smokeClient ? smokeClient.getAccessToken() : null;\n } catch {\n return null;\n }\n}\n\nasync function resolveWritableAutoOptions(args: {\n client: HcmClient | null;\n templateKind: MiniTemplateKind;\n model?: string;\n fields?: string;\n defaults?: string;\n}): Promise<{\n fields?: string[];\n defaults?: Record<string, unknown>;\n todayDefaultFields?: string[];\n}> {\n if (args.templateKind !== 'writable-workbench') return {};\n const explicitAutoFields = isAuto(args.fields);\n const explicitAutoDefaults = isAuto(args.defaults);\n const shouldInferFields = explicitAutoFields || (!!args.model && args.fields === undefined);\n const shouldInferDefaults = explicitAutoDefaults || (!!args.model && args.defaults === undefined);\n if (!shouldInferFields && !shouldInferDefaults) return {};\n if (!args.client) {\n if (explicitAutoFields || explicitAutoDefaults) {\n throw new Error('--fields auto and --defaults auto require a configured HCM profile');\n }\n return {};\n }\n const model = args.model ?? 'OrgUnit';\n const inferred = inferMiniWritableTemplateOptionsFromModel(await args.client.describe(model));\n return {\n fields: shouldInferFields ? inferred.fields : undefined,\n defaults: shouldInferDefaults ? inferred.defaults : undefined,\n todayDefaultFields: shouldInferDefaults ? inferred.todayDefaultFields : undefined,\n };\n}\n\nfunction parseTemplateKind(value?: string): MiniTemplateKind {\n const templateKind = (value || 'dashboard').trim();\n if (templateKind !== 'dashboard' && templateKind !== 'multi-page' && templateKind !== 'writable-workbench') {\n throw new Error(`unsupported mini template: ${value}`);\n }\n return templateKind;\n}\n\nfunction parseSurface(value: string | undefined): MiniSurface {\n if (!value) return 'embedded';\n if (value === 'embedded' || value === 'standalone') return value;\n throw new Error('--surface must be embedded or standalone');\n}\n\nfunction parseScopes(value: string | undefined): string[] | undefined {\n return parseCsv(value);\n}\n\nfunction parseCsv(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n if (isAuto(value)) return undefined;\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction parseModelKey(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const model = value.trim();\n if (!/^[A-Z][A-Za-z0-9]*$/.test(model)) {\n throw new Error('--model must be a Model key, for example OrgUnit');\n }\n return model;\n}\n\nfunction parseJsonObject(\n value: string | undefined,\n flagName: string,\n): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (isAuto(value)) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new Error(`${flagName} must be valid JSON object`);\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(`${flagName} must be valid JSON object`);\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction validateWritableOptions(templateKind: MiniTemplateKind, args: WorkspaceAddMiniArgs): void {\n if (templateKind === 'writable-workbench') return;\n if (templateKind === 'multi-page') {\n if (args.fields || args.defaults) {\n throw new Error('--fields and --defaults are only supported with --template writable-workbench');\n }\n return;\n }\n if (args.model || args.fields || args.defaults) {\n throw new Error(\n '--model is only supported with --template multi-page or writable-workbench; --fields and --defaults are only supported with --template writable-workbench',\n );\n }\n}\n\nfunction isAuto(value: string | undefined): boolean {\n return value?.trim().toLowerCase() === 'auto';\n}\n\nfunction parsePositiveInt(value: string | number | undefined, fallback: number, flag: string): number {\n if (value === undefined || value === null || value === '') return fallback;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${flag} must be a positive integer`);\n }\n return parsed;\n}\n\nfunction filterPreviewTargets(targets: MiniPreviewTarget[], surface: string): MiniPreviewTarget[] {\n if (surface === 'all') return targets;\n if (surface === 'bare' || surface === 'standalone' || surface === 'embedded') {\n return targets.filter((item) => item.key === surface);\n }\n throw new Error('--surface must be all, bare, standalone or embedded');\n}\n\nfunction normalizeWorkspaceKey(value: string): string {\n const key = value.trim();\n if (!key) throw new Error('workspaceKey is required');\n return key;\n}\n\nfunction normalizeRelativePath(value: string): string {\n const normalized = toPosix(value).replace(/^\\/+/, '').replace(/\\/+/g, '/');\n if (!normalized || normalized === '.' || normalized.includes('\\0')) {\n throw new Error('path is empty');\n }\n for (const segment of normalized.split('/')) {\n if (!segment || segment === '.' || segment === '..') {\n throw new Error(`unsafe path segment: ${segment}`);\n }\n }\n return normalized;\n}\n\nfunction toPosix(value: string): string {\n return value.split(path.sep).join('/');\n}\n\nfunction sha256(content: string): string {\n return crypto.createHash('sha256').update(content, 'utf-8').digest('hex');\n}\n\nfunction stringRequired(value: unknown, field: string): string {\n if (typeof value === 'string' && value.trim()) return value;\n throw new Error(`${field} is required`);\n}\n\nfunction stringOptional(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n}\n\nfunction unwrapData(value: unknown): unknown {\n if (value && typeof value === 'object' && 'data' in value) {\n return (value as { data?: unknown }).data;\n }\n return value;\n}\n\nfunction optionalText(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n const text = String(value).trim();\n return text || undefined;\n}\n\nfunction writeWorkspaceListResult(\n rows: TenantExtensionWorkspaceRow[],\n format: OutputFormat,\n total?: number,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject({ rows, total }, { format }) + '\\n');\n return;\n }\n process.stdout.write(formatRows(toWorkspaceListRows(rows), { format: 'table' }) + '\\n');\n if (total !== undefined) {\n process.stdout.write(`Showing ${rows.length} of ${total} workspaces.\\n`);\n }\n}\n\nfunction writeWorkspaceActiveResult(view: WorkspaceActiveView, format: OutputFormat): void {\n if (format !== 'table') {\n process.stdout.write(formatObject(view, { format }) + '\\n');\n return;\n }\n const rows = [\n {\n activeWorkspaceKey: view.activeWorkspaceKey ?? '-',\n localWorkspaceKey: view.localWorkspaceKey ?? '-',\n matchesLocal:\n view.matchesLocal === null ? '-' : view.matchesLocal ? 'yes' : 'no',\n profile: view.profile,\n tenant: view.tenantId,\n endpoint: view.endpoint,\n dir: view.rootDir,\n },\n ];\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n}\n\nfunction writeWorkspaceBindResult(\n context: WorkspaceContext,\n rootDir: string,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject({ ...context, rootDir }, { format }) + '\\n');\n return;\n }\n process.stdout.write(\n [\n `workspace bound: ${context.workspaceKey}`,\n `directory: ${rootDir}`,\n `profile: ${context.profile ?? '-'}`,\n `tenant: ${context.tenantId ?? '-'}`,\n ].join('\\n') + '\\n',\n );\n}\n\nfunction writeWorkspaceCreateResult(\n result: {\n workspaceKey: string;\n id: string;\n rootDir: string;\n activated: boolean;\n profile: string;\n tenantId: string;\n },\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject(result, { format }) + '\\n');\n return;\n }\n process.stdout.write(\n [\n `workspace created: ${result.workspaceKey}`,\n `id: ${result.id}`,\n `directory: ${result.rootDir}`,\n `profile: ${result.profile}`,\n `tenant: ${result.tenantId}`,\n `activated: ${result.activated ? 'yes' : 'no'}`,\n ].join('\\n') + '\\n',\n );\n}\n\nfunction writeWorkspacePullResult(\n result: {\n workspaceKey: string;\n rootDir: string;\n totalRemoteFiles: number;\n miniApps: Array<{ appCode: string; files: number }>;\n rawFiles: string[];\n },\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject(result, { format }) + '\\n');\n return;\n }\n const lines = [\n `workspace pulled: ${result.workspaceKey}`,\n `directory: ${result.rootDir}`,\n `remote files: ${result.totalRemoteFiles}`,\n `mini apps: ${result.miniApps.length}`,\n `raw files: ${result.rawFiles.length}`,\n ];\n if (result.miniApps.length) {\n lines.push('mini artifacts:');\n for (const app of result.miniApps) lines.push(` - ${app.appCode}: ${app.files} files`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\nfunction writeWorkspaceAddMiniResult(\n result: { appCode: string; workspaceKey: string; targetDir: string; files: unknown[] },\n rootDir: string,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject({ ...result, workspaceRoot: rootDir }, { format }) + '\\n');\n return;\n }\n process.stdout.write(\n [\n `workspace artifact added: mini:${result.appCode}`,\n `workspace: ${result.workspaceKey}`,\n `workspace root: ${rootDir}`,\n `directory: ${result.targetDir}`,\n `files: ${result.files.length}`,\n ].join('\\n') + '\\n',\n );\n}\n\nfunction writeWorkspaceValidateResult(\n results: Array<{ app: MiniAppDir; result: MiniValidationResult }>,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(\n formatObject(\n results.map((item) => ({ artifact: `mini:${item.app.appCode}`, ...item.result })),\n { format },\n ) + '\\n',\n );\n return;\n }\n const rows = results.map((item) => ({\n artifact: `mini:${item.app.appCode}`,\n valid: item.result.valid ? 'yes' : 'no',\n errors: item.result.errors.length,\n warnings: item.result.warnings.length,\n }));\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n for (const item of results) {\n if (!item.result.errors.length && !item.result.warnings.length) continue;\n process.stdout.write(`\\nmini:${item.app.appCode}\\n`);\n for (const error of item.result.errors) process.stdout.write(` error: ${error}\\n`);\n for (const warning of item.result.warnings) process.stdout.write(` warning: ${warning}\\n`);\n }\n}\n\nfunction writeWorkspacePushResult(\n rawResult: WorkspaceRawPushResult,\n results: Array<{ app: MiniAppDir; result: MiniPushResult }>,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(\n formatObject(\n {\n workspaceFiles: { artifact: 'workspace', ...rawResult },\n miniApps: results.map((item) => ({ artifact: `mini:${item.app.appCode}`, ...item.result })),\n },\n { format },\n ) + '\\n',\n );\n return;\n }\n const rawConflicts = rawResult.conflicts.map((conflict) => ({\n artifact: 'workspace',\n file: conflict.localPath,\n remote: conflict.remotePath,\n reason: conflict.reason,\n }));\n const miniConflicts = results.flatMap((item) =>\n item.result.conflicts.map((conflict) => ({\n artifact: `mini:${item.app.appCode}`,\n file: conflict.localPath,\n remote: conflict.remotePath,\n reason: conflict.reason,\n })),\n );\n const conflicts = [...rawConflicts, ...miniConflicts];\n if (conflicts.length) {\n process.stdout.write('conflicts:\\n' + formatRows(conflicts, { format: 'table' }) + '\\n');\n return;\n }\n const rawOperations = rawResult.operations.map((operation) => ({\n artifact: 'workspace',\n op: operation.operation,\n file: operation.localPath,\n remote: operation.remotePath,\n reason: operation.reason ?? '',\n }));\n const miniOperations = results.flatMap((item) =>\n item.result.operations.map((operation) => ({\n artifact: `mini:${item.app.appCode}`,\n op: operation.operation,\n file: operation.localPath,\n remote: operation.remotePath,\n reason: operation.reason ?? '',\n })),\n );\n const operations = [...rawOperations, ...miniOperations];\n process.stdout.write(formatRows(operations, { format: 'table' }) + '\\n');\n if (rawResult.dryRun || results.some((item) => item.result.dryRun)) {\n process.stdout.write('dry-run: no remote changes were written\\n');\n }\n}\n\nfunction writeWorkspaceVerifyResult(\n context: WorkspaceContext,\n rootDir: string,\n raw: {\n status: MiniStatusEntry[];\n plan: WorkspaceRawPushResult | null;\n planSkipped?: string;\n },\n reports: WorkspaceMiniVerifyItem[],\n format: OutputFormat,\n): void {\n const rawOk = !!raw.plan && raw.plan.conflicts.length === 0;\n const ok = rawOk && reports.every((item) => item.report.ok);\n if (format === 'json') {\n process.stdout.write(\n formatObject(\n {\n ok,\n workspaceKey: context.workspaceKey,\n rootDir,\n workspaceFiles: {\n ok: rawOk,\n status: summarizeStatus(raw.status),\n plan: raw.plan\n ? {\n operations: raw.plan.operations,\n conflicts: raw.plan.conflicts,\n }\n : null,\n planSkipped: raw.planSkipped,\n },\n miniApps: reports.map((item) => ({\n appCode: item.appCode,\n dir: item.dir,\n ...item.agentReport,\n })),\n },\n { format },\n ) + '\\n',\n );\n return;\n }\n if (format !== 'table') {\n process.stdout.write(\n formatObject(\n {\n ok,\n workspaceKey: context.workspaceKey,\n rootDir,\n workspaceFiles: raw,\n miniApps: reports,\n },\n { format },\n ) + '\\n',\n );\n return;\n }\n const lines = [\n `workspace verify: ${ok ? 'OK' : 'FAIL'}`,\n `workspace: ${context.workspaceKey}`,\n `directory: ${rootDir}`,\n `workspace files: ${raw.status.length}`,\n `mini apps: ${reports.length}`,\n ];\n lines.push('', 'workspace files');\n if (raw.planSkipped) {\n lines.push(` dry-run skipped: ${raw.planSkipped}`);\n } else if (raw.plan) {\n lines.push(\n ` status: ${formatStatusSummary(summarizeStatus(raw.status))}`,\n ` dry-run: ${raw.plan.conflicts.length ? 'CONFLICT' : 'OK'} (${raw.plan.operations.length} operations)`,\n );\n for (const conflict of raw.plan.conflicts) {\n lines.push(` conflict: ${conflict.localPath} -> ${conflict.reason}`);\n }\n }\n for (const item of reports) {\n lines.push('', `mini:${item.appCode}`, formatMiniVerifyReport(item.report));\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\nfunction summarizeStatus(status: MiniStatusEntry[]): Record<MiniStatusEntry['status'], number> {\n return status.reduce(\n (acc, item) => {\n acc[item.status] += 1;\n return acc;\n },\n { added: 0, modified: 0, deleted: 0, unchanged: 0 },\n );\n}\n\nfunction formatStatusSummary(summary: Record<MiniStatusEntry['status'], number>): string {\n return `added=${summary.added}, modified=${summary.modified}, deleted=${summary.deleted}, unchanged=${summary.unchanged}`;\n}\n\nfunction exitWorkspaceError(err: unknown, profile?: string): never {\n const maybeAxios = err as { isAxiosError?: boolean };\n if (maybeAxios?.isAxiosError) {\n exitWithError(fromAxiosError(err, profile));\n }\n exitWithError(err);\n}\n","export interface TenantExtensionWorkspaceRow {\n workspaceKey?: unknown;\n description?: unknown;\n ownerUserName?: unknown;\n sharedUsers?: unknown;\n filesCount?: unknown;\n myLockCount?: unknown;\n devModeEnabled?: unknown;\n updateTime?: unknown;\n}\n\nexport interface WorkspaceListRow {\n [key: string]: unknown;\n current: string;\n workspaceKey: string;\n description: string;\n owner: string;\n files: string;\n locks: string;\n updatedAt: string;\n}\n\nexport function toWorkspaceListRows(rows: TenantExtensionWorkspaceRow[]): WorkspaceListRow[] {\n return rows.map((row) => ({\n current: boolValue(row.devModeEnabled) ? '*' : '',\n workspaceKey: stringValue(row.workspaceKey) ?? '-',\n description: stringValue(row.description) ?? '',\n owner: stringValue(row.ownerUserName) ?? '-',\n files: numberValue(row.filesCount),\n locks: numberValue(row.myLockCount),\n updatedAt: stringValue(row.updateTime) ?? '-',\n }));\n}\n\nfunction stringValue(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n const text = String(value).trim();\n return text || undefined;\n}\n\nfunction numberValue(value: unknown): string {\n if (typeof value === 'number') return String(value);\n if (typeof value === 'string' && value.trim()) return value.trim();\n return '0';\n}\n\nfunction boolValue(value: unknown): boolean {\n return value === true || value === 'true';\n}\n","import {\n loadEnv,\n saveEnv,\n loadIdentity,\n listIdentities,\n deleteIdentity,\n loadGlobalConfig,\n TokenStore,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitOk, exitWithError } from '../utils/exit';\n\nexport async function identityList(args: { env?: string }): Promise<void> {\n try {\n const g = await loadGlobalConfig();\n const filter = args.env === 'all' ? undefined : (args.env ?? g.activeEnv);\n const names = await listIdentities(filter);\n if (names.length === 0) {\n exitOk('(no identities)');\n return;\n }\n const lines: string[] = [];\n for (const n of names) {\n const meta = await loadIdentity(n);\n const env = await loadEnv(meta.env).catch(() => null);\n const isDefault = env?.defaultIdentity === n ? '*' : ' ';\n const expired = meta.expiresAt && new Date(meta.expiresAt) < new Date() ? ' (expired)' : '';\n lines.push(`${isDefault} ${n} scheme=${meta.scheme} env=${meta.env}${expired}`);\n }\n exitOk(lines.join('\\n'));\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function identityUse(name: string): Promise<void> {\n try {\n const meta = await loadIdentity(name); // throws IDENTITY_NOT_FOUND on missing\n // Orphan identity: env was deleted but identity meta lingered. Remap\n // ENV_NOT_FOUND → IDENTITY_NOT_IN_ENV so the error code matches the user's\n // mental model (\"I'm using `identity use`, not `env use`\").\n const env = await loadEnv(meta.env).catch(() => {\n throw new CliError({\n code: CliErrorCode.IDENTITY_NOT_IN_ENV,\n message: `identity '${name}' references env '${meta.env}' which no longer exists. Re-create the env, or remove this orphan: hcm identity remove ${name}`,\n });\n });\n env.defaultIdentity = name;\n await saveEnv(meta.env, env);\n exitOk(`✅ default identity for env '${meta.env}': ${name}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function identityRemove(name: string): Promise<void> {\n try {\n const meta = await loadIdentity(name);\n try {\n await TokenStore.forIdentity(name).clear();\n } catch (err) {\n process.stderr.write(\n `[hcm] event=identity_cleanup_failed identity=${name} reason=${JSON.stringify(String((err as Error).message))}\\n`,\n );\n }\n await deleteIdentity(name);\n // if this was the env's default, clear it\n const env = await loadEnv(meta.env).catch(() => null);\n if (env?.defaultIdentity === name) {\n env.defaultIdentity = undefined;\n await saveEnv(meta.env, env);\n }\n exitOk(`✅ identity '${name}' removed`);\n } catch (e) {\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n type ActionMeta,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport {\n assessDeliveryCommand,\n type DeliveryActionResolution,\n type DeliveryAssessment,\n} from './delivery';\n\nexport interface DeliveryActionRequest {\n model: string;\n action: string;\n httpMethod: string;\n scope: string;\n env?: string;\n identity?: string;\n profile?: string;\n}\n\nexport type ResolveDeliveryAction = (\n request: DeliveryActionRequest,\n) => Promise<DeliveryActionResolution>;\n\nexport interface EffectiveDeliveryAssessmentDependencies {\n resolveAction?: ResolveDeliveryAction;\n}\n\n/**\n * 仅 Action 需要读取 Core 的既有声明;其他命令继续使用纯本地评估。\n */\nexport async function assessEffectiveDeliveryCommand(\n inputArgv: string[],\n dependencies: EffectiveDeliveryAssessmentDependencies = {},\n): Promise<DeliveryAssessment> {\n const local = assessDeliveryCommand(inputArgv);\n if (local.reasonCode !== 'action-effect-unclassified') return local;\n\n const request = parseActionRequest(inputArgv);\n if ('status' in request) {\n return assessDeliveryCommand(inputArgv, { actionResolution: request });\n }\n\n const resolution = await (dependencies.resolveAction ?? resolveCoreAction)(request);\n return assessDeliveryCommand(inputArgv, { actionResolution: resolution });\n}\n\nexport async function deliveryAssessCommand(\n argv: string[],\n args: { output?: OutputFormat },\n): Promise<void> {\n const assessment = await assessEffectiveDeliveryCommand(argv);\n process.stdout.write(formatObject(assessment, { format: args.output ?? 'json' }) + '\\n');\n}\n\nasync function resolveCoreAction(request: DeliveryActionRequest): Promise<DeliveryActionResolution> {\n try {\n const auth = await getActiveAuthContextFromCli({\n env: request.env,\n as: request.identity,\n profile: request.profile,\n });\n const description = await HcmClient.fromAuthContext(auth).describe(request.model);\n const matches = description.actions.filter((action) => matchesRequest(action, request));\n if (matches.length === 0) {\n return failed(\n 'action-metadata-not-found',\n 'Core 元数据中没有与本次 method/scope 精确匹配的 Action,拒绝执行。',\n );\n }\n if (matches.length > 1) {\n return failed(\n 'action-metadata-ambiguous',\n 'Core 元数据存在多个与本次 method/scope 匹配的 Action,无法唯一判定,拒绝执行。',\n );\n }\n\n const action = matches[0]!;\n if (typeof action.readOnly !== 'boolean') {\n return failed(\n 'action-readonly-unclassified',\n 'Core 未返回 Action 的 readOnly 声明,按安全默认拒绝执行。',\n );\n }\n return {\n status: 'resolved',\n policy: {\n scope: action.scope!,\n httpMethod: action.httpMethod!.toUpperCase(),\n readOnly: action.readOnly,\n ...(action.source ? { source: action.source } : {}),\n },\n };\n } catch {\n return failed(\n 'action-metadata-unavailable',\n '无法读取 Core Action 元数据,按安全默认拒绝执行。',\n );\n }\n}\n\nfunction matchesRequest(action: ActionMeta, request: DeliveryActionRequest): boolean {\n return action.name === request.action\n && action.httpMethod?.toUpperCase() === request.httpMethod\n && action.scope?.toLowerCase() === request.scope;\n}\n\nfunction parseActionRequest(inputArgv: string[]): DeliveryActionRequest | DeliveryActionResolution {\n const argv = inputArgv[0] === '--' ? inputArgv.slice(1) : [...inputArgv];\n const spec = argv[1] ?? '';\n const separator = spec.indexOf('.');\n if (separator <= 0 || separator === spec.length - 1) {\n return failed('invalid-action-spec', 'Action 必须使用 <Model>.<Action> 格式。');\n }\n\n const httpMethod = (flagValue(argv, '--method') ?? 'POST').toUpperCase();\n if (!['GET', 'POST', 'PUT', 'DELETE'].includes(httpMethod)) {\n return failed('invalid-action-method', 'Action method 必须是 GET、POST、PUT 或 DELETE。');\n }\n const explicitScope = flagValue(argv, '--scope');\n const scope = explicitScope ?? (flagValue(argv, '--id') ? 'object' : 'class');\n if (scope !== 'class' && scope !== 'object') {\n return failed('invalid-action-scope', 'Action scope 必须是 class 或 object。');\n }\n\n return {\n model: spec.slice(0, separator),\n action: spec.slice(separator + 1),\n httpMethod,\n scope,\n env: flagValue(argv, '--env'),\n identity: flagValue(argv, '--as'),\n profile: flagValue(argv, '--profile'),\n };\n}\n\nfunction failed(reasonCode: string, reason: string): DeliveryActionResolution {\n return { status: 'failed', reasonCode, reason };\n}\n\nfunction flagValue(argv: string[], flag: string): string | undefined {\n const equals = argv.find((arg) => arg.startsWith(`${flag}=`));\n if (equals) return equals.slice(flag.length + 1);\n const index = argv.indexOf(flag);\n return index >= 0 ? argv[index + 1] : undefined;\n}\n","import { createHash } from 'node:crypto';\n\nexport type DeliveryRisk = 'R0' | 'R1' | 'R2' | 'R3';\nexport type DeliveryExecution = 'direct' | 'guarded' | 'forbidden';\nexport type DeliveryModeDecision = 'allow' | 'deny';\n\nexport interface DeliveryAssessment {\n schemaVersion: 1;\n contractVersion: '2026-08-29';\n assessmentId: string;\n commandSha256: string;\n command: {\n name: string;\n subcommand?: string;\n };\n risk: DeliveryRisk;\n execution: DeliveryExecution;\n guardedExecutionAvailable: boolean;\n effect: string;\n reasonCode: string;\n reason: string;\n environment: {\n envAlias?: string;\n identityAlias?: string;\n };\n target: Record<string, unknown>;\n requirements: string[];\n evidenceRequirements: string[];\n sensitiveFlags: string[];\n modePolicy: {\n planOnly: DeliveryModeDecision;\n controlled: DeliveryModeDecision;\n };\n}\n\ninterface Classification {\n risk: DeliveryRisk;\n execution: DeliveryExecution;\n effect: string;\n reasonCode: string;\n reason: string;\n}\n\nexport interface DeliveryActionPolicy {\n scope: string;\n httpMethod: string;\n readOnly: boolean;\n source?: string;\n}\n\nexport type DeliveryActionResolution =\n | { status: 'resolved'; policy: DeliveryActionPolicy }\n | { status: 'failed'; reasonCode: string; reason: string };\n\nexport interface DeliveryAssessmentOptions {\n actionResolution?: DeliveryActionResolution;\n}\n\nconst APPROVAL_BYPASS_FLAGS = new Set(['-y', '--yes', '--force', '--auto-approve']);\nconst CREDENTIAL_FLAGS = new Set([\n '--password',\n '--password-stdin',\n '--client-secret',\n '--pat',\n '--pat-stdin',\n '--new-password',\n '--new-password-stdin',\n]);\nconst PAYLOAD_FLAGS = ['--data', '--params'];\nconst GUARDED_EXECUTOR_REASON_CODES = new Set([\n 'record-create',\n 'record-update',\n 'cache-mutation',\n 'setting-write',\n 'credential-reset',\n 'action-write',\n]);\n\n/**\n * 对一次结构化 HCM argv 做纯本地风险评估。\n *\n * 调用方必须传子命令本身,不传 `hcm` 或稳定入口;例如:\n * `['create', 'Employee', '--data', '{...}', '--env', 'prod', '--as', 'consultant']`。\n */\nexport function assessDeliveryCommand(\n inputArgv: string[],\n options: DeliveryAssessmentOptions = {},\n): DeliveryAssessment {\n const argv = inputArgv[0] === '--' ? inputArgv.slice(1) : [...inputArgv];\n const commandSha256 = sha256(JSON.stringify(argv));\n const name = argv[0] ?? '';\n const subcommand = argv[1] && !argv[1].startsWith('-') ? argv[1] : undefined;\n const envAlias = flagValue(argv, '--env');\n const identityAlias = flagValue(argv, '--as');\n const sensitiveFlags = [\n ...new Set([...PAYLOAD_FLAGS, ...CREDENTIAL_FLAGS].filter((flag) => hasFlag(argv, flag))),\n ];\n const target = summarizeTarget(argv, options.actionResolution);\n\n let classification = classify(argv, options.actionResolution);\n const invalidPayload = payloadError(argv);\n if (invalidPayload) {\n classification = forbidden('invalid-input', 'JSON payload 无效,不能进入任何执行路径。');\n }\n\n const requirements: string[] = [];\n const guardedExecutionAvailable =\n classification.risk === 'R2' && GUARDED_EXECUTOR_REASON_CODES.has(classification.reasonCode);\n if (classification.risk === 'R2') {\n if (!envAlias) requirements.push('explicit-env');\n if (!identityAlias) requirements.push('explicit-identity');\n if (guardedExecutionAvailable) {\n requirements.push('change-plan', 'rollback-plan', 'human-approval', 'single-use-plan');\n } else {\n requirements.push('guarded-executor');\n }\n } else if (classification.risk === 'R3') {\n requirements.push('governance-escalation');\n }\n\n const allowed = classification.risk === 'R0' || classification.risk === 'R1';\n return {\n schemaVersion: 1,\n contractVersion: '2026-08-29',\n assessmentId: sha256(`2026-08-29\\n${commandSha256}`).slice(0, 24),\n commandSha256,\n command: { name: name || '(empty)', ...(subcommand ? { subcommand } : {}) },\n ...classification,\n guardedExecutionAvailable,\n environment: {\n ...(envAlias ? { envAlias } : {}),\n ...(identityAlias ? { identityAlias } : {}),\n },\n target,\n requirements,\n evidenceRequirements: evidenceFor(classification.risk),\n sensitiveFlags,\n modePolicy: {\n planOnly: allowed ? 'allow' : 'deny',\n controlled: allowed || guardedExecutionAvailable ? 'allow' : 'deny',\n },\n };\n}\n\nfunction classify(\n argv: string[],\n actionResolution?: DeliveryActionResolution,\n): Classification {\n const name = argv[0] ?? '';\n const subcommand = argv[1] ?? '';\n\n if (argv.some((arg) => APPROVAL_BYPASS_FLAGS.has(flagName(arg)))) {\n return forbidden('approval-bypass', '命令包含跳过确认的旗标,顾问交付面不执行。');\n }\n if (name === 'user' && subcommand === 'reset-password') {\n const nonStdinCredential = argv.some((arg) => {\n const flag = flagName(arg);\n return CREDENTIAL_FLAGS.has(flag) && flag !== '--password-stdin';\n });\n if (nonStdinCredential || !argv.includes('--password-stdin')) {\n return forbidden(\n 'credential-governance',\n '用户密码重置只能通过 --password-stdin 进入受控凭据流程。',\n );\n }\n return guarded('credential-write', 'credential-reset');\n }\n if (argv.some((arg) => CREDENTIAL_FLAGS.has(flagName(arg)))) {\n return forbidden('credential-governance', '命令携带身份凭据参数,必须转交身份治理流程。');\n }\n\n if (name === 'version') return direct('R0', 'product-discovery', 'product-discovery');\n if (name === 'delivery' && subcommand === 'assess') {\n return direct('R0', 'local-discovery', 'risk-assessment');\n }\n\n if (name === 'skills') {\n if (subcommand === 'list' || subcommand === 'show') {\n return direct('R0', 'product-discovery', 'skill-discovery');\n }\n if (subcommand === 'sync' || subcommand === 'install') {\n return direct('R1', 'managed-local-write', 'skill-managed-write');\n }\n return forbidden('unknown-command', '未知 skills 子命令按最高风险关闭。');\n }\n\n if (name === 'env') {\n if (subcommand === 'list' || subcommand === 'current' || subcommand === 'show') {\n return direct('R0', 'local-discovery', 'environment-read');\n }\n return forbidden('identity-governance', '环境新增、切换、编辑或删除属于治理操作。');\n }\n\n if (name === 'identity') {\n if (subcommand === 'list') return direct('R0', 'local-discovery', 'identity-read');\n return forbidden('identity-governance', '身份切换或删除属于治理操作。');\n }\n\n if (name === 'query' || name === 'describe' || name === 'trace') {\n return direct('R1', 'remote-read', 'business-read');\n }\n\n if (name === 'cache') {\n if (subcommand === 'stats') return direct('R1', 'remote-read', 'cache-read');\n if (subcommand === 'clear' || subcommand === 'clear-meta') {\n return guarded('operational-write', 'cache-mutation');\n }\n }\n\n if (name === 'meta') {\n if (subcommand === 'list' || subcommand === 'get') {\n return direct('R1', 'remote-read', 'metadata-read');\n }\n if (subcommand === 'set' && hasFlag(argv, '--dry-run')) {\n return direct('R1', 'local-validation', 'metadata-dry-run');\n }\n if (subcommand === 'set') return guarded('tenant-config-write', 'metadata-write');\n if (subcommand === 'delete') return forbidden('destructive', '元数据删除不可由顾问插件执行。');\n }\n\n if (name === 'setting') {\n if (subcommand === 'get') return direct('R1', 'remote-read', 'setting-read');\n if (subcommand === 'set' && hasFlag(argv, '--dry-run')) {\n return direct('R1', 'local-validation', 'setting-dry-run');\n }\n if (subcommand === 'set' || subcommand === 'reset') {\n return guarded('tenant-config-write', 'setting-write');\n }\n }\n\n if (name === 'workspace') {\n if (subcommand === 'push' && hasFlag(argv, '--dry-run')) {\n return direct('R1', 'remote-read', 'workspace-push-dry-run');\n }\n if (['list', 'active', 'status', 'validate', 'verify', 'preview'].includes(subcommand)) {\n return direct('R1', 'remote-read', 'workspace-read');\n }\n if (subcommand === 'pull') {\n return direct('R1', 'managed-local-write', 'workspace-pull');\n }\n if (subcommand === 'bind' || (subcommand === 'add' && argv[2] === 'mini')) {\n return guarded('managed-local-write', 'workspace-local-change');\n }\n if (subcommand === 'create') return guarded('tenant-write', 'workspace-create');\n if (subcommand === 'push') return forbidden('publish', '开发空间发布属于 R3。');\n }\n\n if (name === 'import') {\n if (hasFlag(argv, '--dry-run')) {\n return direct('R1', 'local-validation', 'import-dry-run');\n }\n return guarded('bulk-tenant-write', 'import-write');\n }\n\n if (name === 'create' || name === 'update') {\n return guarded('tenant-write', name === 'create' ? 'record-create' : 'record-update');\n }\n\n if (name === 'upload') return guarded('tenant-write', 'document-upload');\n if (name === 'download') return direct('R1', 'managed-local-write', 'document-download');\n\n if (name === 'action') {\n if (actionResolution?.status === 'resolved') {\n return classifyAction(actionResolution.policy);\n }\n if (actionResolution?.status === 'failed') {\n return forbidden(actionResolution.reasonCode, actionResolution.reason);\n }\n return forbidden(\n 'action-effect-unclassified',\n '尚未读取 Core Action 风控声明,不能按名称猜测后放行。',\n );\n }\n if (name === 'delete' || (name === 'meta' && subcommand === 'delete')) {\n return forbidden('destructive', '删除操作不进入顾问插件执行面。');\n }\n if (name === 'tenant') {\n return forbidden('tenant-governance', '租户开通或治理必须升级治理人员。');\n }\n if (name === 'login' || name === 'logout') {\n return forbidden('identity-governance', '登录与登出属于身份治理操作。');\n }\n if (name === 'chat') {\n return forbidden('agent-autonomy', '顾问插件不通过嵌套数字员工对话扩大自治执行面。');\n }\n\n return forbidden('unknown-command', '未知命令按最高风险关闭。');\n}\n\nfunction summarizeTarget(\n argv: string[],\n actionResolution?: DeliveryActionResolution,\n): Record<string, unknown> {\n const name = argv[0] ?? '';\n const subcommand = argv[1] ?? '';\n const target: Record<string, unknown> = {};\n\n if (['query', 'describe', 'create', 'update', 'delete'].includes(name) && subcommand) {\n target.model = subcommand;\n }\n if (name === 'action' && subcommand) {\n target.action = subcommand;\n if (actionResolution?.status === 'resolved') {\n target.actionPolicy = { ...actionResolution.policy };\n }\n }\n if (name === 'skills' && argv[2] && !argv[2].startsWith('-')) target.skill = argv[2];\n if (name === 'meta' && argv[2] && !argv[2].startsWith('-')) target.path = argv[2];\n if (name === 'cache' && argv[2] && !argv[2].startsWith('-')) {\n target.cacheOperation = subcommand;\n target.model = argv[2];\n }\n if (name === 'setting' && argv[2] && !argv[2].startsWith('-')) {\n target.domain = argv[2];\n const settingKeys = valuesAfterFlag(argv, '--set')\n .map((assignment) => assignment.split('=', 1)[0])\n .filter((key): key is string => Boolean(key))\n .sort();\n if (settingKeys.length > 0) target.settingKeys = settingKeys;\n }\n\n const id = flagValue(argv, '--id');\n if (name === 'user' && subcommand === 'reset-password') {\n if (id) target.userIdSha256 = sha256(id);\n const username = flagValue(argv, '--username');\n if (username) target.usernameSha256 = sha256(username);\n target.forceChangeOnNextLogin = !hasFlag(argv, '--no-force-change');\n } else if (id) {\n target.recordIdSha256 = sha256(id);\n }\n\n for (const flag of PAYLOAD_FLAGS) {\n const raw = flagValue(argv, flag);\n if (!raw) continue;\n target.payloadSha256 = sha256(raw);\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (isPlainObject(parsed)) target.fieldNames = Object.keys(parsed).sort();\n } catch {\n // payloadError 会把最终结果升级为 R3;摘要仍可用于关联失败输入。\n }\n }\n return target;\n}\n\nfunction payloadError(argv: string[]): boolean {\n for (const flag of PAYLOAD_FLAGS) {\n const raw = flagValue(argv, flag);\n if (raw === undefined) continue;\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!isPlainObject(parsed)) return true;\n } catch {\n return true;\n }\n }\n return false;\n}\n\nfunction direct(risk: 'R0' | 'R1', effect: string, reasonCode: string): Classification {\n return {\n risk,\n execution: 'direct',\n effect,\n reasonCode,\n reason:\n risk === 'R0' ? '纯发现操作,可直接执行。' : '只读或受管本地操作,可直接执行并保留结果。',\n };\n}\n\nfunction guarded(effect: string, reasonCode: string): Classification {\n return {\n risk: 'R2',\n execution: 'guarded',\n effect,\n reasonCode,\n reason:\n '普通副作用操作;只允许在 controlled 项目中通过 delivery prepare + delivery execute 单次受控执行。',\n };\n}\n\n/**\n * Action 档位只由 Core 的 `readOnly` 声明决定,与 create/update 同一套档位。\n *\n * 🔴 不消费 `requiresConfirmation`:它对 CLI 不承载可用信息。Core 侧 DEFAULT 按\n * httpMethod 派生,只读的 POST Action(如 previewWidgetDataSources)派生出来同样是\n * `true`,必须被忽略;而它唯一区分得开的情形是「非只读但免确认」——那是 GET 派生或\n * 显式 SKIP,把这批 Action 放进免收据直执行属于扩大直执行面,与本次阻塞无关。\n */\nfunction classifyAction(policy: DeliveryActionPolicy): Classification {\n if (policy.readOnly) {\n return {\n risk: 'R1',\n execution: 'direct',\n effect: 'remote-read',\n reasonCode: 'action-read-only',\n reason: 'Core 声明该 Action 为只读,与 Moirai 的只读 Action 路径一致,可直接执行。',\n };\n }\n return guarded('tenant-write', 'action-write');\n}\n\nfunction forbidden(reasonCode: string, reason: string): Classification {\n return { risk: 'R3', execution: 'forbidden', effect: reasonCode, reasonCode, reason };\n}\n\nfunction evidenceFor(risk: DeliveryRisk): string[] {\n if (risk === 'R0') return ['command-digest', 'discovery-result'];\n if (risk === 'R1') return ['command-digest', 'target-aliases', 'result-summary'];\n if (risk === 'R2') {\n return [\n 'command-digest',\n 'explicit-target-aliases',\n 'pre-state-or-dry-run',\n 'rollback-plan',\n 'execution-receipt',\n 'post-verification',\n ];\n }\n return ['governance-decision'];\n}\n\nfunction flagValue(argv: string[], flag: string): string | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === undefined) continue;\n if (arg === flag) return argv[index + 1];\n if (arg.startsWith(`${flag}=`)) return arg.slice(flag.length + 1);\n }\n return undefined;\n}\n\nfunction hasFlag(argv: string[], flag: string): boolean {\n return argv.some((arg) => arg === flag || arg.startsWith(`${flag}=`));\n}\n\nfunction flagName(arg: string): string {\n const equals = arg.indexOf('=');\n return equals < 0 ? arg : arg.slice(0, equals);\n}\n\nfunction valuesAfterFlag(argv: string[], flag: string): string[] {\n const index = argv.indexOf(flag);\n if (index < 0) return [];\n const values: string[] = [];\n for (let cursor = index + 1; cursor < argv.length; cursor += 1) {\n const value = argv[cursor];\n if (value === undefined || value.startsWith('-')) break;\n values.push(value);\n }\n return values;\n}\n\nfunction sha256(value: string): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","/**\n * `hcm delivery doctor` —— 顾问到现场敲的第一条命令。\n *\n * 四条锚点:**我连上了吗 / 我是谁 / 我有没有 configAdmin / 我站在哪一层**。\n * 判据全在 `@hcmai/sdk` 的 `fde/doctor` 里,这一层只负责:\n * 解析身份上下文 → 用既有 axios 管道适配出侦察端口 → 渲染 → 定退出码。\n *\n * 🔴 **不在这里重写任何判据**。命令层多一处判断,就会与 core 里的那份漂移,\n * 而顾问看到的是命令层这一份。\n */\nimport {\n HcmClient,\n fetchReconIdentity,\n formatObject,\n fromAxiosError,\n httpProbe,\n runDoctor,\n type DoctorReport,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DeliveryDoctorArgs {\n env?: string;\n profile?: string;\n as?: string;\n output?: OutputFormat;\n capabilities?: string;\n}\n\n/** 与产品端默认一致的 capability 串;它是**爬法**属性,会随四元组落档。 */\nconst DEFAULT_CAPABILITIES = 'default';\n\nfunction render(report: DoctorReport): string {\n const lines: string[] = [];\n for (const c of report.checks) {\n // 🔴 四条锚点恒存在,逐条打——少打一条,顾问会以为那一层查过了。\n lines.push(`${c.ok ? '✅' : '❌'} ${c.anchor.padEnd(13)} ${c.detail}`);\n }\n lines.push('');\n lines.push(\n report.ok\n ? '四条锚点全绿:可以开始 recon。'\n : '有锚点没过——先按上面各条的下一步处理,不要在这个状态上爬基线。',\n );\n return lines.join('\\n');\n}\n\nexport async function deliveryDoctorCommand(args: DeliveryDoctorArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n // 🔴 复用既有管道(认证 / 刷新 / 拦截器),不另造一份 HTTP 客户端。\n const probe = httpProbe(client.raw(), args.capabilities ?? DEFAULT_CAPABILITIES);\n // `ctx.tenantId` 是**顾问要的**租户;token 实际归属的那个现打 /api/auth/info 拿。\n const identity = await fetchReconIdentity(probe, ctx.tenantId);\n const report = await runDoctor(probe, identity);\n\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(render(report) + '\\n');\n process.stdout.write(formatObject(report, { format: fmt }) + '\\n');\n // 🔴 有锚点没过 ⇒ 非零退出码:doctor 会被写进脚本里当前置闸,\n // 恒 0 会让「没过」在自动化里静默通过。\n process.exit(report.ok ? 0 : 1);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n }\n}\n","/**\n * `hcm delivery recon` —— 顾问在现场爬一份**可带走的**基线。\n *\n * 两个动作,性质完全不同,别混:\n * · `recon`(默认):**要联网**,把这个环境的模型 / 字段 / 只读闸 / 依赖图 / 码表 /\n * 可写性画像整套爬下来落盘;\n * · `recon round`:**零网络**,只读盘上已有的一份基线,回答「它是不是一轮完整跑出来的」。\n * 气隙机器上、或者刚被 Ctrl-C 打断之后,顾问手上就只有那几个文件 —— 被打断的那一轮\n * **不会打印任何摘要**,所以这个判断不能只活在摘要里。\n *\n * 🔴 **这一层不重写任何判据**。分档、措辞、边界全部照用 `@hcmai/sdk` 里的\n * `runRecon` / `inspectRound` / `renderRound`,命令层只做三件事:\n * 解析身份上下文 → 用既有 axios 管道适配出侦察端口 → 渲染与定退出码。\n * 命令层多一处判断,就会与 core 里的那份漂移,而顾问看到的是命令层这一份。\n */\nimport {\n HcmClient,\n ReconLayout,\n ROUND_EXIT_CODES,\n computeReconSourceKey,\n formatObject,\n fromAxiosError,\n httpProbe,\n inspectRound,\n renderRound,\n runRecon,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DeliveryReconArgs {\n env?: string;\n profile?: string;\n as?: string;\n out?: string;\n state?: string;\n model?: string;\n output?: OutputFormat;\n capabilities?: string;\n}\n\nexport interface DeliveryReconRoundArgs {\n dir?: string;\n output?: OutputFormat;\n}\n\n/**\n * ⚠️ **`round` 子命令不声明自己的 `--output`**,它读父命令 `recon` 上那一个。\n *\n * 🔴 这是实测出来的,不是设计偏好:commander 默认允许父命令的选项出现在子命令名**之后**,\n * 于是 `hcm delivery recon round --dir X --output table` 里那个 `table`\n * **落在父命令上**;子命令若也声明一个同名选项,拿到的永远是它自己的缺省 `json`。\n * 现场表现是:顾问照着产物 note 敲那条命令,**人话判读那一半根本不出来**,\n * 而退出码和 JSON 都正常 —— 一个不报错、只是少给你一半信息的静默缺陷(本刀真跑逮到)。\n *\n * ⇒ 两条路都不走:\n * · 子命令再声明一个 `--output`:它**永远赢不了**,是一处不会生效的装饰;\n * · 开 `enablePositionalOptions()`:那会改掉**整个 CLI** 的解析规则\n * (父命令选项从此必须写在子命令名之前),为一处收益动全局是本仓明令的反面。\n * ⇒ 只在父命令上声明一次,子命令读它。`round --help` 里看不到 `--output`,\n * 而这恰恰是**准确**的:那个选项确实属于 `recon`。\n */\n\n\n/** 与产品端默认一致的 capability 串;它是**爬法**属性,会随四元组落档。 */\nconst DEFAULT_CAPABILITIES = 'default';\n\nexport async function deliveryReconCommand(args: DeliveryReconArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n // 🔴 复用既有管道(认证 / 刷新 / 拦截器),不另造一份 HTTP 客户端。\n const probe = httpProbe(client.raw(), args.capabilities ?? DEFAULT_CAPABILITIES);\n\n // 🔴 产物目录按**爬取身份**分叉,而 sourceKey 从 **meta** 端点的响应头探\n // (不是 `/api/system/models`)。这里错一次的后果比 doctor 更重:**产物目录名**\n // 会恒为 `unknown-<摘要>`,两个站在不同层上的顾问于是写进同一个目录。\n // ⚠️ 判据整个在 `computeReconSourceKey()` 里(它内部从 `modelKeys()` 这**唯一一道门**\n // 取 key,dict 过滤 / 空串过滤 / 排序都在那儿)—— 命令层不许自己就地取。\n const sourceKey = await computeReconSourceKey(probe);\n const layout = new ReconLayout(args.out ?? '.', ctx.tenantId, sourceKey);\n\n const summary = await runRecon(probe, layout, {\n state: args.state ?? '',\n onlyModel: args.model ?? null,\n identity: ctx.tenantId ? { requestedTenantId: ctx.tenantId } : null,\n });\n\n process.stdout.write(formatObject(summary, { format: args.output ?? 'json' }) + '\\n');\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n }\n}\n\n/**\n * `hcm delivery recon round --dir <产物目录>` —— **零网络**,不读身份、不发请求。\n *\n * 🔴 参数是**产物目录本身**(`<out>/recon/<租户段>/<来源段>`),不是产物根:\n * 判读只需要那几个文件,多一层「在同一租户下选哪一份基线」的推断就多一处会错的地方,\n * 而顾问手上那份目录他自己看得见。产物里的 roundNote 教的也是这条。\n *\n * 🔴 **档位由 `inspectRound` 给**,这里只做「档位 → 退出码」一次查表,一个字都不重判。\n *\n * ⚠️ Python 侧那句「查不到就按 mixed 兜底」在这里**故意没有**:`ROUND_EXIT_CODES` 是\n * `Record<RoundState, number>`,档位取值域是全的 —— 兜底分支**永远走不到**(实测:\n * 把它改成按 complete 兜底,一条用例都不红,因为那一支根本执行不到)。\n * 而「以后多一档忘了配退出码」这件事由**类型**接住:往 `ROUND_STATES` 加一档,\n * `ROUND_EXIT_CODES` 的字面量当场编译不过 —— 比一个运行时兜底更早、更硬。\n * 留一条永不执行的兜底只会让人以为它在保护什么。\n */\nexport async function deliveryReconRoundCommand(args: DeliveryReconRoundArgs): Promise<void> {\n // 🔴 **先算出退出码,再退出** —— `process.exit()` 不放在 `try` 里面。\n // 生产上二者行为逐字相同(真 Node 里 `process.exit` 直接终止进程,不会被 catch 到),\n // 但把它留在 try 内会让这条命令**测不了**:用例要观测退出码只能把 `process.exit`\n // 换成抛异常,而那一抛会被下面这个 catch 接住、翻译成「出错了 ⇒ 1」——\n // 于是一条 complete 的基线在用例里表现为 rc=1(实测栽过一次)。\n // 判据能不能自证前提,取决于前提能不能被观测到;这里的形态就是为了让它能。\n let code: number;\n try {\n const result = inspectRound(args.dir ?? '.');\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(renderRound(result));\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n code = ROUND_EXIT_CODES[result.state];\n } catch (e) {\n exitWithError(e);\n code = 1;\n }\n process.exit(code);\n}\n","import { createHash, randomBytes as secureRandomBytes } from 'node:crypto';\nimport { spawn } from 'node:child_process';\nimport { createReadStream, promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { CliError, CliErrorCode, formatObject, type OutputFormat } from '@hcmai/sdk';\nimport type { DeliveryAssessment } from './delivery';\nimport { assessEffectiveDeliveryCommand } from './delivery-action-policy';\nimport { exitWithError } from '../utils/exit';\n\nconst EXECUTION_CONTRACT_VERSION = '2026-08-29.controlled-v2' as const;\nconst DEFAULT_TTL_SECONDS = 15 * 60;\nconst MIN_TTL_SECONDS = 60;\nconst MAX_TTL_SECONDS = 60 * 60;\nconst PLAN_ID_PATTERN = /^[a-f0-9]{24}$/;\n\nexport type DeliveryRuntimeIdentity =\n | {\n kind: 'node-entry';\n executableSha256: string;\n entrySha256: string;\n }\n | {\n kind: 'executable';\n executableSha256: string;\n };\n\ninterface BoundDocument {\n path: string;\n sha256: string;\n}\n\nexport interface DeliveryExecutionPlan {\n schemaVersion: 1;\n contractVersion: typeof EXECUTION_CONTRACT_VERSION;\n planId: string;\n nonceSha256: string;\n createdAt: string;\n expiresAt: string;\n chironLockSha256: string;\n runtime: DeliveryRuntimeIdentity;\n assessment: DeliveryAssessment;\n documents: {\n change: BoundDocument;\n rollback: BoundDocument;\n };\n /**\n * 被 `--data-file` / `--params-file` 引用的载荷文件及其摘要。\n *\n * 🔴 少了它,`--data-file` 就是受控路径上的一个洞:计划只对 argv 取摘要,内联 `--data`\n * 的载荷在 argv 里因而被覆盖,而 `--data-file` 的载荷在文件里——prepare 与 execute\n * 之间把文件改掉不会被任何检查发现,\"这份计划批的是这份内容\"就不成立了。\n *\n * 守住它的是两件事,缺一不可:`isExecutionPlan` 强制本字段存在(旧结构的计划连 schema\n * 都过不了),以及 EXECUTION_CONTRACT_VERSION 随结构一起升版(旧契约的计划一律拒绝)。\n * 不要再加\"argv 用了 --data-file 就检查计划里有没有绑\"这类断言——手改计划在\n * `computePlanId(plan) !== planId` 那步就已经被挡住,那条断言变异删掉也不会红。\n */\n payloads: BoundDocument[];\n evidenceDir: string;\n}\n\nexport interface DeliveryExecutionReceipt {\n schemaVersion: 1;\n contractVersion: typeof EXECUTION_CONTRACT_VERSION;\n planId: string;\n assessmentId: string;\n commandSha256: string;\n startedAt: string;\n completedAt: string;\n exitCode: number;\n stdoutSha256: string;\n stderrSha256: string;\n}\n\ninterface DeliveryStreams {\n stdout(chunk: Buffer): void;\n stderr(chunk: Buffer): void;\n}\n\nexport type RunDeliveryCommand = (\n argv: string[],\n cwd: string,\n streams: DeliveryStreams,\n) => Promise<{ exitCode: number }>;\n\ninterface DeliveryExecutionDependencies {\n now?: () => Date;\n runtimeIdentity?: () => Promise<DeliveryRuntimeIdentity>;\n assessCommand?: (argv: string[]) => Promise<DeliveryAssessment>;\n}\n\nexport interface PrepareDeliveryInput extends DeliveryExecutionDependencies {\n project: string;\n argv: string[];\n changeRef: string;\n rollbackRef: string;\n evidenceDir: string;\n ttlSeconds?: number;\n randomBytes?: (size: number) => Buffer;\n}\n\nexport interface ExecuteDeliveryInput extends DeliveryExecutionDependencies {\n project: string;\n planId: string;\n argv: string[];\n runCommand?: RunDeliveryCommand;\n}\n\nexport interface DeliveryPrepareArgs {\n project?: string;\n changeRef?: string;\n rollbackRef?: string;\n evidenceDir?: string;\n ttlSeconds?: string;\n output?: OutputFormat;\n}\n\nexport interface DeliveryExecuteArgs {\n project?: string;\n output?: OutputFormat;\n}\n\nexport async function prepareDeliveryExecution(\n input: PrepareDeliveryInput,\n): Promise<DeliveryExecutionPlan> {\n const project = await realProject(input.project);\n await readProjectMode(project);\n const assessment = await (input.assessCommand ?? assessEffectiveDeliveryCommand)(input.argv);\n assertGuardedAssessment(assessment, input.argv);\n\n const ttlSeconds = input.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n if (\n !Number.isInteger(ttlSeconds) ||\n ttlSeconds < MIN_TTL_SECONDS ||\n ttlSeconds > MAX_TTL_SECONDS\n ) {\n throw invalid(`--ttl-seconds 必须是 ${MIN_TTL_SECONDS} 到 ${MAX_TTL_SECONDS} 的整数`);\n }\n\n const change = await bindDocument(project, input.changeRef, '变更说明');\n const rollback = await bindDocument(project, input.rollbackRef, '回滚说明');\n const payloads = await bindPayloadFiles(project, input.argv);\n const evidence = await bindEvidenceDirectory(project, input.evidenceDir);\n const { bytes: lockBytes, runtime: lockedRuntime } = await readChironLock(project);\n const runtime = await (input.runtimeIdentity ?? currentRuntimeIdentity)();\n assertRuntimeMatches(runtime, lockedRuntime);\n\n const created = (input.now ?? (() => new Date()))();\n if (Number.isNaN(created.getTime())) throw invalid('当前时间无效');\n const core = {\n schemaVersion: 1 as const,\n contractVersion: EXECUTION_CONTRACT_VERSION,\n nonceSha256: sha256((input.randomBytes ?? secureRandomBytes)(12)),\n createdAt: created.toISOString(),\n expiresAt: new Date(created.getTime() + ttlSeconds * 1000).toISOString(),\n chironLockSha256: sha256(lockBytes),\n runtime,\n assessment,\n documents: { change, rollback },\n payloads,\n evidenceDir: evidence.relative,\n };\n const planId = sha256(canonicalJson(core)).slice(0, 24);\n const plan: DeliveryExecutionPlan = { ...core, planId };\n const plansDir = path.join(project, '.hcm-delivery', 'execution-plans');\n await safeManagedDirectory(project, '.hcm-delivery/execution-plans', plansDir);\n const planFile = path.join(plansDir, `${planId}.json`);\n try {\n await fs.writeFile(planFile, `${JSON.stringify(plan, null, 2)}\\n`, {\n encoding: 'utf8',\n mode: 0o600,\n flag: 'wx',\n });\n } catch (cause) {\n throw invalid(`执行计划写入失败或 planId 已存在:${planId}`, cause);\n }\n return plan;\n}\n\nexport async function executeDeliveryPlan(\n input: ExecuteDeliveryInput,\n): Promise<DeliveryExecutionReceipt> {\n if (!PLAN_ID_PATTERN.test(input.planId)) throw invalid('planId 必须是 24 位小写十六进制');\n const project = await realProject(input.project);\n if ((await readProjectMode(project)) !== 'controlled') {\n throw invalid('项目不是 controlled,不能执行 R2 计划');\n }\n\n const planFile = path.join(project, '.hcm-delivery', 'execution-plans', `${input.planId}.json`);\n const plan = await readPlan(project, planFile);\n if (plan.planId !== input.planId || computePlanId(plan) !== input.planId) {\n throw invalid('执行计划内容与 planId 摘要不一致');\n }\n\n const now = (input.now ?? (() => new Date()))();\n if (Number.isNaN(now.getTime())) throw invalid('当前时间无效');\n const expiresAt = Date.parse(plan.expiresAt);\n const createdAt = Date.parse(plan.createdAt);\n if (\n !Number.isFinite(createdAt) ||\n !Number.isFinite(expiresAt) ||\n expiresAt - createdAt < MIN_TTL_SECONDS * 1000 ||\n expiresAt - createdAt > MAX_TTL_SECONDS * 1000\n ) {\n throw invalid('执行计划时间窗口无效');\n }\n if (now.getTime() < createdAt - 5_000) throw invalid('当前时间早于计划创建时间');\n if (now.getTime() > expiresAt) throw invalid('执行计划已过期,请重新 prepare');\n\n const assessment = await (input.assessCommand ?? assessEffectiveDeliveryCommand)(input.argv);\n assertGuardedAssessment(assessment, input.argv);\n if (canonicalJson(assessment) !== canonicalJson(plan.assessment)) {\n throw invalid('实际 argv 与执行计划的命令摘要或风险事实不一致');\n }\n\n const { bytes: lockBytes, runtime: lockedRuntime } = await readChironLock(project);\n if (sha256(lockBytes) !== plan.chironLockSha256) {\n throw invalid('Chiron 锁摘要已漂移,请重新评估并 prepare');\n }\n const runtime = await (input.runtimeIdentity ?? currentRuntimeIdentity)();\n assertRuntimeMatches(runtime, lockedRuntime);\n if (canonicalJson(runtime) !== canonicalJson(plan.runtime)) {\n throw invalid('CLI 运行时摘要与执行计划不一致');\n }\n await assertDocumentUnchanged(project, plan.documents.change, '变更说明');\n await assertDocumentUnchanged(project, plan.documents.rollback, '回滚说明');\n // argv 摘要覆盖不到外部载荷文件的内容,这里补上——否则 prepare 批的和 execute 跑的\n // 可以是两份不同的数据。\n await assertPayloadsUnchanged(project, plan.payloads);\n const evidenceDir = await bindEvidenceDirectory(project, plan.evidenceDir);\n const receiptFile = path.join(evidenceDir.absolute, `${plan.planId}.receipt.json`);\n if (await pathExists(receiptFile)) throw invalid(`执行收据已存在,拒绝再次执行:${plan.planId}`);\n\n const claimsDir = path.join(project, '.hcm-delivery', 'execution-claims');\n await safeManagedDirectory(project, '.hcm-delivery/execution-claims', claimsDir);\n const claimFile = path.join(claimsDir, `${plan.planId}.json`);\n try {\n await fs.writeFile(\n claimFile,\n `${JSON.stringify({ schemaVersion: 1, planId: plan.planId, claimedAt: now.toISOString() }, null, 2)}\\n`,\n { encoding: 'utf8', mode: 0o600, flag: 'wx' },\n );\n } catch (cause) {\n throw invalid(`执行计划已消费,拒绝重复执行:${plan.planId}`, cause);\n }\n\n const stdoutHash = createHash('sha256');\n const stderrHash = createHash('sha256');\n const run = input.runCommand ?? runCurrentCliCommand;\n let exitCode: number;\n try {\n ({ exitCode } = await run(input.argv, project, {\n stdout: (chunk) => stdoutHash.update(chunk),\n stderr: (chunk) => stderrHash.update(chunk),\n }));\n } catch (cause) {\n stderrHash.update(\n Buffer.from(`delivery executor failed: ${String((cause as Error).message)}\\n`),\n );\n exitCode = 1;\n }\n\n const completed = (input.now ?? (() => new Date()))();\n if (Number.isNaN(completed.getTime())) throw invalid('完成时间无效');\n if (!Number.isInteger(exitCode) || exitCode < 0) exitCode = 1;\n const receipt: DeliveryExecutionReceipt = {\n schemaVersion: 1,\n contractVersion: EXECUTION_CONTRACT_VERSION,\n planId: plan.planId,\n assessmentId: plan.assessment.assessmentId,\n commandSha256: plan.assessment.commandSha256,\n startedAt: now.toISOString(),\n completedAt: completed.toISOString(),\n exitCode,\n stdoutSha256: stdoutHash.digest('hex'),\n stderrSha256: stderrHash.digest('hex'),\n };\n await writeReceiptExclusive(receiptFile, receipt);\n return receipt;\n}\n\nexport async function deliveryPrepareCommand(\n argv: string[],\n args: DeliveryPrepareArgs,\n): Promise<void> {\n try {\n if (!args.changeRef) throw invalid('--change-ref <file> 必填');\n if (!args.rollbackRef) throw invalid('--rollback-ref <file> 必填');\n if (!args.evidenceDir) throw invalid('--evidence-dir <dir> 必填');\n const ttlSeconds = parseTtl(args.ttlSeconds);\n const plan = await prepareDeliveryExecution({\n project: args.project ?? process.cwd(),\n argv,\n changeRef: args.changeRef,\n rollbackRef: args.rollbackRef,\n evidenceDir: args.evidenceDir,\n ...(ttlSeconds === undefined ? {} : { ttlSeconds }),\n });\n process.stdout.write(formatObject(plan, { format: args.output ?? 'json' }) + '\\n');\n } catch (cause) {\n exitWithError(cause);\n }\n}\n\nexport async function deliveryExecuteCommand(\n planId: string,\n argv: string[],\n args: DeliveryExecuteArgs,\n): Promise<void> {\n try {\n const receipt = await executeDeliveryPlan({\n project: args.project ?? process.cwd(),\n planId,\n argv,\n });\n process.stdout.write(formatObject(receipt, { format: args.output ?? 'json' }) + '\\n');\n process.exitCode = receipt.exitCode;\n } catch (cause) {\n exitWithError(cause);\n }\n}\n\nasync function readProjectMode(project: string): Promise<'plan-only' | 'controlled'> {\n const file = path.join(project, '.hcm-delivery', 'project.yml');\n const content = await readSafeFile(project, file, '项目配置');\n const match = content\n .toString('utf8')\n .match(\n /^deliveryMode:\\s*(?:\"(plan-only|controlled)\"|'(plan-only|controlled)'|(plan-only|controlled))\\s*$/m,\n );\n const mode = match?.[1] ?? match?.[2] ?? match?.[3];\n if (mode !== 'plan-only' && mode !== 'controlled') {\n throw invalid('project.yml 缺少合法 deliveryMode');\n }\n return mode;\n}\n\nasync function readChironLock(\n project: string,\n): Promise<{ bytes: Buffer; runtime: DeliveryRuntimeIdentity }> {\n const file = path.join(project, '.hcm-delivery', 'chiron.lock.json');\n const bytes = await readSafeFile(project, file, 'Chiron 锁');\n let parsed: unknown;\n try {\n parsed = JSON.parse(bytes.toString('utf8')) as unknown;\n } catch (cause) {\n throw invalid('Chiron 锁不是合法 JSON', cause);\n }\n const launch = (parsed as { runtime?: { launch?: unknown } })?.runtime?.launch;\n if (!isRuntimeIdentity(launch)) throw invalid('Chiron 锁缺少合法 runtime.launch 摘要');\n return { bytes, runtime: launch };\n}\n\nasync function bindDocument(\n project: string,\n reference: string,\n label: string,\n): Promise<BoundDocument> {\n const relative = safeRelative(reference, label);\n if (!(relative.startsWith('work/') || relative.startsWith('decisions/'))) {\n throw invalid(`${label}必须位于项目 work/ 或 decisions/ 下`);\n }\n const file = path.join(project, relative);\n const bytes = await readSafeFile(project, file, label);\n return { path: relative, sha256: sha256(bytes) };\n}\n\nasync function assertDocumentUnchanged(\n project: string,\n document: BoundDocument,\n label: string,\n): Promise<void> {\n const current = await bindDocument(project, document.path, label);\n if (current.sha256 !== document.sha256) throw invalid(`${label}摘要已漂移,请重新 prepare`);\n}\n\nasync function bindEvidenceDirectory(\n project: string,\n reference: string,\n): Promise<{ relative: string; absolute: string }> {\n const relative = safeRelative(reference, 'evidence 目录');\n if (!(relative === 'evidence' || relative.startsWith('evidence/'))) {\n throw invalid('evidence 目录必须位于项目 evidence/ 下');\n }\n const absolute = path.join(project, relative);\n await assertNoSymlinkComponents(project, relative);\n const stat = await fs.stat(absolute).catch((cause) => {\n throw invalid(`evidence 目录不可用:${relative}`, cause);\n });\n if (!stat.isDirectory()) throw invalid(`evidence 路径不是目录:${relative}`);\n return { relative, absolute };\n}\n\nasync function readPlan(project: string, file: string): Promise<DeliveryExecutionPlan> {\n const bytes = await readSafeFile(project, file, '执行计划');\n let plan: unknown;\n try {\n plan = JSON.parse(bytes.toString('utf8')) as unknown;\n } catch (cause) {\n throw invalid('执行计划不是合法 JSON', cause);\n }\n if (!isExecutionPlan(plan)) throw invalid('执行计划 schema 无效');\n return plan;\n}\n\nfunction computePlanId(plan: DeliveryExecutionPlan): string {\n const core: Partial<DeliveryExecutionPlan> = { ...plan };\n delete core.planId;\n return sha256(canonicalJson(core)).slice(0, 24);\n}\n\nfunction assertGuardedAssessment(assessment: DeliveryAssessment, argv: string[]): void {\n if (assessment.risk !== 'R2') throw invalid('只有 R2 命令可以进入受控执行计划');\n if (!assessment.guardedExecutionAvailable) {\n throw invalid('该 R2 命令不在首批受控执行器支持面');\n }\n if (!assessment.environment.envAlias) throw invalid('R2 argv 必须显式包含 --env 环境别名');\n if (!assessment.environment.identityAlias) {\n throw invalid('R2 argv 必须显式包含 --as 身份别名');\n }\n validateSupportedCommandShape(assessment.reasonCode, argv);\n}\n\nfunction validateSupportedCommandShape(reasonCode: string, argv: string[]): void {\n if (reasonCode === 'credential-reset') {\n if (argv[0] !== 'user' || argv[1] !== 'reset-password') {\n throw invalid('credential-reset 只支持 user reset-password');\n }\n const userId = optionalFlagValue(argv, '--id');\n const username = optionalFlagValue(argv, '--username');\n if (Boolean(userId) === Boolean(username)) {\n throw invalid('user reset-password 必须且只能包含 --id 或 --username');\n }\n if (!argv.includes('--password-stdin')) {\n throw invalid('user reset-password 必须包含独立的 --password-stdin');\n }\n if (\n argv.some((value) =>\n [\n '--password',\n '--new-password',\n '--client-secret',\n '--pat',\n '--new-password-stdin',\n '--pat-stdin',\n ].includes(value.split('=', 1)[0] ?? ''),\n ) ||\n argv.some((value) => value.startsWith('--password-stdin='))\n ) {\n throw invalid('user reset-password 不允许在 argv 中携带明文凭据');\n }\n return;\n }\n if (reasonCode === 'record-create') {\n requireExactlyOnePayload(argv, 'create');\n return;\n }\n if (reasonCode === 'record-update') {\n requireFlagValue(argv, '--id', 'update 必须包含 --id <id>');\n requireExactlyOnePayload(argv, 'update');\n return;\n }\n if (reasonCode === 'cache-mutation') {\n if (!argv[2] || argv[2].startsWith('-')) throw invalid('cache clear 必须包含 Model');\n return;\n }\n if (reasonCode === 'setting-write') {\n if (!argv[2] || argv[2].startsWith('-')) throw invalid('setting 写命令必须包含 domain');\n if (argv[1] === 'set') {\n requireFlagValue(argv, '--set', 'setting set 必须包含 --set <assignment>');\n return;\n }\n if (argv[1] === 'reset' && (!argv[3] || !argv[4])) {\n throw invalid('setting reset 必须包含 domain、namespace 与 key');\n }\n }\n}\n\nfunction optionalFlagValue(argv: string[], flag: string): string | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const value = argv[index];\n if (value === flag) {\n const next = argv[index + 1];\n return next && !next.startsWith('-') ? next : undefined;\n }\n if (value?.startsWith(`${flag}=`) && value.length > flag.length + 1) {\n return value.slice(flag.length + 1);\n }\n }\n return undefined;\n}\n\n/**\n * 写命令的载荷必须来自 `--data` 或 `--data-file` 之一,恰好一个。\n *\n * 受控路径此前只认内联 `--data`,与 `hcm create/update` 本身和交付 Skill(明写\"复杂配置\n * 用 --data-file\")互相打架:复杂配置根本进不了 guarded 执行,只能被迫塞进一行 shell\n * 字符串或干脆走不通。2026-08-29 顾问仿真实测即卡在这里。\n */\nfunction requireExactlyOnePayload(argv: string[], command: string): void {\n const inline = optionalFlagValue(argv, '--data') !== undefined;\n const fromFile = optionalFlagValue(argv, '--data-file') !== undefined;\n if (inline && fromFile) {\n throw invalid(`${command} 的 --data 与 --data-file 互斥,只能给一个`);\n }\n if (!inline && !fromFile) {\n throw invalid(`${command} 必须包含 --data <JSON> 或 --data-file <文件>`);\n }\n}\n\n/** argv 里所有引用外部载荷的开关;它们的内容必须随计划一起被钉住。 */\nconst PAYLOAD_FILE_FLAGS = ['--data-file', '--params-file'] as const;\n\nasync function bindPayloadFiles(project: string, argv: string[]): Promise<BoundDocument[]> {\n const bound: BoundDocument[] = [];\n for (const flag of PAYLOAD_FILE_FLAGS) {\n const reference = optionalFlagValue(argv, flag);\n if (reference === undefined) continue;\n bound.push(await bindPayloadFile(project, reference, `${flag} 载荷`));\n }\n return bound;\n}\n\nasync function bindPayloadFile(\n project: string,\n reference: string,\n label: string,\n): Promise<BoundDocument> {\n const relative = safeRelative(reference, label);\n const file = path.join(project, relative);\n const bytes = await readSafeFile(project, file, label);\n return { path: relative, sha256: sha256(bytes) };\n}\n\nasync function assertPayloadsUnchanged(\n project: string,\n payloads: BoundDocument[],\n): Promise<void> {\n for (const payload of payloads) {\n const current = await bindPayloadFile(project, payload.path, `载荷 ${payload.path}`);\n if (current.sha256 !== payload.sha256) {\n throw invalid(`载荷文件 ${payload.path} 的内容已变更,请重新 prepare`);\n }\n }\n}\n\nfunction requireFlagValue(argv: string[], flag: string, message: string): string {\n for (let index = 0; index < argv.length; index += 1) {\n const value = argv[index];\n if (value === flag) {\n const next = argv[index + 1];\n if (next && !next.startsWith('-')) return next;\n throw invalid(message);\n }\n if (value?.startsWith(`${flag}=`) && value.length > flag.length + 1) {\n return value.slice(flag.length + 1);\n }\n }\n throw invalid(message);\n}\n\nfunction assertRuntimeMatches(\n actual: DeliveryRuntimeIdentity,\n expected: DeliveryRuntimeIdentity,\n): void {\n if (canonicalJson(actual) !== canonicalJson(expected)) {\n throw invalid('当前 CLI 运行时摘要与 Chiron 锁不一致,请重新 skills sync');\n }\n}\n\nasync function currentRuntimeIdentity(): Promise<DeliveryRuntimeIdentity> {\n const entry = process.argv[1];\n if (!entry) throw invalid('无法解析当前 CLI entry');\n return {\n kind: 'node-entry',\n executableSha256: await sha256File(process.execPath),\n entrySha256: await sha256File(entry),\n };\n}\n\nasync function runCurrentCliCommand(\n argv: string[],\n cwd: string,\n streams: DeliveryStreams,\n): Promise<{ exitCode: number }> {\n const entry = process.argv[1];\n if (!entry) throw invalid('无法解析当前 CLI entry');\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [entry, ...argv], {\n cwd,\n env: process.env,\n shell: false,\n stdio: ['inherit', 'pipe', 'pipe'],\n windowsHide: true,\n });\n child.stdout.on('data', (chunk: Buffer) => {\n streams.stdout(chunk);\n process.stdout.write(chunk);\n });\n child.stderr.on('data', (chunk: Buffer) => {\n streams.stderr(chunk);\n process.stderr.write(chunk);\n });\n child.once('error', reject);\n child.once('close', (code, signal) => resolve({ exitCode: code ?? (signal ? 1 : 0) }));\n });\n}\n\nasync function writeReceiptExclusive(\n target: string,\n receipt: DeliveryExecutionReceipt,\n): Promise<void> {\n const temp = `${target}.${process.pid}.${Date.now()}.tmp`;\n try {\n await fs.writeFile(temp, `${JSON.stringify(receipt, null, 2)}\\n`, {\n encoding: 'utf8',\n mode: 0o600,\n flag: 'wx',\n });\n await fs.link(temp, target);\n } catch (cause) {\n throw invalid(`执行收据写入失败或已存在:${path.basename(target)}`, cause);\n } finally {\n await fs.unlink(temp).catch(() => undefined);\n }\n}\n\nasync function safeManagedDirectory(\n project: string,\n relative: string,\n absolute: string,\n): Promise<void> {\n await assertNoSymlinkComponents(project, path.dirname(relative));\n const existing = await fs.lstat(absolute).catch(() => undefined);\n if (existing?.isSymbolicLink()) throw invalid(`受管目录不能是符号链接:${relative}`);\n if (existing && !existing.isDirectory()) throw invalid(`受管路径不是目录:${relative}`);\n if (!existing) await fs.mkdir(absolute, { mode: 0o700 });\n await fs.chmod(absolute, 0o700);\n}\n\nasync function pathExists(file: string): Promise<boolean> {\n return fs.lstat(file).then(\n () => true,\n (cause: NodeJS.ErrnoException) => {\n if (cause.code === 'ENOENT') return false;\n throw cause;\n },\n );\n}\n\nasync function readSafeFile(project: string, file: string, label: string): Promise<Buffer> {\n const relative = path.relative(project, file).split(path.sep).join('/');\n if (relative.startsWith('../') || path.isAbsolute(relative))\n throw invalid(`${label}路径逃逸项目`);\n await assertNoSymlinkComponents(project, relative);\n let stat;\n try {\n stat = await fs.lstat(file);\n } catch (cause) {\n throw invalid(`${label}不可用:${relative}`, cause);\n }\n if (stat.isSymbolicLink()) throw invalid(`${label}不能是符号链接:${relative}`);\n if (!stat.isFile()) throw invalid(`${label}不是普通文件:${relative}`);\n return fs.readFile(file);\n}\n\nasync function assertNoSymlinkComponents(project: string, relative: string): Promise<void> {\n const parts = relative.split('/').filter(Boolean);\n let current = project;\n for (const part of parts) {\n current = path.join(current, part);\n const stat = await fs.lstat(current).catch(() => undefined);\n if (stat?.isSymbolicLink()) throw invalid(`路径包含符号链接:${relative}`);\n if (!stat) break;\n }\n}\n\nasync function realProject(requested: string): Promise<string> {\n const absolute = path.resolve(requested);\n let project;\n try {\n project = await fs.realpath(absolute);\n } catch (cause) {\n throw invalid(`项目目录不可用:${absolute}`, cause);\n }\n const stat = await fs.stat(project);\n if (!stat.isDirectory()) throw invalid(`项目路径不是目录:${absolute}`);\n return project;\n}\n\nfunction safeRelative(reference: string, label: string): string {\n if (!reference || path.isAbsolute(reference) || /[\\r\\n\\0]/.test(reference)) {\n throw invalid(`${label}必须是项目内相对路径`);\n }\n const normalized = path.normalize(reference).split(path.sep).join('/');\n if (normalized === '..' || normalized.startsWith('../') || normalized === '.') {\n throw invalid(`${label}路径逃逸项目`);\n }\n return normalized.replace(/^\\.\\//, '');\n}\n\nfunction isRuntimeIdentity(value: unknown): value is DeliveryRuntimeIdentity {\n if (!isRecord(value) || !isSha(value.executableSha256)) return false;\n if (value.kind === 'executable') return true;\n return value.kind === 'node-entry' && isSha(value.entrySha256);\n}\n\nfunction isExecutionPlan(value: unknown): value is DeliveryExecutionPlan {\n if (!isRecord(value)) return false;\n return (\n value.schemaVersion === 1 &&\n value.contractVersion === EXECUTION_CONTRACT_VERSION &&\n typeof value.planId === 'string' &&\n PLAN_ID_PATTERN.test(value.planId) &&\n typeof value.createdAt === 'string' &&\n typeof value.expiresAt === 'string' &&\n isSha(value.nonceSha256) &&\n isSha(value.chironLockSha256) &&\n isRuntimeIdentity(value.runtime) &&\n isRecord(value.assessment) &&\n isRecord(value.documents) &&\n isBoundDocument(value.documents.change) &&\n isBoundDocument(value.documents.rollback) &&\n Array.isArray(value.payloads) &&\n value.payloads.every(isBoundDocument) &&\n typeof value.evidenceDir === 'string'\n );\n}\n\nfunction isBoundDocument(value: unknown): value is BoundDocument {\n return isRecord(value) && typeof value.path === 'string' && isSha(value.sha256);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isSha(value: unknown): value is string {\n return typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);\n}\n\nfunction parseTtl(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (!/^\\d+$/.test(value)) throw invalid('--ttl-seconds 必须是整数');\n return Number(value);\n}\n\nfunction canonicalJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`;\n if (isRecord(value)) {\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`)\n .join(',')}}`;\n }\n return JSON.stringify(value) ?? 'null';\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nasync function sha256File(file: string): Promise<string> {\n const hash = createHash('sha256');\n await new Promise<void>((resolve, reject) => {\n const stream = createReadStream(file);\n stream.on('data', (chunk) => hash.update(chunk));\n stream.on('error', reject);\n stream.on('end', resolve);\n });\n return hash.digest('hex');\n}\n\nfunction invalid(message: string, cause?: unknown): CliError {\n return new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message, cause });\n}\n","import {\n HcmClient,\n adminResetPassword,\n formatObject,\n fromAxiosError,\n CliError,\n CliErrorCode,\n type AdminResetPasswordRequest,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\nimport { promptSecret, readSecretFromStdin } from '../utils/prompt';\n\nexport interface UserResetPasswordArgs {\n id?: string;\n username?: string;\n passwordStdin?: boolean;\n forceChange?: boolean;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport function buildAdminResetPasswordRequest(\n args: Pick<UserResetPasswordArgs, 'id' | 'username' | 'forceChange'>,\n password: string,\n): AdminResetPasswordRequest {\n const hasId = Boolean(args.id);\n const hasUsername = Boolean(args.username);\n if (hasId === hasUsername) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--id <uuid> 与 --username <user> 必须且只能提供一个',\n });\n }\n if (!password) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '新密码不能为空',\n });\n }\n return {\n ...(args.id ? { userId: args.id } : {}),\n ...(args.username ? { username: args.username } : {}),\n newPassword: password,\n confirmPassword: password,\n forceChangeOnNextLogin: args.forceChange !== false,\n };\n}\n\nexport async function userResetPasswordCommand(args: UserResetPasswordArgs): Promise<void> {\n try {\n const password = args.passwordStdin ? await readSecretFromStdin() : await promptPasswordTwice();\n const request = buildAdminResetPasswordRequest(args, password);\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await adminResetPassword(client.raw(), request);\n process.stdout.write(formatObject(result, { format: args.output ?? 'json' }) + '\\n');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = cause as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(cause);\n }\n}\n\nasync function promptPasswordTwice(): Promise<string> {\n const password = await promptSecret('新密码: ');\n const confirmation = await promptSecret('再次输入新密码: ');\n if (password !== confirmation) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '两次输入的新密码不一致',\n });\n }\n return password;\n}\n","/** 帮助、版本和纯本地 delivery 合同不读取身份配置,不应为历史 profile 迁移付启动成本。 */\nexport function needsLegacyProfileMigration(argv: string[]): boolean {\n const args = argv.slice(2);\n if (args[0] === 'delivery') return false;\n return !args.some((arg) => ['--help', '-h', '--version', '-V'].includes(arg));\n}\n"],"mappings":"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","names":["axios","loadGlobalConfig","loadEnv","loadIdentity","listEnvs","CliError","CliErrorCode","fs","path","meta","marked","markedTerminal","absoluteDownloadUrl","Box","Text","jsx","jsxs","lines","row","col","useEffect","useRef","useState","fs","Box","Text","useInput","marked","jsx","jsxs","result","meta","identity","path","React","HcmClient","DEFAULT_AGENT_ID","client","ans","readline","resolve","CliError","resolve","CliError","env","endpoint","fromAxiosError","meta","loadGlobalConfig","saveGlobalConfig","CliError","CliErrorCode","axios","loadEnv","saveEnv","loadGlobalConfig","saveGlobalConfig","loadIdentity","TokenStore","CliError","CliErrorCode","loadGlobalConfig","loadEnv","CliError","CliErrorCode","saveEnv","saveGlobalConfig","axios","loadIdentity","failed","TokenStore","CliError","CliErrorCode","loadGlobalConfig","saveGlobalConfig","CliError","CliErrorCode","client","result","HcmClient","fromAxiosError","CliError","CliErrorCode","CliError","CliErrorCode","CliError","CliErrorCode","client","HcmClient","result","fromAxiosError","HcmClient","formatObject","fromAxiosError","client","HcmClient","formatObject","fromAxiosError","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","CliError","CliErrorCode","client","HcmClient","result","formatObject","fromAxiosError","HcmClient","formatObject","formatRows","fromAxiosError","CliError","CliErrorCode","HcmClient","fromAxiosError","formatRows","formatObject","CliError","CliErrorCode","result","formatObject","fromAxiosError","loadEnv","loadGlobalConfig","resolveActiveEnv","CliError","CliErrorCode","env","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","client","readFileSync","HcmClient","formatObject","fromAxiosError","path","client","result","HcmClient","formatObject","fromAxiosError","client","HcmClient","WsClient","sendMessageAndStream","createConversation","DEFAULT_AGENT_ID","saveConversationState","formatObject","formatRows","fetchConversationTimeline","CliError","CliErrorCode","parseInteractionRequest","parseInteractionResolved","buildConfirm","buildReject","buildAnswer","chalk","fs","fail","client","result","runInkRepl","StreamPresenter","TerminalRenderer","buildResumeSummary","uploadDocument","meta","extractInlineFilePaths","resolveInteraction","resolve","readLineFromStdin","r","HcmClient","client","HcmClient","formatObject","formatRows","fromAxiosError","parsePositiveInt","client","HcmClient","formatObject","fromAxiosError","client","result","fail","HcmClient","formatObject","fromAxiosError","uploadDocument","client","meta","fsp","os","path","createHash","createHttpClient","assertSafeSkillId","assertSafeReferencePath","normalizeReferences","parseSkillRequirements","parseSkillFrontmatter","resolveSkillInstallOrder","formatObject","fromAxiosError","loadEnv","loadGlobalConfig","resolveActiveEnv","CliError","CliErrorCode","CliError","CliErrorCode","path","CliError","CliErrorCode","readFileSync","readdirSync","statSync","path","formatObject","readdirSync","statSync","readFileSync","manifest","formatObject","CliError","CliErrorCode","relative","createHash","fs","path","CliError","CliErrorCode","markdown","sha256","stableJson","preparedFile","createHash","fs","path","CliError","CliErrorCode","invalid","forbidden","sha256","result","env","resolve","skills","sha256","createHash","loadGlobalConfig","resolveActiveEnv","env","loadEnv","CliError","CliErrorCode","normalizeEndpoint","invalid","exists","fsp","path","os","createHttpClient","fail","fromAxiosError","manifest","client","formatObject","parseSkillFrontmatter","assertSafeSkillId","result","resolveSkillInstallOrder","normalizeReferences","relative","parseSkillRequirements","meta","assertSafeReferencePath","createHttpClient","formatObject","fromAxiosError","loadEnv","loadGlobalConfig","resolveActiveEnv","CliError","CliErrorCode","CliError","CliErrorCode","resolveEndpoint","loadGlobalConfig","resolveActiveEnv","env","loadEnv","createHttpClient","result","formatObject","fromAxiosError","fsp","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","client","HcmClient","fail","fromAxiosError","formatObject","path","CliError","CliErrorCode","resolve","fsp","result","fs","path","formatObject","formatRows","HcmClient","fromAxiosError","client","HcmClient","parsePositiveInt","result","formatObject","formatRows","sha256","manifest","flagName","fromAxiosError","loadEnv","saveEnv","loadIdentity","listIdentities","deleteIdentity","loadGlobalConfig","TokenStore","CliError","CliErrorCode","meta","env","HcmClient","formatObject","createHash","sha256","formatObject","HcmClient","action","flagValue","HcmClient","formatObject","fromAxiosError","render","client","identity","HcmClient","formatObject","fromAxiosError","httpProbe","DEFAULT_CAPABILITIES","client","result","createHash","createReadStream","fs","path","CliError","CliErrorCode","formatObject","invalid","sha256","path","fs","createHash","formatObject","relative","sha256File","resolve","createReadStream","CliError","CliErrorCode","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","CliError","CliErrorCode","client","HcmClient","result","formatObject","fromAxiosError"]}
1
+ {"version":3,"sources":["../src/utils/exit.ts","../src/middleware/auth-guard.ts","../src/utils/attachment-args.ts","../src/utils/slash.ts","../src/streaming/TerminalRenderer.ts","../src/streaming/StreamPresenter.ts","../src/repl/InkRendererBridge.ts","../src/repl/BlockView.tsx","../src/repl/MultilineInput.tsx","../src/repl/types.ts","../src/repl/App.tsx","../src/repl/run.ts","../src/streaming/control-prompt.ts","../src/io/readline.ts","../src/index.ts","../src/package-version.ts","../src/commands/login.ts","../src/utils/prompt.ts","../src/commands/config.ts","../src/commands/env.ts","../src/utils/table.ts","../src/commands/query.ts","../src/commands/action.ts","../src/utils/json-input.ts","../src/commands/create.ts","../src/commands/update.ts","../src/commands/setting.ts","../src/commands/version.ts","../src/commands/delete.ts","../src/commands/import.ts","../src/commands/describe.ts","../src/commands/chat.ts","../src/commands/download.ts","../src/commands/trace.ts","../src/commands/cache.ts","../src/commands/upload.ts","../src/commands/skills.ts","../src/commands/skills-catalog.ts","../src/commands/skills-bundled.ts","../src/commands/skills-manifest.ts","../src/commands/skills-sync.ts","../src/commands/skills-runtime.ts","../src/commands/tenant.ts","../src/commands/meta.ts","../src/commands/workspace.ts","../src/commands/workspace-format.ts","../src/commands/identity.ts","../src/commands/delivery-action-policy.ts","../src/commands/delivery.ts","../src/commands/delivery-doctor.ts","../src/commands/delivery-recon.ts","../src/commands/delivery-gate0.ts","../src/commands/delivery-execution.ts","../src/commands/user.ts","../src/startup.ts"],"sourcesContent":["import { CliError } from '@hcmai/sdk';\n\nexport function exitWithError(err: unknown): never {\n if (err instanceof CliError) {\n process.stderr.write(`Error: ${err.toFormattedString()}\\n`);\n process.exit(err.exitCode);\n }\n if (err instanceof Error) {\n process.stderr.write(`Error: ${err.message}\\n`);\n process.exit(1);\n }\n process.stderr.write(`Error: ${String(err)}\\n`);\n process.exit(1);\n}\n\nexport function exitOk(stdout?: string): never {\n if (stdout) process.stdout.write(stdout + '\\n');\n process.exit(0);\n}\n","import axios from 'axios';\nimport {\n ensureSessionFresh,\n loadGlobalConfig,\n loadEnv,\n loadIdentity,\n resolveActiveEnv,\n resolveActiveIdentity,\n listEnvs,\n CliError,\n CliErrorCode,\n type ClientAuthContext,\n} from '@hcmai/sdk';\n\nexport interface AuthContext {\n env: string;\n endpoint: string;\n tenantId: string;\n identity: string;\n}\n\n/**\n * Resolve the active auth context for a business command.\n *\n * Priority for env: `args.envFlag > HCM_ENV > HCM_PROFILE > global.activeEnv`.\n * Priority for identity: `args.asFlag > HCM_IDENTITY > env.defaultIdentity > first identity in env`.\n *\n * Throws CliError:\n * - NO_ACTIVE_ENV when no env is configured on disk\n * - IDENTITY_NOT_FOUND when env has no identity (via resolveActiveIdentity)\n * - TOKEN_EXPIRED when identity.expiresAt < now\n *\n * 🔴 判过期**之前**先尝试续期。原因是本地的 `expiresAt` 只是服务端状态的一份缓存:\n * 后端 `TokenAuthenticationFilter` 在每个带 token 的请求上都会滑动续期,而这份缓存\n * 是登录那一刻算死的、之后再没更新过 —— 直接拿它判,就是**用一个早就过时的本地值\n * 去拒绝服务端明明还认的 token**。`ensureSessionFresh` 打一次无条件续期端点并把结果\n * 写回本地,让这个判断重新变成真的。它 best-effort,不抛。\n */\nexport async function ensureActiveAuth(args: {\n envFlag?: string;\n asFlag?: string;\n}): Promise<AuthContext> {\n const g = await loadGlobalConfig();\n const envName = resolveActiveEnv({ envFlag: args.envFlag }, process.env, g);\n\n // verify env exists on disk (handles fresh install where activeEnv='default' has no file)\n const envs = await listEnvs();\n if (!envs.includes(envName)) {\n throw new CliError({\n code: CliErrorCode.NO_ACTIVE_ENV,\n message: `no env configured. Run: hcm env add <name> --endpoint <url> && hcm login --env <name>`,\n });\n }\n\n const envCfg = await loadEnv(envName);\n const identityName = await resolveActiveIdentity(\n { asFlag: args.asFlag },\n process.env,\n envName,\n );\n let idMeta = await loadIdentity(identityName);\n\n // 续上会话再判过期。续期成功会改写同一份 meta,所以要重读。\n const slid = await ensureSessionFresh({\n endpoint: envCfg.endpoint,\n identity: identityName,\n httpClient: axios.create({ baseURL: envCfg.endpoint, timeout: 30_000 }),\n });\n if (slid) idMeta = await loadIdentity(identityName);\n\n if (idMeta.expiresAt && new Date(idMeta.expiresAt) < new Date()) {\n throw new CliError({\n code: CliErrorCode.TOKEN_EXPIRED,\n message: `identity '${identityName}' token expired. Run: hcm login --env ${envName}`,\n });\n }\n\n return {\n env: envName,\n endpoint: envCfg.endpoint,\n // 服务端认定的租户优先。`envCfg.tenantId` 是登录前的入参,它的缺省 `'1'` 是个\n // 猜测——ADR-177 之后新租户是 UUID,那个猜测几乎必然错。\n tenantId: idMeta.tenantId ?? envCfg.tenantId ?? '1',\n identity: identityName,\n };\n}\n\n/**\n * CLI sugar around `ensureActiveAuth` for business commands (T15).\n *\n * - Transpiles deprecated `--profile <name>` to `--env <name>` (one-time stderr warn)\n * - Forwards `--env` and `--as` flags to `ensureActiveAuth`\n * - Returns a `ClientAuthContext` ready for `HcmClient.fromAuthContext(ctx)`\n *\n * Use this in every business command (`query` / `action` / `describe` / `chat`\n * / `trace` / `workspace*`) so the env/identity resolution + deprecated flag\n * handling lives in one place.\n */\nexport async function getActiveAuthContextFromCli(\n args: {\n env?: string;\n /** @deprecated 用 --env 替代 — transpiled here with a stderr warning */\n profile?: string;\n as?: string;\n },\n /**\n * Optional fallback when neither flag nor env-var resolves an env. Used by\n * workspace commands that fall back to the bound env stored in the local\n * hcm.workspace.json. Kept as a separate arg (not args.env) so the\n * `--profile` transpile warning still fires independently.\n */\n opts?: { fallbackEnv?: string },\n): Promise<ClientAuthContext> {\n let envFlag = args.env;\n if (args.profile && !envFlag) {\n process.stderr.write(\n '[hcm] event=deprecated_flag flag=--profile replacement=--env\\n',\n );\n envFlag = args.profile;\n }\n if (!envFlag && opts?.fallbackEnv) envFlag = opts.fallbackEnv;\n const ctx = await ensureActiveAuth({ envFlag, asFlag: args.as });\n return ctx;\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * `@路径` 内联附件解析(issue #64 · 对标 Claude Code 的 @ mention 交互手势)。\n *\n * 从消息文本提取 `@` 前缀且指向存在本地文件的 token,返回清理后的文本与路径列表。\n * 支持 `~` 展开与引号包裹的含空格路径(`@\"my file.pdf\"`)。`@` 后不是存在文件的\n * token(如 @某人 称呼)原样保留——存在性检查即歧义消解。\n */\nexport function extractAtFileTokens(text: string): { cleaned: string; paths: string[] } {\n const paths: string[] = [];\n // @\"quoted path\" | @'quoted path' | @bare-token(到空白为止)\n const re = /@(?:\"([^\"]+)\"|'([^']+)'|(\\S+))/g;\n const cleaned = text\n .replace(re, (match, dq: string | undefined, sq: string | undefined, bare: string | undefined) => {\n const candidate = dq ?? sq ?? bare ?? '';\n const abs = expandHome(candidate);\n if (isExistingFile(abs)) {\n paths.push(abs);\n return '';\n }\n return match;\n })\n .replace(/[ \\t]{2,}/g, ' ')\n .trim();\n return { cleaned, paths };\n}\n\n/**\n * 行内「裸绝对路径」内联附件解析(无 `@` 前缀、与正文同行)。\n *\n * 补 {@link extractAtFileTokens}(要 `@` 前缀)与 {@link isBareFilePath}(要整行就一个路径)\n * 之间的缺口:终端粘贴图片/剪贴板自动插入的绝对路径常是「`/var/folders/.../clipboard-x.png`\n * 给某人换头像」这种「路径 + 同行文字、无 `@`」形态——旧两检测器都接不住,裸路径漏进消息\n * 文本 → 传给 LLM 当散文 → 幻觉成别的路径(实测 bug)。这里识别 `/` 或 `~/` 开头的 token\n * (含引号包裹的含空格绝对路径),**存在性检查消歧**:只有真指向本地文件的才当附件剥离,\n * 普通含「/」的文字(`他/她`、日期 `2026/06/13`、URL path)因不存在对应文件而原样保留。\n */\nexport function extractInlineFilePaths(text: string): { cleaned: string; paths: string[] } {\n const paths: string[] = [];\n // \"abs path\" | 'abs path' | 裸 abs token(到空白为止);三支都要求以 / 或 ~/ 开头。\n const re = /\"((?:\\/|~\\/)[^\"]+)\"|'((?:\\/|~\\/)[^']+)'|((?:\\/|~\\/)\\S+)/g;\n const cleaned = text\n .replace(re, (match, dq: string | undefined, sq: string | undefined, bare: string | undefined) => {\n const candidate = dq ?? sq ?? bare ?? '';\n const abs = expandHome(candidate);\n if (isExistingFile(abs)) {\n paths.push(abs);\n return '';\n }\n return match;\n })\n .replace(/[ \\t]{2,}/g, ' ')\n .trim();\n return { cleaned, paths };\n}\n\n/** 整条消息恰为一个存在的文件路径(粘贴路径场景,D4 一期)。 */\nexport function isBareFilePath(text: string): string | null {\n const t = text.trim().replace(/^[\"']|[\"']$/g, '');\n if (!t || t.includes('\\n')) return null;\n const abs = expandHome(t);\n return isExistingFile(abs) ? abs : null;\n}\n\nfunction expandHome(p: string): string {\n return p.startsWith('~') ? path.join(os.homedir(), p.slice(1)) : path.resolve(p);\n}\n\nfunction isExistingFile(p: string): boolean {\n try {\n return fs.statSync(p).isFile();\n } catch {\n return false;\n }\n}\n","export interface SlashCommand {\n name: string;\n args: string[];\n}\n\nexport function parseSlash(line: string): SlashCommand | null {\n if (!line.startsWith('/')) return null;\n const parts = line.slice(1).trim().split(/\\s+/);\n return { name: parts[0]!, args: parts.slice(1) };\n}\n\n/** REPL 输入区的 slash 命令补全候选。 */\nexport interface SlashCommandSpec {\n cmd: string;\n desc: string;\n /** 命令带参数(如 /attach <路径>):回车/Tab 只补全命令名并留空格,不立即提交。 */\n takesArgs?: boolean;\n}\n\n/** 输入框可补全的 slash 命令目录(顺序即菜单展示顺序)。 */\nexport const SLASH_COMMANDS: SlashCommandSpec[] = [\n { cmd: '/new', desc: '开新会话' },\n { cmd: '/attach', desc: '添加附件', takesArgs: true },\n { cmd: '/send', desc: '发送当前草稿' },\n { cmd: '/help', desc: '帮助' },\n { cmd: '/exit', desc: '退出' },\n];\n\n/** 输入是否处于「正在敲 slash 命令名」状态(/ 开头、尚未出现空格进入参数区)。 */\nexport function isSlashTyping(input: string): boolean {\n return input.startsWith('/') && !input.includes(' ') && !input.includes('\\n');\n}\n\n/** 按前缀过滤候选命令;非「敲命令名」状态返回空数组(菜单关闭)。 */\nexport function filterSlashCommands(\n input: string,\n commands: SlashCommandSpec[] = SLASH_COMMANDS,\n): SlashCommandSpec[] {\n if (!isSlashTyping(input)) return [];\n return commands.filter((c) => c.cmd.startsWith(input));\n}\n\n/** 菜单候选索引归一(支持负数 / 越界回绕)。 */\nexport function wrapIndex(index: number, length: number): number {\n if (length <= 0) return 0;\n return ((index % length) + length) % length;\n}\n\n/** slash 菜单打开时一次按键的归宿(纯函数,便于测试)。 */\nexport type SlashKeyAction =\n | { type: 'move'; delta: number }\n | { type: 'complete'; text: string } // 补全到输入框,不提交(带参命令 / Tab)\n | { type: 'execute'; text: string } // 补全并立即提交(无参命令回车)\n | { type: 'none' };\n\n/** 把按键 + 当前选中项映射为菜单动作;不识别的键返回 none(交还输入框默认行为)。 */\nexport function resolveSlashKey(\n key: { upArrow?: boolean; downArrow?: boolean; tab?: boolean; return?: boolean },\n selected: SlashCommandSpec | undefined,\n): SlashKeyAction {\n if (key.upArrow) return { type: 'move', delta: -1 };\n if (key.downArrow) return { type: 'move', delta: 1 };\n if (!selected) return { type: 'none' };\n if (key.tab) return { type: 'complete', text: selected.cmd + (selected.takesArgs ? ' ' : '') };\n if (key.return) {\n return selected.takesArgs\n ? { type: 'complete', text: selected.cmd + ' ' }\n : { type: 'execute', text: selected.cmd };\n }\n return { type: 'none' };\n}\n","import chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport { marked } from 'marked';\n// marked-terminal v7: 用 named export markedTerminal() 返回 marked extension\nimport { markedTerminal } from 'marked-terminal';\nimport { absoluteDownloadUrl, type InteractionRequest, type ResumeSummary } from '@hcmai/sdk';\n\n/**\n * OSC 8 终端超链接:把 text 标记为指向 url 的可点链接。链接是字符单元的属性,\n * **跨行不失效**——绕开终端对「软/硬换行的长 URL」不自动识别(点不动)的坑。\n * Ghostty / iTerm2 / WezTerm / kitty / VS Code 终端均支持;不支持的终端降级为纯 text。\n */\nexport function terminalHyperlink(url: string, text: string): string {\n return `\u001b]8;;${url}\u0007${text}\u001b]8;;\u0007`;\n}\n\n/** 终端可读行宽:管道/CI 无 columns 时 80;超宽终端钳到 120 保持行长可读。 */\nfunction termWidth(): number {\n const c = process.stdout.columns;\n return c && c > 40 ? Math.min(c, 120) : 80;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nmarked.use(markedTerminal({ width: termWidth() }) as any);\n\nexport interface TerminalRendererOptions {\n markdown: boolean;\n showThinking: boolean;\n /** verbose 时展开 thinking content; 默认 false → 仅单行总结 (类似 web \"✓ 推理完成 Xs\") */\n verboseThinking?: boolean;\n showToolCalls: boolean;\n /** verbose 时显示 tool args; 默认 false → 仅显示 tool name + 状态 */\n verboseTools?: boolean;\n spinner: boolean;\n color: boolean;\n /** 可注入 writer(测试捕获输出用);缺省走 process.stdout.write */\n sink?: (s: string) => void;\n /** 后端地址(HcmClient.endpoint),用于把相对下载链接拼成可点的绝对签名 URL(ADR-140)。 */\n apiBase?: string;\n}\n\n/** 已知 agent 中文显示名映射, 跟 web 端 AGENT_PALETTES 对齐. agentKey 未知时 fallback 用 raw key. */\nconst AGENT_NAMES: Record<string, string> = {\n moirai: 'Moirai',\n analyst: '数据分析专家',\n hr: 'HR 专家',\n reporter: '报表专家',\n trans_mgr: '调动管理员',\n recruiter: '招聘专家',\n talent_dev: '人才发展专家',\n meta_config: '元数据配置专家',\n alert_mgr: '监控专家',\n flow_mgr: '流程专家',\n knowledge: '知识库专家',\n exporter: '导出专家',\n comp: '薪酬专家',\n 'comp-analyst': '薪酬分析专家',\n notifier: '通知专家',\n troubleshooter: '排障专家',\n};\n\n/** agent 显示名(presenter 拼 spinner 委派摘要时也用)。 */\nexport function agentDisplayName(agentKey: string): string {\n return AGENT_NAMES[agentKey] ?? agentKey;\n}\n\n/** ask 卡 choice 文案:string 直用;对象取 label/value/text 字段兜底 JSON 化。 */\nfunction choiceLabel(c: unknown): string {\n if (typeof c === 'string') return c;\n if (c && typeof c === 'object') {\n const o = c as Record<string, unknown>;\n const v = o.label ?? o.value ?? o.text;\n if (typeof v === 'string') return v;\n try { return JSON.stringify(c); } catch { /* fallthrough */ }\n }\n return String(c);\n}\n\n/** G6 · 终态行额外统计(in/out token 分解 + 工具/委派计数)。全为可选,0 值省略。 */\nexport interface CompletionLineStats {\n inputTokens?: number;\n outputTokens?: number;\n toolCount?: number;\n delegationCount?: number;\n}\n\nexport class TerminalRenderer {\n private spinner: Ora | null = null;\n private chatBuffer: string = '';\n private thinkingActive = false;\n private thinkingBuffer = '';\n private thinkingStartMs = 0;\n private depth = 0;\n /**\n * 行首状态机:所有输出统一经 write() 跟踪末字符。块级输出(工具行/委派/卡片/终态)\n * 前必过 blockBoundary()——2026-06-11 实测的「正文与工具行黏连/缩进忽 2 忽 4/孤儿 ✓ 行」\n * 三类乱象共同根因就是各方法独立 write、互不知道光标在不在行首。\n */\n private atLineStart = true;\n\n constructor(private readonly opts: TerminalRendererOptions) {\n if (!opts.color) {\n // chalk v5 不可关 level via assign; 用 ChalkInstance level=0 处理\n // 全局降级\n chalk.level = 0;\n }\n }\n\n private write(text: string): void {\n if (!text) return;\n (this.opts.sink ?? ((s: string) => { process.stdout.write(s); }))(text);\n this.atLineStart = text.endsWith('\\n');\n }\n\n private indent(): string {\n return ' '.repeat(this.depth);\n }\n\n /** 光标不在行首时补换行。 */\n private ensureLineStart(): void {\n if (!this.atLineStart) this.write('\\n');\n }\n\n /** 块级输出统一前置:停 spinner → 渲染收口累积正文 → 确保行首。 */\n private blockBoundary(): void {\n this.stopSpinner();\n this.flushChatBuffer();\n this.ensureLineStart();\n }\n\n /**\n * 流式正文 chunk。\n *\n * markdown 开(TTY 默认):段落级流式渲染——chunk 累积进 chatBuffer,每攒满一个完整\n * 段落(`\\n\\n` 边界、且 code fence 已闭合)立即过 marked 渲染输出,未完段留 buffer。\n * 修复 2026-06-11 实测灾难:旧实现全程只累积、终态才一次性渲染,62s 任务正文零流式。\n *\n * markdown 关(管道/--no-markdown):逐 chunk 直写。行首缩进由「当前在行首 + depth>0」\n * 单点决定,chunk 尾换行不再预挂缩进(旧实现残留 2 空格是缩进忽 2 忽 4 的根因)。\n */\n writeChatChunk(text: string): void {\n this.stopSpinner();\n this.chatBuffer += text;\n if (this.opts.markdown) {\n this.flushCompleteParagraphs();\n return;\n }\n let out = text.replace(/\\n(?!$)/g, '\\n' + this.indent());\n if (this.atLineStart && this.depth > 0) out = this.indent() + out;\n this.write(out);\n }\n\n /**\n * 把 chatBuffer 中已完整的段落渲染输出;半截 code fence(``` 计数为奇)推迟到闭合。\n * fence 判定按 CommonMark:行首 0-3 空格 + ```(不用 \\s*——它会吃换行,把行内三反引号\n * 误计入奇偶,致段落被误判未闭合而退化回「憋到终态」;2026-06-11 review I3)。\n */\n private flushCompleteParagraphs(): void {\n const idx = this.chatBuffer.lastIndexOf('\\n\\n');\n if (idx < 0) return;\n const head = this.chatBuffer.slice(0, idx + 2);\n const fences = (head.match(/(?:^|\\n) {0,3}```/g) ?? []).length;\n if (fences % 2 === 1) return;\n this.chatBuffer = this.chatBuffer.slice(idx + 2);\n this.renderMarkdown(head);\n }\n\n /** 渲染一段 markdown 并按 depth 缩进输出,段尾统一单空行(对齐 Claude Code 段间距)。 */\n private renderMarkdown(text: string): void {\n const src = text.replace(/\\n+$/, '');\n if (!src.trim()) return;\n const rendered = (marked.parse(src) as string).replace(/\\n+$/, '');\n if (!rendered) return;\n this.ensureLineStart();\n const indented = this.depth > 0\n ? this.indent() + rendered.replace(/\\n/g, '\\n' + this.indent())\n : rendered;\n this.write(indented + '\\n\\n');\n }\n\n /** 渲染收口累积正文(终态/块级边界时调)。markdown 关时正文已直写,仅校正行首。 */\n flushChatBuffer(): void {\n if (this.opts.markdown) {\n const rest = this.chatBuffer;\n this.chatBuffer = '';\n this.renderMarkdown(rest);\n } else {\n this.chatBuffer = '';\n this.ensureLineStart();\n }\n }\n\n startSpinner(text: string): void {\n if (!this.opts.spinner) return;\n if (this.spinner) {\n // 已在转:仅换文案,避免 stop/start 闪烁。\n this.spinner.text = chalk.gray(text);\n return;\n }\n // spinner 永远独占一行:半行正文上直接 start 会被 ora 的 clearLine 抹掉。\n this.ensureLineStart();\n // discardStdin 必须关(2026-06-12 REPL 第二轮挂死 RCA):ora 默认接管并丢弃 stdin,\n // 与 REPL 的 readline 同 stdin 共存时,多次 start/stop 会破坏 readline 的行事件\n // 监听——第二轮输入回显正常但 line 事件永不触发(无 spinner 无 Error 纯空白挂死)。\n this.spinner = ora({ text: chalk.gray(text), discardStdin: false }).start();\n }\n\n updateSpinner(text: string): void {\n if (this.spinner) this.spinner.text = chalk.gray(text);\n }\n\n stopSpinner(): void {\n if (this.spinner) {\n this.spinner.stop();\n this.spinner = null;\n // ora.stop() 清掉 spinner 行并把光标归位行首。\n this.atLineStart = true;\n }\n }\n\n /**\n * thinking 流。默认折叠:累积字符数,endThinking 时单行总结「✓ 推理完成 (Xs · N chars)」。\n * 首 chunk 自动起算(旧实现靠零调用的 showThinkingHeader 置位 thinkingActive,\n * 导致总结行从未显示过——2026-06-11 审计钉出的死配置)。\n */\n writeThinkingChunk(text: string): void {\n if (!this.opts.showThinking) return;\n if (!this.thinkingActive) {\n this.thinkingActive = true;\n this.thinkingBuffer = '';\n this.thinkingStartMs = Date.now();\n if (this.opts.verboseThinking) {\n this.blockBoundary();\n this.write(chalk.gray.italic('💭 thinking…\\n'));\n }\n }\n this.thinkingBuffer += text;\n if (this.opts.verboseThinking) {\n this.write(chalk.gray.italic(text));\n }\n }\n\n endThinking(): void {\n if (!this.opts.showThinking || !this.thinkingActive) return;\n const elapsedSec = Math.max(0, (Date.now() - this.thinkingStartMs) / 1000);\n const chars = this.thinkingBuffer.length;\n this.ensureLineStart();\n if (this.opts.verboseThinking) {\n this.write(chalk.gray('─'.repeat(40)) + '\\n');\n } else if (chars > 0) {\n this.write(chalk.gray(`✓ 推理完成 (${elapsedSec.toFixed(1)}s · ${chars} chars)\\n`));\n }\n this.thinkingActive = false;\n this.thinkingBuffer = '';\n }\n\n showInterrupted(reason: string): void {\n this.blockBoundary();\n this.write(chalk.yellow(`^C 已中断 (${reason})\\n`));\n }\n\n /**\n * 用户纠偏被注入的确认行(W1a-2,对齐 Web SteeringRow「↪ 纠偏」风格):\n * steer 命令发出后此前终端零确认,用户不知道纠偏有没有被采纳。\n * 仅后端真正注入(steering.applied 事件)时显示——不在发送时乐观显示。\n */\n steeringLine(contents: string[]): void {\n this.blockBoundary();\n for (const text of contents) {\n this.write(this.indent() + chalk.blue('↪ 纠偏 ') + chalk.gray(text) + '\\n');\n }\n }\n\n /**\n * 续会话上下文回顾(刀⑤,对标 Claude Code resume):续接已有 conversation 时\n * 在新输出前回显「续接提示行 + 最近 N 轮摘要」,让用户知道聊到哪了。\n * 整块 dim 弱化——它是背景回顾,不能比正文抢眼。\n */\n showResumeContext(summary: ResumeSummary): void {\n this.ensureLineStart();\n const shortId = summary.conversationId.length > 12\n ? '…' + summary.conversationId.slice(-12)\n : summary.conversationId;\n const shownRounds = summary.recent.filter((t) => t.role === 'user').length;\n const earlier = summary.totalRounds - shownRounds;\n const earlierNote = earlier > 0 ? `,更早 ${earlier} 轮略` : '';\n this.write(chalk.dim(`↻ 续接会话 ${shortId}(共 ${summary.totalRounds} 轮${earlierNote};不带 --resume 将开新会话)`) + '\\n');\n for (const turn of summary.recent) {\n if (turn.role === 'user') {\n this.write(chalk.dim(` > ${turn.text}`) + '\\n');\n } else {\n this.write(chalk.dim(` ${turn.text}`) + '\\n');\n }\n }\n this.write('\\n');\n }\n\n /**\n * 流结束完成行。G6 · 对标 Claude Code 终态行——单行紧凑 dim,信息密度拉满:\n * 耗时 · token(总量带 in/out 分解)· 工具调用数 · 委派数 · traceId · conversationId。\n * 0 值的可选段(in/out、工具、委派)省略,保持紧凑不堆砌。\n */\n showCompleted(\n durMs: number,\n traceId: string | null,\n conversationId: string,\n totalTokens?: number,\n stats?: CompletionLineStats,\n ): void {\n this.blockBoundary();\n const segs: string[] = [`${durMs}ms`];\n\n // token:总量 + in/out 分解(in/out 任一 > 0 才展开括号)。\n if (totalTokens) {\n const inTok = stats?.inputTokens ?? 0;\n const outTok = stats?.outputTokens ?? 0;\n const split = inTok > 0 || outTok > 0 ? ` (↑${inTok}/↓${outTok})` : '';\n segs.push(`${totalTokens} tok${split}`);\n }\n // 工具调用数 / 委派数(> 0 才出)。\n if (stats?.toolCount) segs.push(`${stats.toolCount} 工具`);\n if (stats?.delegationCount) segs.push(`${stats.delegationCount} 委派`);\n\n segs.push(`traceId ${traceId ?? '?'}`);\n segs.push(`conversation ${conversationId}`);\n this.write(chalk.dim(`\\n✓ done (${segs.join(' · ')})\\n`));\n }\n\n /**\n * v4 委派开始(折叠模式):单行「⏺ 委派 → 名」即收,子流过程不平铺——活动状态由\n * presenter 驱动 spinner 动态摘要(「⎿ 名 · …」),结束由 delegationEnd 统计收口。\n * 修复 2026-06-11 实测:子代理全程独白 + 最终表格平铺重复输出(Claude Code 对标:\n * 子 Task 折叠为单行摘要 + 工具计数)。\n */\n delegationStart(agentKey: string, _callId: string): void {\n this.blockBoundary();\n this.write(this.indent() + chalk.blue(`⏺ 委派 → ${agentDisplayName(agentKey)}`) + '\\n');\n this.depth += 1;\n }\n\n /**\n * v4 委派收口:「⎿ 完成 (N 工具 · X.Xs)」;有失败工具时一并标出。\n * success=false(委派整体失败)→ 红色「⎿ 委派失败」+ ADR-058 next_step 路标——\n * 失败委派绝不打绿勾(2026-06-11 review C1:旧版收口无 success 态,失败静默显成功)。\n */\n delegationEnd(\n _callId: string,\n durMs?: number,\n toolCount?: number,\n failCount?: number,\n success: boolean = true,\n nextSteps?: string[],\n ): void {\n this.blockBoundary();\n const segs: string[] = [];\n if (toolCount) segs.push(`${toolCount} 工具${failCount ? `,${failCount} 失败` : ''}`);\n if (durMs) segs.push(`${(durMs / 1000).toFixed(1)}s`);\n const detail = segs.length > 0 ? ` (${segs.join(' · ')})` : '';\n if (success) {\n this.write(this.indent() + chalk.gray(`⎿ 完成${detail}`) + '\\n');\n } else {\n this.write(this.indent() + chalk.red(`⎿ ✗ 委派失败${detail}`) + '\\n');\n if (nextSteps && nextSteps.length > 0) this.writeNextSteps(nextSteps);\n }\n this.depth = Math.max(0, this.depth - 1);\n }\n\n /**\n * v4 工具行(整行原子输出):tool.result 到达时一次打印「⚙ name preview ✓ 12ms」。\n * 旧「tool() 打半行 + toolResult() 追加状态」模型已删——并行工具/正文 chunk 交错会把\n * 追加的 ✓/✗ 挤成孤儿行(2026-06-11 实测「✓ 0ms」孤儿)。执行中可见性由 spinner 文案承担。\n *\n * G5 · 失败时透出 ADR-058 `next_step` 路标(逐行 dim),用户看到下一步指引而非只一个 ✗。\n */\n toolLine(name: string, argsPreview: string, success: boolean, durMs: number, nextSteps?: string[]): void {\n this.blockBoundary();\n const status = success ? chalk.green('✓') : chalk.red('✗');\n const preview = argsPreview ? chalk.gray(` ${argsPreview}`) : '';\n this.write(this.indent() + chalk.cyan(`⚙ ${name}`) + preview + ' ' + status + chalk.gray(` ${durMs}ms`) + '\\n');\n if (!success && nextSteps && nextSteps.length > 0) {\n this.writeNextSteps(nextSteps);\n }\n }\n\n /** G5 · next_step 路标块:dim「↳ 下一步」标题 + 逐条缩进列表(对齐工具行缩进)。 */\n private writeNextSteps(steps: string[]): void {\n const pad = this.indent() + ' ';\n this.write(pad + chalk.dim('↳ 下一步:') + '\\n');\n for (const s of steps) {\n this.write(pad + chalk.dim(` • ${s}`) + '\\n');\n }\n }\n\n /** 来源行(仅子代理触发,agentPath ≥2 段时显示 `↑ 来自 a › b`,对齐 Web)。 */\n private originLine(path: string): string {\n const segs = path.split('.').filter(Boolean);\n if (segs.length < 2) return '';\n const names = segs.map((k) => agentDisplayName(k));\n return chalk.gray(` ↑ 来自 ${names.join(' › ')}`) + '\\n';\n }\n\n /** v4 控制通道 confirm 卡(醒目 box + 编号选项),对齐 Web ConfirmationCard。 */\n confirmCard(req: InteractionRequest): void {\n this.blockBoundary();\n const hi = req.riskLevel === 'HIGH' || req.riskLevel === 'CRITICAL';\n this.write('\\n' + chalk.yellow('┌─ CONFIRM' + (hi ? ' · 高风险' : '') + ' ' + '─'.repeat(20)) + '\\n');\n this.write(this.originLine(req.originAgentPath));\n if (req.toolName) this.write(chalk.gray(' 操作 ') + `${req.toolName}(${req.summary})` + '\\n');\n else this.write(chalk.gray(' 说明 ') + req.summary + '\\n');\n if (req.argsPreview) {\n const chips = Object.entries(req.argsPreview).map(([k, v]) => `${k}=${String(v)}`).join(' · ');\n this.write(chalk.gray(' 参数 ') + chips + '\\n');\n }\n this.write(chalk.yellow('─'.repeat(38)) + '\\n');\n this.write(hi ? ' 1) 批准 2) 驳回并说明\\n' : ' 1) 确认执行 2) 取消\\n');\n }\n\n /** v4 控制通道 ask 卡(轻量 ? 引导 + 编号 choices / 自由文本),对齐 Web AskCard。 */\n askCard(req: InteractionRequest): void {\n this.blockBoundary();\n const lastSeg = req.originAgentPath.split('.').pop() ?? '';\n const name = lastSeg ? agentDisplayName(lastSeg) : 'Moirai';\n this.write('\\n' + chalk.cyan(`? ${name} · 提问`) + '\\n');\n this.write(' ' + (req.question ?? req.summary) + '\\n');\n if (req.choices?.length) {\n // choices 元素可能是对象({label}/{value}/{text},控制通道 wire 形态)——\n // 直接模板插值会渲染成 [object Object](2026-06-12 实测)。\n req.choices.forEach((c, i) => this.write(` ${i + 1}) ${choiceLabel(c)} `));\n this.write('\\n');\n } else {\n this.write(chalk.dim(' (直接输入回答)') + '\\n');\n }\n }\n\n /** --auto-approve 下自动批准 confirm 时的审计行(不静默)。 */\n autoApproved(toolName: string | undefined, summary: string): void {\n this.ensureLineStart();\n this.write(chalk.gray(` ✓ 已自动批准: ${toolName ?? ''}(${summary})`) + '\\n');\n }\n\n /**\n * G4 · control.interaction.resolved(phase=RESUMED):决策已受理、继续执行(ADR-125)。\n * 不再让用户决策后视觉空白。\n */\n interactionResumed(): void {\n this.blockBoundary();\n this.write(chalk.green(' ✓ 已受理,继续执行…') + '\\n');\n }\n\n /**\n * G4 · control.interaction.resolved(phase=TERMINAL):交互终局(ADR-125),\n * status ∈ {COMPLETED, FAILED, SUPERSEDED}。按 status 渲染终局行。\n */\n interactionTerminal(status?: string): void {\n this.blockBoundary();\n if (status === 'FAILED') {\n this.write(chalk.red(' ✗ 交互失败') + '\\n');\n } else if (status === 'SUPERSEDED') {\n this.write(chalk.gray(' ↪ 交互已被新请求接管') + '\\n');\n } else {\n // COMPLETED(含 status 缺省)\n this.write(chalk.gray(' ✓ 交互完成') + '\\n');\n }\n }\n\n /**\n * v4 content_part 终端降级:终端画不了富内容,降级为「▸ 类型 · 标题」头行 +\n * insight 缩进副行的强调块(委派块内随 depth 缩进)——区别于正文灰色一行,\n * 富内容产物是结果本身,视觉层级须高于过程文本。\n */\n contentPartSummary(part: Record<string, unknown>): void {\n this.blockBoundary();\n const type = part.type as string;\n const pad = this.indent();\n if (type === 'chart') {\n this.write(pad + chalk.cyan(`▸ 图表 · ${(part.title as string) ?? ''}`) + '\\n');\n if (part.insight) this.write(pad + chalk.gray(` ${String(part.insight)}`) + '\\n');\n } else if (type === 'table') {\n this.write(pad + chalk.cyan(`▸ 表格 · ${(part.title as string) ?? ''}`) + '\\n');\n } else if (type === 'file' || type === 'fileDownload') {\n // fileDownload:文件名做成 OSC 8 超链接,点击由浏览器打开签名链接(ADR-140,免 Bearer)。\n // 不打印裸 URL——长签名 URL 换行后终端不自动识别(点不动);OSC 8 链接跨行仍可点。\n const fileName = (part.fileName as string) ?? '文件';\n const abs = part.downloadUrl ? absoluteDownloadUrl(this.opts.apiBase, String(part.downloadUrl)) : undefined;\n const head = abs ? terminalHyperlink(abs, `📎 ${fileName}`) : `📎 ${fileName}`;\n this.write(pad + chalk.cyan(`▸ ${head}`) + (abs ? chalk.gray(' ← 点击打开') : '') + '\\n');\n } else {\n this.write(pad + chalk.cyan(`▸ ${type}`) + '\\n');\n }\n }\n}\n","import { agentDisplayName, type TerminalRenderer } from './TerminalRenderer';\nimport { createV4Reducer, truncateDisplay, type V4RenderSink } from '@hcmai/sdk';\n\nexport interface StreamPresenterOptions {\n showToolCalls: boolean;\n output: 'text' | 'json';\n}\n\nexport interface StreamResult {\n status: 'completed' | 'interrupted' | 'incomplete';\n traceId: string | null;\n streamId?: string;\n conversationId?: string;\n}\n\n/** G6 · 终态行统计素材(流中累计)。 */\nexport interface CompletionStats {\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n toolCount: number;\n delegationCount: number;\n}\n\n/** 委派子流折叠态:子流文本/工具不平铺,凝成 spinner 活动摘要 + 收口统计。 */\ninterface DelegationMeta {\n name: string;\n toolCount: number;\n failCount: number;\n /** 子流文本滚动窗(取最后非空行做 spinner 摘要),上限防长会话累积。 */\n textTail: string;\n /** 跨暂停累计耗时:每段(暂停前 + RESUME 后)的 durMs 相加,收口时一次性透出。 */\n accumDurMs: number;\n /** 当前是否处于「暂停待应答」态(specialist 子流内 ASK/CONFIRM HALT,等用户应答续跑)。 */\n paused: boolean;\n}\n\n// 极简 logger,避免引入 winston\nconst debug = (...args: unknown[]): void => {\n if (process.env.HCM_DEBUG) console.error('[StreamPresenter]', ...args);\n};\n\n/**\n * StreamPresenter(v4):把 v4 block 流经 createV4Reducer 折成语义事件 → TerminalRenderer。\n * delete-on-supersede(ADR-120):v3 case 已全删,仅保留终态三事件(response.completed/failed/\n * interrupted)作 iterator 终态边界;展示流 6 事件(message.start / block 三件 / tool.result / message.stop)\n * 全部交给 reducer。output='json' 时旁路渲染、直打原始 envelope。\n *\n * 子流折叠(2026-06-11 对标 Claude Code):reducer 每个回调都带 parentToolUseId,\n * parent 非空(委派子流)的 text/thinking/tool 不进正文区——折叠为委派块 spinner 的\n * 动态活动摘要(「⎿ 数据分析专家 · …」),委派结束由 delegationEnd 收口统计行。\n * 修复实测灾难:子代理 80 行表格平铺一遍 + 主代理复述一遍的双重输出。\n */\nexport class StreamPresenter {\n private traceId: string | null = null;\n private streamId: string | undefined;\n private totalTokens = 0;\n // G6:终态行密度——in/out token 分解 + 工具调用数 + 委派数(流中统计)。\n private inputTokens = 0;\n private outputTokens = 0;\n private toolCount = 0;\n private delegationCount = 0;\n /** 已见 ROOT message.stop(end_turn)——iterator 收口后据此判 completed/incomplete。 */\n private sawRootStop = false;\n private readonly reducer: {\n handle: (type: string, payload: Record<string, unknown>) => boolean;\n };\n /** 委派折叠态(callId → 名字/工具计数/文本尾窗)。耗时不再自计——onDelegationEnd 带后端 durMs。 */\n private readonly delgMeta = new Map<string, DelegationMeta>();\n /** 工具行整行输出模型:result 到达才打整行,start 时暂存 name/argsPreview。 */\n private readonly pendingTools = new Map<string, { toolName: string; argsPreview: string }>();\n\n constructor(\n private readonly renderer: TerminalRenderer,\n private readonly opts: StreamPresenterOptions,\n ) {\n // G1:spinner 由 presenter 驱动(renderer 仅 TTY+spinner 开时真转,CI/raw 自动 no-op)。\n // 关键空白期:① 等 LLM 首 token ② 工具执行中 ③ 委派子流执行中。有真实输出即停转。\n const sink: V4RenderSink = {\n onText: (t, parent) => {\n if (parent) {\n this.bumpDelegationActivity(parent, t);\n return;\n }\n this.renderer.writeChatChunk(t); // 内部已 stopSpinner\n },\n onThinkingDelta: (t, parent) => {\n if (parent) {\n this.bumpDelegationActivity(parent, null, '思考中…');\n return;\n }\n this.renderer.writeThinkingChunk(t); // 折叠态保留「思考中…」spinner\n },\n onThinkingDone: (parent) => {\n if (!parent) this.renderer.endThinking();\n },\n onToolStarted: (callId, toolName, argsPreview, parent) => {\n this.pendingTools.set(callId, { toolName, argsPreview });\n if (parent) {\n // 子流工具:折叠——只更新委派活动摘要 + 计数,不打行。\n const d = this.delgMeta.get(parent);\n if (d) {\n d.toolCount += 1;\n this.renderer.updateSpinner(`⎿ ${d.name} · ⚙ ${toolName}…`);\n }\n return;\n }\n // 主流程:工具行等 result 到齐才整行输出(见 onToolResult),执行中由 spinner 透出。\n this.renderer.startSpinner(`执行工具 ${toolName}…`);\n },\n onToolResult: (callId, success, durMs, _childConvId, parent, nextSteps, toolName) => {\n const meta = this.pendingTools.get(callId);\n this.pendingTools.delete(callId);\n this.toolCount += 1; // G6:全局计数含子流工具\n if (parent) {\n const d = this.delgMeta.get(parent);\n if (d && !success) d.failCount += 1;\n return;\n }\n // G5:失败时透出 next_step 路标(成功 nextSteps 为 undefined)。\n // #1930:名字优先取 onToolStarted 暂存的(block.start 注册);无 start 的事件(缓存短路\n // no-op 等)用 reducer 兜底解析的 toolName;都没有才退回 `?`。\n if (this.opts.showToolCalls) {\n this.renderer.toolLine(meta?.toolName ?? toolName ?? '?', meta?.argsPreview ?? '', success, durMs, nextSteps);\n }\n // 工具结束 → 回到等下一轮 LLM 输出\n this.renderer.startSpinner('思考中…');\n },\n // content_part 是面向用户的产物(图表/表格/文件),子流产生的也透出(委派块内缩进显示)。\n onContentPart: (part) => this.renderer.contentPartSummary(part),\n // W1a-2:纠偏注入确认行——steer 后终端不再零反馈。\n onSteeringApplied: (contents) => this.renderer.steeringLine(contents),\n onDelegationStart: (agentKey, parentToolUseId) => {\n const existing = this.delgMeta.get(parentToolUseId);\n if (existing) {\n // RESUME:暂停应答后续跑同一委派块(同 parentToolUseId 再来 message.start)——\n // 不重复计数、不重画块头(CLI append-only 不能回填),仅复位活动 spinner。\n existing.paused = false;\n this.renderer.startSpinner(`⎿ ${existing.name} · 执行中…`);\n return;\n }\n this.delegationCount += 1; // G6:委派计数(暂停→续跑不重复计入)\n const name = agentDisplayName(agentKey);\n this.delgMeta.set(parentToolUseId, { name, toolCount: 0, failCount: 0, textTail: '', accumDurMs: 0, paused: false });\n this.renderer.delegationStart(agentKey, parentToolUseId); // 内部 blockBoundary\n this.renderer.startSpinner(`⎿ ${name} · 执行中…`);\n },\n onDelegationPaused: (parentToolUseId, durMs) => {\n const d = this.delgMeta.get(parentToolUseId);\n if (!d) return; // 无块可挂(理论不达:暂停必先有 delegationStart)\n // 暂停待应答:保留委派块不收口、累计本段耗时,等 RESUME 续跑收口成一条「完成」。\n // 可见反馈由 control 通道「✓ 已受理,继续执行…」+ 交互提示 UI 承载,此处不打收口行\n // (旧版把 transport success=false 渲染成红色「✗ 委派失败」= 假警报,本修复消除)。\n d.accumDurMs += durMs;\n d.paused = true;\n this.renderer.updateSpinner(`⎿ ${d.name} · ⏸ 等待应答…`);\n },\n onDelegationEnd: (parentToolUseId, success, durMs, nextSteps) => {\n const d = this.delgMeta.get(parentToolUseId);\n this.delgMeta.delete(parentToolUseId);\n if (!d) {\n // 子流从未启动(委派在路由/校验层直接失败,无 message.start)——没有委派块头行,\n // 失败渲染为普通失败工具行(委派本来就是 tool),成功则静默(无可收口的块)。\n if (!success) this.renderer.toolLine('hcm_delegate', '', false, durMs, nextSteps);\n this.renderer.startSpinner('思考中…');\n return;\n }\n // 累计跨暂停的各段耗时(暂停段已 onDelegationPaused 累入 accumDurMs)。\n const totalDurMs = d.accumDurMs + durMs;\n this.renderer.delegationEnd(parentToolUseId, totalDurMs, d.toolCount, d.failCount, success, nextSteps);\n this.renderer.startSpinner('思考中…');\n },\n onTerminal: (_stopReason, tokens) => {\n this.totalTokens = tokens || this.totalTokens;\n this.pendingTools.clear();\n // 暂停待应答的委派块要跨 HALT 的「中间 ROOT message.stop」存活(resume 段续跑后才\n // 由 onDelegationEnd 收口删除)——只清非暂停态,否则中间 stop 会把块清空、resume\n // 被误判为新委派(退回到「2 委派 + 假失败」老 bug)。终局 stop 时块已收口、此处为空。\n for (const [k, d] of this.delgMeta) {\n if (!d.paused) this.delgMeta.delete(k);\n }\n // G3:markdown 段落已流式渲染,终态仅 flush 未完尾段(非 markdown 校正行首)。\n this.renderer.flushChatBuffer();\n this.renderer.stopSpinner();\n },\n };\n this.reducer = createV4Reducer(sink);\n }\n\n /**\n * 子流活动摘要:取子流文本最后一个非空行(截显示宽度)刷进 spinner 文案,\n * TTY 上呈现「⎿ 数据分析专家 · 正在并行执行两个查询…」的单行滚动效果。\n */\n private bumpDelegationActivity(parent: string, text: string | null, fallback?: string): void {\n const d = this.delgMeta.get(parent);\n if (!d) return;\n if (text) {\n d.textTail = (d.textTail + text).slice(-300);\n const lastLine = d.textTail\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .pop();\n if (lastLine) {\n this.renderer.updateSpinner(`⎿ ${d.name} · ${truncateDisplay(lastLine, 48)}`);\n return;\n }\n }\n this.renderer.updateSpinner(`⎿ ${d.name} · ${fallback ?? '执行中…'}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async consume(events: AsyncIterable<any>): Promise<StreamResult> {\n // G1:起手即转「思考中…」覆盖「已发 message.create,等 LLM 首 token」这段最大空白期。\n // json 旁路不渲染,故仅 text 模式驱动 spinner。\n if (this.opts.output !== 'json') this.renderer.startSpinner('思考中…');\n for await (const ev of events) {\n if (!this.traceId && ev.traceId) this.traceId = ev.traceId;\n if (!this.streamId && ev.streamId) this.streamId = ev.streamId;\n // G6:token in/out 分解从终态 payload 取(ROOT message.stop 带 inputTokens/outputTokens;\n // response.completed 走 usage.{inputTokens,outputTokens})。子流 message.stop 不计入。\n this.captureTokenBreakdown(ev);\n\n if (this.opts.output === 'json') {\n process.stdout.write(JSON.stringify(ev) + '\\n');\n if (ev.type === 'response.completed') return this.result('completed');\n if (ev.type === 'response.interrupted') return this.result('interrupted');\n if (ev.type === 'response.failed') throw this.toError(ev);\n // ROOT message.stop 不再立即终态(2026-06-12 ASK 挂死 RCA):hold 模式下它可能是\n // HALT 的中间 stop,resume 段事件还在路上——终态判定单点在 iterator(它持有未决\n // 交互集),presenter 以 iterator 收口为唯一终态。非 hold 时 iterator 在 stop 后\n // 立即 finish,行为与旧版完全一致。\n if (ev.type === 'message.stop' && !ev.payload?.parentToolUseId) {\n this.sawRootStop = true;\n }\n continue;\n }\n\n // 终态三事件(v4 兼容边界)= iterator 终态\n if (ev.type === 'response.completed') {\n if (ev.payload?.totalTokens) this.totalTokens = ev.payload.totalTokens;\n // G3:兜底 flush(reducer onTerminal 未触达时,仍把 markdown 累积段渲染出来)。\n this.renderer.flushChatBuffer();\n this.renderer.stopSpinner();\n return this.result('completed');\n }\n if (ev.type === 'response.failed') {\n this.renderer.stopSpinner();\n throw this.toError(ev);\n }\n if (ev.type === 'response.interrupted') {\n this.renderer.showInterrupted(ev.payload?.reason ?? 'UNKNOWN');\n return this.result('interrupted');\n }\n\n // v4 原生终态信号:ROOT message.stop(parentToolUseId 空)。\n // 🔴 end_turn 不在此 return(2026-06-12 ASK 挂死 RCA):hold 模式下 HALT 的 ROOT stop\n // 是中间态——iterator(唯一持有未决交互集的层)会继续吐 resume 段事件;旧版在此\n // 无条件 return 导致 ASK/confirm 决策回发后的 resume 正文整段被丢(用户答完「1」\n // 后纯黑洞,体感挂死)。终态判定单点化:presenter 只记录 stop、消费到 iterator\n // 收口为止。error/interrupted 仍即时终态(无 resume 语义)。\n if (ev.type === 'message.stop' && !ev.payload?.parentToolUseId) {\n this.reducer.handle(ev.type, ev.payload ?? {}); // onTerminal 记 tokens + flush\n const reason = ev.payload?.stopReason;\n if (reason === 'error') throw this.toError(ev);\n if (reason === 'interrupted') {\n this.renderer.showInterrupted('INTERRUPTED');\n return this.result('interrupted');\n }\n this.sawRootStop = true;\n continue;\n }\n\n // v4 block 流 → reducer;未命中则 debug 静默(v3 已删)\n if (!this.reducer.handle(ev.type, ev.payload ?? {})) debug('unknown event', ev.type);\n }\n // iterator 收口(非 hold:ROOT stop 即 finish;hold:TERMINAL 兜底/无未决 stop 后 finish)。\n this.renderer.stopSpinner();\n return this.result(this.sawRootStop ? 'completed' : 'incomplete');\n }\n\n get tokenCount(): number {\n return this.totalTokens;\n }\n\n /** G6 · 终态行素材:总/进/出 token + 工具数 + 委派数。0 值由 renderer 决定是否省略。 */\n get completionStats(): CompletionStats {\n return {\n totalTokens: this.totalTokens,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n toolCount: this.toolCount,\n delegationCount: this.delegationCount,\n };\n }\n\n /**\n * G6 · 从终态 payload 抽 in/out token 分解。仅 ROOT(parentToolUseId 空)的 message.stop /\n * response.completed 计入,避免子流 message.stop 的 turn 增量被误当全程值覆盖。\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private captureTokenBreakdown(ev: any): void {\n const p = ev?.payload;\n if (!p) return;\n if (ev.type === 'message.stop' && !p.parentToolUseId) {\n if (typeof p.inputTokens === 'number') this.inputTokens = p.inputTokens;\n if (typeof p.outputTokens === 'number') this.outputTokens = p.outputTokens;\n } else if (ev.type === 'response.completed') {\n const usage = p.usage;\n if (usage && typeof usage === 'object') {\n if (typeof usage.inputTokens === 'number') this.inputTokens = usage.inputTokens;\n if (typeof usage.outputTokens === 'number') this.outputTokens = usage.outputTokens;\n }\n }\n }\n\n private result(status: StreamResult['status']): StreamResult {\n return { status, traceId: this.traceId, streamId: this.streamId };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private toError(ev: any): Error {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err: any = new Error(ev.payload?.message ?? 'stream failed');\n err.code = ev.payload?.errorCode ?? ev.payload?.code;\n err.traceId = ev.traceId;\n return err;\n }\n}\n","import { marked } from 'marked';\nimport { markedTerminal } from 'marked-terminal';\nimport { agentDisplayName, terminalHyperlink } from '../streaming/TerminalRenderer';\nimport { absoluteDownloadUrl, type ResumeSummary } from '@hcmai/sdk';\nimport type { Block, StreamingState } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nmarked.use(markedTerminal() as any);\n\nexport interface BridgeSinks {\n appendBlock(b: Block): void;\n updateStreaming(patch: Partial<StreamingState>): void;\n}\n\n/**\n * ADR-129 · duck-type TerminalRenderer 的方法面 → React state 事件。\n *\n * StreamPresenter 以 TS 结构类型依赖 TerminalRenderer——本 bridge 实现同一方法面\n * (与单测 rendererSpy 同一招),把每个渲染语义翻译为「append 历史块」或「更新动态区」。\n * 语义层(reducer/presenter/iterator)零改动全复用,这是 ADR-129 D2 的落点。\n *\n * 正文策略:流式期间原文进动态区(打字机);段落落块时整段过 marked-terminal 渲染\n * 为 ANSI 进 `<Static>` 历史——与单发模式渲染完全一致。\n */\nexport function createInkRendererBridge(sinks: BridgeSinks, apiBase?: string) {\n let chatBuffer = '';\n let thinkingChars = 0;\n let thinkingSince: number | null = null;\n\n const renderAnsi = (src: string): string =>\n (marked.parse(src.replace(/\\n+$/, '')) as string).replace(/\\n+$/, '');\n\n const flushParagraphs = (force: boolean): void => {\n if (!chatBuffer) return;\n let head = '';\n if (force) {\n head = chatBuffer;\n chatBuffer = '';\n } else {\n const idx = chatBuffer.lastIndexOf('\\n\\n');\n if (idx < 0) return;\n const candidate = chatBuffer.slice(0, idx + 2);\n const fences = (candidate.match(/(?:^|\\n) {0,3}```/g) ?? []).length;\n if (fences % 2 === 1) return;\n head = candidate;\n chatBuffer = chatBuffer.slice(idx + 2);\n }\n if (head.trim()) {\n sinks.appendBlock({ kind: 'assistant', ansi: renderAnsi(head) });\n }\n sinks.updateStreaming({ text: chatBuffer });\n };\n\n return {\n // ── 正文流 ──\n writeChatChunk(text: string): void {\n chatBuffer += text;\n sinks.updateStreaming({ text: chatBuffer, spinner: null });\n flushParagraphs(false);\n },\n flushChatBuffer(): void {\n flushParagraphs(true);\n sinks.updateStreaming({ text: '' });\n },\n\n // ── spinner(动态区状态行)──\n startSpinner(text: string): void {\n sinks.updateStreaming({ spinner: text });\n },\n updateSpinner(text: string): void {\n sinks.updateStreaming({ spinner: text });\n },\n stopSpinner(): void {\n sinks.updateStreaming({ spinner: null });\n },\n\n // ── thinking(折叠:进行中计时,结束落总结块)──\n writeThinkingChunk(text: string): void {\n if (thinkingSince == null) {\n thinkingSince = Date.now();\n sinks.updateStreaming({ thinkingSince });\n }\n thinkingChars += text.length;\n },\n endThinking(): void {\n if (thinkingSince != null && thinkingChars > 0) {\n sinks.appendBlock({\n kind: 'thinking',\n seconds: Math.max(0, (Date.now() - thinkingSince) / 1000),\n chars: thinkingChars,\n });\n }\n thinkingSince = null;\n thinkingChars = 0;\n sinks.updateStreaming({ thinkingSince: null });\n },\n\n // ── 工具/委派/富内容 ──\n toolLine(name: string, preview: string, success: boolean, durMs: number, nextSteps?: string[]): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'tool', name, preview, success, durMs, nextSteps });\n },\n delegationStart(agentKey: string): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'delegationStart', agentName: agentDisplayName(agentKey) });\n },\n delegationEnd(_id: string, durMs?: number, toolCount?: number, failCount?: number,\n success: boolean = true, nextSteps?: string[]): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'delegationEnd', durMs, toolCount, failCount, success, nextSteps });\n },\n contentPartSummary(part: Record<string, unknown>): void {\n flushParagraphs(true);\n const type = part.type as string;\n let label: string;\n let detail: string | undefined;\n if (type === 'file' || type === 'fileDownload') {\n // 文件名做 OSC 8 超链接,点击由浏览器打开签名链接(ADR-140,免 Bearer);不打裸 URL——\n // 长签名 URL 换行后终端不自动识别(点不动),OSC 8 链接是字符单元属性、跨行仍可点。\n const fileName = (part.fileName as string) ?? '文件';\n const abs = part.downloadUrl ? absoluteDownloadUrl(apiBase, String(part.downloadUrl)) : undefined;\n label = abs ? `▸ ${terminalHyperlink(abs, `📎 ${fileName}`)} ← 点击打开` : `▸ 📎 ${fileName}`;\n } else if (type === 'chart') {\n label = `▸ 图表 · ${(part.title as string) ?? ''}`;\n detail = part.insight ? String(part.insight) : undefined;\n } else if (type === 'table') {\n label = `▸ 表格 · ${(part.title as string) ?? ''}`;\n } else {\n label = `▸ ${type}`;\n detail = part.insight ? String(part.insight) : undefined;\n }\n sinks.appendBlock({ kind: 'contentPart', label, detail });\n },\n steeringLine(contents: string[]): void {\n flushParagraphs(true);\n for (const text of contents) sinks.appendBlock({ kind: 'steering', text });\n },\n\n // ── 交互反馈 / 终态 ──\n interactionResumed(): void {\n sinks.appendBlock({ kind: 'interactionNote', tone: 'ok', text: '已受理,继续执行…' });\n },\n interactionTerminal(status?: string): void {\n const tone = status === 'FAILED' ? 'fail' as const : 'info' as const;\n const text = status === 'FAILED' ? '交互失败'\n : status === 'SUPERSEDED' ? '交互已被新请求接管' : '交互完成';\n sinks.appendBlock({ kind: 'interactionNote', tone, text });\n },\n autoApproved(toolName: string | undefined, summary: string): void {\n sinks.appendBlock({ kind: 'interactionNote', tone: 'ok', text: `已自动批准: ${toolName ?? ''}(${summary})` });\n },\n showInterrupted(reason: string): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'interrupted', reason });\n sinks.updateStreaming({ spinner: null, text: '' });\n },\n showCompleted(durMs: number, traceId: string | null, conversationId: string,\n totalTokens?: number, stats?: { inputTokens?: number; outputTokens?: number; toolCount?: number; delegationCount?: number }): void {\n flushParagraphs(true);\n sinks.appendBlock({\n kind: 'done', durMs, traceId, conversationId, totalTokens,\n inputTokens: stats?.inputTokens, outputTokens: stats?.outputTokens,\n toolCount: stats?.toolCount, delegationCount: stats?.delegationCount,\n });\n sinks.updateStreaming({ spinner: null, text: '' });\n },\n showResumeContext(summary: ResumeSummary): void {\n sinks.appendBlock({\n kind: 'resume', conversationId: summary.conversationId,\n totalRounds: summary.totalRounds, turns: summary.recent,\n });\n },\n };\n}\n\nexport type InkRendererBridge = ReturnType<typeof createInkRendererBridge>;\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Block } from './types';\n\n/** 历史块渲染(进 `<Static>`,append-only 永不重绘)。视觉语义对齐手搓版 TerminalRenderer。 */\nexport function BlockView({ block: b }: { block: Block }): React.JSX.Element {\n switch (b.kind) {\n case 'banner':\n return <Text color=\"gray\">{b.text}</Text>;\n case 'user':\n return (\n <Box flexDirection=\"column\">\n <Text><Text color=\"cyan\">{'❯ '}</Text>{b.text}</Text>\n {b.attachments?.length ? (\n <Text dimColor>{' 📎 ' + b.attachments.map((a) => a.fileName).join(' · ')}</Text>\n ) : null}\n </Box>\n );\n case 'assistant':\n return <Box flexDirection=\"column\" marginBottom={1}><Text>{b.ansi}</Text></Box>;\n case 'thinking':\n return <Text color=\"gray\">✓ 推理完成 ({b.seconds.toFixed(1)}s · {b.chars} chars)</Text>;\n case 'tool':\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"cyan\">⚙ {b.name}</Text>\n {b.preview ? <Text color=\"gray\"> {b.preview}</Text> : null}\n {' '}{b.success ? <Text color=\"green\">✓</Text> : <Text color=\"red\">✗</Text>}\n <Text color=\"gray\"> {b.durMs}ms</Text>\n </Text>\n {!b.success && b.nextSteps?.length ? (\n <Box flexDirection=\"column\" marginLeft={4}>\n <Text dimColor>↳ 下一步:</Text>\n {b.nextSteps.map((s, i) => <Text key={i} dimColor> • {s}</Text>)}\n </Box>\n ) : null}\n </Box>\n );\n case 'delegationStart':\n return <Text color=\"blue\">⏺ 委派 → {b.agentName}</Text>;\n case 'delegationEnd': {\n const segs: string[] = [];\n if (b.toolCount) segs.push(`${b.toolCount} 工具${b.failCount ? `,${b.failCount} 失败` : ''}`);\n if (b.durMs) segs.push(`${(b.durMs / 1000).toFixed(1)}s`);\n const detail = segs.length ? ` (${segs.join(' · ')})` : '';\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n {b.success\n ? <Text color=\"gray\">⎿ 完成{detail}</Text>\n : <Text color=\"red\">⎿ ✗ 委派失败{detail}</Text>}\n {!b.success && b.nextSteps?.length ? (\n <Box flexDirection=\"column\" marginLeft={2}>\n {b.nextSteps.map((s, i) => <Text key={i} dimColor> • {s}</Text>)}\n </Box>\n ) : null}\n </Box>\n );\n }\n case 'steering':\n return <Text><Text color=\"blue\">↪ 纠偏 </Text><Text color=\"gray\">{b.text}</Text></Text>;\n case 'contentPart':\n return (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\">{b.label}</Text>\n {b.detail ? <Text color=\"gray\"> {b.detail}</Text> : null}\n </Box>\n );\n case 'interactionNote':\n return b.tone === 'fail'\n ? <Text color=\"red\"> ✗ {b.text}</Text>\n : b.tone === 'ok'\n ? <Text color=\"green\"> ✓ {b.text}</Text>\n : <Text color=\"gray\"> {b.text}</Text>;\n case 'resume': {\n const shownUsers = b.turns.filter((t) => t.role === 'user').length;\n const earlier = b.totalRounds - shownUsers;\n const shortId = b.conversationId.length > 12 ? '…' + b.conversationId.slice(-12) : b.conversationId;\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>↻ 续接会话 {shortId}(共 {b.totalRounds} 轮{earlier > 0 ? `,更早 ${earlier} 轮略` : ''})</Text>\n {b.turns.map((t, i) => (\n <Text key={i} dimColor>{t.role === 'user' ? ` > ${t.text}` : ` ${t.text}`}</Text>\n ))}\n </Box>\n );\n }\n case 'done': {\n const segs: string[] = [`${b.durMs}ms`];\n if (b.totalTokens) {\n const split = (b.inputTokens || b.outputTokens) ? ` (↑${b.inputTokens ?? 0}/↓${b.outputTokens ?? 0})` : '';\n segs.push(`${b.totalTokens} tok${split}`);\n }\n if (b.toolCount) segs.push(`${b.toolCount} 工具`);\n if (b.delegationCount) segs.push(`${b.delegationCount} 委派`);\n segs.push(`traceId ${b.traceId ?? '?'}`);\n segs.push(`conversation ${b.conversationId}`);\n return <Box marginBottom={1}><Text dimColor>✓ done ({segs.join(' · ')})</Text></Box>;\n }\n case 'interrupted':\n return <Text color=\"yellow\">^ 已中断 ({b.reason})</Text>;\n case 'error':\n return <Text color=\"red\">✗ Error: {b.text}</Text>;\n default:\n return <Text />;\n }\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nexport interface MultilineInputProps {\n value: string;\n onChange: (v: string) => void;\n onSubmit: (v: string) => void;\n placeholder?: string;\n /** 首行提示符(续行自动等宽缩进)。 */\n prompt?: string;\n /** 光标已在首行仍按 ↑ —— 交还历史导航。 */\n onHistoryUp?: () => void;\n /** 光标已在末行仍按 ↓ —— 交还历史导航。 */\n onHistoryDown?: () => void;\n /** Esc 清空输入时同步回调(清待发附件等外部暂存态,issue #64)。 */\n onEscapeClear?: () => void;\n /**\n * 外部按键捕获钩子:在输入框处理任何键之前调用,返回 true 表示该键已被上层\n * (如 slash 命令菜单)消费,输入框跳过自身处理。保持输入框对 slash 语义无知。\n */\n captureKey?: (input: string, key: KeyLike) => boolean;\n}\n\n/**\n * 多行输入框(对标主流聊天输入区:Enter 发送,修饰 Enter 换行):\n * - 裸 Enter 发送;Shift+Enter / Ctrl+Enter / Option+Enter / Ctrl+J 换行续输\n * (修饰 Enter 需终端键盘增强,run.ts 开 modifyOtherKeys;Ctrl+J 传统 \\n 作无增强兜底)\n * - 草稿末行输入 /send 再 Enter 仍可发送(剥掉 /send 行)\n * - 粘贴多行文本(单 chunk 含换行)原样插入,不误触提交\n * - ↑↓ 在多行间移动光标,首/末行边界让位给历史导航(Claude Code 同行为)\n * - Esc 清空当前输入(busy 态的 Esc 打断在 App 层,互不冲突)\n *\n * value 受控于父级;光标是组件内部状态——外部改值(历史回填/提交清空)时\n * 光标自动置末尾,selfEdit 标记区分两种来源。\n */\nexport function MultilineInput(props: MultilineInputProps): React.JSX.Element {\n const { value, onChange, onSubmit, placeholder = '', prompt = '› ', onHistoryUp, onHistoryDown, onEscapeClear, captureKey } = props;\n const [cursor, setCursor] = useState(value.length);\n const selfEdit = useRef(false);\n\n useEffect(() => {\n if (selfEdit.current) { selfEdit.current = false; return; }\n setCursor(value.length);\n }, [value]);\n\n const edit = (next: string, nextCursor: number): void => {\n selfEdit.current = true;\n setCursor(nextCursor);\n onChange(next);\n };\n\n useInput((input, key) => {\n // 上层(slash 菜单)优先消费导航/补全键;返回 true 则输入框不再处理本次按键。\n if (captureKey?.(input, key)) return;\n if (key.escape) { if (value) edit('', 0); onEscapeClear?.(); return; }\n // 固定 composer 语义(对标主流聊天输入区):\n // - 裸 Enter 发送\n // - Shift/Ctrl/Option+Enter 换行;Ctrl+J(传统 \\n)换行作无终端增强兜底\n // - 草稿末行 `/send` + Enter 仍兜底发送(剥掉 /send 行)。\n // 终端差异:\n // - Shift/Ctrl/Option+Enter(kitty CSI-u 形态)Ink 7 原生解析出 key.return + 修饰位\n // - xterm modifyOtherKeys 形态(ESC[27;<mod>;13~)Ink 不识别,匹配剥掉 ESC 的原文\n const modifiedEnter = classifyModifiedEnter(input, key);\n if (modifiedEnter === 'newline' || input === '\\n') {\n edit(value.slice(0, cursor) + '\\n' + value.slice(cursor), cursor + 1);\n return;\n }\n if (key.return) {\n // 裸 Enter 发送(修饰 Enter 已在上面归为换行)。空白输入不触发提交。\n const sendDraft = draftFromSendCommandLine(value, cursor);\n const toSend = sendDraft !== null ? sendDraft : value;\n if (toSend.trim()) onSubmit(toSend);\n return;\n }\n // 其他未映射的修饰键序列(CSI ~/u 收尾)不入正文。\n if (/^(?:\\x1b)?\\[\\d+(?:;\\d+)*[~u]$/.test(input)) return;\n if (key.backspace || key.delete) {\n if (cursor > 0) edit(value.slice(0, cursor - 1) + value.slice(cursor), cursor - 1);\n return;\n }\n if (key.leftArrow) { setCursor((c) => Math.max(0, c - 1)); return; }\n if (key.rightArrow) { setCursor((c) => Math.min(value.length, c + 1)); return; }\n if (key.upArrow || key.downArrow) {\n const lines = value.split('\\n');\n const { row, col } = locate(lines, cursor);\n if (key.upArrow) {\n if (row === 0) { onHistoryUp?.(); return; }\n setCursor(offsetOf(lines, row - 1, Math.min(col, lines[row - 1]!.length)));\n } else {\n if (row === lines.length - 1) { onHistoryDown?.(); return; }\n setCursor(offsetOf(lines, row + 1, Math.min(col, lines[row + 1]!.length)));\n }\n return;\n }\n if (key.ctrl || key.meta || key.tab) return;\n if (input) {\n // 可打印输入与粘贴整段同路:\\r / \\r\\n 统一归一为 \\n。\n const text = input.replace(/\\r\\n?/g, '\\n');\n edit(value.slice(0, cursor) + text + value.slice(cursor), cursor + text.length);\n }\n });\n\n const indent = ' '.repeat(prompt.length);\n\n if (!value) {\n return (\n <Box>\n <Text color=\"cyan\">{prompt}</Text>\n <Text inverse>{placeholder.charAt(0) || ' '}</Text>\n <Text dimColor>{placeholder.slice(1)}</Text>\n </Box>\n );\n }\n\n const lines = value.split('\\n');\n const { row, col } = locate(lines, cursor);\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, r) => (\n <Box key={r}>\n <Text color=\"cyan\">{r === 0 ? prompt : indent}</Text>\n {r === row ? (\n <Text>\n {line.slice(0, col)}\n <Text inverse>{col < line.length ? line[col] : ' '}</Text>\n {col < line.length ? line.slice(col + 1) : ''}\n </Text>\n ) : (\n <Text>{line.length ? line : ' '}</Text>\n )}\n </Box>\n ))}\n </Box>\n );\n}\n\ninterface KeyLike {\n return?: boolean;\n shift?: boolean;\n ctrl?: boolean;\n meta?: boolean;\n upArrow?: boolean;\n downArrow?: boolean;\n tab?: boolean;\n}\n\nexport function classifyModifiedEnter(input: string, key: KeyLike): 'submit' | 'newline' | null {\n // Enter 发送、修饰 Enter 换行:Shift/Ctrl/Option+Enter 一律换行(裸 Enter 走 key.return 提交分支)。\n if (key.return && (key.ctrl || key.meta || key.shift)) return 'newline';\n\n // xterm modifyOtherKeys 形态 ESC[27;<mod>;13~:任何修饰位(shift=2 / alt=3,4 / ctrl=5…)都换行。\n const match = /^(?:\\x1b)?\\[27;(\\d+);13~$/.exec(input);\n if (!match) return null;\n return 'newline';\n}\n\nexport function isSingleLineSlashCommand(value: string): boolean {\n const text = value.trim();\n return text.startsWith('/') && !text.includes('\\n');\n}\n\nexport function draftFromSendCommandLine(value: string, cursor: number): string | null {\n const lines = value.split('\\n');\n const { row } = locate(lines, cursor);\n if ((lines[row] ?? '').trim() !== '/send') return null;\n const next = lines.filter((_, i) => i !== row).join('\\n').trim();\n return next.length > 0 ? next : '';\n}\n\n/** 光标线性偏移 → (行, 列)。 */\nfunction locate(lines: string[], cursor: number): { row: number; col: number } {\n let rest = cursor;\n for (let r = 0; r < lines.length; r++) {\n if (rest <= lines[r]!.length) return { row: r, col: rest };\n rest -= lines[r]!.length + 1;\n }\n return { row: lines.length - 1, col: lines[lines.length - 1]!.length };\n}\n\n/** (行, 列) → 光标线性偏移。 */\nfunction offsetOf(lines: string[], row: number, col: number): number {\n let off = 0;\n for (let r = 0; r < row; r++) off += lines[r]!.length + 1;\n return off + col;\n}\n","/**\n * ADR-129 · Ink REPL 的历史块模型。\n *\n * 聊天历史 = append-only 的 Block 列表(渲染进 Ink `<Static>`,一旦落块永不重绘——\n * 这是 Ink 对滚动长输出的标准解法,也天然杜绝手搓时代的渲染竞态)。\n * 动态区(流式正文/spinner/交互卡/输入框)不在此列,由 App 的 state 直接驱动。\n */\n\nexport type Block =\n | { kind: 'banner'; text: string }\n | { kind: 'user'; text: string; attachments?: Array<{ fileName: string; documentId: string }> }\n /** 已完成的 assistant 正文段(marked-terminal 渲染后的 ANSI 字符串,与单发模式渲染一致)。 */\n | { kind: 'assistant'; ansi: string }\n | { kind: 'thinking'; seconds: number; chars: number }\n | { kind: 'tool'; name: string; preview: string; success: boolean; durMs: number; nextSteps?: string[] }\n | { kind: 'delegationStart'; agentName: string }\n | { kind: 'delegationEnd'; durMs?: number; toolCount?: number; failCount?: number; success: boolean; nextSteps?: string[] }\n | { kind: 'steering'; text: string }\n | { kind: 'contentPart'; label: string; detail?: string }\n | { kind: 'interactionNote'; tone: 'ok' | 'fail' | 'info'; text: string }\n | { kind: 'resume'; conversationId: string; totalRounds: number; turns: Array<{ role: 'user' | 'assistant'; text: string }> }\n | { kind: 'done'; durMs: number; traceId: string | null; conversationId: string; totalTokens?: number; inputTokens?: number; outputTokens?: number; toolCount?: number; delegationCount?: number }\n | { kind: 'interrupted'; reason: string }\n | { kind: 'error'; text: string };\n\n/** 动态区状态:一轮对话进行中的实时投影。 */\nexport interface StreamingState {\n /** 当前累积的流式正文(原文,落块时再过 marked 渲染)。 */\n text: string;\n /** spinner 文案;null = 不转。 */\n spinner: string | null;\n /** thinking 进行中起始时刻(ms);null = 无。 */\n thinkingSince: number | null;\n active: boolean;\n}\n\nexport const IDLE_STREAMING: StreamingState = {\n text: '',\n spinner: null,\n thinkingSince: null,\n active: false,\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport * as fs from 'node:fs/promises';\nimport { Box, Static, Text, useApp, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport SelectInput from 'ink-select-input';\nimport Spinner from 'ink-spinner';\nimport { marked } from 'marked';\nimport {\n sendMessageAndStream,\n createConversation,\n saveConversationState,\n parseInteractionRequest,\n parseInteractionResolved,\n buildConfirm,\n buildReject,\n buildAnswer,\n fetchConversationTimeline,\n buildResumeSummary,\n replHistoryFile,\n DEFAULT_AGENT_ID,\n uploadDocument,\n type AttachmentMeta,\n type WsClient,\n type HcmClient,\n type InteractionRequest,\n} from '@hcmai/sdk';\nimport { extractAtFileTokens, extractInlineFilePaths, isBareFilePath } from '../utils/attachment-args';\nimport { filterSlashCommands, resolveSlashKey, wrapIndex } from '../utils/slash';\nimport { agentDisplayName } from '../streaming/TerminalRenderer';\nimport { StreamPresenter } from '../streaming/StreamPresenter';\nimport type { TerminalRenderer } from '../streaming/TerminalRenderer';\nimport { createInkRendererBridge } from './InkRendererBridge';\nimport { BlockView } from './BlockView';\nimport { MultilineInput } from './MultilineInput';\nimport { IDLE_STREAMING, type Block, type StreamingState } from './types';\n\nexport interface ReplAppProps {\n ws: WsClient;\n client: HcmClient;\n agentId: string;\n env: string;\n identity: string;\n tenantId: string;\n initialConversationId?: string;\n autoApprove?: boolean;\n}\n\ntype Interaction = { req: InteractionRequest; respond: (d: Decision) => void };\ntype Decision =\n | { kind: 'confirm'; remember?: boolean }\n | { kind: 'reject'; feedback?: string }\n | { kind: 'answer'; text?: string; choiceIndex?: number };\n\n/**\n * ADR-129 · hcm chat REPL 的 Ink 主组件。\n *\n * 终端唯一 owner:历史块进 `<Static>`(append-only 永不重绘),动态区(流式正文/\n * spinner/交互卡/输入框)由 state 驱动——手搓时代的 stdin 共存/渲染竞态范畴病在此\n * 模型下不存在。语义层(reducer/presenter/iterator)经 InkRendererBridge 全复用。\n */\nexport function ReplApp(props: ReplAppProps): React.JSX.Element {\n const { exit } = useApp();\n const [blocks, setBlocks] = useState<Block[]>([{\n kind: 'banner',\n text: `HCM Chat · Enter 发送 · Shift+Enter 换行 · /help 帮助`,\n }]);\n const [streaming, setStreaming] = useState<StreamingState>(IDLE_STREAMING);\n const [interaction, setInteraction] = useState<Interaction | null>(null);\n const [input, setInput] = useState('');\n // slash 命令菜单当前高亮项(对标 Claude Code:默认选中第一个匹配项,回车直接执行)。\n const [slashIndex, setSlashIndex] = useState(0);\n const [busy, setBusy] = useState(false);\n const [conversationId, setConversationId] = useState<string | undefined>(props.initialConversationId);\n const [conversationMode, setConversationMode] = useState<'new' | 'resume' | 'chat'>(\n props.initialConversationId ? 'resume' : 'new',\n );\n // 会话累计 token(输入区底部状态栏显示,对标 Claude Code 的 context 概览)。\n const [sessionTokens, setSessionTokens] = useState(0);\n // issue #64:待发附件(/attach 或裸路径暂存;@路径 在提交时直接上传合并)。\n const [pendingAttachments, setPendingAttachments] = useState<AttachmentMeta[]>([]);\n\n const convRef = useRef<string | undefined>(props.initialConversationId);\n const cancelRef = useRef<((reason: string) => void) | null>(null);\n const replayedRef = useRef(false);\n // 会话级免询问:CONFIRM 卡选「是,本会话不再询问」后置 true,后续 CONFIRM 自动批准\n //(对标 Claude Code「Yes, and don't ask again this session」,纯客户端,不动后端)。\n const sessionAutoApproveRef = useRef(false);\n\n // 输入历史 ↑↓ 回填(readline 时代的 history file 平移,跨进程持久)。\n const historyRef = useRef<string[]>([]);\n const histIdxRef = useRef(-1);\n const draftRef = useRef('');\n useEffect(() => {\n void fs.readFile(replHistoryFile(props.env), 'utf-8')\n .then((c) => { historyRef.current = c.split('\\n').filter(Boolean); })\n .catch(() => { /* 首次无历史 */ });\n }, [props.env]);\n\n // busy 实时计时(动态 hint「esc 打断 · X.Xs」)。\n const [elapsedMs, setElapsedMs] = useState(0);\n useEffect(() => {\n if (!busy) return;\n const t0 = Date.now();\n setElapsedMs(0);\n const timer = setInterval(() => setElapsedMs(Date.now() - t0), 500);\n return () => clearInterval(timer);\n }, [busy]);\n\n const appendBlock = useCallback((b: Block) => setBlocks((prev) => [...prev, b]), []);\n const updateStreaming = useCallback(\n (patch: Partial<StreamingState>) => setStreaming((prev) => ({ ...prev, ...patch })),\n []);\n\n useInput((_input, key) => {\n // interaction 激活时 Esc 交给 InteractionView 处理(=拒绝该交互),不在此硬中断整轮。\n if (key.escape && cancelRef.current && !interaction) { cancelRef.current('user-esc'); return; }\n });\n\n // 历史回填(↑↓ 的按键归 MultilineInput,仅光标到达首/末行边界时回调到这里)。\n const historyUp = useCallback(() => {\n const hist = historyRef.current;\n if (hist.length === 0) return;\n if (histIdxRef.current === -1) { draftRef.current = input; histIdxRef.current = hist.length; }\n histIdxRef.current = Math.max(0, histIdxRef.current - 1);\n setInput(hist[histIdxRef.current] ?? '');\n }, [input]);\n const historyDown = useCallback(() => {\n if (histIdxRef.current === -1) return;\n const hist = historyRef.current;\n histIdxRef.current += 1;\n if (histIdxRef.current >= hist.length) {\n histIdxRef.current = -1;\n setInput(draftRef.current);\n } else {\n setInput(hist[histIdxRef.current] ?? '');\n }\n }, []);\n\n const runTurn = useCallback(async (prompt: string, attachments?: AttachmentMeta[]) => {\n setBusy(true);\n updateStreaming({ active: true, spinner: '思考中…' });\n const bridge = createInkRendererBridge({ appendBlock, updateStreaming }, props.client.endpoint);\n // 续聊回放(刀⑤平移):首轮且续接既有会话时回显最近轮摘要。\n if (!replayedRef.current && convRef.current) {\n replayedRef.current = true;\n const items = await fetchConversationTimeline(props.client.raw(), convRef.current);\n const summary = items ? buildResumeSummary(convRef.current, items) : null;\n if (summary) bridge.showResumeContext(summary);\n }\n try {\n // 长开 REPL 的连接自愈:后端重启/网络闪断后旧 WS 已死,发消息前重建(no-op 若健康)。\n await props.ws.ensureConnected();\n if (!convRef.current) {\n const conv = await createConversation(props.client.raw(), props.agentId);\n convRef.current = conv.id;\n setConversationId(conv.id);\n setConversationMode('chat');\n }\n const presenter = new StreamPresenter(bridge as unknown as TerminalRenderer, {\n showToolCalls: true,\n output: 'text',\n });\n const handle = await sendMessageAndStream(props.ws, prompt, {\n conversationId: convRef.current,\n agentId: props.agentId,\n holdUntilInteractionTerminal: true,\n attachments,\n });\n convRef.current = handle.conversationId;\n setConversationId(handle.conversationId);\n cancelRef.current = (reason) => handle.cancel(reason);\n\n const off = handle.onControl((ev) => {\n if (ev.type === 'control.interaction.resolved') {\n const r = parseInteractionResolved(ev.payload);\n if (r.phase === 'RESUMED') bridge.interactionResumed();\n else if (r.phase === 'TERMINAL') bridge.interactionTerminal((ev.payload.status as string) || undefined);\n return;\n }\n if (ev.type !== 'control.interaction.request') return;\n const req = parseInteractionRequest(ev.payload);\n if ((props.autoApprove || sessionAutoApproveRef.current) && req.kind === 'CONFIRM') {\n bridge.autoApproved(req.toolName, req.summary);\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n return;\n }\n setInteraction({\n req,\n respond: (d) => {\n setInteraction(null);\n if (d.kind === 'confirm') {\n if (d.remember) sessionAutoApproveRef.current = true;\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n } else if (d.kind === 'reject') {\n const reason = d.feedback?.trim();\n handle.sendCommand(buildReject(req.interactionId, handle.conversationId, reason || undefined));\n } else {\n handle.sendCommand(buildAnswer(req.interactionId, handle.conversationId, d.text ?? '', d.choiceIndex));\n }\n },\n });\n });\n\n const t0 = Date.now();\n try {\n const result = await presenter.consume(handle.events);\n const stats = presenter.completionStats;\n if (result.status === 'completed') {\n bridge.showCompleted(Date.now() - t0, result.traceId, convRef.current ?? '', presenter.tokenCount || undefined, stats);\n }\n if (presenter.tokenCount) setSessionTokens((prev) => prev + presenter.tokenCount);\n if (convRef.current) {\n await saveConversationState(props.env, {\n lastConversationId: convRef.current,\n updatedAt: new Date().toISOString(),\n });\n }\n } finally {\n off();\n }\n } catch (e) {\n appendBlock({ kind: 'error', text: (e as Error).message ?? String(e) });\n } finally {\n cancelRef.current = null;\n setBusy(false);\n setStreaming(IDLE_STREAMING);\n setInteraction(null);\n }\n }, [appendBlock, updateStreaming, props]);\n\n /** issue #64:上传单个本地文件为附件,失败转 banner 提示。 */\n const uploadOne = useCallback(async (filePath: string): Promise<AttachmentMeta | null> => {\n try {\n const meta = await uploadDocument(props.client.raw(), filePath);\n return meta;\n } catch (e) {\n appendBlock({ kind: 'banner', text: `📎 上传失败 ${filePath}: ${(e as Error).message}` });\n return null;\n }\n }, [appendBlock, props.client]);\n\n const onSubmit = useCallback((raw: string) => {\n const line = raw.trim();\n setInput('');\n if (!line) return;\n if (line === '/exit' || line === '/quit') { exit(); return; }\n if (line === '/send') return;\n if (line === '/help') {\n appendBlock({ kind: 'banner', text: 'Enter 发送 · Shift/Ctrl+Enter 换行 · /send 兜底发送 · /new 新会话 · /attach <路径> 附件 · /exit 退出' });\n return;\n }\n if (line === '/new') {\n convRef.current = undefined;\n setConversationId(undefined);\n setConversationMode('new');\n replayedRef.current = false;\n appendBlock({ kind: 'banner', text: '· 已切换:下一条消息将开启新会话' });\n return;\n }\n // issue #64 · /attach <path>:上传并暂存,随下一条消息发送。\n if (line.startsWith('/attach')) {\n const arg = line.slice('/attach'.length).trim().replace(/^[\"']|[\"']$/g, '');\n if (!arg) { appendBlock({ kind: 'banner', text: '用法: /attach <本地文件路径>' }); return; }\n void (async () => {\n const meta = await uploadOne(arg);\n if (meta) setPendingAttachments((prev) => [...prev, meta]);\n })();\n return;\n }\n // issue #64 · 粘贴/输入裸文件路径:暂存为待发附件(D4 一期)。\n const bare = isBareFilePath(line);\n if (bare) {\n void (async () => {\n const meta = await uploadOne(bare);\n if (meta) {\n setPendingAttachments((prev) => [...prev, meta]);\n appendBlock({ kind: 'banner', text: `📎 已暂存附件 ${meta.fileName},输入消息后一起发送` });\n }\n })();\n return;\n }\n // 历史入档(内存 + 持久文件,与 readline 时代同一文件跨版本互通;\n // 文件按行存——多行消息落盘时换行折叠为空格,保持单行格式兼容)。\n historyRef.current.push(line);\n histIdxRef.current = -1;\n void fs.appendFile(replHistoryFile(props.env), line.replace(/\\n/g, ' ') + '\\n').catch(() => { /* 忽略 */ });\n // issue #64 · @路径 内联引用:提交时解析、上传、从文本移除(Claude Code @ mention 映射)。\n // 叠加:无 @ 前缀的行内裸绝对路径(粘贴/剪贴板路径 + 同行文字)也识别上传——否则裸路径\n // 漏进消息文本传给 LLM 当散文 → 幻觉成别的路径(实测 bug)。\n void (async () => {\n const at = extractAtFileTokens(line);\n const inline = extractInlineFilePaths(at.cleaned);\n const cleaned = inline.cleaned;\n const paths = [...at.paths, ...inline.paths];\n const uploaded: AttachmentMeta[] = [];\n for (const fp of paths) {\n const meta = await uploadOne(fp);\n if (meta) uploaded.push(meta);\n }\n const attachments = [...pendingAttachments, ...uploaded];\n setPendingAttachments([]);\n const text = cleaned || (attachments.length ? '请处理这些附件' : line);\n appendBlock({ kind: 'user', text, attachments: attachments.length ? attachments : undefined });\n await runTurn(text, attachments.length ? attachments : undefined);\n })();\n }, [appendBlock, exit, runTurn, uploadOne, pendingAttachments, props.env]);\n\n // 流式正文渐进 markdown(Ink 重渲染免费——手搓 append-only 终端做不到的能力):\n // 动态区每帧对未完段做 marked 渲染;半截标记渲染异常时回退原文。\n const streamingAnsi = useMemo(() => {\n if (!streaming.text) return '';\n try {\n return (marked.parse(streaming.text) as string).replace(/\\n+$/, '');\n } catch {\n return streaming.text;\n }\n }, [streaming.text]);\n\n // slash 命令菜单(输入 / 开头、未进参数区时浮现,按前缀过滤)。\n const slashItems = filterSlashCommands(input);\n const slashOpen = slashItems.length > 0;\n const slashSelected = slashOpen ? wrapIndex(slashIndex, slashItems.length) : 0;\n // 命令列右补齐到等宽,描述列对齐(对标 Claude Code 的命令面板)。\n const slashColWidth = slashOpen ? Math.max(...slashItems.map((s) => s.cmd.length)) + 2 : 0;\n\n // 菜单打开时拦截方向键/Tab/回车:↑↓ 切换高亮、Tab 补全、回车补全或直接执行\n //(无参命令直接提交,带参命令仅补全命令名留空格)。返回 true 则输入框不再处理本次按键。\n const handleSlashKey = (_input: string, key: { upArrow?: boolean; downArrow?: boolean; tab?: boolean; return?: boolean }): boolean => {\n if (!slashOpen) return false;\n const action = resolveSlashKey(key, slashItems[slashSelected]);\n switch (action.type) {\n case 'move':\n setSlashIndex(wrapIndex(slashSelected + action.delta, slashItems.length));\n return true;\n case 'complete':\n setSlashIndex(0);\n setInput(action.text);\n return true;\n case 'execute':\n onSubmit(action.text);\n return true;\n default:\n return false;\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Static items={blocks}>\n {(b, i) => <BlockView key={i} block={b} />}\n </Static>\n\n {streamingAnsi ? (\n <Box marginTop={0}><Text>{streamingAnsi}</Text></Box>\n ) : null}\n\n {streaming.spinner ? (\n <Box>\n <Text color=\"gray\"><Spinner type=\"dots\" /> {streaming.spinner}</Text>\n <Text dimColor> esc 打断 · {(elapsedMs / 1000).toFixed(1)}s</Text>\n </Box>\n ) : busy ? (\n <Box><Text dimColor>esc 打断 · {(elapsedMs / 1000).toFixed(1)}s</Text></Box>\n ) : null}\n\n {interaction ? (\n <InteractionView interaction={interaction} />\n ) : !busy ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <ComposerRule />\n <AttachmentChips attachments={pendingAttachments} />\n <MultilineInput\n value={input}\n onChange={(v) => {\n setInput(v);\n // 改写命令文本即把高亮回到第一个匹配项(方向键导航不走 onChange,故选择不丢)。\n if (v.startsWith('/')) setSlashIndex(0); else histIdxRef.current = -1;\n }}\n onSubmit={onSubmit}\n placeholder=\"问 Moirai…\"\n onEscapeClear={() => setPendingAttachments([])}\n onHistoryUp={historyUp}\n onHistoryDown={historyDown}\n captureKey={handleSlashKey}\n />\n {/* 底线:与顶线对称把输入框上下框住,与下方状态栏/slash 菜单分隔(对标 Claude Code) */}\n <ComposerRule />\n {slashOpen ? (\n <Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n {slashItems.map(({ cmd, desc }, i) => {\n const on = i === slashSelected;\n return (\n <Box key={cmd}>\n <Text color={on ? 'cyan' : undefined} bold={on} dimColor={!on}>\n {cmd.padEnd(slashColWidth)}\n </Text>\n <Text dimColor={!on}>{desc}</Text>\n </Box>\n );\n })}\n </Box>\n ) : (\n <StatusBar\n env={props.env} identity={props.identity} tenantId={props.tenantId}\n agentId={props.agentId}\n conversationId={conversationId}\n conversationMode={conversationMode}\n sessionTokens={sessionTokens}\n />\n )}\n </Box>\n ) : null}\n </Box>\n );\n}\n\n/** 输入框上下分隔线(同一组件,顶/底各用一次,把输入框框住,对标 Claude Code 输入区)。 */\nfunction ComposerRule(): React.JSX.Element {\n return (\n <Box\n width=\"100%\"\n borderStyle=\"single\" borderColor=\"white\"\n borderTop borderBottom={false} borderLeft={false} borderRight={false}\n />\n );\n}\n\nfunction AttachmentChips({ attachments }: { attachments: AttachmentMeta[] }): React.JSX.Element | null {\n if (attachments.length === 0) return null;\n return (\n <Box paddingX={1}>\n <Text dimColor>\n attachments {attachments.map((a) => shortLabel(a.fileName, 24)).join(' · ')}\n </Text>\n </Box>\n );\n}\n\n/**\n * 输入框下方常驻环境信息栏(对标 Claude Code 底部状态行):\n * 左侧身份上下文(env · identity · tenant · agent),右侧会话动态(短 id · 累计 token)。\n * slash 菜单浮现时让位(与 Claude Code 同行为),避免底部跳动。\n */\nfunction StatusBar(props: {\n env: string; identity: string; tenantId: string;\n agentId: string; conversationId?: string; conversationMode: 'new' | 'resume' | 'chat'; sessionTokens: number;\n}): React.JSX.Element {\n // identity 命名约定常带「@env」后缀(如 suitj@bay4),与 env 段重复时去掉。\n const identity = props.identity.endsWith(`@${props.env}`)\n ? props.identity.slice(0, -props.env.length - 1)\n : props.identity;\n const left = [\n props.env,\n identity,\n `t${props.tenantId}`,\n agentLabel(props.agentId),\n ].join(' · ');\n const right = [\n conversationStatus(props.conversationMode, props.conversationId),\n `${fmtTokens(props.sessionTokens)} tok`,\n 'Enter 发送',\n ];\n return (\n <Box paddingX={1} width=\"100%\" justifyContent=\"space-between\">\n <Text dimColor>{left}</Text>\n <Text dimColor>{right.join(' · ')}</Text>\n </Box>\n );\n}\n\n/** 状态栏 token 数:1234 → 1.2k(千位以上压缩,避免状态栏溢出换行)。 */\nfunction fmtTokens(n: number): string {\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n\nfunction conversationStatus(mode: 'new' | 'resume' | 'chat', conversationId?: string): string {\n if (!conversationId || mode === 'new') return 'new chat';\n const shortId = shortConversationId(conversationId);\n if (mode === 'resume') return `resume ${shortId}`;\n return `chat ${shortId}`;\n}\n\nfunction shortConversationId(id: string): string {\n return id.length > 14 ? `…${id.slice(-12)}` : id;\n}\n\nfunction shortLabel(value: string, max: number): string {\n return value.length > max ? value.slice(0, Math.max(0, max - 1)) + '…' : value;\n}\n\n/**\n * 状态栏 agent 标签:key 形态走 agentDisplayName;UUID 形态没有本地名册——\n * 默认主 agent 显示 Moirai(与 DEFAULT_AGENT_ID 同一常量层级),其余缩短为尾 4 位。\n */\nfunction agentLabel(agentId: string): string {\n if (agentId === DEFAULT_AGENT_ID) return 'Moirai';\n if (/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(agentId)) return `agent …${agentId.slice(-4)}`;\n return agentDisplayName(agentId);\n}\n\n/** 来源行:agentPath ≥2 段时显示「来自 Moirai › HR 专家」(与 Web originLine 同语义)。 */\nfunction originLine(path: string | undefined): string | null {\n const segs = (path ?? '').split('.').filter(Boolean);\n if (segs.length < 2) return null;\n return `来自 ${segs.map((k) => agentDisplayName(k)).join(' › ')}`;\n}\n\nexport function InteractionView({ interaction }: { interaction: Interaction }): React.JSX.Element {\n const { req, respond } = interaction;\n const [freeText, setFreeText] = useState('');\n const [freeMode, setFreeMode] = useState(false); // ASK「自己输入」\n const [rejectMode, setRejectMode] = useState(false); // CONFIRM「否,并告诉它怎么改」\n const origin = originLine(req.originAgentPath);\n\n const choices = (req.choices ?? []).map((c, i) => ({\n label: typeof c === 'string' ? c : String((c as Record<string, unknown>).label ?? (c as Record<string, unknown>).value ?? JSON.stringify(c)),\n value: String(i),\n }));\n\n // 正在显示自由文本输入框时,数字键/Esc 让位给 TextInput(避免吃掉输入)。\n const askFreeText = req.kind === 'ASK' && (choices.length === 0 || freeMode);\n const textInputActive = rejectMode || askFreeText;\n\n // 数字键直选 + Esc 取消(对标 Claude Code 的 1/2/3 + esc)。\n useInput((input, key) => {\n if (textInputActive) return;\n if (key.escape) { respond({ kind: 'reject' }); return; }\n if (req.kind === 'CONFIRM') {\n if (input === '1') respond({ kind: 'confirm' });\n else if (input === '2') respond({ kind: 'confirm', remember: true });\n else if (input === '3') setRejectMode(true);\n } else {\n const n = Number(input);\n if (Number.isInteger(n) && n >= 1 && n <= choices.length) respond({ kind: 'answer', text: choices[n - 1]!.label, choiceIndex: n - 1 });\n else if (input === String(choices.length + 1)) setFreeMode(true);\n }\n });\n\n if (req.kind === 'CONFIRM') {\n const hi = req.riskLevel === 'HIGH' || req.riskLevel === 'CRITICAL';\n const args = req.argsPreview\n ? Object.entries(req.argsPreview).map(([k, v]) => `${k}=${String(v)}`).join(' · ')\n : '';\n if (rejectMode) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" borderDimColor paddingX={1}>\n <Text>告诉它怎么改(直接回车=仅取消):</Text>\n <Box>\n <Text color=\"cyan\">{'› '}</Text>\n <TextInput value={freeText} onChange={setFreeText} onSubmit={(v) => respond({ kind: 'reject', feedback: v })} />\n </Box>\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={hi ? 'yellow' : 'gray'} borderDimColor={!hi} paddingX={1}>\n <Text bold color={hi ? 'yellow' : undefined}>{hi ? '⚠ ' : '⏺ '}{req.toolName ? `${req.toolName} · ` : ''}{req.summary}</Text>\n {origin ? <Text dimColor>{origin}</Text> : null}\n {args ? <Text color=\"gray\">{args}</Text> : null}\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>是否执行?{hi ? '(高风险)' : ''}</Text>\n <SelectInput\n items={[\n { label: '1. 是,执行', value: 'yes' },\n { label: '2. 是,本会话内同类不再询问', value: 'yes-all' },\n { label: '3. 否,并告诉它怎么改', value: 'no' },\n ]}\n onSelect={(item) => {\n if (item.value === 'yes') respond({ kind: 'confirm' });\n else if (item.value === 'yes-all') respond({ kind: 'confirm', remember: true });\n else setRejectMode(true);\n }}\n />\n <Text dimColor>1/2/3 直选 · esc 取消</Text>\n </Box>\n </Box>\n );\n }\n\n // ASK\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" borderDimColor paddingX={1}>\n <Text color=\"cyan\">? {req.question ?? req.summary}</Text>\n {origin ? <Text dimColor>{origin}</Text> : null}\n {!askFreeText ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <SelectInput\n items={[\n ...choices.map((c, i) => ({ label: `${i + 1}. ${c.label}`, value: c.value })),\n { label: `${choices.length + 1}. 自己输入…`, value: '__free__' },\n ]}\n onSelect={(item) => {\n if (item.value === '__free__') { setFreeMode(true); return; }\n const idx = Number(item.value);\n respond({ kind: 'answer', text: choices[idx]?.label, choiceIndex: idx });\n }}\n />\n <Text dimColor>1-{choices.length + 1} 直选</Text>\n </Box>\n ) : (\n <Box>\n <Text color=\"cyan\">{'› '}</Text>\n <TextInput value={freeText} onChange={setFreeText} onSubmit={(v) => respond({ kind: 'answer', text: v.trim() })} />\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { HcmClient, WsClient, DEFAULT_AGENT_ID } from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\nimport type { ChatArgs } from '../commands/chat';\nimport { ReplApp } from './App';\n\n/**\n * ADR-129 · Ink REPL 入口:会话装配(auth/WS/conversation 续接)后渲染 ReplApp。\n * 取代手搓 readline 版 chat-repl.ts(delete-on-supersede)。\n */\nexport async function runInkRepl(args: ChatArgs): Promise<void> {\n // Composer 快捷键(对标主流聊天输入区):开 xterm modifyOtherKeys=1,\n // 支持的终端(Ghostty/iTerm2/WezTerm/xterm.js)会把 Shift/Ctrl/Option+Enter 编码为\n // 独立序列;MultilineInput 据此实现 Enter 发送、Shift/Ctrl/Option+Enter 换行。mode 1 只影响\n // 本无编码的修饰组合,Esc / Ctrl+C / 裸 Enter 编码不变(裸 Enter 即发送)。任何退出路径都还原。\n if (process.stdout.isTTY) {\n process.stdout.write('\\x1b[>4;1m');\n process.on('exit', () => process.stdout.write('\\x1b[>4;0m'));\n }\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const ws = new WsClient({\n endpoint: ctx.endpoint.replace(/^http/, 'ws') + '/ws/conversation',\n getAccessToken: () => client.getAccessToken(),\n onTokenExpiring: () => client.handleRefresh(),\n });\n await ws.connect();\n\n // 会话续接:显式 --resume / legacy --conversation > 首条消息时新建。\n let initialConversationId: string | undefined;\n if (args.resume && args.conversation) {\n throw new Error('--resume 和 --conversation 不能同时使用;新命令请用 --resume <conversationId>');\n }\n if (args.resume === 'NEW') {\n throw new Error('--resume 需要既存 conversationId;新会话请直接省略 --resume');\n }\n if (args.resume) {\n initialConversationId = args.resume;\n } else if (args.conversation && args.conversation !== 'NEW') {\n initialConversationId = args.conversation;\n }\n\n const { waitUntilExit } = render(\n React.createElement(ReplApp, {\n ws,\n client,\n agentId: args.agent ?? DEFAULT_AGENT_ID,\n env: ctx.env,\n identity: ctx.identity,\n tenantId: String(ctx.tenantId),\n initialConversationId,\n autoApprove: !!args.autoApprove,\n }),\n );\n await waitUntilExit();\n await ws.close();\n process.exit(0);\n } catch (e) {\n exitWithError(e);\n }\n}\n","/**\n * control-prompt — 把 InteractionRequest 解析成一个决策(confirm/reject/answer/error)。\n * 纯决策逻辑:readLine 注入便于测;TTY 检测 + auto-approve fallback。\n * 实际从 process.stdin 读取的 readline 工具在 commands 层(Task 9)注入,本模块不碰 stdin。\n */\nimport type { InteractionRequest } from '@hcmai/sdk';\n\nexport type InteractionDecision =\n | { decision: 'confirm' }\n | { decision: 'reject'; reason?: string }\n | { decision: 'answer'; answer: string; choiceIndex?: number }\n | { decision: 'error'; reason: string };\n\nexport interface ResolveOpts {\n isTty: boolean;\n autoApprove: boolean;\n /** --on-confirm 解析结果;优先级最高(> autoApprove > TTY readLine > 非 TTY 默认 reject)。 */\n onConfirm?: { decision: 'approve' } | { decision: 'reject'; reason?: string };\n /** --on-ask 应答文本;命中 choices 精确文本时回填 choiceIndex。 */\n onAsk?: string;\n readLine: (prompt?: string) => Promise<string>;\n}\n\nexport async function resolveInteraction(\n req: InteractionRequest,\n opts: ResolveOpts,\n): Promise<InteractionDecision> {\n if (req.kind === 'CONFIRM') {\n if (opts.onConfirm) {\n return opts.onConfirm.decision === 'approve'\n ? { decision: 'confirm' }\n : { decision: 'reject', reason: opts.onConfirm.reason };\n }\n if (opts.autoApprove) return { decision: 'confirm' };\n if (!opts.isTty) return { decision: 'reject', reason: 'non-interactive' };\n const ans = (await opts.readLine(' › ')).trim();\n if (ans === '1') return { decision: 'confirm' };\n return { decision: 'reject', reason: ans === '2' ? undefined : `unrecognized:${ans}` };\n }\n // ASK\n if (opts.onAsk !== undefined) {\n const idx = req.choices?.indexOf(opts.onAsk) ?? -1;\n return idx >= 0\n ? { decision: 'answer', answer: opts.onAsk, choiceIndex: idx }\n : { decision: 'answer', answer: opts.onAsk };\n }\n if (!opts.isTty) return { decision: 'error', reason: 'ASK requires interactive TTY (use --on-ask)' };\n const ans = (await opts.readLine(' › ')).trim();\n if (req.choices?.length) {\n const idx = Number(ans) - 1;\n const choice = Number.isInteger(idx) ? req.choices[idx] : undefined;\n if (choice !== undefined) {\n return { decision: 'answer', answer: choice, choiceIndex: idx };\n }\n return { decision: 'answer', answer: ans }; // 非合法编号 → 当自由文本\n }\n return { decision: 'answer', answer: ans };\n}\n","import * as readline from 'node:readline';\n\n/**\n * 从 stdin 读一行——控制通道 confirm/ask 内联交互用(resolveInteraction 的 readLine 注入实现)。\n * 仅在 TTY 交互场景调用;非 TTY 的 fallback 由 resolveInteraction 决策(不会走到这里)。\n */\nexport function readLineFromStdin(prompt = ''): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n","import { Command } from 'commander';\nimport { migrateLegacyProfiles } from '@hcmai/sdk';\nimport { CLI_VERSION } from './package-version';\nimport { loginCommand, logoutCommand } from './commands/login';\nimport {\n configListDeprecated,\n configShowDeprecated,\n configSetProfileDeprecated,\n configDeleteDeprecated,\n configSet,\n configGet,\n} from './commands/config';\nimport { queryCommand } from './commands/query';\nimport { actionCommand } from './commands/action';\nimport { createCommand } from './commands/create';\nimport { updateCommand } from './commands/update';\nimport {\n settingGetCommand,\n settingSetCommand,\n settingResetCommand,\n} from './commands/setting';\nimport { versionCommand } from './commands/version';\nimport { deleteCommand } from './commands/delete';\nimport { importCommand } from './commands/import';\nimport { describeCommand } from './commands/describe';\nimport { chatCommand } from './commands/chat';\nimport { downloadCommand } from './commands/download';\nimport { traceCommand } from './commands/trace';\nimport { cacheStatsCommand, cacheClearCommand, cacheClearMetaCommand } from './commands/cache';\nimport { uploadCommand } from './commands/upload';\nimport {\n skillsListCommand,\n skillsShowCommand,\n skillsInstallCommand,\n skillsSyncCommand,\n skillsUpdateCommand,\n} from './commands/skills';\nimport { tenantBootstrapCommand } from './commands/tenant';\nimport {\n metaListCommand,\n metaGetCommand,\n metaSetCommand,\n metaDeleteCommand,\n} from './commands/meta';\nimport {\n removedMiniCommand,\n workspaceAddMiniCommand,\n workspaceActiveCommand,\n workspaceBindCommand,\n workspaceCreateCommand,\n workspaceListCommand,\n workspacePreviewCommand,\n workspacePullCommand,\n workspacePushCommand,\n workspaceStatusCommand,\n workspaceValidateCommand,\n workspaceVerifyCommand,\n} from './commands/workspace';\nimport {\n envList,\n envCurrent,\n envAdd,\n envUse,\n envRemove,\n envShow,\n envEdit,\n} from './commands/env';\nimport { identityList, identityUse, identityRemove } from './commands/identity';\nimport { deliveryAssessCommand } from './commands/delivery-action-policy';\nimport { deliveryDoctorCommand } from './commands/delivery-doctor';\nimport { deliveryReconCommand, deliveryReconRoundCommand } from './commands/delivery-recon';\nimport { deliveryGate0Command } from './commands/delivery-gate0';\nimport type { OutputFormat } from '@hcmai/sdk';\nimport { skillsManifestCommand } from './commands/skills-manifest';\nimport { deliveryExecuteCommand, deliveryPrepareCommand } from './commands/delivery-execution';\nimport { userResetPasswordCommand } from './commands/user';\nimport { needsLegacyProfileMigration } from './startup';\n\nconst program = new Command();\nconst exitOnBrokenPipe = (err: NodeJS.ErrnoException): void => {\n if (err.code === 'EPIPE') process.exit(0);\n throw err;\n};\n\nprocess.stdout.on('error', exitOnBrokenPipe);\nprocess.stderr.on('error', exitOnBrokenPipe);\n\nprogram\n .name('hcm')\n .description('HCM 命令行工具 — 操作 HCM API、与 Moirai 数字员工对话、开发租户开发空间')\n .version(CLI_VERSION);\n\nprogram\n .command('login')\n .description('登录 HCM(配对码 / 用户名密码 / client_credentials / PAT 四种方式)')\n .argument('[endpoint]', '从系统页面「命令行工具」复制来的地址(配对码方式)')\n .option('--code <code>', '配对码,在系统页面用户菜单 →「命令行工具」生成')\n .option('--env <name>', '环境名(默认 activeEnv)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--name <id-name>', '自定义 identity 名(默认按 scheme 推断)')\n .option('--no-activate', 'login 完不切到该环境也不设为 default identity')\n .option('--endpoint <url>', 'HCM 后端地址,例如 http://localhost:8080')\n .option('--username <user>', '用户名(密码登录模式)')\n .option('--password <pwd>', '密码(密码登录模式)')\n .option('--client-id <id>', 'OAuth client_id(client_credentials 模式)')\n .option('--client-secret <secret>', 'OAuth client_secret(client_credentials 模式)')\n .option('--pat <token>', 'PAT 个人访问令牌(注意:会泄漏到 ps/history,建议改用 --pat-stdin)')\n .option('--pat-stdin', '从标准输入读取 PAT(推荐)')\n .option('--new-password <pwd>', '首登强制改密时的新口令(会泄漏到 history/ps,建议 --new-password-stdin)')\n .option('--new-password-stdin', '首登强制改密时从标准输入读新口令(非交互场景)')\n .option('--tenant <tenantId>', '租户 ID(默认 1)')\n .action((endpoint, opts) => loginCommand({ ...opts, endpointArg: endpoint }));\n\nprogram\n .command('logout')\n .description('登出 HCM(清除 identity 的 keychain token)')\n .option('--identity <name>', '指定 identity;默认清当前 env 的 default identity')\n .option('--env <name>', '指定 env(影响 default identity 解析)')\n .action((opts) => logoutCommand(opts));\n\nconst config = program\n .command('config')\n .description('管理全局 defaults(env/identity 用 `hcm env` / `hcm identity`)');\nconfig\n .command('list')\n .description('[deprecated] 用 `hcm env list`')\n .action(() => configListDeprecated());\nconfig\n .command('show')\n .description('[deprecated] 用 `hcm env current`')\n .action(() => configShowDeprecated());\nconfig\n .command('set-profile <name>')\n .description('[deprecated] 用 `hcm env use`')\n .action((n) => configSetProfileDeprecated(n));\nconfig\n .command('delete <name>')\n .description('[deprecated] 用 `hcm env remove --force`')\n .action((n) => configDeleteDeprecated(n));\nconfig\n .command('set <key> <value>')\n .description('设置全局 defaults,例如 `defaults.output json`')\n .action((k, v) => configSet(k, v));\nconfig\n .command('get <key>')\n .description('读取全局 defaults')\n .action((k) => configGet(k));\n\nconst env = program.command('env').description('管理 HCM 环境(多后端连接配置)');\nenv\n .command('list')\n .description('列出全部 env')\n .action(() => envList());\nenv\n .command('current')\n .description('显示当前激活的 env')\n .action(() => envCurrent());\nenv\n .command('add <name>')\n .description('新增 env')\n .option('--endpoint <url>', 'HCM 后端 URL(必填)')\n .option('--tenant <id>', '默认 tenant id', '1')\n .option('--frontend <url>', '对应前端 URL,例如 http://127.0.0.1:5176')\n .option('--force', '覆盖已存在的同名 env')\n .action((name, opts) => envAdd(name, opts));\nenv\n .command('use <name>')\n .description('切到指定 env')\n .option('--no-ping', '跳过 endpoint 健康检查')\n .action((name, opts) => envUse(name, opts));\nenv\n .command('remove <name>')\n .description('删除 env(级联清除该 env 的全部 identity 和 token)')\n .option('--force', '跳过确认提示')\n .action((name, opts) => envRemove(name, opts));\nenv\n .command('show [name]')\n .description('显示 env 详情(含该 env 下的 identity 列表)')\n .action((name) => envShow({ name }));\nenv\n .command('edit <field> <value>')\n .description('编辑 env 字段(endpoint / frontend / tenantId / defaultIdentity / defaultAgent)')\n .option('--env <name>', '目标 env 名(默认当前 activeEnv)')\n .action((field, value, opts) => envEdit(field, value, opts));\n\nconst identity = program.command('identity').description('管理 HCM 身份凭据(env 下的 identity)');\nidentity\n .command('list')\n .description('列出 identity(默认列当前 env,--env all 列全部)')\n .option('--env <name>', '过滤 env;传 \"all\" 列全部', undefined)\n .action((opts) => identityList(opts));\nidentity\n .command('use <name>')\n .description('把 identity 设为其 env 的 default identity')\n .action((name) => identityUse(name));\nidentity\n .command('remove <name>')\n .description('删除 identity(清 token + 若是 env default 则清空)')\n .action((name) => identityRemove(name));\n\nconst user = program.command('user').description('管理租户用户的专用凭据流程');\nuser\n .command('reset-password')\n .description('由 admin.system 安全重置用户密码,并使既有会话失效')\n .option('--id <uuid>', '目标用户 ID(与 --username 二选一)')\n .option('--username <user>', '目标用户名(与 --id 二选一)')\n .option('--password-stdin', '从标准输入读取新密码(Agent/受控交付必须使用)')\n .option('--no-force-change', '下次登录不强制改密(仅限已批准的隔离测试环境)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(必须具备 admin.system)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => userResetPasswordCommand(opts));\n\nconst delivery = program\n .command('delivery')\n .description('顾问交付:现场探活、风险评估与一次性受控执行合同');\ndelivery\n .command('assess')\n .description('评估一次 HCM CLI argv;Action 风控声明读取自目标 Core,用 -- 分隔被评估命令')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .allowUnknownOption(true)\n .argument('<command...>', '被评估的 HCM 子命令与参数,不包含 hcm 本身')\n .action((command, opts) => deliveryAssessCommand(command, opts));\ndelivery\n .command('doctor')\n .description('四条锚点探活:连通 / 我是谁 / configAdmin / 站在哪一层')\n .option('--env <name>', '目标环境别名')\n .option('--as <identity>', '临时换身份')\n .option('--capabilities <s>', '爬取时声明的 capability 串(会随四元组留档)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => deliveryDoctorCommand(opts));\nconst recon = delivery\n .command('recon')\n .description('爬一份可带走的基线:模型 / 字段 / 只读闸 / 依赖图 / 码表 / 可写性画像')\n .option('--env <name>', '目标环境别名')\n .option('--as <identity>', '临时换身份')\n .option('--out <dir>', '产物根目录(产物落在 <out>/recon/<租户段>/<来源段>)', '.')\n .option('--state <s>', '只读闸的 state(产品里 state 不可枚举,闸的覆盖面永远是 state-scoped)')\n .option('--model <key>', '定向重爬:只重爬这一个模型,其余沿用上一轮产物')\n .option('--capabilities <s>', '爬取时声明的 capability 串(会随四元组留档)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => deliveryReconCommand(opts));\nrecon\n .command('round')\n .description('零网络:读一份已落盘的基线,判断它是不是一轮完整跑出来的(complete/mixed/unknown)')\n .option('--dir <dir>', '产物目录(<out>/recon/<租户段>/<来源段>)', '.')\n // 🔴 **这里不声明 `--output`**,理由见 delivery-recon.ts 里那段注释(实测缺陷):\n // commander 会把子命令名之后的 `--output` 判给父命令,子命令再声明一个只会是装饰。\n .action((opts, cmd) =>\n deliveryReconRoundCommand({\n ...opts,\n output: (cmd.parent?.opts() as { output?: OutputFormat } | undefined)?.output,\n }),\n );\ndelivery\n .command('gate0')\n .description(\n '零网络:扫一份 skill 的正文,把环境事实 / 未登记的协议形态 / 产物路径挡在成稿之外',\n )\n .requiredOption('--skills <dir>', '要扫的 skill 根目录(正文 + references/ 全目录,同一判据)')\n .option('--recon <dir>', '基线产物目录(<out>/recon/<租户段>/<来源段>)', '.')\n .option(\n '--mapping <file>',\n '顾问手写的映射工件(naturalKey 这一类的唯一来源);不给 ⇒ 那一类恒绿 ⇒ rc=2',\n )\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => deliveryGate0Command(opts));\ndelivery\n .command('prepare')\n .description('把受支持的 R2 argv 与锁、运行时和变更/回滚说明绑定为短时执行计划')\n .requiredOption('--change-ref <file>', '项目 work/ 或 decisions/ 下的变更说明')\n .requiredOption('--rollback-ref <file>', '项目 work/ 或 decisions/ 下的回滚说明')\n .requiredOption('--evidence-dir <dir>', '项目 evidence/ 下的收据目录')\n .option('--project <dir>', 'HCM 顾问项目根目录', '.')\n .option('--ttl-seconds <n>', '有效期秒数(60-3600)', '900')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .allowUnknownOption(true)\n .argument('<command...>', '被绑定的 R2 HCM 子命令与参数,不包含 hcm 本身')\n .action((command, opts) => deliveryPrepareCommand(command, opts));\ndelivery\n .command('execute <planId>')\n .description('逐次批准后消费短时计划,并执行一次与计划完全相同的 R2 argv')\n .option('--project <dir>', 'HCM 顾问项目根目录', '.')\n .option('--output <fmt>', '收据输出格式:table | json | yaml', 'json')\n .allowUnknownOption(true)\n .argument('<command...>', '与 prepare 完全相同的 R2 HCM 子命令与参数')\n .action((planId, command, opts) => deliveryExecuteCommand(planId, command, opts));\n\nprogram\n .command('query <Model>')\n .description('查询 Model 列表数据(通过 ModelQueryDsl JSON 表达过滤/排序/分页)')\n .option(\n '--filter <JSON>',\n '过滤 AST(ModelQueryDsl):叶子 \\'{\"field\":\"status\",\"op\":\"eq\",\"value\":\"ACTIVE\"}\\','\n + '多条件用 \\'{\"and\":[叶子,…]}\\'。⚠️ 不接受 {\"字段\":\"值\"} 简写,schema 层会拒',\n )\n .option('--sort <JSON>', '排序条件 JSON,例如 \\'[{\"field\":\"hireDate\",\"direction\":\"desc\"}]\\'')\n .option('--fields <list>', '返回字段列表(逗号分隔),例如 name,code,email')\n .option('--keyword <text>', '全文检索关键字')\n .option('--limit <n>', '每页大小', '20')\n .option('--offset <n>', '偏移量(按 limit 自动换算 page)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((m, opts) => queryCommand(m, opts));\n\nprogram\n .command('action <Model.Action>')\n .description('调用 Model 上的 Action(业务方法),例如 Employee.regularize')\n .option('--id <id>', '目标实体 ID(object Action 必填)')\n .option('--ids <csv>', '批量 ID(逗号分隔,bulk Action 用)')\n .option('--method <method>', 'HTTP 方法:GET | POST | PUT | DELETE', 'POST')\n .option('--scope <scope>', '强制 Action scope:class | object(默认:有 --id 为 object,否则 class)')\n .option('--params <JSON>', 'Action 入参 JSON,例如 \\'{\"effectDate\":\"2026-06-01\"}\\'')\n .option('--params-file <path>', '从 UTF-8 JSON 文件读取 Action 入参(与 --params 互斥)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((spec, opts) => actionCommand(spec, opts));\n\nprogram\n .command('create <Model>')\n .description('创建一条 Model 记录(走后端完整校验)')\n .option('--data <JSON>', '记录字段 JSON,例如 \\'{\"code\":\"ORG_SALES\",\"name\":\"销售部\"}\\'')\n .option('--data-file <path>', '从 UTF-8 JSON 文件读取记录字段(与 --data 互斥)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((m, opts) => createCommand(m, opts));\n\nprogram\n .command('delete <Model>')\n .description('删除一条 Model 记录(走后端完整校验;部分 Model 会执行业务撤销)')\n .option('--id <id>', '目标实体 ID(必填)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((m, opts) => deleteCommand(m, opts));\n\nprogram\n .command('import <path>')\n .description('注入 DataPackage YAML 数据集(目录或单文件,走后端完整校验)')\n .option('--dry-run', '只跑客户端静态校验,不落库(见 spec §8 限制)')\n .option('--update-only', '已存在(按 key_field)则 PUT 更新,否则 create')\n .option('--on-error <mode>', 'stop | continue(默认 continue)', 'continue')\n .option('--report <path>', '写 JSON 注入报告(逐行结果 + key→id 映射)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((p, opts) => importCommand(p, opts));\n\nprogram\n .command('describe <Model>')\n .description('查看 Model 元数据(字段、关系、Action 列表)')\n .option('-v, --verbose', '显示字段描述与 enum 取值')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((m, opts) => describeCommand(m, opts));\n\nprogram\n .command('chat [prompt]')\n .description('与数字员工 Moirai 对话;有 prompt 单发后退出,不带 prompt 进入 REPL')\n .option('--agent <key>', '指定 agent UUID(默认使用 analyst 内置 agent)')\n .option('--resume <id>', '续接指定 conversation;不传则默认开新会话')\n .option('--conversation <id>', '[deprecated] 用 --resume 替代;传 NEW 等价默认新会话')\n .option('--list', '列出最近会话,不进入聊天')\n .option('--events [conversationId]', '只读查看指定 conversation 的 timeline/event 流;也可配 --resume <id>')\n .option('--limit <N>', '配合 --list:显示最近 N 条会话', '10')\n .option('--stream', '流式输出(默认开启,逐 token 打印 + thinking/tools 实时显示)', true)\n .option('--no-stream', '关闭流式,等 LLM 全文返回后一次性显示(CI / 脚本管道场景)')\n .option('--show-tool-calls', '展示工具调用详细参数(默认显示工具名 + 状态,verbose 时显示完整参数)', true)\n .option('--no-show-tool-calls', '完全隐藏工具调用')\n .option('--prompt-file <path>', '从文件读取 prompt 内容')\n .option('--timeout <sec>', '请求超时秒数', '60')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:text | json', 'text')\n .option('--no-markdown', '关闭流式末态 markdown 渲染(CI / pipe 友好)')\n .option('--no-thinking', '关闭 thinking 段显示')\n .option('--verbose-thinking', '展开 thinking 完整内容(默认仅单行总结)')\n .option('--verbose-tools', '展示工具调用完整参数(默认仅工具名 + 状态)')\n .option('--no-spinner', '关闭 spinner(CI 友好)')\n .option('--no-color', '关闭颜色(CI / accessibility)')\n .option('--raw', '逐行打印原始 v4/control envelope(协议示波器,不渲染)')\n .option('--auto-approve', '自动批准高风险 confirm(仍打印审计行;批量 / 非交互场景)')\n .option('--on-confirm <decision>', '非交互 confirm 决策:approve | reject | reject:<reason>(优先于 --auto-approve)')\n .option('--on-ask <answer>', '非交互 ASK 应答文本(命中 choices 时自动回填 choiceIndex)')\n .option(\n '--inject-on <spec>',\n '流中途注入命令(仅 --raw):<eventType>:<action>[:<content>],action ∈ {interrupt, steer}(P0 S-interrupt / S-steer)',\n )\n .option(\n '--regenerate-from <seq>',\n '重新生成(ADR-089):发 response.regenerate 重跑指定 assistant 段;取正整数 seq 或 last-assistant,必须配 --resume <id>',\n )\n .option(\n '--attach <path>',\n '附件:上传本地文件随消息发送(可重复;REPL 内也可用 @路径 内联或 /attach)',\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .action((prompt, opts) => chatCommand(prompt, opts));\n\nprogram\n .command('download <documentId>')\n .description('下载 HCM 文档到本地(会话附件 / 报表产物;默认 ~/Downloads/hcm)')\n .option('-o, --output <path>', '输出文件或目录')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .action((documentId, opts) => downloadCommand(documentId, opts));\n\nconst workspace = program\n .command('workspace')\n .description('开发租户开发空间文件包(mini_apps / menus / metas / scripts)');\nworkspace\n .command('list')\n .description('列出当前用户可访问的租户开发空间')\n .option('--keyword <text>', '按空间 Key / 说明 / Owner 搜索')\n .option('--limit <n>', '返回条数', '50')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceListCommand(opts));\nworkspace\n .command('active')\n .description('查看当前 HCM 开发模式激活空间,并对比本地目录绑定')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceActiveCommand(opts));\nworkspace\n .command('bind <workspaceKey>')\n .description('把当前目录绑定到一个租户开发空间')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--tenant <tenantId>', '租户 ID(默认使用 env 配置)')\n .option('--endpoint <url>', 'HCM 后端地址(默认使用 env 配置)')\n .option('--force', '强制覆盖已有绑定')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((workspaceKey, opts) => workspaceBindCommand(workspaceKey, opts));\nworkspace\n .command('create <workspaceKey>')\n .description('新建租户开发空间,并在本地目录写入 workspace 绑定')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--description <text>', '开发空间说明')\n .option('--activate', '创建后绑定为当前开发空间')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--force', '本地目录已有不同 workspace 绑定时强制覆盖')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((workspaceKey, opts) => workspaceCreateCommand(workspaceKey, opts));\nworkspace\n .command('pull')\n .description('从开发空间拉取文件包到本地;mini_apps 会生成可验证的 artifact 上下文')\n .option('--workspace <key>', '租户开发空间 key;未提供时读取本地绑定')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--force', '强制覆盖已有的本地文件')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspacePullCommand(opts));\n\nconst workspaceAdd = workspace.command('add').description('向已绑定开发空间添加 artifact');\nworkspaceAdd\n .command('mini <appCode>')\n .description('新增轻应用 artifact(写入 mini_apps/<appCode>/)')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--name <name>', '轻应用展示名')\n .option('--template <kind>', '模板:dashboard | multi-page | writable-workbench', 'dashboard')\n .option('--model <Model>', '可写工作台绑定的 Model,例如 OrgUnit')\n .option('--fields <csv|auto>', '可写工作台表单字段列表;传 auto 时根据 Model 元数据推断')\n .option('--defaults <JSON|auto>', '可写工作台创建默认值;传 auto 时根据 Model 元数据推断')\n .option(\n '--surface <surface>',\n '运行形态:embedded(嵌入业务页)| standalone(独立页)',\n 'embedded',\n )\n .option('--scopes <csv>', 'manifest.requiredScopes 列表(逗号分隔;默认随模板选择)')\n .option('--tenant <tenantId>', 'manifest.bundleObjectRef 中绑定的租户 ID')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--force', '强制覆盖已有的本地文件')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((appCode, opts) => workspaceAddMiniCommand(appCode, opts));\nworkspace\n .command('status')\n .description('查看开发空间本地 artifact 与上次 pull/push 的差异')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceStatusCommand(opts));\nworkspace\n .command('validate')\n .description('校验开发空间本地 artifact(push 前必跑)')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceValidateCommand(opts));\nworkspace\n .command('push')\n .description('把本地开发空间 artifact 推送回租户开发空间')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--dry-run', '只计算待执行的操作,不真正写远端文件')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspacePushCommand(opts));\nworkspace\n .command('preview')\n .description('打印开发空间中轻应用 artifact 的预览 URL')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--frontend <url>', '前端地址', 'http://127.0.0.1:5179')\n .option('--surface <surface>', '展示哪种形态:all | bare | standalone | embedded', 'all')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspacePreviewCommand(opts));\nworkspace\n .command('verify')\n .description(\n '一键验收:串联 validate + status + push --dry-run + preview,全程只读不写远端,push 前必跑',\n )\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,dry-run 阶段需要)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--frontend <url>', '前端地址', 'http://127.0.0.1:5179')\n .option('--surface <surface>', '预览形态:all | bare | standalone | embedded', 'all')\n .option('--smoke', '对预览入口与基础资源执行只读 HTTP GET 可达检查')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceVerifyCommand(opts));\n\nprogram\n .command('trace [traceId]')\n .description('查看 trace:不传 traceId 列最近记录,传 traceId 显示人类可读详情')\n .option('--conv <convId>', '查会话的 LLM 逐调用 trace(PG llm_call_trace,ADR-134 D2)')\n .option('--llm-calls', '把位置参当 convId 查 LLM 逐调用(等价 --conv <convId>)')\n .option('--span <N>', '查看第 N 个 span 的详情')\n .option('-n, --limit <N>', '列表模式显示条数', '10')\n .option('--events', '按事件时间线展示 spans/logs/LLM 内容摘要')\n .option('--raw', '输出原始 trace 聚合 JSON(协议/P0 调试用)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '兼容输出格式:table | json | yaml;调试原文优先用 --raw', 'table')\n .action((traceId, opts) => traceCommand(traceId ?? null, opts));\n\nprogram\n .command('mini')\n .description('已移除:请改用 hcm workspace')\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .argument('[args...]')\n .action(() => removedMiniCommand());\n\n// ─── cache:两级缓存运维(改 meta / 改数据后必用) ───────────────────────\nconst cache = program.command('cache').description('模型缓存运维(Caffeine 本地 + Redis 远程,须走 API)');\ncache\n .command('stats <Model>')\n .description('查看模型缓存统计')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => cacheStatsCommand(model, opts));\ncache\n .command('clear <Model>')\n .description('清模型实体缓存(幂等,不破坏数据)')\n .option('--id <id>', '只清单条(默认清全部)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => cacheClearCommand(model, opts));\ncache\n .command('clear-meta <Model>')\n .description('清元数据缓存(Code 级 YAML + Action 定义)——改 meta YAML 后必跑')\n .option('--type <type>', '元数据类型:list | info | view | filter | page…(默认全清)')\n .option('--state <state>', '状态变体(如 self),配合 --type')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => cacheClearMetaCommand(model, opts));\n\n// ─── upload:与 download 成对,报表/套打/导入模板的入口 ──────────────────\nprogram\n .command('upload <file>')\n .description('上传本地文件到 HCM 文档服务,返回 documentId')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .option(\n '--category <name>',\n '存储分类(须是目标环境里真实存在的分类,如 flex-report / template / attachment)',\n 'attachment',\n )\n .action((file, opts) => uploadCommand(file, opts));\n\n// ─── tenant:交付旅程第一步,唯一「无租户无用户」时可用的写入口 ──────────\nconst tenant = program.command('tenant').description('租户开通与生命周期');\ntenant\n .command('bootstrap')\n .description('开通新租户(建租户 + admin 用户 + 结构 reconcile)——不可逆,默认过确认闸')\n .requiredOption('--tenant-id <id>', '租户 ID')\n .requiredOption('--admin-username <user>', '管理员用户名')\n .option('--admin-password <pwd>', '管理员密码(会泄漏到 history/ps,建议 --admin-password-stdin)')\n .option('--admin-password-stdin', '从标准输入读管理员密码(推荐)')\n .option('--tenant-name <name>', '租户名称(默认取 tenantId)')\n .option('--bootstrap-key <key>', 'bootstrap 密钥(建议用 HCM_BOOTSTRAP_KEY 环境变量)')\n .option('--bootstrap-key-stdin', '从标准输入读 bootstrap 密钥')\n .option('--endpoint <url>', '后端地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('-y, --yes', '跳过确认(CI 用)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => tenantBootstrapCommand(opts));\n\n// ─── meta:租户元数据读写(配置面的主战场) ─────────────────────────────\nconst meta = program.command('meta').description('租户元数据读写(页面/字段/列表配置)');\nmeta\n .command('list')\n .description('列出租户元数据文件')\n .option('--keyword <kw>', '搜索关键词')\n .option('--type <type>', '类型:yml | properties | all', 'all')\n .option('--page <n>', '页码(从 0 开始)')\n .option('--page-size <n>', '每页条数')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => metaListCommand(opts));\nmeta\n .command('get <path>')\n .description('打印 meta 原文(如 metas/Employee.list.yml)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .action((p, opts) => metaGetCommand(p, opts));\nmeta\n .command('set <path>')\n .description('写入 meta 原文;写完须 hcm cache clear-meta <Model> 才生效')\n .requiredOption('--file <file>', '从文件读取原文(- 表示 stdin)')\n .option('--dry-run', '只显示将写入的内容,不实际写入')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((p, opts) => metaSetCommand(p, opts));\nmeta\n .command('delete <path>')\n .description('删除 meta(不可逆,默认过确认闸)')\n .option('-y, --yes', '跳过确认')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((p, opts) => metaDeleteCommand(p, opts));\n\n// ─── skills:交付技能(睿戎 Chiron 技能库 + CLI 自带;免认证,空环境即可用) ───\nconst skills = program\n .command('skills')\n .description('交付技能:睿戎 Chiron 技能库 + CLI 自带技能(免认证,无需先 login)');\nskills\n .command('list [keyword]')\n .description('列出目标环境这一版的交付技能;--installed 改看本地装了哪些(不连网)')\n .option('--installed', '只看本地已装的技能(读 .hcm-skills.json,不连网)')\n .option('--target <agent>', '配合 --installed:claude | codex | auto', 'auto')\n .option('--global', '配合 --installed:看用户级目录')\n .option('--dir <path>', '配合 --installed:看指定目录')\n .option('--category <key>', '只看某个分类')\n .option('--stage <key>', '只看某个交付阶段:handover | baseline | configure | migrate | integrate | golive | operate')\n .option('--by-stage', '按交付生命周期分组展示(默认按功能分类)')\n .option('--source <kind>', '这一趟看哪些来源:cli(只看自带,不连网)| chiron | all', 'all')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((kw, opts) => skillsListCommand(kw, opts));\nskills\n .command('manifest')\n .description('打印本 CLI 的命令面与自带技能清单(不连网,供守卫与外部工具比对)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => skillsManifestCommand(program, opts));\nskills\n .command('show <id>')\n .description('打印技能原文(管道友好);自带技能直接读本地,不连网')\n .option('--source <kind>', '这一趟看哪些来源:cli(只看自带,不连网)| chiron | all', 'all')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .action((id, opts) => skillsShowCommand(id, opts));\nskills\n .command('install [id]')\n .description('连同 requires 前置技能与参考文件装到 agent 技能目录;--all 装整个技能库')\n .option('--all', '装整个技能库,并记为「跟随全集」(往后 update 会自动补上产品新增的技能)')\n .option('--target <agent>', '装给哪个 agent:claude(.claude/skills/)| codex(hcm-skills/ + AGENTS.md)| auto', 'auto')\n .option('--global', '装到用户级目录而非当前项目')\n .option('--dir <path>', '装到指定目录')\n .option('--from <dir>', '从本地目录装(现场改过的版本),不走网络')\n .option('--source <kind>', '这一趟看哪些来源:cli(只看自带,不连网)| chiron | all', 'all')\n .option('--force', '覆盖已存在的同名技能')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((id: string | undefined, opts) => skillsInstallCommand(id, opts));\nskills\n .command('sync <id>')\n .description('从目标实例同步 Skill 闭包到 WorkBuddy 项目并写 chiron.lock')\n .requiredOption('--target <agent>', '目标 Agent 宿主;当前支持 workbuddy')\n .requiredOption('--project <path>', 'WorkBuddy 项目根目录')\n .option('--cli <path>', '显式指定要锁定到项目的 HCM CLI;默认使用当前这份 CLI')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((id, opts) => skillsSyncCommand(id, opts));\nskills\n .command('update')\n .description('把装过的技能升到目标环境这一版(产品升级后跑它)')\n .option('--all', '连产品新增的技能一起装上,并记为「跟随全集」')\n .option('--check', '只看会变什么,不写盘')\n .option('--target <agent>', 'claude | codex | auto(默认按已安装目录探)', 'auto')\n .option('--global', '升级用户级目录里的技能')\n .option('--dir <path>', '升级指定目录里的技能')\n .option('--force', '连本地改过的技能一起覆盖成产品这一版')\n .option('--source <kind>', '这一趟看哪些来源:cli(只看自带,不连网)| chiron | all', 'all')\n .option('--endpoint <url>', '技能库地址(默认取安装时记录的地址)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => skillsUpdateCommand(opts));\n\nprogram\n .command('update <Model>')\n .description('更新一条 Model 记录(走后端完整校验)')\n .requiredOption('--id <id>', '记录 ID')\n .option('--data <JSON>', '要更新的字段 JSON,例如 \\'{\"name\":\"新名称\"}\\'')\n .option('--data-file <path>', '从 UTF-8 JSON 文件读取更新字段(与 --data 互斥)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => updateCommand(model, opts));\n\nprogram\n .command('version')\n .description('查后端版本(commit / tag / 构建时间)——免认证,无需先 login')\n .option('--endpoint <url>', '后端地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => versionCommand(opts));\n\n// ─── setting:租户系统参数(受控 PATCH 路径,不是标准 Model 的 PUT)───────\nconst setting = program\n .command('setting')\n .description('租户系统参数(登录策略 / 密码策略 / 功能开关 / 集成参数)');\nsetting\n .command('get <domain>')\n .description('读某域参数(定义 + 租户覆盖值合并,缺失回落默认值)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((d, opts) => settingGetCommand(d, opts));\nsetting\n .command('set <domain>')\n .description('改参数,可重复 --set;走受控校验路径而非标准 CRUD')\n .option('--set <assignment...>', 'namespace.key=value,例如 security.password.passwordPolicy=complex')\n .option('--dry-run', '只显示将写入什么,不实际写入')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((d, opts) => settingSetCommand(d, opts));\nsetting\n .command('reset <domain> <namespace> <key>')\n .description('清除租户覆盖,回落到默认值')\n .option('--revision <n>', '乐观锁版本号')\n .option('-y, --yes', '跳过确认')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((d, ns, k, opts) => settingResetCommand(d, ns, k, opts));\n\nasync function main(): Promise<void> {\n // 帮助/版本与 delivery 不读取 env/identity;execute 的真实子命令会在独立进程里正常迁移。\n if (needsLegacyProfileMigration(process.argv)) {\n try {\n await migrateLegacyProfiles();\n } catch (e) {\n // Migration should never fully throw (it catches per-profile failures),\n // but guard the top-level just in case to avoid breaking unrelated commands.\n process.stderr.write(\n `[hcm] event=migration_error reason=${JSON.stringify(String((e as Error).message))}\\n`,\n );\n }\n }\n await program.parseAsync(process.argv);\n}\n\n/**\n * 导出 commander 注册表,供守卫读取**真实命令面**(刀 5.5 spec §8 / §12.1 的 C4)。\n * 🔴 抄一份命令表来比对是没有意义的——那正是 ADR-319 §7.1 G8 缺口的成因。\n */\nexport { program };\n\n// 🔴 极性刻意如此:**默认照常执行**,只有显式设了 HCM_CLI_IMPORT_ONLY=1 才跳过。\n// 反过来写(默认不执行、由入口显式调用)会让「变量没设对」直接表现为 CLI 什么都不做,\n// 而这个开关只有测试会用——生产路径上它恒不存在,行为与本刀之前逐字相同。\nif (process.env.HCM_CLI_IMPORT_ONLY !== '1') {\n main().catch((e: unknown) => {\n process.stderr.write(`[hcm] fatal: ${String((e as Error).message)}\\n`);\n process.exit(1);\n });\n}\n","import { readFileSync } from 'node:fs';\n\ninterface PackageManifest {\n version: string;\n}\n\nconst manifest = JSON.parse(\n readFileSync(new URL('../package.json', import.meta.url), 'utf8'),\n) as PackageManifest;\n\nexport const CLI_VERSION = manifest.version;\n","import axios from 'axios';\nimport {\n loginClientCredentials,\n loginPairing,\n loginPat,\n loginPassword,\n inferEnvName,\n toOrigin,\n changePassword,\n detectPasswordChangeChallenge,\n loadEnv,\n saveEnv,\n saveIdentity,\n loadIdentity,\n loadGlobalConfig,\n saveGlobalConfig,\n TokenStore,\n isServerSlidingSession,\n CliError,\n CliErrorCode,\n describePrincipal,\n type IdentityMeta,\n type Principal,\n} from '@hcmai/sdk';\nimport { promptText, promptSecret, readStdin } from '../utils/prompt';\nimport { exitOk, exitWithError } from '../utils/exit';\n\nexport interface LoginArgs {\n env?: string;\n profile?: string; // [deprecated] transpile to --env with stderr warning\n name?: string; // custom identity name (overrides auto inference)\n /**\n * Commander quirk: `--no-activate` sets `opts.activate = false` (not\n * `opts.noActivate = true`). Default (no flag) → undefined → treat as true.\n * Use `args.activate !== false` to mean \"should activate\".\n */\n activate?: boolean;\n endpoint?: string;\n username?: string;\n password?: string;\n clientId?: string;\n clientSecret?: string;\n pat?: string;\n patStdin?: boolean;\n /** 首登强制改密时的新口令(非交互场景)。见 loginPasswordWithFirstLoginChange。 */\n newPassword?: string;\n newPasswordStdin?: boolean;\n tenant?: string;\n /** 配对码(ADR-308 第四轨)。与位置参数 <endpoint> 搭配使用。 */\n code?: string;\n /** 位置参数:从页面复制来的地址,可带路径与查询串。 */\n endpointArg?: string;\n}\n\n/**\n * 密码登录,并接管 fresh tenant 的**首登强制改密**。\n *\n * `hcm tenant bootstrap` 建出来的租户,admin 用初始口令登录会被后端拒(403\n * `AUTH_PASSWORD_CHANGE_REQUIRED`)并返回一个 300 秒有效的 changePasswordToken——\n * 不改密就拿不到正式 token,新租户等于登不进去。这是交付第一步上的硬阻塞,\n * 所以由 login 自己走完,而不是让顾问去拼两条 curl。\n *\n * 非该挑战的失败(口令错、账号锁定 423、网络错)原样抛出,不做任何吞咽。\n */\nasync function loginPasswordWithFirstLoginChange(\n input: Parameters<typeof loginPassword>[0],\n args: LoginArgs,\n): Promise<Awaited<ReturnType<typeof loginPassword>>> {\n try {\n return await loginPassword(input);\n } catch (e) {\n const challenge = detectPasswordChangeChallenge(e);\n if (!challenge) throw e;\n\n process.stderr.write(\n `[hcm] 该账号首次登录必须改密(临时凭据 ${challenge.expiresInSeconds ?? 300}s 内有效)\\n`,\n );\n let next: string;\n if (args.newPasswordStdin) next = (await readStdin()).trim();\n else if (args.newPassword) {\n process.stderr.write(\n '[hcm] WARNING: --new-password <p> 会泄漏到 shell history / ps aux。推荐 --new-password-stdin。\\n',\n );\n next = args.newPassword;\n } else {\n next = await promptSecret('设置新密码: ');\n const again = await promptSecret('再输一次: ');\n if (next !== again) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '两次输入的新密码不一致',\n });\n }\n }\n if (!next) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '新密码不能为空' });\n }\n\n await changePassword({\n endpoint: input.endpoint,\n changePasswordToken: challenge.changePasswordToken,\n oldPassword: input.password,\n newPassword: next,\n httpClient: input.httpClient,\n });\n process.stderr.write('[hcm] 密码已更新,正在用新密码登录\\n');\n return loginPassword({ ...input, password: next });\n }\n}\n\nfunction inferIdentityName(\n scheme: 'password' | 'client_credentials' | 'pat' | 'pairing',\n env: string,\n extra: { username?: string; clientId?: string },\n): string {\n if (scheme === 'password' && extra.username) return `${extra.username}@${env}`;\n if (scheme === 'client_credentials' && extra.clientId) {\n return `${extra.clientId.slice(0, 6)}@${env}`;\n }\n if (scheme === 'pairing' && extra.username) return `${extra.username}@${env}`;\n if (scheme === 'pat') {\n const name = `pat-${Math.random().toString(36).slice(2, 6)}@${env}`;\n process.stderr.write(\n `[hcm] event=pat_identity_auto_named name=${name} hint=\"pass --name <id> for a stable identity name across re-logins\"\\n`,\n );\n return name;\n }\n return `default@${env}`;\n}\n\n/**\n * Migrate token + meta from a profile-scoped TokenStore (legacy path used by\n * @hcmai/sdk loginPassword/Pat/ClientCredentials helpers) into an\n * identity-scoped TokenStore. Once @hcmai/sdk helpers accept a TokenStore arg\n * (Phase 2 follow-up), this shim can be removed.\n */\nasync function migrateProfileTokenToIdentity(\n envName: string,\n identityName: string,\n): Promise<void> {\n const oldStore = new TokenStore(envName);\n const oldMeta = await oldStore.readMeta();\n if (!oldMeta) throw new Error('login helper did not write token meta');\n\n const rawAccess = await oldStore.getAccessToken();\n const rawRefresh = await oldStore.getRefreshToken();\n\n const newStore = TokenStore.forIdentity(identityName);\n // Seed meta first so subsequent setAccessToken/setRefreshToken can update\n // the accessTokenRef/refreshTokenRef in place via writeMeta.\n await newStore.writeMeta(oldMeta);\n try {\n if (rawAccess) {\n const ref = await newStore.setAccessToken(rawAccess);\n const cur = (await newStore.readMeta()) ?? oldMeta;\n cur.accessTokenRef = ref;\n await newStore.writeMeta(cur);\n }\n if (rawRefresh) {\n const ref = await newStore.setRefreshToken(rawRefresh);\n const cur = (await newStore.readMeta()) ?? oldMeta;\n cur.refreshTokenRef = ref;\n await newStore.writeMeta(cur);\n }\n // Wipe legacy keychain + credentials.json so the profile-scoped path is\n // no longer authoritative for this token.\n await oldStore.clear();\n } catch (err) {\n // Partial migration: identity meta exists but token may not have made it\n // to identity-scoped keychain (or legacy path may still linger). Surface a\n // recovery hint so user knows to re-run login.\n process.stderr.write(\n `[hcm] event=migration_partial_failure direction=profile-to-identity identity=${identityName} reason=${JSON.stringify(String((err as Error).message))} hint=\"re-run hcm login --env ${envName}\"\\n`,\n );\n throw err;\n }\n}\n\nexport async function loginCommand(args: LoginArgs): Promise<void> {\n // deprecated --profile transpile\n if (args.profile && args.env) {\n process.stderr.write(\n '[hcm] event=deprecated_flag_ignored flag=--profile reason=\"--env also passed; --env wins\"\\n',\n );\n } else if (args.profile && !args.env) {\n process.stderr.write(\n '[hcm] event=deprecated_flag flag=--profile replacement=--env\\n',\n );\n args.env = args.profile;\n }\n\n const g = await loadGlobalConfig();\n // 🔴 配对轨的 env 名从**粘贴进来的地址**推,而不是 activeEnv:这条轨存在的全部理由\n // 就是「使用者不知道自己该用哪个 env / endpoint / 租户」,落到 activeEnv 等于又把那个\n // 前提搬了回来——而且会把新环境的凭据默默写进旧环境。\n const pairingOrigin = args.code ? toOrigin(args.endpointArg ?? args.endpoint ?? '') : null;\n const envName = args.env ?? (pairingOrigin ? inferEnvName(pairingOrigin) : g.activeEnv);\n\n try {\n // Load existing env or prompt for endpoint\n let envCfg = await loadEnv(envName).catch(() => null);\n if (pairingOrigin && !envCfg) {\n // 配对轨:地址来自那一行命令,租户随兑换响应回来,两样都不必问人。\n envCfg = { endpoint: pairingOrigin };\n await saveEnv(envName, envCfg);\n }\n if (pairingOrigin && envCfg && envCfg.endpoint !== pairingOrigin) {\n // 🔴 同名不同址不许静默覆盖:那会把另一个环境的配置改掉,而使用者只是粘贴了\n // 一行命令、根本不知道自己动了什么。\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n `env '${envName}' 已存在且指向 ${envCfg.endpoint},与本次的 ${pairingOrigin} 不同。` +\n `用 --env <name> 显式指定一个新名字。`,\n });\n }\n if (!envCfg) {\n const endpoint = args.endpoint ?? (await promptText('endpoint: '));\n if (!endpoint) {\n throw new CliError({\n code: CliErrorCode.ENV_ENDPOINT_REQUIRED,\n message:\n 'env not configured; pass --endpoint or run `hcm env add` first',\n });\n }\n envCfg = { endpoint, tenantId: args.tenant ?? '1' };\n await saveEnv(envName, envCfg);\n }\n const endpoint = envCfg.endpoint;\n const tenantId = args.tenant ?? envCfg.tenantId ?? '1';\n const http = axios.create({ baseURL: endpoint, timeout: 30_000 });\n\n // Resolve PAT input (if any)\n let pat: string | undefined;\n if (args.patStdin) pat = await readStdin();\n else if (args.pat) {\n pat = args.pat;\n process.stderr.write(\n '[hcm] WARNING: --pat <token> may leak via shell history / ps aux. Prefer --pat-stdin.\\n',\n );\n }\n\n let scheme: 'password' | 'client_credentials' | 'pat' | 'pairing';\n let scopes: string[];\n let username: string | undefined;\n let clientId: string | undefined;\n // 服务端认定的归属。三条 track 里只有 PAT 与口令能拿到(client_credentials 是机器身份)。\n let principal: Principal | undefined;\n\n if (args.code) {\n // ─── Track 4: 配对码(ADR-308)───\n // 放在最前:它自带地址与租户,不与下面三条的任何参数组合冲突。\n const { record, principal: p } = await loginPairing({\n endpoint,\n code: args.code,\n profile: envName,\n httpClient: http,\n });\n scheme = 'pairing';\n scopes = record.scopes;\n principal = p;\n username = p?.username;\n } else if (pat) {\n // ─── Track 1: PAT ───\n const { record, principal: p } = await loginPat({\n endpoint,\n tenantId,\n pat,\n profile: envName,\n httpClient: http,\n });\n scheme = 'pat';\n scopes = record.scopes;\n principal = p;\n } else if (args.clientId || args.clientSecret) {\n // ─── Track 2: client_credentials ───\n clientId = args.clientId ?? (await promptText('client_id: '));\n const clientSecret =\n args.clientSecret ?? (await promptSecret('client_secret: '));\n if (!clientId || !clientSecret) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: 'client_id and client_secret required',\n });\n }\n const { record } = await loginClientCredentials({\n endpoint,\n tenantId,\n clientId,\n clientSecret,\n profile: envName,\n httpClient: http,\n });\n scheme = 'client_credentials';\n scopes = record.scopes;\n } else {\n // ─── Track 3 (default): password ───\n username = args.username ?? (await promptText('username: '));\n const password = args.password ?? (await promptSecret('password: '));\n if (!username || !password) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: 'username and password required',\n });\n }\n const { record, principal: p } = await loginPasswordWithFirstLoginChange(\n { endpoint, tenantId, username, password, profile: envName, httpClient: http },\n args,\n );\n scheme = 'password';\n scopes = record.scopes;\n principal = p;\n }\n\n // Pick identity name (auto-inferred or --name override)\n const idName =\n args.name ?? inferIdentityName(scheme, envName, { username, clientId });\n\n // Move token from profile-scoped to identity-scoped store\n await migrateProfileTokenToIdentity(envName, idName);\n\n // Write IdentityMeta JSON (env FK validated inside saveIdentity)\n const newStore = TokenStore.forIdentity(idName);\n const newMeta = await newStore.readMeta();\n const identityMeta: IdentityMeta = {\n env: envName,\n scheme,\n scopes,\n expiresAt: newMeta?.expiresAt,\n // 服务端回了用户名就用服务端的:`--user` 传的只是登录入参,大小写/别名都可能与\n // 账号真名不同。\n username: principal?.username ?? username,\n accessTokenRef: newMeta?.accessTokenRef,\n refreshTokenRef: newMeta?.refreshTokenRef,\n tenantId: principal?.tenantId,\n // saveIdentity 写的是 IdentityMeta 形状,且和 TokenStore 共用同一个文件、\n // 最后写 —— 不在这里显式带上,上一步 writeMeta 存的 ttlSeconds 会被抹掉。\n ttlSeconds: newMeta?.ttlSeconds,\n };\n await saveIdentity(idName, identityMeta);\n\n // 🔴 「我要的租户」vs「token 实际归属的租户」不一致时必须让人看见:不一致意味着\n // 后面每一条命令都打在另一个租户上,而返回的数据看起来完全正常。\n if (principal?.tenantId && String(principal.tenantId) !== String(tenantId)) {\n process.stderr.write(\n `[hcm] WARNING: 请求的租户是 ${tenantId},但 token 实际归属租户 ${principal.tenantId}。` +\n `后续命令按 ${principal.tenantId} 执行。\\n`,\n );\n }\n\n // Commander quirk: `--no-activate` sets opts.activate=false, NOT\n // opts.noActivate=true. Default (no flag) → undefined → treat as true.\n const shouldActivate = args.activate !== false;\n // Point defaultIdentity at the identity we just logged in as (unless --no-activate).\n // This used to fire only when the env had NO defaultIdentity, so logging in as a second\n // user on the same env left defaultIdentity pinned to the first one — every later command\n // then ran silently as the wrong identity. Skip the write when it already matches.\n if (shouldActivate && envCfg.defaultIdentity !== idName) {\n envCfg.defaultIdentity = idName;\n await saveEnv(envName, envCfg);\n }\n // Auto-switch activeEnv unless --no-activate\n if (shouldActivate) {\n const gl = await loadGlobalConfig();\n gl.activeEnv = envName;\n await saveGlobalConfig(gl);\n }\n\n // 回显里必须有**服务端说的**身份,而不只是我们自己传进去的参数 —— 后者登错租户时\n // 长得和登对了一模一样。\n exitOk(\n `✅ logged in (env=${envName}, identity=${idName}, scheme=${scheme}, ` +\n `${describePrincipal(principal)}, scopes=${scopes.join(' ')})`,\n );\n } catch (e) {\n const err = e as { isAxiosError?: boolean };\n if (err.isAxiosError) {\n const { fromAxiosError } = await import('@hcmai/sdk');\n exitWithError(\n fromAxiosError(\n e as Parameters<typeof fromAxiosError>[0],\n envName,\n ),\n );\n }\n exitWithError(e);\n }\n}\n\n/**\n * 登出。\n *\n * 🔴 **先让服务端吊销,再清本地**——此前这里只做了后半截(`TokenStore.clear()`),\n * 于是 `hcm logout` 删掉的只是**本机的一份副本**,服务端那个 token 在 Redis 里继续\n * 有效最多 24 小时。名字叫 logout 而实际不 logout,在两个场景下会直接骗人:\n *\n * 1. **在别人的机器上跑过 CLI**(顾问 SSH 进客户服务器是常态):你以为退出了,\n * 实际上那台机器的 root / 备份快照里可能早已复制走一份仍然有效的 token。\n * 2. **凭据可能已泄漏时**:logout 是人第一反应会执行的补救动作,而它什么都没补救。\n *\n * 服务端 `POST /api/auth/logout` 走 `tokenManager.revokeToken(token)` 真吊销,且该路径\n * 在 `SecurityPathConfig.PUBLIC_PATHS` 里、带自己的 Bearer 就能调——能力一直都在,\n * 只是没接线。\n *\n * **失败不阻断清本地**:服务端不可达时仍然清掉本地凭据,但**如实说明**服务端那份可能\n * 还活着。反过来(服务端失败就不清本地)会让人在断网时连登出都做不了。\n */\nexport async function logoutCommand(args: {\n identity?: string;\n env?: string;\n}): Promise<void> {\n try {\n let target = args.identity;\n let envName = args.env;\n if (!target) {\n const g = await loadGlobalConfig();\n envName = args.env ?? g.activeEnv;\n const envCfg = await loadEnv(envName).catch(() => null);\n const dflt = envCfg?.defaultIdentity;\n if (!dflt) {\n exitOk('(no active identity to log out)');\n return;\n }\n target = dflt;\n }\n // Throw IDENTITY_NOT_FOUND for nonexistent identity instead of silently\n // succeeding (which would falsely report \"logged out\" of something that\n // never existed).\n const idMeta = await loadIdentity(target);\n const store = TokenStore.forIdentity(target);\n\n const revoked = await revokeOnServer(store, envName ?? idMeta.env);\n await store.clear();\n\n if (revoked) {\n exitOk(`✅ logged out (identity: ${target})`);\n } else {\n // 🔴 不许把这一支也报成 ✅:本地清了,服务端那份可能还有效。\n exitOk(\n `⚠️ 已清除本地凭据 (identity: ${target}),但服务端吊销未确认——` +\n `该 token 可能仍然有效直至自然过期。若凭据可能已泄漏,请改密以吊销全部会话。`,\n );\n }\n } catch (e) {\n exitWithError(e);\n }\n}\n\n/**\n * 请服务端吊销这条 token。返回是否确认吊销。\n *\n * 🔴 **只对服务端会话 token 生效**,走 `isServerSlidingSession` 谓词而不是逐个列举:\n * - `pat` —— 别处颁发的长期凭据,由后端管失效,`logout` 只该断开本机引用,\n * 不该把别人的 PAT 吊销掉\n * - `client_credentials` —— `hcmt_` 不是 Redis 会话 token,`/api/auth/logout` 对它无效\n * - `password` / `pairing` —— 这两条才是 `TokenManager.createToken` 铸的会话 token\n *\n * 此前这里写的是 `meta.scheme === 'pat'` 取反,等于把 client_credentials 也发出去\n * 打一次注定无效的请求;更要命的是新增第四轨时,只要 scheme 记错就会**静默跳过吊销**。\n */\nasync function revokeOnServer(store: TokenStore, envName: string): Promise<boolean> {\n try {\n const meta = await store.readMeta();\n if (!meta || !isServerSlidingSession(meta.scheme)) return false;\n const token = await store.getAccessToken();\n if (!token) return false;\n const envCfg = await loadEnv(envName).catch(() => null);\n if (!envCfg?.endpoint) return false;\n\n await axios.create({ baseURL: envCfg.endpoint, timeout: 15_000 }).post(\n `${envCfg.endpoint}/api/auth/logout`,\n undefined,\n { headers: { Authorization: `Bearer ${token}` } },\n );\n return true;\n } catch {\n // 服务端不可达 / token 已失效 —— 两种都不该阻断本地清理。\n return false;\n }\n}\n","import * as readline from 'node:readline';\n\nexport async function promptText(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n}\n\nexport async function promptSecret(question: string): Promise<string> {\n return new Promise((resolve) => {\n process.stdout.write(question);\n const stdin = process.stdin;\n stdin.setRawMode?.(true);\n stdin.resume();\n let buf = '';\n const onData = (data: Buffer) => {\n const s = data.toString('utf-8');\n for (const ch of s) {\n if (ch === '\\r' || ch === '\\n') {\n stdin.setRawMode?.(false);\n stdin.pause();\n stdin.removeListener('data', onData);\n process.stdout.write('\\n');\n resolve(buf);\n return;\n }\n if (ch === '\\x03') process.exit(130); // Ctrl+C\n if (ch === '\\x7f') {\n buf = buf.slice(0, -1);\n continue;\n }\n buf += ch;\n process.stdout.write('*');\n }\n };\n stdin.on('data', onData);\n });\n}\n\nexport async function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString('utf-8').trim();\n}\n\n/**\n * 从标准输入读取秘密值,只移除管道输入通常附带的一个行结束符。\n * 密码本身的前后空格属于有效字符,不能像普通文本那样 trim。\n */\nexport async function readSecretFromStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks)\n .toString('utf-8')\n .replace(/\\r?\\n$/, '');\n}\n\nexport async function promptConfirm(question: string): Promise<boolean> {\n const ans = await promptText(question);\n return /^y(es)?$/i.test(ans.trim());\n}\n","import {\n loadGlobalConfig,\n saveGlobalConfig,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { envList, envCurrent, envUse, envRemove } from './env';\nimport { exitOk, exitWithError } from '../utils/exit';\n\nfunction warnDeprecated(oldCmd: string, newCmd: string): void {\n process.stderr.write(\n `[hcm] event=deprecated_cmd old=${JSON.stringify(oldCmd)} replacement=${JSON.stringify(newCmd)}\\n`,\n );\n}\n\nexport async function configListDeprecated(): Promise<void> {\n warnDeprecated('hcm config list', 'hcm env list');\n await envList();\n}\n\nexport async function configShowDeprecated(): Promise<void> {\n warnDeprecated('hcm config show', 'hcm env current');\n await envCurrent();\n}\n\nexport async function configSetProfileDeprecated(name: string): Promise<void> {\n warnDeprecated('hcm config set-profile', 'hcm env use');\n // Legacy 行为不 ping endpoint\n await envUse(name, { ping: false });\n}\n\nexport async function configDeleteDeprecated(name: string): Promise<void> {\n warnDeprecated('hcm config delete', 'hcm env remove --force');\n // legacy `hcm config delete` 没有确认提示, 转译时透传 --force 保持行为一致\n await envRemove(name, { force: true });\n}\n\nexport async function configSet(key: string, value: string): Promise<void> {\n try {\n if (!key.startsWith('defaults.')) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n \"hcm config set only accepts defaults.*. For env fields use 'hcm env edit <field> <value>'.\",\n });\n }\n const sub = key.slice('defaults.'.length);\n const g = await loadGlobalConfig();\n g.defaults = g.defaults ?? {};\n (g.defaults as unknown as Record<string, string>)[sub] = value;\n await saveGlobalConfig(g);\n exitOk(`✅ defaults.${sub} = ${value}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function configGet(key: string): Promise<void> {\n try {\n if (!key.startsWith('defaults.')) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n \"hcm config get only accepts defaults.*. For env fields use 'hcm env show'.\",\n });\n }\n const sub = key.slice('defaults.'.length);\n const g = await loadGlobalConfig();\n exitOk(String((g.defaults as unknown as Record<string, string>)?.[sub] ?? ''));\n } catch (e) {\n exitWithError(e);\n }\n}\n","import axios from 'axios';\nimport {\n loadEnv,\n saveEnv,\n listEnvs,\n deleteEnv,\n loadGlobalConfig,\n saveGlobalConfig,\n loadIdentity,\n listIdentities,\n deleteIdentity,\n TokenStore,\n CliError,\n CliErrorCode,\n toYaml,\n} from '@hcmai/sdk';\nimport { exitOk, exitWithError } from '../utils/exit';\nimport { promptConfirm } from '../utils/prompt';\nimport { formatTable } from '../utils/table';\n\nexport async function envList(): Promise<void> {\n try {\n const envs = await listEnvs();\n const g = await loadGlobalConfig();\n if (envs.length === 0) {\n exitOk('(no envs; run `hcm env add <name> --endpoint <url>`)');\n return;\n }\n const rows = await Promise.all(\n envs.map(async (name) => {\n const cfg = await loadEnv(name);\n return {\n active: name === g.activeEnv ? '*' : ' ',\n name,\n endpoint: cfg.endpoint,\n frontend: cfg.frontend ?? '(none)',\n tenant: cfg.tenantId ?? '1',\n identity: cfg.defaultIdentity ?? '(none)',\n };\n }),\n );\n exitOk(formatTable(rows));\n } catch (e) {\n exitWithError(e);\n }\n}\nexport async function envCurrent(): Promise<void> {\n try {\n const g = await loadGlobalConfig();\n const cfg = await loadEnv(g.activeEnv).catch(() => null);\n if (!cfg) {\n exitOk('(no active env; run `hcm env add <name> --endpoint <url>`)');\n return;\n }\n const idName = cfg.defaultIdentity ?? '(none)';\n const frontend = cfg.frontend ? ` frontend=${cfg.frontend}` : '';\n exitOk(`→ ${g.activeEnv} ${cfg.endpoint}${frontend} tenant=${cfg.tenantId ?? '1'} identity=${idName}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envAdd(\n name: string,\n args: { endpoint?: string; frontend?: string; tenant?: string; force?: boolean },\n): Promise<void> {\n try {\n if (!args.endpoint) {\n throw new CliError({\n code: CliErrorCode.ENV_ENDPOINT_REQUIRED,\n message: 'env add requires --endpoint <url>',\n });\n }\n const existing = await loadEnv(name).catch(() => null);\n if (existing && !args.force) {\n throw new CliError({\n code: CliErrorCode.ENV_ALREADY_EXISTS,\n message: `env '${name}' already exists. Use --force to overwrite.`,\n });\n }\n await saveEnv(name, {\n endpoint: args.endpoint,\n frontend: args.frontend,\n tenantId: args.tenant ?? '1',\n });\n // If this is the first env (or active env points to a non-existent env), make this the active env\n const allEnvs = await listEnvs();\n const g = await loadGlobalConfig();\n const activeExists = allEnvs.includes(g.activeEnv);\n if (!activeExists) {\n g.activeEnv = name;\n await saveGlobalConfig(g);\n }\n exitOk(`✅ env '${name}' added. Run: hcm login --env ${name}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envUse(name: string, args: { ping?: boolean }): Promise<void> {\n try {\n const cfg = await loadEnv(name);\n const g = await loadGlobalConfig();\n g.activeEnv = name;\n await saveGlobalConfig(g);\n // commander --no-ping sets args.ping = false. Default is undefined → treat as true.\n const shouldPing = args.ping !== false;\n if (shouldPing && !process.env.CI) {\n try {\n await axios.get(`${cfg.endpoint}/api/version/backend`, { timeout: 2000 });\n } catch (e) {\n const reason = String((e as Error).message).slice(0, 60).replace(/\\s+/g, '-');\n process.stderr.write(\n `[hcm] event=env_ping_failed env=${name} reason=${reason} hint=token-may-need-re-login\\n`,\n );\n }\n }\n if (cfg.defaultIdentity) {\n const id = await loadIdentity(cfg.defaultIdentity).catch(() => null);\n if (id?.expiresAt && new Date(id.expiresAt) < new Date()) {\n process.stderr.write(\n `[hcm] event=token_expired identity=${cfg.defaultIdentity} hint=\"hcm login --env ${name}\"\\n`,\n );\n }\n }\n exitOk(`✅ active env: ${name}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envRemove(name: string, args: { force?: boolean }): Promise<void> {\n try {\n if (!args.force) {\n const ok = await promptConfirm(`remove env '${name}' and all its identities? [y/N] `);\n if (!ok) {\n exitOk('aborted');\n return;\n }\n }\n const ids = await listIdentities(name);\n const failed: string[] = [];\n for (const id of ids) {\n try {\n await TokenStore.forIdentity(id).clear();\n await deleteIdentity(id);\n } catch (err) {\n failed.push(id);\n process.stderr.write(\n `[hcm] event=identity_cleanup_failed identity=${id} reason=${JSON.stringify(String((err as Error).message))}\\n`,\n );\n }\n }\n await deleteEnv(name);\n const g = await loadGlobalConfig();\n if (g.activeEnv === name) {\n g.activeEnv = 'default';\n await saveGlobalConfig(g);\n }\n const removedCount = ids.length - failed.length;\n const noun = (n: number): string => (n === 1 ? 'identity' : 'identities');\n const failPart =\n failed.length > 0\n ? `, ${failed.length} ${noun(failed.length)} failed: ${failed.join(', ')}`\n : '';\n exitOk(`✅ env '${name}' removed (${removedCount} ${noun(removedCount)} removed${failPart})`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envShow(args: { name?: string }): Promise<void> {\n try {\n const g = await loadGlobalConfig();\n const target = args.name ?? g.activeEnv;\n const cfg = await loadEnv(target);\n const ids = await listIdentities(target);\n exitOk(\n toYaml({\n name: target,\n active: target === g.activeEnv,\n ...cfg,\n identities: ids,\n }),\n );\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envEdit(\n field: string,\n value: string,\n args: { env?: string },\n): Promise<void> {\n try {\n const ALLOWED = new Set(['endpoint', 'frontend', 'tenantId', 'defaultIdentity', 'defaultAgent']);\n if (!ALLOWED.has(field)) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `unknown field '${field}'. Allowed: ${[...ALLOWED].join(', ')}`,\n });\n }\n const g = await loadGlobalConfig();\n const name = args.env ?? g.activeEnv;\n const cfg = await loadEnv(name);\n // FK validation: defaultIdentity must point to an existing identity\n if (field === 'defaultIdentity') {\n await loadIdentity(value); // throws IDENTITY_NOT_FOUND if missing\n }\n (cfg as unknown as Record<string, string>)[field] = value;\n await saveEnv(name, cfg);\n exitOk(`✅ ${name}.${field} = ${value}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\n","/**\n * Render an array of homogeneous string-record rows as a fixed-width text table.\n * Uses code-unit length (no CJK width adjustment) — acceptable for current ASCII-only fields.\n */\nexport function formatTable(rows: Array<Record<string, string>>): string {\n if (rows.length === 0) return '';\n const keys = Object.keys(rows[0]!);\n const widths = keys.map((k) =>\n Math.max(k.length, ...rows.map((r) => String(r[k] ?? '').length)),\n );\n const header = keys.map((k, i) => k.padEnd(widths[i]!)).join(' ');\n const body = rows.map((r) =>\n keys.map((k, i) => String(r[k] ?? '').padEnd(widths[i]!)).join(' '),\n );\n return [header, '-'.repeat(header.length), ...body].join('\\n');\n}\n","import {\n HcmClient,\n formatRows,\n fromAxiosError,\n type OutputFormat,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface QueryArgs {\n filter?: string;\n sort?: string;\n fields?: string;\n keyword?: string;\n limit?: number;\n offset?: number;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport async function queryCommand(model: string, args: QueryArgs): Promise<void> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dsl: any = {};\n if (args.filter) dsl.filter = parseJsonOrThrow(args.filter, '--filter');\n if (args.sort) dsl.sort = parseJsonOrThrow(args.sort, '--sort');\n if (args.fields) dsl.fields = args.fields.split(',').map((s) => s.trim());\n if (args.keyword) dsl.keyword = args.keyword;\n if (args.limit) dsl.limit = Number(args.limit);\n if (args.offset) dsl.offset = Number(args.offset);\n if (!dsl.limit) dsl.limit = 20;\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await client.query(model, dsl);\n const fmt: OutputFormat = args.output ?? 'table';\n const out = formatRows(result.rows as Record<string, unknown>[], { format: fmt });\n process.stdout.write(out + '\\n');\n if (fmt === 'table' && result.total !== undefined) {\n process.stdout.write(`Showing ${result.rows.length} of ${result.total} results.\\n`);\n }\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n\nfunction parseJsonOrThrow(text: string, flag: string): unknown {\n try {\n return JSON.parse(text);\n } catch (e) {\n throw new CliError({\n code: CliErrorCode.INVALID_JSON,\n message: `${flag} is not valid JSON: ${(e as Error).message}`,\n });\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n type ActionHttpMethod,\n type ActionScope,\n type OutputFormat,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { readJsonObjectInput } from '../utils/json-input';\n\nexport interface ActionArgs {\n id?: string;\n ids?: string;\n params?: string;\n paramsFile?: string;\n method?: string;\n scope?: string;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport async function actionCommand(spec: string, args: ActionArgs): Promise<void> {\n try {\n const [model, action] = spec.split('.');\n if (!model || !action) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: 'expected <Model>.<Action> (e.g. Employee.regularize)',\n });\n }\n if (args.id && args.ids) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--id and --ids are mutually exclusive',\n });\n }\n const method = normalizeMethod(args.method);\n const scope = normalizeScope(args.scope);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const input: any = { method };\n if (scope) input.scope = scope;\n if (args.id) input.id = args.id;\n if (args.ids) input.ids = args.ids.split(',').map((s) => s.trim());\n const params = await readJsonObjectInput({\n inline: args.params,\n file: args.paramsFile,\n inlineFlag: '--params',\n fileFlag: '--params-file',\n required: false,\n });\n if (params) input.params = params;\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await client.action(model, action, input);\n const fmt: OutputFormat = args.output ?? 'json';\n\n if (fmt !== 'json' && result.taskId) {\n process.stdout.write(\n `⏳ task created: ${result.taskId} (use \\`hcm task ${result.taskId}\\` to follow up — coming Phase 1)\\n`,\n );\n } else if (fmt !== 'json') {\n process.stdout.write('✅ action succeeded\\n');\n }\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n\nfunction normalizeMethod(value?: string): ActionHttpMethod {\n const raw = (value ?? 'POST').toUpperCase();\n if (raw === 'GET' || raw === 'POST' || raw === 'PUT' || raw === 'DELETE') return raw;\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--method 取值 GET | POST | PUT | DELETE,收到 \"${value}\"`,\n });\n}\n\nfunction normalizeScope(value?: string): ActionScope | undefined {\n if (value === undefined) return undefined;\n if (value === 'class' || value === 'object') return value;\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--scope 取值 class | object,收到 \"${value}\"`,\n });\n}\n","import * as fs from 'node:fs/promises';\nimport { CliError, CliErrorCode } from '@hcmai/sdk';\n\nexport interface JsonObjectInputOptions {\n inline?: string;\n file?: string;\n inlineFlag: string;\n fileFlag: string;\n required?: boolean;\n}\n\n/**\n * 读取 Agent 友好的 JSON 对象输入。\n * 小对象可直接放命令行;复杂报表配置应走文件,避免 shell 转义和命令长度限制。\n */\nexport async function readJsonObjectInput(\n options: JsonObjectInputOptions,\n): Promise<Record<string, unknown> | undefined> {\n const { inline, file, inlineFlag, fileFlag, required = true } = options;\n if (inline && file) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `${inlineFlag} 与 ${fileFlag} 不能同时使用`,\n });\n }\n if (!inline && !file) {\n if (!required) return undefined;\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: `${inlineFlag} <JSON> 或 ${fileFlag} <path> 必填`,\n });\n }\n\n let raw: string;\n let sourceFlag: string;\n if (file) {\n sourceFlag = fileFlag;\n try {\n raw = await fs.readFile(file, 'utf-8');\n } catch (error) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `${fileFlag}: 无法读取 ${file}: ${(error as Error).message}`,\n });\n }\n } else {\n sourceFlag = inlineFlag;\n raw = inline!;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new CliError({\n code: CliErrorCode.INVALID_JSON,\n message: `${sourceFlag}: ${(error as Error).message}`,\n });\n }\n if (parsed === null || Array.isArray(parsed) || typeof parsed !== 'object') {\n throw new CliError({\n code: CliErrorCode.INVALID_JSON,\n message: `${sourceFlag}: 顶层必须是 JSON 对象`,\n });\n }\n return parsed as Record<string, unknown>;\n}\n","import { HcmClient, formatObject, fromAxiosError, type OutputFormat } from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { readJsonObjectInput } from '../utils/json-input';\n\nexport interface CreateArgs {\n data?: string;\n dataFile?: string;\n env?: string;\n as?: string;\n profile?: string;\n output?: OutputFormat;\n}\n\nexport async function createCommand(model: string, args: CreateArgs): Promise<void> {\n try {\n const data = await readJsonObjectInput({\n inline: args.data,\n file: args.dataFile,\n inlineFlag: '--data',\n fileFlag: '--data-file',\n });\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const res = await client.create(model, data!);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write('✅ created\\n');\n process.stdout.write(formatObject(res, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.profile));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { readJsonObjectInput } from '../utils/json-input';\n\nexport interface UpdateArgs {\n id?: string;\n data?: string;\n dataFile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\n/**\n * `hcm update <Model> --id <id> --data '{...}'` —— 更新一条记录(走后端完整校验)。\n *\n * 与 create/delete 成对:配置类交付动作里「改一条已有记录」是基本盘,\n * 之前只能退回 curl -X PUT。\n */\nexport async function updateCommand(model: string, args: UpdateArgs): Promise<void> {\n try {\n if (!args.id) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '--id <id> 必填' });\n }\n const data = await readJsonObjectInput({\n inline: args.data,\n file: args.dataFile,\n inlineFlag: '--data',\n fileFlag: '--data-file',\n });\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await client.update(model, args.id, data!);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`✅ ${model}#${args.id} 已更新\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n formatRows,\n fromAxiosError,\n getSettingDomain,\n patchSettingDomain,\n resetSettingItem,\n parseSettingAssignment,\n CliError,\n CliErrorCode,\n type OutputFormat,\n type SettingWrite,\n} from '@hcmai/sdk';\nimport { promptConfirm } from '../utils/prompt';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface SettingArgs {\n set?: string[];\n revision?: string;\n dryRun?: boolean;\n yes?: boolean;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nasync function client(args: SettingArgs): Promise<HcmClient> {\n return HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n}\n\nfunction fail(e: unknown, args: SettingArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 404) {\n exitWithError(new Error('没有这个参数域 —— 用 `hcm setting get <域>` 看现有域,常见有 security / feature / integration'));\n }\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm setting get <domain>` —— 读某域的全部参数(定义 + 租户覆盖值合并)。 */\nexport async function settingGetCommand(domain: string, args: SettingArgs): Promise<void> {\n try {\n const c = await client(args);\n const { items } = await getSettingDomain(c.raw(), domain);\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'table') {\n const rows = items.map((i) => ({\n namespace: i.namespace,\n key: i.settingKey,\n value: i.value ?? i.defaultValue,\n overridden: i.value !== undefined && i.value !== null ? 'yes' : '',\n revision: i.revision ?? '',\n }));\n process.stdout.write(formatRows(rows as Record<string, unknown>[], { format: 'table' }) + '\\n');\n } else {\n process.stdout.write(formatObject(items, { format: fmt }) + '\\n');\n }\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm setting set <domain> --set ns.key=value [--set ...]` —— 改参数。\n *\n * 走受控的 PATCH 路径(按定义校验 + 乐观锁 + 写历史),不是标准 Model 的 PUT。\n * 默认对着**客户环境**写,故支持 --dry-run 先看要改什么。\n */\nexport async function settingSetCommand(domain: string, args: SettingArgs): Promise<void> {\n try {\n const raw = args.set ?? [];\n if (raw.length === 0) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '至少要一个 --set namespace.key=value,例如 --set security.password.passwordPolicy=complex',\n });\n }\n let items: SettingWrite[];\n try {\n items = raw.map(parseSettingAssignment);\n } catch (e) {\n throw new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message: (e as Error).message });\n }\n\n if (args.dryRun) {\n process.stdout.write(`[dry-run] 将在域 ${domain} 写入 ${items.length} 项,未实际写入:\\n`);\n for (const i of items) process.stdout.write(` ${i.namespace}.${i.settingKey} = ${String(i.value)}\\n`);\n process.exit(0);\n }\n\n const c = await client(args);\n const result = await patchSettingDomain(c.raw(), domain, items);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`✅ ${domain} 已更新 ${items.length} 项\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm setting reset <domain> <namespace> <key>` —— 清除租户覆盖,回落到默认值。\n *\n * 是「恢复默认」而非「删除」——下次 set 就能写回,故不是不可逆操作;\n * 但它会改变客户环境的现行行为,所以仍过确认闸。\n */\nexport async function settingResetCommand(\n domain: string,\n namespace: string,\n key: string,\n args: SettingArgs,\n): Promise<void> {\n try {\n if (!args.yes) {\n const ok = await promptConfirm(`将清除 ${domain} / ${namespace}.${key} 的租户覆盖,回落到默认值。继续?`);\n if (!ok) {\n process.stderr.write('已取消\\n');\n process.exit(1);\n }\n }\n const c = await client(args);\n const revision = args.revision === undefined ? undefined : Number(args.revision);\n const result = await resetSettingItem(c.raw(), domain, namespace, key, revision);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`✅ ${namespace}.${key} 已回落到默认值\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n","import {\n createHttpClient,\n formatObject,\n fromAxiosError,\n loadEnv,\n loadGlobalConfig,\n resolveActiveEnv,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\n\nexport interface VersionArgs {\n endpoint?: string;\n env?: string;\n output?: OutputFormat;\n}\n\n/**\n * `hcm version` —— 查后端版本(commit / tag / 构建时间)。\n *\n * 与 `hcm skills` 一样走**免认证**端点(`/api/version/**` 在公开白名单里):\n * 「客户环境到底是哪一版」经常是在还没拿到账号的时候就要回答的第一问。\n */\nexport async function versionCommand(args: VersionArgs): Promise<void> {\n try {\n let endpoint = args.endpoint;\n if (!endpoint) {\n const g = await loadGlobalConfig();\n const env = await loadEnv(resolveActiveEnv({ envFlag: args.env }, process.env, g)).catch(() => null);\n if (!env?.endpoint) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`',\n });\n }\n endpoint = env.endpoint;\n }\n const http = createHttpClient({\n endpoint: endpoint.replace(/\\/+$/, ''),\n getAccessToken: async () => null,\n onRefresh: async () => {},\n });\n const resp = await http.get('/api/version/backend');\n const info = resp.data?.data ?? resp.data;\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`${endpoint}\\n`);\n process.stdout.write(formatObject(info, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n type OutputFormat,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DeleteArgs {\n id?: string;\n env?: string;\n as?: string;\n profile?: string;\n output?: OutputFormat;\n}\n\nexport async function deleteCommand(model: string, args: DeleteArgs): Promise<void> {\n try {\n if (!args.id) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '--id <id> 必填' });\n }\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const res = await client.remove(model, args.id);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write('✅ deleted\\n');\n process.stdout.write(formatObject(res, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.profile));\n exitWithError(e);\n }\n}\n","import { readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport {\n HcmClient, parseFixture, runImport, formatObject, fromAxiosError,\n type Fixture, type ImportClient, type ImportOptions, type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface ImportArgs {\n dryRun?: boolean;\n updateOnly?: boolean;\n onError?: string;\n report?: string;\n env?: string;\n as?: string;\n profile?: string;\n output?: OutputFormat;\n}\n\n/** 递归收集 *.yml/*.yaml,按相对路径字典序(对齐 spec §4 拓扑约定)。 */\nfunction collectYmlFiles(path: string): string[] {\n if (statSync(path).isFile()) return [path];\n const out: string[] = [];\n const walk = (dir: string): void => {\n for (const name of readdirSync(dir).sort()) {\n const full = join(dir, name);\n if (statSync(full).isDirectory()) walk(full);\n else if (full.endsWith('.yml') || full.endsWith('.yaml')) out.push(full);\n }\n };\n walk(path);\n return out.sort();\n}\n\n// dry-run 不触达后端,用一个永不被调用的 stub(runner 的 dryRun 分支不调 client),免去 auth 依赖\nconst DRY_RUN_CLIENT: ImportClient = {\n findIdByKey: async () => null,\n create: async () => ({ id: '' }),\n update: async () => ({}),\n};\n\nexport async function importCommand(path: string, args: ImportArgs): Promise<void> {\n try {\n const files = collectYmlFiles(path);\n const fixtures: Fixture[] = files.map((f) =>\n parseFixture(readFileSync(f, 'utf8'), relative(process.cwd(), f)),\n );\n\n const opts: ImportOptions = {\n dryRun: !!args.dryRun,\n updateOnly: !!args.updateOnly,\n onError: args.onError === 'stop' ? 'stop' : 'continue',\n };\n\n const client: ImportClient = opts.dryRun\n ? DRY_RUN_CLIENT\n : HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await runImport(client, fixtures, opts);\n\n if (args.report) writeFileSync(args.report, JSON.stringify(result, null, 2));\n\n const fmt: OutputFormat = args.output ?? 'json';\n const tag = opts.dryRun ? '🔍 dry-run' : '📦 import';\n process.stdout.write(\n `${tag}: created=${result.created} updated=${result.updated} skipped=${result.skipped} failed=${result.failed}\\n`,\n );\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(result.failed > 0 ? 3 : 0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.profile));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n type ModelDescription,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface DescribeArgs {\n verbose?: boolean;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport async function describeCommand(model: string, args: DescribeArgs): Promise<void> {\n try {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const desc = await client.describe(model, { verbose: !!args.verbose });\n\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt !== 'table') {\n process.stdout.write(formatObject(desc, { format: fmt }) + '\\n');\n process.exit(0);\n }\n\n process.stdout.write(formatDescriptionTable(desc, !!args.verbose) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n\nexport function formatDescriptionTable(desc: ModelDescription, verbose = false): string {\n const lines: string[] = [`=== ${desc.model} ===`];\n if (desc.labels.zh_CN) lines.push(`zh_CN: ${desc.labels.zh_CN}`);\n if (desc.labels.en) lines.push(`en: ${desc.labels.en}`);\n lines.push(`fields (${desc.fields.length}):`);\n for (const f of desc.fields) {\n const req = f.required ? ' required' : ' ';\n const lbl = verbose ? ` ${f.label ?? ''} ${f.description ?? ''}` : ` ${f.label ?? ''}`;\n lines.push(` ${f.name.padEnd(20)} ${f.type.padEnd(10)} ${req}${lbl}`);\n }\n lines.push(`actions (${desc.actions.length}):`);\n for (const a of desc.actions) {\n const call = [a.scope, a.httpMethod].filter(Boolean).join(' ');\n const params = a.params?.length\n ? ` params: ${a.params.map((p) => `${p.name}:${p.type}`).join(', ')}`\n : '';\n const description = verbose && a.description ? ` ${a.description}` : '';\n lines.push(` ${a.name.padEnd(20)} ${call.padEnd(12)} ${a.label ?? ''}${params}${description}`);\n }\n if (desc.relations.length) {\n lines.push(`relations: ${desc.relations.map((r) => `${r.key}(via ${r.via})`).join(', ')}`);\n }\n return lines.join('\\n');\n}\n","import type { AttachmentMeta } from '@hcmai/sdk';\nimport {\n HcmClient,\n WsClient,\n oneShot,\n sendMessageAndStream,\n createConversation,\n DEFAULT_AGENT_ID,\n saveConversationState,\n formatObject,\n formatRows,\n fetchConversationTimeline,\n fetchConversationTimelineStrict,\n fetchRecentConversations,\n findLastAssistantSeq,\n CliError,\n CliErrorCode,\n parseInteractionRequest,\n parseInteractionResolved,\n buildConfirm,\n buildReject,\n buildAnswer,\n buildInterrupt,\n buildSteer,\n} from '@hcmai/sdk';\nimport chalk from 'chalk';\nimport * as fs from 'node:fs/promises';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport type ChatOutputFormat = 'text' | 'json';\n\nexport interface ChatArgs {\n agent?: string;\n resume?: string;\n conversation?: string;\n list?: boolean;\n events?: boolean | string;\n limit?: string;\n stream?: boolean;\n noStream?: boolean;\n showToolCalls?: boolean;\n promptFile?: string;\n timeout?: number;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: ChatOutputFormat;\n // ADR-085: streaming display flags. commander `--no-xxx` 在解析时把 args.xxx 设 false.\n markdown?: boolean;\n thinking?: boolean;\n verboseThinking?: boolean;\n verboseTools?: boolean;\n spinner?: boolean;\n color?: boolean;\n raw?: boolean;\n autoApprove?: boolean;\n onConfirm?: string;\n onAsk?: string;\n /** P0 测试接口:流中途注入命令,格式 <eventType>:<action>[:<arg>](仅 --raw 分支生效)。 */\n injectOn?: string;\n /** 重新生成(ADR-089):发 response.regenerate 重跑指定 assistant 段,不发新 prompt;必须配 --resume/--conversation。 */\n regenerateFrom?: string;\n /** issue #64:附件路径(可重复),上传后随消息发送。 */\n attach?: string[];\n}\n\n/** parseInjectOn 结果:收到首个 eventType 事件后触发一次注入。 */\nexport interface InjectSpec {\n eventType: string;\n action: 'interrupt' | 'steer';\n /** steer 的 content(必填);interrupt 无此字段。 */\n arg?: string;\n}\n\n/**\n * 解析 --inject-on 取值;格式 `<eventType>:<action>[:<arg>]`。\n * - action ∈ {interrupt, steer}\n * - steer 必须带 arg(content);arg 内可含冒号(只 split 前两段,剩余整体为 arg)\n * - 非法值抛 CliError INVALID_ARGUMENT(fail-fast 在发请求前)\n */\nexport function parseInjectOn(s: string): InjectSpec {\n const fail = (detail: string): never => {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--inject-on 格式 <eventType>:<action>[:<arg>],action ∈ {interrupt, steer}(steer 必须带 content);${detail},收到 \"${s}\"`,\n });\n };\n // 只 split 前两段,剩余整体(含冒号)作为 arg,支持 steer content 内含冒号。\n const firstColon = s.indexOf(':');\n if (firstColon < 0) return fail('缺少 action 段');\n const eventType = s.slice(0, firstColon);\n const rest = s.slice(firstColon + 1);\n const secondColon = rest.indexOf(':');\n const action = secondColon < 0 ? rest : rest.slice(0, secondColon);\n const arg = secondColon < 0 ? undefined : rest.slice(secondColon + 1);\n\n if (!eventType) return fail('eventType 段为空');\n if (action === 'interrupt') {\n if (arg !== undefined) return fail('interrupt 不接受 arg');\n return { eventType, action: 'interrupt' };\n }\n if (action === 'steer') {\n if (arg === undefined || arg === '') return fail('steer 必须带 content(arg)');\n return { eventType, action: 'steer', arg };\n }\n return fail(`未知 action \"${action}\"`);\n}\n\n/** 解析 --on-confirm 取值;非法值在发请求前 fail-fast。 */\nexport function parseOnConfirm(s: string): { decision: 'approve' } | { decision: 'reject'; reason?: string } {\n if (s === 'approve') return { decision: 'approve' };\n if (s === 'reject') return { decision: 'reject' };\n if (s.startsWith('reject:')) return { decision: 'reject', reason: s.slice('reject:'.length) };\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--on-confirm 取值 approve | reject | reject:<reason>,收到 \"${s}\"`,\n });\n}\n\nexport function resolveResumeConversation(args: Pick<ChatArgs, 'resume' | 'conversation'>): string | undefined {\n if (args.resume && args.conversation) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--resume 和 --conversation 不能同时使用;新命令请用 --resume <conversationId>',\n });\n }\n if (args.resume === 'NEW') {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--resume 需要既存 conversationId;新会话请直接省略 --resume',\n });\n }\n const id = args.resume ?? args.conversation;\n if (!id || id === 'NEW') return undefined;\n return id;\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number, flag: string): number {\n const n = Number(value ?? fallback);\n if (!Number.isInteger(n) || n <= 0) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `${flag} 需要正整数,收到 \"${value}\"`,\n });\n }\n return n;\n}\n\nfunction formatShortDate(value: unknown): string {\n if (typeof value !== 'string' || value.trim() === '') return '-';\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return value.replace('T', ' ').slice(0, 16);\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\nfunction oneLine(value: unknown, max = 36): string {\n const text = String(value ?? '').replace(/\\s+/g, ' ').trim();\n if (!text) return '-';\n return text.length > max ? text.slice(0, Math.max(0, max - 1)) + '…' : text;\n}\n\nexport function resolveEventsConversation(\n args: Pick<ChatArgs, 'events' | 'resume' | 'conversation'>,\n): string | undefined {\n if (!args.events) return undefined;\n const resumeConversationId = resolveResumeConversation(args);\n const eventConversationId = typeof args.events === 'string' ? args.events.trim() : undefined;\n if (eventConversationId === 'NEW') {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--events 需要既存 conversationId;新会话没有可查询的事件流',\n });\n }\n if (eventConversationId && resumeConversationId && eventConversationId !== resumeConversationId) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--events <conversationId> 与 --resume/--conversation 指向不同会话;请只保留一个 id',\n });\n }\n const id = eventConversationId || resumeConversationId;\n if (!id) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '查询事件流请传 `hcm chat --events <conversationId>`,或 `hcm chat --resume <conversationId> --events`',\n });\n }\n return id;\n}\n\nfunction eventAgent(value: Record<string, unknown>): string {\n return oneLine(value.agentPath ?? value.agent ?? value.delegationAgent, 24);\n}\n\nfunction eventScope(value: Record<string, unknown>): string {\n if (value.subLoop === true) return 'sub';\n if (value.subLoop === false) return 'root';\n return '-';\n}\n\nfunction eventStatus(value: Record<string, unknown>): string {\n if (typeof value.status === 'string' && value.status.trim()) return oneLine(value.status, 18);\n if (value.live === true) return 'live';\n const tools = value.tools;\n if (Array.isArray(tools) && tools.length) {\n if (tools.some((tool) => String((tool as Record<string, unknown>).state ?? '').toLowerCase() === 'failed')) {\n return 'failed';\n }\n if (tools.some((tool) => String((tool as Record<string, unknown>).state ?? '').toLowerCase() === 'running')) {\n return 'running';\n }\n return 'done';\n }\n return '-';\n}\n\nfunction stableJson(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value ?? '');\n }\n}\n\nfunction eventPreview(value: Record<string, unknown>): string {\n for (const key of ['text', 'content', 'summary', 'question', 'detail', 'message']) {\n if (typeof value[key] === 'string' && value[key].trim()) return oneLine(value[key], 86);\n }\n const tools = value.tools;\n if (Array.isArray(tools) && tools.length) {\n return oneLine(\n tools.map((tool) => {\n const t = tool as Record<string, unknown>;\n return `${String(t.toolName ?? t.name ?? '-')}:${String(t.state ?? t.status ?? '-')}`;\n }).join(' · '),\n 86,\n );\n }\n const activityLog = value.activityLog;\n if (Array.isArray(activityLog) && activityLog.length) {\n return oneLine(\n activityLog.map((item) => {\n const a = item as Record<string, unknown>;\n return String(a.detail ?? a.label ?? a.kind ?? '');\n }).filter(Boolean).join(' · '),\n 86,\n );\n }\n const part = value.part;\n if (part && typeof part === 'object') return oneLine(stableJson(part), 86);\n return oneLine(stableJson(value), 86);\n}\n\nasync function printConversationEvents(conversationId: string, args: ChatArgs): Promise<void> {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const items = await fetchConversationTimelineStrict(client.raw(), conversationId);\n const fmt: ChatOutputFormat = args.output ?? 'text';\n\n if (args.raw) {\n for (const item of items) {\n process.stdout.write(JSON.stringify({ conversationId, ...item }) + '\\n');\n }\n return;\n }\n\n if (fmt === 'json') {\n process.stdout.write(formatObject({ conversationId, count: items.length, events: items }, { format: 'json' }) + '\\n');\n return;\n }\n\n process.stdout.write(`conversation events: ${conversationId}\\n`);\n if (!items.length) {\n process.stdout.write('No timeline events.\\n');\n return;\n }\n\n const rows = items.map((item) => {\n const value = item as unknown as Record<string, unknown>;\n return {\n SEQ: value.seq ?? '-',\n KIND: oneLine(value.kind, 18),\n AGENT: eventAgent(value),\n SCOPE: eventScope(value),\n STATUS: eventStatus(value),\n EVENT: eventPreview(value),\n };\n });\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n process.stdout.write(`Showing ${items.length} event${items.length === 1 ? '' : 's'}.\\n`);\n process.stdout.write(`raw: hcm chat --events ${conversationId} --raw\\n`);\n}\n\nasync function printConversationList(args: ChatArgs): Promise<void> {\n if (args.events || args.resume || args.conversation || args.regenerateFrom || args.promptFile) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--list 只用于列会话;不要同时传 --events/--resume/--conversation/--regenerate-from/--prompt-file',\n });\n }\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const limit = parsePositiveInt(args.limit, 10, '--limit');\n const result = await fetchRecentConversations(client.raw(), limit);\n const fmt: ChatOutputFormat = args.output ?? 'text';\n if (fmt === 'json') {\n process.stdout.write(formatObject(result, { format: 'json' }) + '\\n');\n return;\n }\n const rows = result.rows.map((row) => ({\n UPDATED: formatShortDate(row.lastActiveAt ?? row.updateTime ?? row.createTime),\n MSGS: row.messageCount ?? 0,\n TOKENS: row.totalTokens ?? 0,\n TITLE: oneLine(row.title ?? row.lastMessagePreview ?? row.summary, 34),\n CONVERSATION: row.id ?? '-',\n }));\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n if (result.total !== undefined) {\n process.stdout.write(`Showing ${result.rows.length} of ${result.total} conversations.\\n`);\n }\n}\n\nexport async function chatCommand(prompt: string | undefined, args: ChatArgs): Promise<void> {\n try {\n if (args.list) {\n if (prompt) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--list 不接受 prompt;用 `hcm chat --list` 查看最近会话',\n });\n }\n await printConversationList(args);\n process.exit(0);\n }\n\n const eventsConversationId = resolveEventsConversation(args);\n if (eventsConversationId) {\n if (prompt || args.promptFile || args.regenerateFrom || args.attach?.length) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--events 是只读查询;不要同时传 prompt/--prompt-file/--regenerate-from/--attach',\n });\n }\n await printConversationEvents(eventsConversationId, args);\n process.exit(0);\n }\n\n // --regenerate-from:不发新 prompt(重跑用原 user message),不进 REPL;\n // fail-fast:seq 必须正整数,且必须指定既存 conversation(缺省会开新会话,无段可重跑)。\n let regenerateFromSeq: number | undefined;\n let regenerateFromLastAssistant = false;\n const regenerateMode = args.regenerateFrom !== undefined;\n const requestedConversationId = resolveResumeConversation(args);\n if (args.regenerateFrom !== undefined) {\n if (args.regenerateFrom === 'last-assistant') {\n regenerateFromLastAssistant = true;\n } else {\n regenerateFromSeq = Number(args.regenerateFrom);\n if (!Number.isInteger(regenerateFromSeq) || regenerateFromSeq <= 0) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--regenerate-from 需要正整数 journal seq 或 last-assistant,收到 \"${args.regenerateFrom}\"`,\n });\n }\n }\n if (!requestedConversationId) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--regenerate-from 必须配合 --resume <既存会话 id>(重跑既存段,无新 prompt)',\n });\n }\n prompt = prompt ?? '';\n }\n if (!prompt && !args.promptFile && !regenerateMode) {\n // ADR-129:REPL = Ink App(手搓 readline 版已退役,delete-on-supersede)。\n const { runInkRepl } = await import('../repl/run');\n return runInkRepl(args);\n }\n if (args.promptFile) {\n prompt = await fs.readFile(args.promptFile, 'utf-8');\n }\n if (prompt === undefined || (!prompt && !regenerateMode)) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: 'prompt is required (positional or --prompt-file)',\n });\n }\n\n // --on-confirm 在发任何请求前校验(非法值 fail-fast),渲染 / raw 两分支复用解析结果。\n const onConfirm = args.onConfirm ? parseOnConfirm(args.onConfirm) : undefined;\n // --inject-on 同样在发请求前 fail-fast(仅 --raw 分支会消费;渲染分支忽略不崩)。\n const injectOn = args.injectOn ? parseInjectOn(args.injectOn) : undefined;\n\n const ctx = await getActiveAuthContextFromCli(args);\n const wsUrl = ctx.endpoint.replace(/^http/, 'ws') + '/ws/conversation';\n const client = HcmClient.fromAuthContext(ctx);\n // Conversation state key — keyed on env name (T15: was `profile`).\n const stateKey = ctx.env;\n\n // Resolve agentId: --agent <UUID> wins, else default analyst.\n const agentId = args.agent ?? DEFAULT_AGENT_ID;\n\n // Resolve conversationId: explicit --resume / legacy --conversation > create new.\n let resumeConversationId = requestedConversationId;\n // 刀⑤ 续聊回放:仅显式续接已有会话时回显上下文摘要;默认 chat 一律开新会话。\n const resumedExisting = !!resumeConversationId;\n if (!resumeConversationId) {\n const conv = await createConversation(client.raw(), agentId);\n resumeConversationId = conv.id;\n }\n if (regenerateFromLastAssistant) {\n const items = await fetchConversationTimeline(client.raw(), resumeConversationId);\n const lastSeq = findLastAssistantSeq(items);\n if (lastSeq == null) {\n throw new CliError({\n code: CliErrorCode.BUSINESS_RULE_VIOLATION,\n message: `--regenerate-from last-assistant 找不到可重跑的 chat-text seq: conversation=${resumeConversationId}`,\n });\n }\n regenerateFromSeq = lastSeq;\n }\n\n const ws = new WsClient({\n endpoint: wsUrl,\n getAccessToken: () => client.getAccessToken(),\n onTokenExpiring: () => client.handleRefresh(),\n });\n await ws.connect();\n\n const fmt: ChatOutputFormat = args.output ?? 'text';\n\n // `--output json` is the script-friendly final result object. Raw protocol\n // JSONL remains available through `--raw`.\n const streamOutput = !!args.stream && (fmt !== 'json' || !!args.raw);\n if (streamOutput) {\n const { StreamPresenter } = await import('../streaming/StreamPresenter');\n const { TerminalRenderer } = await import('../streaming/TerminalRenderer');\n\n const isTty = !!process.stdout.isTTY;\n // commander `--no-xxx` 把 args.xxx 设 false, 未传时 undefined.\n // 默认: tty 自动开 (markdown/spinner/color); thinking 默认开; showToolCalls 由独立 flag 控.\n // commander `--no-xxx` 设 args.xxx=false, --xxx 设 true, 未传 undefined.\n // 默认: tty 自动开 markdown/spinner/color; thinking 默认开 (折叠); tool calls 默认显示 name.\n // verbose 由 args.verboseThinking / args.verboseTools 控制 (传了 → 展开内容).\n const renderer = new TerminalRenderer({\n markdown: args.markdown === false ? false : isTty,\n showThinking: args.thinking === false ? false : true,\n verboseThinking: !!args.verboseThinking,\n showToolCalls: args.showToolCalls !== false,\n verboseTools: !!args.verboseTools,\n spinner: args.spinner === false ? false : isTty,\n color: args.color === false ? false : isTty,\n apiBase: client.endpoint,\n });\n const presenter = new StreamPresenter(renderer, {\n showToolCalls: args.showToolCalls !== false,\n output: fmt,\n });\n\n // 刀⑤ 续聊回放(对标 Claude Code resume):续接已有会话时回显「↻ 续接 + 最近\n // 轮摘要」。仅 TTY + text 渲染分支——管道/CI/--raw 输出保持纯净;拉取失败静默跳过。\n if (resumedExisting && isTty && fmt === 'text' && !args.raw) {\n const { fetchConversationTimeline, buildResumeSummary } = await import('@hcmai/sdk');\n const items = await fetchConversationTimeline(client.raw(), resumeConversationId);\n const summary = items ? buildResumeSummary(resumeConversationId, items) : null;\n if (summary) renderer.showResumeContext(summary);\n }\n\n // issue #64:--attach 上传本地文件,元数据随 message.create 发送。\n let chatAttachments: AttachmentMeta[] | undefined;\n if (args.attach?.length) {\n const { uploadDocument } = await import('@hcmai/sdk');\n chatAttachments = [];\n for (const fp of args.attach) {\n const meta = await uploadDocument(client.raw(), fp);\n chatAttachments.push(meta);\n if (fmt === 'text' && !args.raw) process.stderr.write(`📎 已上传 ${meta.fileName} (${meta.documentId})\\n`);\n }\n }\n // 行内裸绝对路径(无 @ 前缀)也自动上传,与 REPL 同手势——防裸路径漏进 prompt 文本被\n // 当散文传给 LLM → 幻觉成别的路径。剥离路径、文本为空时给占位。\n if (prompt) {\n const { extractInlineFilePaths } = await import('../utils/attachment-args');\n const inline = extractInlineFilePaths(prompt);\n if (inline.paths.length) {\n const { uploadDocument } = await import('@hcmai/sdk');\n chatAttachments = chatAttachments ?? [];\n for (const fp of inline.paths) {\n const meta = await uploadDocument(client.raw(), fp);\n chatAttachments.push(meta);\n if (fmt === 'text' && !args.raw) process.stderr.write(`📎 已上传 ${meta.fileName} (${meta.documentId})\\n`);\n }\n prompt = inline.cleaned || '请处理这些附件';\n }\n }\n const handle = await sendMessageAndStream(ws, prompt, {\n agentId,\n conversationId: resumeConversationId,\n attachments: chatAttachments,\n // 决策回发后继续消费 resume 流到真终态(B3):--raw 与渲染分支同享。\n // 凡可能回发决策的路径都要 hold(否则 HALT 的 ROOT message.stop 被当终态,\n // resume 段内容 + control.interaction.resolved 反馈丢失)。\n // - --raw:仅 --on-confirm/--on-ask 会回发决策(--inject-on 走 interrupt/steer 不 HALT);\n // - 渲染分支:交互式 TTY / --auto-approve / 覆盖项均可能回发 → 一律 hold(G4 终局反馈依赖 resume 段可达)。\n holdUntilInteractionTerminal: args.raw\n ? !!onConfirm || args.onAsk !== undefined\n : true,\n regenerateFromSeq,\n });\n\n // --raw 示波器:逐行打印原始 v4/control envelope(L1 ground truth),不渲染。\n if (args.raw) {\n handle.onControl((ev) => process.stdout.write(JSON.stringify(ev) + '\\n'));\n // --on-confirm / --on-ask:raw 模式也程序化回发决策(P0 runner 依赖),打印与注入互不干扰。\n if (onConfirm || args.onAsk !== undefined) {\n const { resolveInteraction } = await import('../streaming/control-prompt');\n handle.onControl((ev) => {\n if (ev.type !== 'control.interaction.request') return;\n void (async () => {\n const req = parseInteractionRequest(ev.payload);\n const d = await resolveInteraction(req, {\n isTty: false,\n autoApprove: false,\n onConfirm,\n onAsk: args.onAsk,\n readLine: async () => {\n throw new Error('unreachable: override decisions never read stdin');\n },\n });\n if (d.decision === 'confirm') {\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n } else if (d.decision === 'reject') {\n handle.sendCommand(buildReject(req.interactionId, handle.conversationId, d.reason));\n } else if (d.decision === 'answer') {\n handle.sendCommand(buildAnswer(req.interactionId, handle.conversationId, d.answer, d.choiceIndex));\n }\n })();\n });\n }\n // --inject-on:流中途注入命令(P0 S-interrupt / S-steer 前置)。收到首个匹配\n // eventType 且非 control 通道的展示流事件后,发对应命令并打印 _cli marker(只触发一次)。\n let injected = false;\n for await (const ev of handle.events) {\n process.stdout.write(JSON.stringify(ev) + '\\n');\n if (\n injectOn &&\n !injected &&\n ev.type === injectOn.eventType &&\n (ev as { channel?: string }).channel !== 'control'\n ) {\n injected = true;\n if (injectOn.action === 'interrupt') {\n handle.sendCommand(buildInterrupt(handle.conversationId));\n } else {\n // parseInjectOn 已保证 steer 必有 arg(content)。\n handle.sendCommand(buildSteer(injectOn.arg as string, handle.conversationId));\n }\n // marker:channel=\"_cli\" 让 P0 断言层可过滤;payload 采用统一 envelope 形态。\n // 顶层 action/at 暂留兼容旧 P0 断言。\n const at = Date.now();\n process.stdout.write(\n JSON.stringify({\n channel: '_cli',\n type: '_cli.inject.sent',\n action: injectOn.action,\n at,\n conversationId: handle.conversationId,\n payload: {\n eventType: injectOn.eventType,\n action: injectOn.action,\n content: injectOn.action === 'steer' ? injectOn.arg : undefined,\n at,\n },\n }) + '\\n',\n );\n }\n }\n await ws.close();\n await saveConversationState(stateKey, {\n lastConversationId: handle.conversationId,\n updatedAt: new Date().toISOString(),\n });\n // 显式 drain stdout 防 process.exit 截断末行(pipe/CI 模式,与渲染分支同款)。\n await new Promise<void>((resolve) => {\n if (process.stdout.writableNeedDrain) {\n process.stdout.once('drain', resolve);\n } else {\n resolve();\n }\n });\n process.exit(0);\n }\n\n // 控制通道:confirm/ask 内联 stdin 交互;决策回发 approval.* / interaction.answer。\n const { resolveInteraction } = await import('../streaming/control-prompt');\n const { readLineFromStdin } = await import('../io/readline');\n handle.onControl((ev) => {\n // G4:决策受理 / 终局反馈(ADR-125)——用户 approve/reject/answer 后不再视觉空白。\n if (ev.type === 'control.interaction.resolved') {\n const r = parseInteractionResolved(ev.payload);\n if (r.phase === 'RESUMED') renderer.interactionResumed();\n else if (r.phase === 'TERMINAL') renderer.interactionTerminal((ev.payload.status as string) || undefined);\n return;\n }\n if (ev.type !== 'control.interaction.request') return;\n void (async () => {\n const req = parseInteractionRequest(ev.payload);\n if (req.kind === 'CONFIRM') renderer.confirmCard(req);\n else renderer.askCard(req);\n const decision = await resolveInteraction(req, {\n isTty: !!process.stdin.isTTY,\n autoApprove: !!args.autoApprove,\n onConfirm,\n onAsk: args.onAsk,\n readLine: readLineFromStdin,\n });\n if (decision.decision === 'confirm') {\n if (args.autoApprove) renderer.autoApproved(req.toolName, req.summary);\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n } else if (decision.decision === 'reject') {\n handle.sendCommand(buildReject(req.interactionId, handle.conversationId, decision.reason));\n } else if (decision.decision === 'answer') {\n handle.sendCommand(\n buildAnswer(req.interactionId, handle.conversationId, decision.answer, decision.choiceIndex),\n );\n } else {\n // 关键发现#1 RCA + 真流实测证实:ASK 在非交互(非 TTY)且无 --on-ask 兜底时\n // decision='error'。旧逻辑只 showInterrupted 打印、不回发命令 → 引擎挂起等应答、\n // consume 因 holdUntilInteractionTerminal 永等 interaction terminal → 双向死等挂死。\n // 实测发现仅发 response.interrupt(handle.cancel)不足以救场——后端在 ASK HALT\n // 状态对 interrupt 不回终态事件;且 ws.close() 主动关不广播 disconnect、不解\n // iterator hold。唯一可靠兜底:best-effort 通知后端中止 + CLI 主动退出进程\n // (130=中断语义),杜绝挂死,让自动化/CI 调用能以非零码感知「ASK 未应答」。\n renderer.showInterrupted(decision.reason);\n handle.cancel('ASK_UNANSWERABLE');\n await ws.close().catch(() => undefined);\n process.exit(130);\n }\n })();\n });\n\n // Ctrl+C abort handler — handle.cancel 发 response.interrupt(buildInterrupt);后端回 message.stop(interrupted) 后 iterator 终态.\n const sigintHandler = (): void => {\n process.stderr.write(chalk.yellow('\\n^C 中断中...\\n'));\n handle.cancel('USER_CANCEL');\n };\n process.once('SIGINT', sigintHandler);\n\n const t0 = Date.now();\n try {\n const result = await presenter.consume(handle.events);\n // G6:终态行带 in/out token 分解 + 工具/委派计数(流中统计)。\n const stats = presenter.completionStats;\n renderer.showCompleted(Date.now() - t0, result.traceId, handle.conversationId, presenter.tokenCount || undefined, {\n inputTokens: stats.inputTokens,\n outputTokens: stats.outputTokens,\n toolCount: stats.toolCount,\n delegationCount: stats.delegationCount,\n });\n await ws.close();\n await saveConversationState(stateKey, {\n lastConversationId: handle.conversationId,\n lastStreamId: result.streamId,\n lastTraceId: result.traceId ?? undefined,\n lastAgentKey: args.agent,\n updatedAt: new Date().toISOString(),\n });\n process.removeListener('SIGINT', sigintHandler);\n // 显式 drain stdout 防 process.exit 提前关掉 pipe (CI / pipe 模式下 0-byte bug)\n await new Promise<void>((resolve) => {\n if (process.stdout.writableNeedDrain) {\n process.stdout.once('drain', resolve);\n } else {\n resolve();\n }\n });\n process.exit(result.status === 'interrupted' ? 130 : 0);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n process.removeListener('SIGINT', sigintHandler);\n await ws.close();\n throw new CliError({\n code: e.code ?? CliErrorCode.BUSINESS_RULE_VIOLATION,\n message: e.message,\n traceId: e.traceId ?? undefined,\n });\n }\n }\n\n // 非流式\n const r = await oneShot(ws, prompt, {\n agentId,\n conversationId: resumeConversationId,\n collectEvents: fmt === 'json',\n });\n await ws.close();\n await saveConversationState(stateKey, {\n lastConversationId: r.conversationId,\n lastStreamId: r.streamId,\n lastTraceId: r.traceId ?? undefined,\n lastAgentKey: args.agent,\n updatedAt: new Date().toISOString(),\n });\n\n if (fmt === 'json') {\n process.stdout.write(\n formatObject(\n {\n conversationId: r.conversationId,\n streamId: r.streamId,\n traceId: r.traceId,\n messages: [{ role: 'assistant', content: r.content, toolCalls: r.toolCalls }],\n elapsedMs: r.elapsedMs,\n stopReason: r.stopReason,\n tokens: r.tokens,\n events: r.events,\n },\n { format: 'json' },\n ) + '\\n',\n );\n } else {\n if (args.showToolCalls) {\n for (const tc of r.toolCalls) {\n const mark = tc.success ? '✓' : '✗';\n const label = tc.argsPreview ? ` ${tc.argsPreview}` : '';\n process.stdout.write(\n chalk.gray(`[tool] ${tc.name}${label} ${mark} ${tc.elapsedMs}ms\\n`),\n );\n }\n }\n process.stdout.write(r.content + '\\n');\n process.stdout.write(\n chalk.dim(\n `\\n✓ done (${r.elapsedMs}ms · traceId ${r.traceId} · conversation ${r.conversationId})\\n`,\n ),\n );\n }\n process.exit(0);\n } catch (e) {\n exitWithError(e);\n }\n}\n","import { downloadDocument } from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { HcmClient } from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DownloadArgs {\n output?: string;\n env?: string;\n as?: string;\n}\n\n/**\n * `hcm download <documentId>`(issue #64):认证下载 HCM 文档到本地。\n * 会话附件 / 报表产物的 documentId 均可(timeline 回放与 ⬇ 行打印的 id 直接复用)。\n */\nexport async function downloadCommand(documentId: string, args: DownloadArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const saved = await downloadDocument(client.raw(), { documentId }, args.output);\n process.stdout.write(saved + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const status = (e as any)?.response?.status;\n if (status === 401 || status === 403) {\n exitWithError(new Error(`下载未授权(${status})——请 hcm login 后重试`));\n } else if (status === 404) {\n exitWithError(new Error('文档不存在或已清理(404)——核对 documentId'));\n } else {\n exitWithError(e);\n }\n }\n}\n","import { HcmClient, formatObject, formatRows, fromAxiosError, type OutputFormat } from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface TraceArgs {\n span?: string;\n limit?: string;\n events?: boolean;\n raw?: boolean;\n output?: OutputFormat;\n /** 会话 UUID:查 PG llm_call_trace 逐调用详情(ADR-134 D2) */\n conv?: string;\n /** 与 `hcm trace <convId> --llm-calls` 等价:把位置参当 convId 查 LLM 逐调用 */\n llmCalls?: boolean;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n}\n\n/** ADR-134 D2 · /api/moirai/conversations/{convId}/llm-trace 单行(后端干净投影)。 */\ninterface LlmTraceRow {\n roundNumber?: number | null;\n agentPath?: string | null;\n modelName?: string | null;\n finishReason?: string | null;\n promptTokens?: number | null;\n completionTokens?: number | null;\n totalTokens?: number | null;\n latencyMs?: number | null;\n responseToolCalls?: unknown;\n calledAt?: number | null;\n code?: string | null;\n}\n\ninterface TempoSpan {\n service?: string;\n operation?: string;\n durationMs?: number;\n status?: string;\n errorMessage?: string | null;\n [k: string]: unknown;\n}\n\ninterface LokiLog {\n time?: string;\n level?: string;\n service?: string;\n msg?: string;\n exception?: string;\n [k: string]: unknown;\n}\n\ninterface LlmContent {\n agentKey?: string;\n callType?: string;\n model?: string;\n roundNumber?: number;\n systemPromptHash?: string;\n systemPromptLen?: number;\n [k: string]: unknown;\n}\n\ninterface SourceResult {\n found?: boolean;\n reason?: string;\n spans?: TempoSpan[];\n logs?: LokiLog[];\n llmContent?: LlmContent[];\n [k: string]: unknown;\n}\n\ninterface TraceAggregate {\n traceId?: string;\n sources?: { ssoAudit?: SourceResult; loki?: SourceResult; tempo?: SourceResult };\n}\n\ninterface TraceSummary {\n traceId?: string;\n rootService?: string;\n rootOperation?: string;\n startTimeMs?: number;\n durationMs?: number;\n}\n\ninterface RecentResult {\n found?: boolean;\n reason?: string;\n traces?: TraceSummary[];\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number, flag: string): number {\n const n = Number(value ?? fallback);\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(`${flag} 需要正整数,收到 \"${value}\"`);\n }\n return n;\n}\n\nfunction fmtDuration(ms: number | undefined): string {\n const n = Number(ms ?? 0);\n if (!Number.isFinite(n) || n <= 0) return '-';\n if (n < 1000) return `${Math.round(n)}ms`;\n return `${(n / 1000).toFixed(1)}s`;\n}\n\nfunction toLocalTime(ms: number | undefined): string {\n if (!ms) return '-';\n const d = new Date(ms);\n if (Number.isNaN(d.getTime())) return '-';\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\nfunction short(value: unknown, max: number = 72): string {\n const text = String(value ?? '').replace(/\\s+/g, ' ').trim();\n if (!text) return '-';\n return text.length > max ? text.slice(0, Math.max(0, max - 1)) + '…' : text;\n}\n\nfunction sourceMark(src: SourceResult | undefined): string {\n if (src?.found) return 'yes';\n return src?.reason ? `no: ${short(src.reason, 40)}` : 'no';\n}\n\nfunction deriveStatus(spans: TempoSpan[]): string {\n if (spans.some((sp) => String(sp.status ?? '').toUpperCase() === 'ERROR')) return 'ERROR';\n if (spans.length > 0) return 'OK';\n return 'UNKNOWN';\n}\n\nfunction traceDuration(spans: TempoSpan[]): string {\n const root = spans.find((sp) => Number(sp.durationMs ?? 0) > 0) ?? spans[0];\n return fmtDuration(root?.durationMs);\n}\n\nfunction printRecent(data: RecentResult, limit: number): void {\n const traces = data.traces ?? [];\n if (!traces.length) {\n process.stdout.write(`No recent traces${data.reason ? `: ${data.reason}` : ''}.\\n`);\n return;\n }\n\n const rows = traces.slice(0, limit).map((t) => ({\n TIME: toLocalTime(t.startTimeMs),\n DURATION: fmtDuration(t.durationMs),\n SERVICE: short(t.rootService, 18),\n OPERATION: short(t.rootOperation, 36),\n TRACE: t.traceId ?? '-',\n }));\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n process.stdout.write(`Showing ${rows.length} trace${rows.length === 1 ? '' : 's'}.\\n`);\n process.stdout.write('next: hcm trace <traceId> | hcm trace <traceId> --events | hcm trace <traceId> --raw\\n');\n}\n\nfunction printTraceDetail(traceId: string, agg: TraceAggregate): void {\n const tempo = agg.sources?.tempo;\n const loki = agg.sources?.loki;\n const sso = agg.sources?.ssoAudit;\n const spans = tempo?.spans ?? [];\n const logs = loki?.logs ?? [];\n const llm = loki?.llmContent ?? [];\n\n process.stdout.write(`trace: ${traceId}\\n`);\n process.stdout.write(`status: ${deriveStatus(spans)}\\n`);\n process.stdout.write(`duration: ${traceDuration(spans)}\\n`);\n process.stdout.write(`sources: tempo=${sourceMark(tempo)} · loki=${sourceMark(loki)} · ssoAudit=${sourceMark(sso)}\\n`);\n process.stdout.write(`spans: ${spans.length} · logs: ${logs.length} · llmContent: ${llm.length}\\n`);\n\n if (spans.length) {\n const rows = spans.slice(0, 12).map((sp, i) => ({\n '#': i + 1,\n STATUS: sp.status ?? '-',\n DURATION: fmtDuration(sp.durationMs),\n SERVICE: short(sp.service, 20),\n OPERATION: short(sp.operation, 48),\n }));\n process.stdout.write('\\nTempo spans:\\n');\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n if (spans.length > rows.length) process.stdout.write(`... ${spans.length - rows.length} more spans\\n`);\n } else if (tempo?.reason) {\n process.stdout.write(`\\nTempo: ${tempo.reason}\\n`);\n }\n\n if (logs.length) {\n const rows = logs.slice(0, 8).map((log) => ({\n TIME: short(log.time, 19),\n LEVEL: short(log.level, 8),\n MESSAGE: short(log.msg ?? log.exception, 90),\n }));\n process.stdout.write('\\nLoki logs:\\n');\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n if (logs.length > rows.length) process.stdout.write(`... ${logs.length - rows.length} more logs\\n`);\n } else if (loki?.reason) {\n process.stdout.write(`\\nLoki: ${loki.reason}\\n`);\n }\n\n process.stdout.write('\\nnext: hcm trace <traceId> --events | hcm trace <traceId> --raw\\n');\n}\n\nfunction printTraceEvents(traceId: string, agg: TraceAggregate): void {\n const spans = agg.sources?.tempo?.spans ?? [];\n const logs = agg.sources?.loki?.logs ?? [];\n const llm = agg.sources?.loki?.llmContent ?? [];\n const rows: Record<string, unknown>[] = [];\n\n spans.forEach((sp, i) => rows.push({\n '#': i + 1,\n TYPE: 'span',\n STATUS: sp.status ?? '-',\n DURATION: fmtDuration(sp.durationMs),\n EVENT: short(`${sp.service ?? '-'} · ${sp.operation ?? '-'}`, 84),\n }));\n logs.forEach((log, i) => rows.push({\n '#': `L${i + 1}`,\n TYPE: 'log',\n STATUS: short(log.level, 8),\n DURATION: short(log.time, 19),\n EVENT: short(log.msg ?? log.exception, 84),\n }));\n llm.forEach((item, i) => rows.push({\n '#': `M${i + 1}`,\n TYPE: 'llm',\n STATUS: short(item.callType, 12),\n DURATION: item.roundNumber == null ? '-' : `round ${item.roundNumber}`,\n EVENT: short(`${item.agentKey ?? '-'} · ${item.model ?? '-'} · prompt ${item.systemPromptHash ?? '?'} (${item.systemPromptLen ?? 0})`, 84),\n }));\n\n process.stdout.write(`trace events: ${traceId}\\n`);\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n}\n\n/** ConversationModel 列表行(PG 兜底视图,字段来自 dev-machine 实测)。 */\ninterface ConversationRow {\n id?: string;\n title?: string | null;\n createTime?: string | null;\n lastActiveAt?: string | null;\n messageCount?: number | null;\n totalTokens?: number | null;\n}\n\n/**\n * list 模式:优先 Tempo `/api/trace/recent`;Tempo 不可用(未起观测栈 / 空结果)时回退\n * PG 会话视图(查 ConversationModel,离线可用)。回退给出的是「最近会话」而非 Tempo trace,\n * 用户可据此 `hcm trace --conv <CONV>` 看逐调用。\n */\nasync function listRecentTraces(\n client: InstanceType<typeof HcmClient>,\n limit: number,\n): Promise<void> {\n const http = client.raw();\n try {\n const resp = await http.get('/api/trace/recent', { params: { limit } });\n const data = (resp.data ?? {}) as RecentResult;\n if (data.traces && data.traces.length) {\n printRecent(data, limit);\n return;\n }\n process.stdout.write(\n `Tempo 无最近 trace${data.reason ? `(${short(data.reason, 60)})` : ''},回退 PG 会话视图:\\n\\n`,\n );\n } catch (e) {\n const reason = (e as { message?: string })?.message ?? 'Tempo 不可用';\n process.stdout.write(`Tempo 不可用(${short(reason, 60)}),回退 PG 会话视图:\\n\\n`);\n }\n await listRecentConversationsPg(client, limit);\n}\n\n/** PG 兜底:列最近会话(ConversationModel),供 `hcm trace --conv <id>` 深入。 */\nasync function listRecentConversationsPg(\n client: InstanceType<typeof HcmClient>,\n limit: number,\n): Promise<void> {\n let rows: ConversationRow[];\n try {\n const res = await client.query<ConversationRow>('ConversationModel', {\n sort: [{ field: 'lastActiveAt', direction: 'desc' }],\n limit,\n });\n rows = res.rows;\n } catch (e) {\n process.stdout.write(`PG 会话视图也失败:${short((e as { message?: string })?.message, 80)}\\n`);\n return;\n }\n if (!rows.length) {\n process.stdout.write('无最近会话。\\n');\n return;\n }\n const table = rows.map((c) => ({\n TIME: short(c.lastActiveAt ?? c.createTime, 19),\n TITLE: short(c.title, 28),\n MSGS: c.messageCount ?? '-',\n TOKENS: c.totalTokens ?? '-',\n CONV: c.id ?? '-',\n }));\n process.stdout.write(formatRows(table, { format: 'table' }) + '\\n');\n process.stdout.write(`Showing ${rows.length} conversation${rows.length === 1 ? '' : 's'}(PG 视图)。\\n`);\n process.stdout.write('next: hcm trace --conv <CONV>(看该会话 LLM 逐调用,含委派子会话)\\n');\n}\n\n/**\n * 从 response_tool_calls(后端已解析成对象/数组,或解析失败的原始字符串)抽 tool name 列表。\n * 兼容多种 provider 形状:`{name}` / `{function:{name}}` / 顶层包 `{toolCalls:[...]}`。\n */\nfunction extractToolNames(raw: unknown): string {\n if (raw == null) return '-';\n let value: unknown = raw;\n if (typeof value === 'string') {\n const text = value.trim();\n if (!text) return '-';\n try {\n value = JSON.parse(text);\n } catch {\n return short(text, 24);\n }\n }\n let list: unknown[];\n if (Array.isArray(value)) {\n list = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const nested = obj.toolCalls ?? obj.tool_calls ?? obj.calls;\n list = Array.isArray(nested) ? nested : [value];\n } else {\n return '-';\n }\n const names = list\n .map((item) => {\n if (!item || typeof item !== 'object') return null;\n const o = item as Record<string, unknown>;\n const fn = o.function as Record<string, unknown> | undefined;\n const name = o.name ?? fn?.name ?? o.toolName;\n return typeof name === 'string' && name ? name : null;\n })\n .filter((n): n is string => n != null);\n return names.length ? names.join(', ') : '-';\n}\n\nfunction buildLlmTable(rows: LlmTraceRow[]): {\n table: Record<string, unknown>[];\n inSum: number;\n outSum: number;\n} {\n let inSum = 0;\n let outSum = 0;\n const table = rows.map((r) => {\n const pIn = Number(r.promptTokens ?? 0);\n const pOut = Number(r.completionTokens ?? 0);\n inSum += pIn;\n outSum += pOut;\n return {\n ROUND: r.roundNumber ?? '-',\n AGENT: short(r.agentPath, 22),\n MODEL: short(r.modelName, 22),\n TOOLS: short(extractToolNames(r.responseToolCalls), 30),\n 'TOKENS(in/out)': `${pIn}/${pOut}`,\n LATENCY: fmtDuration(r.latencyMs ?? undefined),\n FINISH: short(r.finishReason, 12),\n };\n });\n return { table, inSum, outSum };\n}\n\n/**\n * 打印会话 LLM 逐调用树:根会话 + 递归展开的委派子会话(BUG#2:委派 specialist 的轮次/\n * 工具在离线 PG trace 里可见,不必依赖 Tempo)。子会话 id 由根会话 timeline 的 delegate\n * tool.result(childConversationId)发现。\n */\nfunction printLlmTraceTree(nodes: TraceNode[]): void {\n const root = nodes[0]!;\n const childCount = nodes.length - 1;\n if (!root.rows.length && childCount === 0) {\n process.stdout.write(`No LLM calls for conversation ${root.convId}.\\n`);\n process.stdout.write('next: 确认 convId 正确,或该会话尚无 LLM 调用落库(dev always-on,ADR-134 D2)。\\n');\n return;\n }\n for (const node of nodes) {\n if (node.depth === 0) {\n process.stdout.write(\n `conversation: ${node.convId}${childCount ? `(+${childCount} 委派子会话)` : ''}\\n`,\n );\n } else {\n process.stdout.write(\n `\\n${' '.repeat(node.depth)}└─ 委派 → ${node.label} · ${node.convId}(depth ${node.depth})\\n`,\n );\n }\n const { table, inSum, outSum } = buildLlmTable(node.rows);\n process.stdout.write(`llm calls: ${node.rows.length} · tokens(in/out): ${inSum}/${outSum}\\n\\n`);\n if (table.length) {\n process.stdout.write(formatRows(table, { format: 'table' }) + '\\n');\n } else {\n process.stdout.write('(无 LLM 调用)\\n');\n }\n }\n process.stdout.write('\\nnext: hcm trace --conv <convId> --raw(看完整逐调用 JSON)\\n');\n}\n\nasync function fetchLlmTrace(\n http: ReturnType<InstanceType<typeof HcmClient>['raw']>,\n convId: string,\n): Promise<LlmTraceRow[]> {\n const resp = await http.get(`/api/moirai/conversations/${encodeURIComponent(convId)}/llm-trace`);\n return (resp.data ?? []) as LlmTraceRow[];\n}\n\ninterface TraceNode {\n convId: string;\n depth: number;\n /** 委派该子会话的 agentKey / 工具名(根为 'root')。 */\n label: string;\n rows: LlmTraceRow[];\n}\n\n/**\n * 从会话 timeline 抽出被委派的子会话(kind='tools' 项内 tools[].childConversationId)。\n * timeline 走 ConversationModel action(PG,离线可用);任何失败返回空(递归 best-effort)。\n */\n/**\n * 从 timeline items 抽出被委派子会话(纯函数,供单测守 timeline schema 契约):\n * kind='tools' 项内 tools[].childConversationId,按出现序去重,label 取 agentKey/name/toolName。\n */\nexport function extractChildConvs(\n items: Array<Record<string, unknown>>,\n): Array<{ childConvId: string; label: string }> {\n const out: Array<{ childConvId: string; label: string }> = [];\n const seen = new Set<string>();\n for (const it of items) {\n if (it.kind !== 'tools' || !Array.isArray(it.tools)) continue;\n for (const t of it.tools as Array<Record<string, unknown>>) {\n const child = t.childConversationId;\n if (typeof child === 'string' && child && !seen.has(child)) {\n seen.add(child);\n const label =\n (typeof t.agentKey === 'string' && t.agentKey) ||\n (typeof t.name === 'string' && t.name) ||\n (typeof t.toolName === 'string' && t.toolName) ||\n 'delegate';\n out.push({ childConvId: child, label });\n }\n }\n }\n return out;\n}\n\nasync function fetchChildConvs(\n http: ReturnType<InstanceType<typeof HcmClient>['raw']>,\n convId: string,\n): Promise<Array<{ childConvId: string; label: string }>> {\n let items: Array<Record<string, unknown>> = [];\n try {\n const resp = await http.get(\n `/api/models/ConversationModel/${encodeURIComponent(convId)}/action/timeline`,\n );\n const body = resp.data as unknown;\n if (Array.isArray(body)) items = body as Array<Record<string, unknown>>;\n else if (body && typeof body === 'object' && Array.isArray((body as { data?: unknown }).data)) {\n items = (body as { data: Array<Record<string, unknown>> }).data;\n }\n } catch {\n return [];\n }\n return extractChildConvs(items);\n}\n\n/** DFS 收集根会话 + 委派子会话的 LLM trace(深度上限防环 / 无限递归)。 */\nasync function gatherLlmTraceTree(\n http: ReturnType<InstanceType<typeof HcmClient>['raw']>,\n rootConvId: string,\n maxDepth = 3,\n): Promise<TraceNode[]> {\n const nodes: TraceNode[] = [];\n const visited = new Set<string>();\n async function walk(convId: string, depth: number, label: string): Promise<void> {\n if (visited.has(convId) || depth > maxDepth) return;\n visited.add(convId);\n nodes.push({ convId, depth, label, rows: await fetchLlmTrace(http, convId) });\n if (depth === maxDepth) return;\n for (const c of await fetchChildConvs(http, convId)) {\n await walk(c.childConvId, depth + 1, c.label);\n }\n }\n await walk(rootConvId, 0, 'root');\n return nodes;\n}\n\nexport async function traceCommand(traceId: string | null, args: TraceArgs): Promise<void> {\n try {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const http = client.raw();\n\n // ADR-134 D2:LLM 逐调用模式 — `hcm trace --conv <convId>` 或 `hcm trace <convId> --llm-calls`\n const convId = args.conv ?? (args.llmCalls ? traceId ?? undefined : undefined);\n if (convId) {\n // raw/json/yaml:保持单会话扁平数组(机器契约不变)。\n if (args.raw || args.output === 'json' || args.output === 'yaml') {\n const rows = await fetchLlmTrace(http, convId);\n const fmt = args.raw ? 'json' : (args.output as OutputFormat);\n process.stdout.write(formatObject(rows, { format: fmt }) + '\\n');\n process.exit(0);\n }\n // 人读表格:递归展开委派子会话(BUG#2)。\n printLlmTraceTree(await gatherLlmTraceTree(http, convId));\n process.exit(0);\n }\n\n if (!traceId) {\n if (args.events || args.raw || args.span) {\n exitWithError('traceId is required for --events, --raw, and --span');\n return;\n }\n await listRecentTraces(client, parsePositiveInt(args.limit, 10, '--limit'));\n process.exit(0);\n }\n\n const resp = await http.get(`/api/trace/${traceId}`);\n const agg: TraceAggregate = resp.data ?? {};\n\n if (args.raw) {\n process.stdout.write(formatObject(agg, { format: 'json' }) + '\\n');\n process.exit(0);\n }\n\n if (args.output === 'json' || args.output === 'yaml') {\n process.stdout.write(formatObject(agg, { format: args.output }) + '\\n');\n process.exit(0);\n }\n\n const spans = agg.sources?.tempo?.spans ?? [];\n if (args.span) {\n const idx = parsePositiveInt(args.span, 1, '--span') - 1;\n if (idx < 0 || idx >= spans.length) {\n exitWithError(`Span #${args.span} 越界(共 ${spans.length} 条 Tempo span)`);\n return;\n }\n process.stdout.write(formatObject(spans[idx], { format: 'yaml' }) + '\\n');\n process.exit(0);\n }\n\n if (args.events) {\n printTraceEvents(traceId, agg);\n } else {\n printTraceDetail(traceId, agg);\n }\n process.exit(0);\n } catch (e) {\n const err = e as Record<string, unknown>;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n getCacheStats,\n clearModelCache,\n clearMetaCache,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface CacheArgs {\n id?: string;\n type?: string;\n state?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nasync function withClient<T>(args: CacheArgs, fn: (c: HcmClient) => Promise<T>): Promise<T> {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n return fn(client);\n}\n\nfunction emit(result: unknown, args: CacheArgs, human: string): void {\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(human + '\\n');\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n}\n\nfunction fail(e: unknown, args: CacheArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm cache stats <Model>` —— 查看两级缓存命中统计。 */\nexport async function cacheStatsCommand(model: string, args: CacheArgs): Promise<void> {\n try {\n const stats = await withClient(args, (c) => getCacheStats(c.raw(), model));\n emit(stats, args, `📊 ${model} 缓存统计`);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm cache clear <Model> [--id <id>]` —— 清实体缓存。\n * 幂等且不破坏数据,故不设确认闸。\n */\nexport async function cacheClearCommand(model: string, args: CacheArgs): Promise<void> {\n try {\n const result = await withClient(args, (c) => clearModelCache(c.raw(), model, args.id));\n emit(result, args, args.id ? `🧹 已清 ${model}#${args.id} 缓存` : `🧹 已清 ${model} 全部实体缓存`);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm cache clear-meta <Model> [--type <t>] [--state <s>]` —— 清元数据缓存\n * (Code 级 YAML 配置 + Action 定义)。改 meta YAML 后必跑,否则读到旧配置。\n */\nexport async function cacheClearMetaCommand(model: string, args: CacheArgs): Promise<void> {\n try {\n const result = await withClient(args, (c) =>\n clearMetaCache(c.raw(), model, { type: args.type, state: args.state }),\n );\n const scope = args.type ? `${args.type}${args.state ? `.${args.state}` : ''}` : '全部';\n emit(result, args, `🧹 已清 ${model} 元数据缓存(${scope})`);\n } catch (e) {\n fail(e, args);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n uploadDocument,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface UploadArgs {\n env?: string;\n as?: string;\n output?: OutputFormat;\n /**\n * 存储分类。**必须是目标环境里真实存在的分类**(服务端数据,不是枚举)。\n * 不传时用 `attachment` —— 通用附件分类,比聊天专用的 `ai-conversation` 中性。\n */\n category?: string;\n}\n\n/**\n * 通用上传的缺省分类。\n *\n * <p>🔴 此前 `uploadDocument` 硬编码聊天专用的 `ai-conversation`,于是\n * `hcm upload <任意文件>` 在没有该分类的环境上一律 404。而本命令的注释自己就\n * 写着「报表 xlsx 模板、套打 docx 模板、导入 Excel 都要先拿到 documentId」——\n * 它明知自己在交付路径上,却在用聊天分类。\n */\nconst DEFAULT_UPLOAD_CATEGORY = 'attachment';\n\n/**\n * `hcm upload <file>` —— 上传本地文件到 HCM 文档服务,返回 documentId。\n *\n * 交付路径上的必用动作:报表 xlsx 模板、套打 docx 模板、导入 Excel 都要先拿到\n * documentId 才能挂到业务对象上。与 `hcm download <documentId>` 成对。\n */\nexport async function uploadCommand(filePath: string, args: UploadArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const meta = await uploadDocument(\n client.raw(),\n filePath,\n args.category ?? DEFAULT_UPLOAD_CATEGORY,\n );\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') {\n process.stdout.write(\n `⬆️ ${meta.fileName} (${meta.fileSize} B) → documentId ${meta.documentId}\\n`,\n );\n }\n process.stdout.write(formatObject(meta, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n const status = err?.response?.status;\n if (err?.code === 'ENOENT') {\n exitWithError(new Error(`文件不存在:${filePath}`));\n } else if (status === 413) {\n exitWithError(new Error('文件超出服务端大小上限(413)'));\n } else if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.env));\n } else {\n exitWithError(e);\n }\n }\n}\n","import { promises as fsp } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport {\n createHttpClient,\n fetchSkillCatalog,\n fetchSkillFile,\n fetchSkillMarkdown,\n fetchSkillReference,\n resolveChironBase,\n assertSafeSkillId,\n assertSafeReferencePath,\n normalizeReferences,\n parseSkillRequirements,\n parseSkillFrontmatter,\n resolveSkillInstallOrder,\n resolveAllSkillsInstallOrder,\n matchSkills,\n filterByStage,\n formatObject,\n fromAxiosError,\n loadEnv,\n loadGlobalConfig,\n resolveActiveEnv,\n CliError,\n CliErrorCode,\n type ChironCategory,\n type ChironManifest,\n type ChironSkill,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport {\n buildUnifiedCatalog,\n checkCrossSourceRequires,\n classifyInstalledSource,\n conflictMessage,\n detectIdConflicts,\n parseSourceFilter,\n unconfirmedConflictNote,\n CLI_CATEGORY_KEY,\n CLI_CATEGORY_NAME,\n SOURCE_STATUS_NOTE,\n type SourceFilter,\n type UnifiedCatalog,\n} from './skills-catalog';\nimport { listBundledSkills, readBundledSkillDocument, resolveBundledClosure } from './skills-bundled';\nimport { CLI_VERSION } from '../package-version';\nimport { prepareSkillDocuments, syncWorkBuddyProject } from './skills-sync';\nimport { prepareWorkBuddyRuntime } from './skills-runtime';\n\nexport interface SkillsArgs {\n endpoint?: string;\n env?: string;\n dir?: string;\n global?: boolean;\n from?: string;\n force?: boolean;\n category?: string;\n stage?: string;\n byStage?: boolean;\n /** 装给哪个 agent:claude = .claude/skills/;codex = hcm-skills/ + AGENTS.md 索引;auto = 探目录 */\n target?: 'claude' | 'codex' | 'auto';\n /** `skills update --check`:只报会变什么,不写盘 */\n check?: boolean;\n /**\n * `install --all` / `update --all`:要的是**整个技能库**。\n *\n * 🔴 这是订阅不是快照——它会记进 `.hcm-skills.json`,往后 `update` 按产品**当前**全集\n * 重算,产品新增的技能自动补上。只装一次快照的话,下个版本新增的技能永远不会来。\n */\n all?: boolean;\n /** `skills list --installed`:只读本地清单,不连网 */\n installed?: boolean;\n /**\n * 这一趟看哪些来源:`cli`(只看自带,不连网)/ `chiron`(只看睿戎)/ `all`(缺省)。\n *\n * 🔴 **它是「这一趟」的过滤器,不写进状态文件**(spec §7.3)。\n * 让它把 `state.all` 的订阅缩成半边,这个订阅的含义就取决于它当初是怎么建的,\n * 而状态文件里看不出来——下一个人跑 update 时拿到的行为无法从文件解释。\n * 🔴 它也**不是**冲突消解手段(spec §5.2):那会让同一条命令在两台机器上装出不同内容。\n */\n source?: SourceFilter;\n output?: OutputFormat;\n}\n\nexport interface SkillsSyncArgs extends Omit<SkillsArgs, 'target'> {\n target?: string;\n project?: string;\n cli?: string;\n}\n\n/** 装到哪个 agent。Codex 不发现 `.claude/skills/`,它读 `AGENTS.md`——装错地方等于没装。 */\nexport type SkillTarget = 'claude' | 'codex';\n\nexport interface SkillReferenceDocument {\n /** 相对 `<skill>/references/` 的路径 */\n path: string;\n content: string;\n}\n\nexport interface SkillDocument {\n id: string;\n markdown: string;\n /** 精确定位符:睿戎是 URL,本地是绝对路径,自带是 `@hcmai/cli@<版本>:skills/<id>`。 */\n source: string;\n /** 来源种类。缺省按睿戎处理(历史路径全是睿戎)。 */\n sourceKind?: RecordSourceKind;\n /** 技能自带的参考文件。正文里 `[x](references/x.md)` 引的就是它们,不带下来就是死链。 */\n references?: SkillReferenceDocument[];\n}\n\n/**\n * catalog 只有两个半边;状态文件比它多一档 `local`(`install --from` 那条路)。\n *\n * 🔴 两个名字不能合成一个:没有任何一趟会去「扫 local 来源」,合成一个要么让 catalog\n * 多出一个永远空的半边,要么状态文件装不下 `local`。\n */\nexport type CatalogSourceKind = 'chiron' | 'cli';\nexport type RecordSourceKind = CatalogSourceKind | 'local';\n\n/** 一条已安装记录。`sha256` 是**安装当时**写下去的内容指纹,用来区分「产品更新了」和「本地改过」。 */\nexport interface InstalledSkillRecord {\n /**\n * 🔴 **保留原字段名与原语义(精确定位符)**,另起新键存来源种类。\n *\n * 把 `source` 改成枚举会丢掉溯源信息,而且有一条真会腐化数据的链:\n * v2 文件被旧 CLI 跑一次 `update` ⇒ 它硬写 `version = 1` 且只覆盖本次改动的那几条\n * ⇒ 盘上出现「version:1 但带枚举值」的混合体 ⇒ 新 CLI 见 `version !== 2` 触发迁移\n * ⇒ 枚举值 `\"bundled\"` 不以 http 开头 ⇒ 判成 local ⇒ **这份技能从此再不更新**,\n * 且 locator 已被覆盖丢失,全程无提示。\n * 新键名没有这个洞:旧 CLI 不认识 `sourceKind` 就不会写它,新 CLI 见到它存在即知已迁移。\n */\n source: string;\n /** 迁移后必然存在;类型上可选是为了能读进 v1 的老文件。 */\n sourceKind?: RecordSourceKind;\n /** 与 `source` 同值同语义(URL / 包内路径 / 本地绝对路径),新代码一律读这个。 */\n sourceLocator?: string;\n sha256: string;\n installedAt: string;\n /** true = 顾问显式装的;false = 作为 requires 被带进来的 */\n direct: boolean;\n references: Record<string, string>;\n}\n\n/** `<baseDir>/.hcm-skills.json`——升级的依据。没有它就只能靠人记住装过什么。 */\nexport interface SkillsStateFile {\n /** 读得进 1,写出去恒为 2。旧 CLI 会把它写回 1——见 `migrateSkillsState`。 */\n version: 1 | 2;\n target: SkillTarget;\n endpoint?: string;\n /** 装的时候探到的技能库前缀('' 或 '/api'),仅供排查用 */\n base?: string;\n /**\n * true = 这个目录订阅了**全集**(装的时候用的 `--all`)。\n *\n * 🔴 `update` 只遍历清单里已记录技能的依赖闭包,所以产品新增的技能永远不会被带进来。\n * 这个标记就是修那个洞:它在,`update` 就按产品当前全集重算。\n */\n all?: boolean;\n updatedAt: string;\n skills: Record<string, InstalledSkillRecord>;\n}\n\nexport const SKILLS_STATE_FILE = '.hcm-skills.json';\n\n/**\n * v1 → v2 的**逐条**迁移:给每条记录补上 `sourceKind` / `sourceLocator`。\n *\n * 🔴 **幂等判据是「这条记录有没有 `sourceKind`」,不是「`version` 等于几」。**\n * 版本号会被旧 CLI 写回 1,于是盘上会出现「version:1 但部分记录已是 v2 形态」的混合体;\n * 按 version 判会把那些已迁移的记录**再判一次**——而 `sourceLocator` 此时可能已被\n * 旧 CLI 覆盖成别的东西,重判的结果是把 `cli` 记录判成 `local`,从此不再升级且无提示。\n * 按「键在不在」判,混合体里已迁移的那部分原样保留。\n *\n * 🔴 **不写盘**:迁移只发生在内存里,等下一次真正的 install/update 落盘时一起写。\n * 单是读一次清单就改写顾问的文件,是本仓「读操作不许有副作用」的反面。\n */\nexport function migrateSkillsState(state: SkillsStateFile): SkillsStateFile {\n const skills: Record<string, InstalledSkillRecord> = {};\n for (const [id, record] of Object.entries(state.skills ?? {})) {\n if (record.sourceKind) {\n skills[id] = record;\n continue;\n }\n // 唯一可用的线索就是 v1 的 `source`:它是 URL ⇒ 睿戎;否则 ⇒ 本地目录装的。\n // 🔴 v1 时代没有「自带技能」这条路,所以迁移**永远不会**产出 `cli`——\n // 那一档只能由新版 CLI 装的时候写下,不能靠猜。\n const kind: RecordSourceKind = /^https?:\\/\\//i.test(record.source ?? '') ? 'chiron' : 'local';\n skills[id] = { ...record, sourceKind: kind, sourceLocator: record.source };\n }\n return { ...state, skills };\n}\n\nexport function sha256(text: string): string {\n return createHash('sha256').update(text, 'utf8').digest('hex');\n}\n\nexport interface SkillInstallationResult {\n /** 本次显式请求的技能;`--all` 时是整个目录 */\n ids: string[];\n /** 落点目录 */\n baseDir: string;\n installed: string[];\n unchanged: string[];\n files: Array<{ id: string; target: string; source: string; bytes: number; status: 'installed' | 'unchanged' }>;\n}\n\n/**\n * 解析 endpoint。技能库端点**免认证**,故只需要连接信息,不解析 identity——\n * 这正是冷启动能成立的原因:空环境、无租户、无账号也能装技能。\n */\nasync function resolveEndpoint(args: SkillsArgs): Promise<string> {\n if (args.endpoint) return args.endpoint.replace(/\\/+$/, '');\n const g = await loadGlobalConfig();\n const envName = resolveActiveEnv({ envFlag: args.env }, process.env, g);\n const env = await loadEnv(envName).catch(() => null);\n if (!env?.endpoint) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message:\n '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`。'\n + '(技能库免认证,不需要先 login)',\n });\n }\n return env.endpoint.replace(/\\/+$/, '');\n}\n\n/** 去掉尾斜杠,两个 endpoint 才比得起来。 */\nexport function normalizeEndpoint(endpoint: string): string {\n return endpoint.replace(/\\/+$/, '');\n}\n\n/**\n * 决定这次连哪个环境,并挡住**静默跨环境**。\n *\n * 一个装过技能的目录是绑在它的来源环境上的:技能随产品版本走,拿另一个客户环境的版本\n * 盖上去,顾问不会收到任何信号,而两边的产品版本很可能不同。\n *\n * 🔴 两个方向都不许静默。只把优先级反过来(记录的来源赢)不是修复——那只是把\n * 「静默用了当前 env」换成「静默还用旧来源」,顾问真想改指向时反而被闷住。所以:\n * 显式给了 `--endpoint` / `--env` 才算改指向(调用方随后把新来源记下来),\n * 没给而两边不一致就报错,让人明说要哪个。\n *\n * 纯函数:网络与配置读取留在调用方,这里只做判定,好测。\n */\nexport function decideTrackedEndpoint(options: {\n /** 命令行显式给了 --endpoint 或 --env */\n explicit: boolean;\n /** 显式指定或当前 env 解析出来的地址;当前 env 解析不出来时为 undefined */\n current?: string;\n /** 安装清单里记的来源;老清单可能没有 */\n recorded?: string;\n}): string {\n const { explicit } = options;\n const current = options.current ? normalizeEndpoint(options.current) : undefined;\n const recorded = options.recorded ? normalizeEndpoint(options.recorded) : undefined;\n\n // 显式改指向:听命令行的\n if (explicit) {\n if (!current) throw invalid('未解析到 endpoint —— 传 --endpoint <url>,或用 --env <name> 指一个配好的环境');\n return current;\n }\n // 老清单没记来源,或这个目录还没装过东西:只能听当前 env\n if (!recorded) {\n if (!current) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message:\n '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`。'\n + '(技能库免认证,不需要先 login)',\n });\n }\n return current;\n }\n // 当前 env 没配/读不出来:跟安装时记的那个,这是既有行为\n if (!current || current === recorded) return recorded;\n\n throw invalid(\n `这个目录的技能装自 ${recorded},当前 env 指向 ${current} —— 不是同一个环境。\\n`\n + '技能随产品版本走,跨环境升级会拿另一个环境的版本盖掉现在这份,且不会有任何提示。\\n'\n + '明说要哪个:\\n'\n + ` · 继续跟 ${recorded} → 加 --endpoint ${recorded}\\n`\n + ` · 改跟当前这个 → 加 --endpoint ${current}(来源会改成它,之后不用再带)`,\n );\n}\n\nasync function exists(target: string): Promise<boolean> {\n try {\n await fsp.stat(target);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * 没显式指定 --target 时探当前目录:`.claude/` 在就是 Claude Code,`AGENTS.md` / `.codex/`\n * 在就是 Codex。两个都没有时**退回 claude**——保持改造前的默认落点不变。\n */\nexport async function detectTarget(cwd: string): Promise<SkillTarget | undefined> {\n if (await exists(path.join(cwd, '.claude'))) return 'claude';\n if (await exists(path.join(cwd, 'AGENTS.md'))) return 'codex';\n if (await exists(path.join(cwd, '.codex'))) return 'codex';\n return undefined;\n}\n\nexport interface InstallLayout {\n target: SkillTarget;\n baseDir: string;\n /** Codex 的技能索引文件;claude 目标为 undefined(它自己发现 .claude/skills/) */\n agentsFile?: string;\n}\n\n/**\n * 算出这次装到哪儿。\n *\n * - `claude`:`.claude/skills/<id>/SKILL.md`(`--global` 落 `~/.claude/skills/`)——Claude Code 自动发现\n * - `codex`:`hcm-skills/<id>/SKILL.md` + 同级 `AGENTS.md` 里维护一段索引(`--global` 落 `~/.codex/`)——\n * 🔴 Codex **没有**技能目录自动发现这回事,只读 `AGENTS.md`,所以索引块是它能用上的唯一途径\n * - `--dir` 显式指定时只覆盖 baseDir,索引文件仍按 target 走\n */\nexport async function resolveInstallLayout(args: SkillsArgs, cwd = process.cwd()): Promise<InstallLayout> {\n const requested = args.target && args.target !== 'auto' ? args.target : undefined;\n const target: SkillTarget = requested ?? (await detectTarget(cwd)) ?? 'claude';\n\n if (target === 'codex') {\n const root = args.global ? path.join(os.homedir(), '.codex') : cwd;\n return {\n target,\n baseDir: args.dir ? path.resolve(args.dir) : path.join(root, 'hcm-skills'),\n agentsFile: path.join(root, 'AGENTS.md'),\n };\n }\n return {\n target,\n baseDir: args.dir\n ? path.resolve(args.dir)\n : args.global\n ? path.join(os.homedir(), '.claude', 'skills')\n : path.join(cwd, '.claude', 'skills'),\n };\n}\n\n/**\n * 技能库客户端。**唯一**拿到 http 的途径,因为它顺带把前缀探好了。\n *\n * 🔴 不要绕过它直接 createHttpClient:真实部署下根路径归前端 SPA,漏探前缀的命令会拿到\n * 一段 HTML 然后解析出满屏空目录——本刀第一版就漏改了 list/show 两个命令,实测才发现。\n * core 那边 `base` 已是必填参数,配合本工厂让「忘了探」变成编译期错误而不是线上现象。\n */\nasync function chironClient(args: SkillsArgs): Promise<{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n http: any;\n endpoint: string;\n base: string;\n}> {\n const endpoint = await resolveEndpoint(args);\n const http = createHttpClient({\n endpoint,\n getAccessToken: async () => null,\n onRefresh: async () => {},\n });\n return { http, endpoint, base: await resolveChironBase(http) };\n}\n\nfunction fail(e: unknown, args: SkillsArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 404) {\n exitWithError(new Error('该环境没有这个技能 —— 跑 `hcm skills list` 看目录(技能随产品版本走)'));\n }\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm skills list [keyword]` —— 列出目标环境这一版的交付技能。 */\nexport async function skillsListCommand(keyword: string | undefined, args: SkillsArgs): Promise<void> {\n try {\n if (args.installed) return await listInstalledSkills(keyword, args);\n const source: SourceFilter = parseSourceFilter(args.source);\n let manifest: ChironManifest | undefined;\n let endpoint: string | undefined;\n // 🔴 `--source cli` **不连网**:自带技能就在这份 CLI 里,为了列它去连一次网,\n // 会让顾问在断网现场连「我这版 CLI 自带了什么」都问不出来。\n if (source !== 'cli') {\n const client = await chironClient(args);\n endpoint = client.endpoint;\n manifest = await fetchSkillCatalog(client.http, client.base);\n }\n const bundled = source === 'chiron' ? undefined : listBundledSkills();\n const catalog = buildUnifiedCatalog({ source, chironManifest: manifest, bundled, cliVersion: CLI_VERSION });\n const conflicts = detectIdConflicts(catalog);\n if (conflicts.ids.length > 0) {\n throw new CliError({\n code: CliErrorCode.SKILL_ID_CONFLICT,\n message: conflictMessage(conflicts.ids, endpoint ?? '(未知环境)'),\n });\n }\n const fmt: OutputFormat = args.output ?? 'table';\n\n // 自带技能合成一个一等分类塞进目录;它不出现在睿戎 manifest 里。\n const cliCategory: ChironCategory | undefined =\n catalog.cli.entries.size > 0\n ? {\n key: CLI_CATEGORY_KEY,\n name: CLI_CATEGORY_NAME,\n description: '随这份 CLI 发布的技能,讲的是本 CLI 的命令;升级 CLI 就是升级它们',\n skills: [...catalog.cli.entries.values()].map((entry) => ({\n id: entry.meta.id,\n title: entry.meta.title,\n category: CLI_CATEGORY_KEY,\n actionSurface: 'cli' as const,\n description: entry.meta.description,\n stages: entry.meta.stages,\n requires: entry.meta.requires,\n bytes: entry.meta.bytes,\n markdownUrl: '',\n })),\n }\n : undefined;\n\n let cats = [...(manifest?.categories ?? []), ...(cliCategory ? [cliCategory] : [])];\n if (args.category) cats = cats.filter((c) => c.key === args.category);\n if (keyword) {\n cats = cats\n .map((c) => ({ ...c, skills: matchSkills(c.skills ?? [], keyword) }))\n .filter((c) => c.skills.length > 0);\n }\n if (args.stage) {\n cats = cats\n .map((c) => ({ ...c, skills: filterByStage(c.skills ?? [], args.stage) }))\n .filter((c) => c.skills.length > 0);\n }\n\n if (fmt === 'json' || fmt === 'yaml') {\n // 🔴 `sources` 里带的是**半边状态**,不只是计数:\n // 「这一半没看」和「这一半是空的」在输出里必须分得开。\n process.stdout.write(\n formatObject(\n {\n ...(manifest ?? {}),\n categories: cats,\n sources: {\n cli: { status: catalog.cli.status, count: catalog.cli.entries.size },\n chiron: { status: catalog.chiron.status, count: catalog.chiron.entries.size },\n },\n conflictCheck: conflicts.checked ? { checked: true } : { checked: false, note: unconfirmedConflictNote(source) },\n },\n { format: fmt },\n ) + '\\n',\n );\n process.exit(0);\n }\n\n const shown = cats.flatMap((c) => c.skills);\n const total = (manifest?.skillCount ?? 0) + catalog.cli.entries.size;\n if (shown.length === 0) {\n // 🔴 空集如实输出「0 个」,不报错:`--source cli --category business` 本来就是空集。\n process.stdout.write(`没有匹配的技能(这一趟看的来源共 ${total} 个)\\n`);\n process.exit(0);\n }\n process.stdout.write(`${manifest?.title ?? 'HCM 技能'} — ${endpoint ?? `@hcmai/cli@${CLI_VERSION}`}\\n\\n`);\n\n // 按交付生命周期看:顾问的心智是「现在第几周,该干什么」\n if (args.byStage) {\n const all = cats.flatMap((c) => c.skills);\n // 🔴 阶段清单的权威源是睿戎 manifest。`--source cli` 没有它时,\n // **不许**在 CLI 里抄一份七个键的常量——那是一张会和产品漂移的手工登记表。\n // 退而由被列出的技能**自己声明的 stages** 生成分组:它只覆盖看得到的东西,\n // 但不会说出与产品不一致的话。\n const stageList = manifest?.stages\n ?? [...new Set(all.flatMap((skill) => skill.stages ?? []))].sort().map((key) => ({\n key,\n name: key,\n description: '',\n skillCount: 0,\n }));\n for (const st of stageList) {\n const inStage = filterByStage(all, st.key);\n if (inStage.length === 0 && !args.stage) {\n process.stdout.write(` ${st.name} (无技能覆盖)\\n\\n`);\n continue;\n }\n if (inStage.length === 0) continue;\n process.stdout.write(` ${st.name}\\n`);\n for (const s of inStage) {\n const flag = s.actionSurface === 'cli' ? '●' : '○';\n process.stdout.write(` ${flag} ${s.id.padEnd(30)} ${s.title}\\n`);\n }\n process.stdout.write('\\n');\n }\n process.stdout.write(` ● CLI 就绪 ○ 待改写动作面 共 ${shown.length} 个\\n`);\n process.stdout.write(` 装一个:hcm skills install <id>\\n`);\n process.exit(0);\n }\n\n for (const c of cats) {\n process.stdout.write(` ${c.name}\\n`);\n for (const s of c.skills) {\n const flag = s.actionSurface === 'cli' ? '●' : '○';\n process.stdout.write(` ${flag} ${s.id.padEnd(30)} ${s.title}\\n`);\n }\n process.stdout.write('\\n');\n }\n process.stdout.write(` ● CLI 就绪 ○ 待改写动作面 共 ${shown.length} 个\\n`);\n process.stdout.write(` 装一个:hcm skills install <id>\\n`);\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm skills list --installed` —— 我这个目录里到底装了哪些。\n *\n * 🔴 全程不连网:顾问在客户现场问「我装了哪些」时,环境可能正是连不上的那个。\n * 标题从本地 SKILL.md 的 frontmatter 读,「本地改过」靠清单里记的安装时指纹比对。\n */\nasync function listInstalledSkills(keyword: string | undefined, args: SkillsArgs): Promise<void> {\n const layout = await resolveInstallLayout(args);\n const state = await readSkillsState(layout.baseDir);\n const fmt: OutputFormat = args.output ?? 'table';\n\n if (!state || Object.keys(state.skills).length === 0) {\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(formatObject({ baseDir: layout.baseDir, target: layout.target, all: false, skills: [] }, { format: fmt }) + '\\n');\n process.exit(0);\n }\n process.stdout.write(`${path.join(layout.baseDir, SKILLS_STATE_FILE)} 不存在或为空 —— 这个目录下还没用本 CLI 装过技能。\\n`);\n process.stdout.write(' 装全部:hcm skills install --all\\n');\n process.exit(0);\n }\n\n const rows = [];\n for (const [id, record] of Object.entries(state.skills).sort(([a], [b]) => a.localeCompare(b))) {\n const markdown = await readInstalled(layout.baseDir, id);\n let title = id;\n if (markdown !== undefined) {\n const raw = parseSkillFrontmatter(markdown, id).title;\n if (typeof raw === 'string' && raw.trim()) title = raw.trim();\n }\n rows.push({\n id,\n title,\n // 迁移保证它必然有值;`?? 'chiron'` 只是让类型闭合,不是业务缺省。\n sourceKind: record.sourceKind ?? 'chiron',\n sourceLocator: record.sourceLocator ?? record.source,\n direct: record.direct,\n installedAt: record.installedAt,\n // 三种状态互斥:文件没了 / 本地改过 / 和装的时候一致\n status: markdown === undefined\n ? ('missing' as const)\n : sha256(markdown) !== record.sha256 ? ('locally-modified' as const) : ('installed' as const),\n });\n }\n const byKeyword = keyword\n ? rows.filter((row) => row.id.includes(keyword) || row.title.includes(keyword))\n : rows;\n // 🔴 `--installed` 下 `--source` **只做过滤,不触发连网**(spec §7.1):\n // 顾问问「我装了哪些」的时候,环境可能正是连不上的那个。\n const sourceFilter: SourceFilter = parseSourceFilter(args.source);\n const shown = sourceFilter === 'all' ? byKeyword : byKeyword.filter((row) => row.sourceKind === sourceFilter);\n const groupOf = (kind: string): string =>\n kind === 'cli' ? 'CLI 自带' : kind === 'local' ? '本地目录装的' : '睿戎技能库';\n\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(formatObject({\n baseDir: layout.baseDir,\n target: layout.target,\n endpoint: state.endpoint,\n all: Boolean(state.all),\n updatedAt: state.updatedAt,\n // 按来源分组的小计:顾问要能一眼看出「这份是跟着 CLI 走的还是跟着后端走的」\n bySource: {\n cli: shown.filter((r) => r.sourceKind === 'cli').length,\n chiron: shown.filter((r) => r.sourceKind === 'chiron').length,\n local: shown.filter((r) => r.sourceKind === 'local').length,\n },\n skills: shown,\n }, { format: fmt }) + '\\n');\n process.exit(0);\n }\n\n process.stdout.write(`已安装的技能 — ${layout.baseDir}(${layout.target})\\n`);\n process.stdout.write(`来源 ${state.endpoint ?? '(未记录)'}`\n + (state.all ? ' 跟随全集:是\\n\\n' : '\\n\\n'));\n if (shown.length === 0) {\n process.stdout.write(` 没有匹配「${keyword}」的技能(共装了 ${rows.length} 个)\\n`);\n process.exit(0);\n }\n for (const kind of ['chiron', 'cli', 'local'] as const) {\n const group = shown.filter((row) => row.sourceKind === kind);\n if (group.length === 0) continue;\n process.stdout.write(` ${groupOf(kind)}(${group.length})\\n`);\n for (const row of group) {\n const mark = row.status === 'missing' ? '?' : row.status === 'locally-modified' ? '!' : row.direct ? '●' : '○';\n const note = row.status === 'missing'\n ? '文件不见了(update 会装回)'\n : row.status === 'locally-modified' ? '本地改过' : row.direct ? '' : '依赖带入';\n process.stdout.write(` ${mark} ${row.id.padEnd(30)} ${row.title.padEnd(24)} ${note}\\n`);\n }\n process.stdout.write('\\n');\n }\n const modified = shown.filter((row) => row.status === 'locally-modified').length;\n const missing = shown.filter((row) => row.status === 'missing').length;\n const indirect = shown.filter((row) => row.direct === false).length;\n process.stdout.write('\\n');\n process.stdout.write(` ● 直接安装 ○ 依赖带入 ! 本地改过 ? 文件缺失\\n`);\n process.stdout.write(` 共 ${shown.length} 个`\n + [\n indirect > 0 ? `${indirect} 个是依赖带入` : '',\n modified > 0 ? `${modified} 个本地改过` : '',\n missing > 0 ? `${missing} 个文件缺失` : '',\n ].filter(Boolean).map((t) => `,${t}`).join('') + '\\n');\n process.stdout.write(` 升级:hcm skills update${state.all ? '' : '(想跟随全集加 --all)'}\\n`);\n process.exit(0);\n}\n\n/** `hcm skills show <id>` —— 打印技能原文(管道友好)。 */\nexport async function skillsShowCommand(id: string, args: SkillsArgs): Promise<void> {\n try {\n assertSafeSkillId(id);\n const source: SourceFilter = parseSourceFilter(args.source);\n // 🔴 自带技能**不连网**:它就在这份 CLI 里,连一次网只会让顾问在断网现场看不到它。\n if (source !== 'chiron' && listBundledSkills().some((s) => s.id === id)) {\n const document = await readBundledSkillDocument(id);\n process.stdout.write(document.markdown.endsWith('\\n') ? document.markdown : document.markdown + '\\n');\n process.exit(0);\n }\n if (source === 'cli') {\n throw invalid(`这一版 CLI 没有自带 ${id} 这个技能(--source cli 不看睿戎目录)`);\n }\n const { http, base } = await chironClient(args);\n const md = await fetchSkillMarkdown(http, id, base);\n process.stdout.write(md.endsWith('\\n') ? md : md + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/** `hcm skills sync <id>` —— 将同实例依赖闭包同步到 WorkBuddy 项目并写所有权锁。 */\nexport async function skillsSyncCommand(id: string, args: SkillsSyncArgs): Promise<void> {\n try {\n assertSafeSkillId(id);\n if (args.target !== 'workbuddy') {\n throw invalid(`sync --target 当前只支持 workbuddy,收到 \"${args.target ?? ''}\"`);\n }\n if (!args.project?.trim()) throw invalid('sync 必须传 --project <path>');\n\n // 🔴 自带技能:**显式**不支持,不静默跳过、也不硬塞一个假 endpoint。\n // `chiron.lock.json` 的 source 三个字段(endpointOriginSha256 / catalogPath /\n // catalogSha256)全是必填且全绑睿戎,自带技能三者皆无。要开这一格得先做\n // 锁文件 schemaVersion 1→2,并回答旧锁读到新 kind 时的行为——本期按 YAGNI 不做。\n if (listBundledSkills().some((one) => one.id === id)) {\n throw new CliError({\n code: CliErrorCode.SYNC_SOURCE_UNSUPPORTED,\n message:\n `\\`${id}\\` 是 CLI 自带技能;skills sync 的锁文件(chiron.lock.json)` +\n '此刻只能记录睿戎来源的出处。装到本地用 `hcm skills install ' + id + '`。',\n });\n }\n\n // 先做纯本地能力探针。候选不兼容时不访问 Chiron,也不触碰项目文件。\n const project = path.resolve(args.project);\n const runtime = await prepareWorkBuddyRuntime({\n candidate: args.cli,\n currentEntryHasRequiredCapabilities: !args.cli?.trim(),\n forbiddenCandidatePaths: [\n path.join(project, '.hcm-delivery', 'bin', 'hcm'),\n path.join(project, '.hcm-delivery', 'bin', 'hcm.cmd'),\n ],\n });\n const connectionArgs: SkillsArgs = { endpoint: args.endpoint, env: args.env };\n const { http, endpoint, base } = await chironClient(connectionArgs);\n const catalog = await fetchSkillCatalog(http, base);\n const documents = await prepareSkillDocuments(\n catalog,\n id,\n async (skillId) => fetchSkillMarkdown(http, skillId, base),\n async (skillId, relativePath) => fetchSkillFile(http, skillId, relativePath, base),\n async (skillId, relativePath) => fetchSkillReference(http, skillId, relativePath, base),\n );\n const result = await syncWorkBuddyProject({\n project,\n endpoint,\n catalog,\n requestedSkill: id,\n documents,\n runtime,\n });\n\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(`${formatObject(result, { format: fmt })}\\n`);\n } else if (result.changed) {\n process.stdout.write(`✅ ${id} → ${result.skillsDir}\\n`);\n process.stdout.write(` 闭包 ${result.resolvedSkills.join(' → ')}\\n`);\n process.stdout.write(` 入口 ${result.runnerPath}\\n`);\n process.stdout.write(` CLI 能力 ${result.capabilitiesSha256.slice(0, 12)}\\n`);\n process.stdout.write(` 锁 ${result.lockPath}\\n`);\n } else {\n process.stdout.write(`✓ ${id} 已是当前目标实例版本,无需更新\\n`);\n process.stdout.write(` 入口 ${result.runnerPath}\\n`);\n process.stdout.write(` 锁 ${result.lockPath}\\n`);\n }\n process.exit(0);\n } catch (e) {\n fail(e, { endpoint: args.endpoint, env: args.env });\n }\n}\n\n/**\n * `hcm skills install <id>` —— 装到 agent 的技能目录。\n *\n * 默认落当前项目 `.claude/skills/<id>/SKILL.md`;`--global` 落 `~/.claude/skills/`。\n * `--from <dir>` 从本地目录装(现场发现技能有问题时先本地改,再回流主库提 PR)。\n */\nexport async function skillsInstallCommand(id: string | undefined, args: SkillsArgs): Promise<void> {\n try {\n const all = Boolean(args.all);\n if (all && id) throw invalid('`--all` 是装整个技能库,不要再带技能 id;只装一个就去掉 --all');\n if (!all && !id) throw invalid('要装哪个技能?给个 id(`hcm skills list` 看目录),或用 `--all` 装全部');\n if (id) assertSafeSkillId(id);\n\n const layout = await resolveInstallLayout(args);\n\n let documents: SkillDocument[];\n let requestedIds: string[];\n let endpoint: string | undefined;\n let base: string | undefined;\n let manifest: ChironManifest | undefined;\n let conflictNote: string | undefined;\n if (args.from) {\n const root = path.resolve(args.from);\n requestedIds = all ? await listLocalSkillIds(root) : [id!];\n const seen = new Set<string>();\n documents = [];\n for (const one of requestedIds) {\n for (const document of await resolveLocalSkillDocuments(root, one)) {\n if (seen.has(document.id)) continue;\n seen.add(document.id);\n documents.push(document);\n }\n }\n } else {\n const source: SourceFilter = parseSourceFilter(args.source);\n const bundled = source === 'chiron' ? undefined : listBundledSkills();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let http: any;\n if (source !== 'cli') {\n // 往一个已经装着别的环境的技能的目录里装,和跨环境升级是同一个坑\n const tracked = decideTrackedEndpoint({\n explicit: Boolean(args.endpoint || args.env),\n current: await resolveEndpoint(args).catch(() => undefined),\n recorded: (await readSkillsState(layout.baseDir))?.endpoint,\n });\n const client = await chironClient({ ...args, endpoint: tracked });\n endpoint = client.endpoint;\n base = client.base;\n http = client.http;\n manifest = await fetchSkillCatalog(http, base);\n }\n\n const catalog = buildUnifiedCatalog({ source, chironManifest: manifest, bundled, cliVersion: CLI_VERSION });\n const conflicts = detectIdConflicts(catalog);\n if (conflicts.ids.length > 0) {\n throw new CliError({\n code: CliErrorCode.SKILL_ID_CONFLICT,\n message: conflictMessage(conflicts.ids, endpoint ?? '(未知环境)'),\n });\n }\n conflictNote = conflicts.checked ? undefined : unconfirmedConflictNote(source);\n\n // 🔴 「睿戎技能依赖自带技能」是禁止方向(spec §6)。在这里当场点名,\n // 否则顾问看到的是一句「技能目录里没有 X」,会去查自己的环境,而缺陷在产品侧。\n for (const v of checkCrossSourceRequires(catalog)) {\n throw invalid(`${v.from} 声明依赖 ${v.to},但 ${v.to} 是 CLI 自带技能。${v.reason}`);\n }\n\n const wantBundled = (one: string): boolean => catalog.cli.entries.has(one);\n const seen = new Set<string>();\n documents = [];\n const pushAll = (docs: SkillDocument[]): void => {\n for (const d of docs) {\n if (seen.has(d.id)) continue;\n seen.add(d.id);\n documents.push(d);\n }\n };\n\n /** 装一份自带技能:自带侧闭包本地解,跨到睿戎的那几条连网解(spec §6 允许的方向)。 */\n const installBundled = async (one: string): Promise<void> => {\n const { documents: local, external } = await resolveBundledClosure(one);\n for (const need of external) {\n if (catalog.chiron.status !== 'fetched') {\n // 🔴 装不全就明确失败并说出缺哪一份,不装半套:半套技能不会报错,\n // 只会让 agent 照着断链的正文干活。\n throw invalid(\n `自带技能 ${one} 依赖睿戎技能 ${need},但这一趟没连网取睿戎目录(--source ${source})。` +\n '联网后重跑,或先单独装上它。',\n );\n }\n if (!catalog.chiron.entries.has(need)) {\n throw invalid(`自带技能 ${one} 依赖 ${need},但 ${endpoint} 的技能目录里没有它`);\n }\n pushAll(\n await mapWithConcurrency(\n resolveSkillInstallOrder(manifest!, need),\n FETCH_CONCURRENCY,\n (skill: ChironSkill) => fetchSkillDocument(http, skill, endpoint!, base!),\n ),\n );\n }\n pushAll(local);\n };\n\n if (all) {\n const order = manifest ? resolveAllSkillsInstallOrder(manifest) : [];\n const bundledIds = [...catalog.cli.entries.keys()].sort();\n if (order.length === 0 && bundledIds.length === 0) {\n throw invalid(`${endpoint ?? '这一趟看的来源'} 里没有可装的技能`);\n }\n requestedIds = [...order.map((skill: ChironSkill) => skill.id), ...bundledIds];\n if (order.length > 0) {\n pushAll(\n await mapWithConcurrency(\n order,\n FETCH_CONCURRENCY,\n (skill: ChironSkill) => fetchSkillDocument(http, skill, endpoint!, base!),\n ),\n );\n }\n for (const one of bundledIds) await installBundled(one);\n } else if (wantBundled(id!)) {\n requestedIds = [id!];\n await installBundled(id!);\n } else {\n if (source === 'cli') {\n throw invalid(`这一版 CLI 没有自带 ${id} 这个技能(--source cli 不看睿戎目录)`);\n }\n requestedIds = [id!];\n pushAll(\n await mapWithConcurrency(\n resolveSkillInstallOrder(manifest!, id!),\n FETCH_CONCURRENCY,\n (skill: ChironSkill) => fetchSkillDocument(http, skill, endpoint!, base!),\n ),\n );\n }\n }\n\n const result = await installSkillDocuments(documents, requestedIds, layout.baseDir, Boolean(args.force), {\n endpoint,\n base,\n target: layout.target,\n all,\n });\n\n const agents = layout.agentsFile\n ? await syncAgentsIndex(layout, manifest)\n : undefined;\n\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(formatObject({ ...result, all, target_agent: layout.target, agentsFile: layout.agentsFile, agents, conflictCheck: conflictNote ? { checked: false, note: conflictNote } : { checked: true } }, { format: fmt }) + '\\n');\n } else {\n const headline = all\n ? `✅ 全部 ${requestedIds.length} 个技能 → ${result.baseDir}`\n : `✅ ${id} → ${path.join(result.baseDir, id!, 'SKILL.md')}`;\n process.stdout.write(`${headline}\\n`);\n if (result.installed.length > 0) {\n process.stdout.write(all\n ? ` 新写入 ${result.installed.length} 个\\n`\n : ` 已安装 ${result.installed.join(' → ')}\\n`);\n }\n if (result.unchanged.length > 0) {\n process.stdout.write(all\n ? ` 已是这一版、未改动 ${result.unchanged.length} 个\\n`\n : ` 已存在且版本一致 ${result.unchanged.join(', ')}\\n`);\n }\n const referenceCount = documents.reduce((n, d) => n + (d.references?.length ?? 0), 0);\n if (referenceCount > 0) {\n process.stdout.write(` 参考文件 ${referenceCount} 个(references/ 下)\\n`);\n }\n if (layout.agentsFile) {\n process.stdout.write(` 已${agents === 'created' ? '创建' : '更新'} ${layout.agentsFile} 里的技能索引(Codex 读这里)\\n`);\n }\n process.stdout.write(` 来源 ${endpoint ?? (args.from ? path.resolve(args.from) : `@hcmai/cli@${CLI_VERSION}`)}\\n`);\n // 🔴 必须说出来:不说的话,「这一趟没查冲突」和「查过了没冲突」在顾问眼里一模一样。\n if (conflictNote) process.stdout.write(` ⚠️ ${conflictNote}\\n`);\n process.stdout.write(all\n ? ' 已记为「跟随全集」:以后跑 hcm skills update,产品新增的技能会自动补上\\n'\n : ' 产品更新后跑 hcm skills update 升级\\n');\n }\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/** 远程取技能内容时的并发上限。38 个技能各带参考文件,全并发会把客户环境打出一串连接。 */\nconst FETCH_CONCURRENCY = 6;\n\nasync function mapWithConcurrency<T, R>(\n items: readonly T[],\n limit: number,\n fn: (item: T) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n let cursor = 0;\n const worker = async (): Promise<void> => {\n for (;;) {\n const index = cursor++;\n if (index >= items.length) return;\n results[index] = await fn(items[index]!);\n }\n };\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));\n return results;\n}\n\n/** `--from <dir> --all`:本地目录里所有带 SKILL.md 的子目录就是可装的技能。 */\nasync function listLocalSkillIds(root: string): Promise<string[]> {\n let entries;\n try {\n entries = await fsp.readdir(root, { withFileTypes: true });\n } catch {\n throw invalid(`读不到本地技能目录:${root}`);\n }\n const ids: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (await exists(path.join(root, entry.name, 'SKILL.md'))) ids.push(entry.name);\n }\n if (ids.length === 0) throw invalid(`本地目录里没有任何 <id>/SKILL.md:${root}`);\n return ids.sort();\n}\n\n/** 远程取一个技能的完整内容:正文 + 它自带的全部参考文件。 */\nasync function fetchSkillDocument(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n http: any,\n skill: ChironSkill,\n endpoint: string,\n base: string,\n): Promise<SkillDocument> {\n const relatives = normalizeReferences(skill.references, skill.id);\n const references = await Promise.all(relatives.map(async (relative) => ({\n path: relative,\n content: await fetchSkillReference(http, skill.id, relative, base),\n })));\n return {\n id: skill.id,\n markdown: await fetchSkillMarkdown(http, skill.id, base),\n source: `${endpoint}${base}/skills/${skill.id}.md`,\n sourceKind: 'chiron',\n references,\n };\n}\n\n/**\n * 重建 Codex 的 AGENTS.md 索引。\n *\n * 每次都按**清单里现有的全部技能**整块重写,而不是往后追加一条——否则升级、改装目录\n * 之后索引会和实际装的东西漂移,而漂移了没有任何东西会报错。\n */\nasync function syncAgentsIndex(\n layout: InstallLayout,\n manifest?: ChironManifest,\n): Promise<'created' | 'replaced' | 'appended' | undefined> {\n if (!layout.agentsFile) return undefined;\n const state = await readSkillsState(layout.baseDir);\n if (!state) return undefined;\n\n const catalog = new Map<string, ChironSkill>();\n for (const category of manifest?.categories ?? []) {\n for (const skill of category.skills ?? []) catalog.set(skill.id, skill);\n }\n\n const agentsDir = path.dirname(layout.agentsFile);\n const entries = Object.keys(state.skills).sort().map((id) => {\n const known = catalog.get(id);\n const absolute = path.join(layout.baseDir, id, 'SKILL.md');\n let relative = path.relative(agentsDir, absolute);\n if (!relative.startsWith('.')) relative = `./${relative}`;\n return {\n id,\n title: known?.title ?? id,\n description: known?.description ?? '',\n relativePath: relative.split(path.sep).join('/'),\n };\n });\n return upsertAgentsBlock(layout.agentsFile, renderAgentsBlock(entries));\n}\n\n/** 从本地作者源递归读取依赖;用于 --from,顺序同远程目录:依赖在前、目标在后。 */\nexport async function resolveLocalSkillDocuments(sourceRoot: string, targetId: string): Promise<SkillDocument[]> {\n assertSafeSkillId(targetId);\n const state = new Map<string, 'visiting' | 'done'>();\n const pathStack: string[] = [];\n const order: SkillDocument[] = [];\n\n const visit = async (id: string, requiredBy?: string): Promise<void> => {\n const current = state.get(id);\n if (current === 'done') return;\n if (current === 'visiting') {\n const start = pathStack.indexOf(id);\n throw invalid(`技能依赖存在环: ${[...pathStack.slice(Math.max(0, start)), id].join(' -> ')}`);\n }\n assertSafeSkillId(id);\n const local = path.join(sourceRoot, id, 'SKILL.md');\n let markdown: string;\n try {\n markdown = await fsp.readFile(local, 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') {\n throw invalid(requiredBy\n ? `本地技能 ${requiredBy} 依赖不存在: ${id}(${local})`\n : `本地目录里没有 ${id}/SKILL.md:${path.join(sourceRoot, id)}`);\n }\n throw cause;\n }\n if (!markdown.trim()) throw invalid(`技能 ${id} 内容为空`);\n\n state.set(id, 'visiting');\n pathStack.push(id);\n const document: SkillDocument = {\n id,\n markdown,\n source: local,\n sourceKind: 'local',\n references: await readLocalReferences(path.join(sourceRoot, id)),\n };\n for (const required of parseSkillRequirements(markdown, id)) {\n await visit(required, id);\n }\n pathStack.pop();\n state.set(id, 'done');\n order.push(document);\n };\n\n await visit(targetId);\n return order;\n}\n\n// ================= 安装清单(.hcm-skills.json)=================\n\n/** 读安装清单;不存在或损坏都返回 undefined——升级命令据此提示「先装一个」而不是崩掉。 */\nexport async function readSkillsState(baseDir: string): Promise<SkillsStateFile | undefined> {\n try {\n const raw = await fsp.readFile(path.join(baseDir, SKILLS_STATE_FILE), 'utf8');\n const parsed = JSON.parse(raw) as SkillsStateFile;\n if (!parsed || typeof parsed !== 'object' || !parsed.skills) return undefined;\n return migrateSkillsState(parsed);\n } catch {\n return undefined;\n }\n}\n\nexport async function writeSkillsState(baseDir: string, state: SkillsStateFile): Promise<void> {\n await fsp.mkdir(baseDir, { recursive: true });\n const file = path.join(baseDir, SKILLS_STATE_FILE);\n const temp = `${file}.${process.pid}.tmp`;\n await fsp.writeFile(temp, JSON.stringify(state, null, 2) + '\\n', 'utf8');\n await fsp.rename(temp, file);\n}\n\n// ================= Codex 的 AGENTS.md 索引块 =================\n\nexport const AGENTS_BLOCK_BEGIN = '<!-- hcm-skills:begin -->';\nexport const AGENTS_BLOCK_END = '<!-- hcm-skills:end -->';\n\n/**\n * 生成 AGENTS.md 里那段索引。\n *\n * Codex 只读 AGENTS.md,不会去扫技能目录——所以每个技能得在这里被点名,并写清\n * 「什么时候读它」,否则装了也不会被用上。块用注释标记包起来,重装/升级时整段替换,\n * 不碰用户自己写的内容。\n */\nexport function renderAgentsBlock(\n entries: Array<{ id: string; title: string; description: string; relativePath: string }>,\n): string {\n const lines = [\n AGENTS_BLOCK_BEGIN,\n '## HCMnext 交付技能(由 `hcm skills install` 维护,勿手工编辑本块)',\n '',\n '遇到下面这些活儿,**先读对应文件再动手**——里面是这套产品的正确做法,',\n '照着做不用翻源码,也不用猜 API。',\n '',\n ];\n for (const e of entries) {\n lines.push(`- \\`${e.relativePath}\\` — **${e.title}**`);\n if (e.description) lines.push(` ${e.description}`);\n }\n lines.push('', AGENTS_BLOCK_END);\n return lines.join('\\n');\n}\n\n/** 把索引块写进 AGENTS.md:没有文件就建,有块就整段换,有文件没块就追加。 */\nexport async function upsertAgentsBlock(agentsFile: string, block: string): Promise<'created' | 'replaced' | 'appended'> {\n let existing = '';\n try {\n existing = await fsp.readFile(agentsFile, 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code !== 'ENOENT') throw cause;\n await fsp.mkdir(path.dirname(agentsFile), { recursive: true });\n await fsp.writeFile(agentsFile, block + '\\n', 'utf8');\n return 'created';\n }\n\n const begin = existing.indexOf(AGENTS_BLOCK_BEGIN);\n const end = existing.indexOf(AGENTS_BLOCK_END);\n if (begin >= 0 && end > begin) {\n const next = existing.slice(0, begin) + block + existing.slice(end + AGENTS_BLOCK_END.length);\n await fsp.writeFile(agentsFile, next, 'utf8');\n return 'replaced';\n }\n const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n';\n await fsp.writeFile(agentsFile, existing + separator + block + '\\n', 'utf8');\n return 'appended';\n}\n\n/**\n * 全部正文和冲突先检查完,再开始写入;网络失败、缺失依赖或版本冲突不会留下半套技能。\n * 已存在且内容完全一致的前置技能可复用,目标技能仍保持旧行为:未传 --force 时拒绝覆盖。\n */\nexport async function installSkillDocuments(\n documents: SkillDocument[],\n requestedIds: string[],\n baseDir: string,\n force: boolean,\n meta?: { endpoint?: string; base?: string; target?: SkillTarget; all?: boolean },\n): Promise<SkillInstallationResult> {\n if (requestedIds.length === 0) throw invalid('没有指定要装的技能');\n for (const id of requestedIds) assertSafeSkillId(id);\n\n const seen = new Set<string>();\n const candidates = documents.map((document) => {\n assertSafeSkillId(document.id);\n if (seen.has(document.id)) throw invalid(`安装闭包包含重复技能: ${document.id}`);\n seen.add(document.id);\n if (!document.markdown.trim()) throw invalid(`技能 ${document.id} 内容为空`);\n return {\n ...document,\n target: path.join(baseDir, document.id, 'SKILL.md'),\n bytes: Buffer.byteLength(document.markdown),\n };\n });\n for (const id of requestedIds) {\n if (!seen.has(id)) throw invalid(`安装闭包不包含目标技能: ${id}`);\n }\n\n // 🔴 判据只看「盘上这一份和要装的这一份一不一样」,**不看**它是显式请求的还是被依赖带进来的。\n // 之前对显式请求的技能一律报「已存在」,导致重装完全一致的内容也必须 --force——\n // 全装因此只能靠 shell 循环加 --force,而 --force 会连顾问现场改过的技能一起冲掉。\n const unchanged = new Set<string>();\n for (const candidate of candidates) {\n if (force) continue;\n const same = await sameOnDisk(baseDir, candidate);\n if (same === undefined) continue;\n if (same) {\n unchanged.add(candidate.id);\n continue;\n }\n throw invalid(\n `${candidate.target} 已存在,且和目标环境这一版不一致。`\n + '用 --force 覆盖(会丢掉本地改动),或 --dir <path> 装到别处;'\n + '只想跟上产品版本用 hcm skills update',\n );\n }\n\n const pending = candidates.filter((candidate) => !unchanged.has(candidate.id));\n await writeSkillDocuments(pending, baseDir);\n await recordInstalled(baseDir, candidates, {\n ...meta,\n directIds: new Set(requestedIds),\n keepInstalledAt: unchanged,\n });\n\n return {\n ids: [...requestedIds],\n baseDir,\n installed: pending.map((candidate) => candidate.id),\n unchanged: candidates.filter((candidate) => unchanged.has(candidate.id)).map((candidate) => candidate.id),\n files: candidates.map((candidate) => ({\n id: candidate.id,\n target: candidate.target,\n source: candidate.source,\n bytes: candidate.bytes,\n status: unchanged.has(candidate.id) ? 'unchanged' : 'installed',\n })),\n };\n}\n\n/**\n * 盘上那一份和要装的这一份是不是同一个东西。\n *\n * 返回 `undefined` = 还没装。🔴 参考文件也要比:正文一样但 references 变了同样是「不一样」,\n * 只比 SKILL.md 会把变更的参考文件判成「已是最新」然后永远不写进去。\n */\nasync function sameOnDisk(\n baseDir: string,\n candidate: { id: string; markdown: string; references?: SkillReferenceDocument[] },\n): Promise<boolean | undefined> {\n const existing = await readInstalled(baseDir, candidate.id);\n if (existing === undefined) return undefined;\n if (existing !== candidate.markdown) return false;\n for (const reference of candidate.references ?? []) {\n if ((await readInstalledReference(baseDir, candidate.id, reference.path)) !== reference.content) return false;\n }\n return true;\n}\n\n/** 读本地技能目录下的 references/(含一层子目录);没有该目录就是空。 */\nasync function readLocalReferences(skillDir: string): Promise<SkillReferenceDocument[]> {\n const root = path.join(skillDir, 'references');\n const out: SkillReferenceDocument[] = [];\n const walk = async (dir: string, prefix: string): Promise<void> => {\n let items;\n try {\n items = await fsp.readdir(dir, { withFileTypes: true });\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') return;\n throw cause;\n }\n for (const item of items.sort((a, b) => a.name.localeCompare(b.name))) {\n const relative = prefix ? `${prefix}/${item.name}` : item.name;\n if (item.isDirectory()) {\n await walk(path.join(dir, item.name), relative);\n continue;\n }\n if (!item.isFile()) continue;\n assertSafeReferencePath(relative);\n out.push({ path: relative, content: await fsp.readFile(path.join(dir, item.name), 'utf8') });\n }\n };\n await walk(root, '');\n return out;\n}\n\nexport interface StaleReference {\n id: string;\n /** 相对 `<skill>/references/` */\n path: string;\n}\n\nexport interface StaleReferencePlan {\n /** 该删的:盘上内容与安装当时记的指纹一致 ⇒ 是产品的旧文件。 */\n remove: StaleReference[];\n /** 不删的:本地改过。与 SKILL.md 同一策略——不默默删掉顾问在现场改过的文件。 */\n keptLocallyModified: StaleReference[];\n}\n\n/**\n * 算出哪些参考文件已经被产品这一版撤掉了。\n *\n * 🔴 为什么必须有这一步:`writeSkillDocuments` **只写不删**,而 `sameOnDisk`\n * 只遍历新文档**有**的 references,永远发现不了多出来的那些。\n * ⇒ CLI 从 0.6 升 0.7 时若某份技能少了一个 `references/x.md`,\n * 那个陈旧文件会**永久留在顾问盘上**,agent 照样会读到它。\n *\n * 待删 = 状态里记的路径集合 − 新文档的路径集合。数据是现成的\n * (`recordInstalled` 早就把 `references: {path: sha256}` 存进了状态),不新造机制。\n */\nexport async function planStaleReferences(\n state: SkillsStateFile,\n documents: SkillDocument[],\n baseDir: string,\n): Promise<StaleReferencePlan> {\n const remove: StaleReference[] = [];\n const keptLocallyModified: StaleReference[] = [];\n for (const document of documents) {\n const recorded = state.skills[document.id]?.references ?? {};\n const fresh = new Set((document.references ?? []).map((r) => r.path));\n for (const [relative, recordedSha] of Object.entries(recorded)) {\n if (fresh.has(relative)) continue;\n const onDisk = await readInstalledReference(baseDir, document.id, relative);\n if (onDisk === undefined) continue; // 盘上本来就没有,无事可做\n if (sha256(onDisk) !== recordedSha) {\n keptLocallyModified.push({ id: document.id, path: relative });\n continue;\n }\n remove.push({ id: document.id, path: relative });\n }\n }\n const byKey = (a: StaleReference, b: StaleReference): number =>\n `${a.id}/${a.path}`.localeCompare(`${b.id}/${b.path}`);\n return { remove: remove.sort(byKey), keptLocallyModified: keptLocallyModified.sort(byKey) };\n}\n\n/**\n * 原子写盘:全部内容先暂存成临时文件,再统一 rename。\n *\n * 参考文件与 SKILL.md 在**同一批**里 —— 中途失败不会留下「正文更新了但参考文件还是旧的」\n * 这种半套状态,那种状态没有任何东西会报错,只会让 agent 照着不一致的两份内容干活。\n */\nexport async function writeSkillDocuments(\n documents: SkillDocument[],\n baseDir: string,\n removals: StaleReference[] = [],\n): Promise<void> {\n const staged: Array<{ temp: string; target: string }> = [];\n /**\n * 🔴 删除走 **rename 到暂存名**,不是直接 unlink:\n * 直接删掉之后这一批里任何一步失败都回滚不了——本函数的 catch 原本只 unlink 暂存文件,\n * 没有任何恢复能力。rename 让「已删」在提交前一直是可逆的。\n */\n const removed: Array<{ parked: string; original: string }> = [];\n try {\n for (const document of documents) {\n const target = path.join(baseDir, document.id, 'SKILL.md');\n await fsp.mkdir(path.dirname(target), { recursive: true });\n const temp = path.join(path.dirname(target), `.SKILL.md.${process.pid}.${Date.now()}.tmp`);\n await fsp.writeFile(temp, document.markdown, 'utf8');\n staged.push({ temp, target });\n\n for (const reference of document.references ?? []) {\n assertSafeReferencePath(reference.path);\n const referenceTarget = path.join(baseDir, document.id, 'references', reference.path);\n await fsp.mkdir(path.dirname(referenceTarget), { recursive: true });\n const referenceTemp = `${referenceTarget}.${process.pid}.${Date.now()}.tmp`;\n await fsp.writeFile(referenceTemp, reference.content, 'utf8');\n staged.push({ temp: referenceTemp, target: referenceTarget });\n }\n }\n // 先把要删的挪到暂存名(可逆),再统一提交写入。\n for (const stale of removals) {\n assertSafeReferencePath(stale.path);\n const original = path.join(baseDir, stale.id, 'references', stale.path);\n const parked = `${original}.${process.pid}.${Date.now()}.removed`;\n await fsp.rename(original, parked);\n removed.push({ parked, original });\n }\n for (const file of staged) await fsp.rename(file.temp, file.target);\n // 全部成功,暂存的删除项这才真的消失。\n await Promise.all(removed.map((r) => fsp.unlink(r.parked).catch(() => undefined)));\n } catch (cause) {\n await Promise.all(staged.map((file) => fsp.unlink(file.temp).catch(() => undefined)));\n // 🔴 把已挪走的原样搬回去。少了这条,一次失败的升级会把参考文件删得只剩一半,\n // 而这种半套状态不会报错,只会让 agent 照着断链的正文干活。\n await Promise.all(removed.map((r) => fsp.rename(r.parked, r.original).catch(() => undefined)));\n throw cause;\n }\n}\n\n/** 清单在文件落地之后写:中途失败时清单不会声称装了实际没装的东西。 */\nasync function recordInstalled(\n baseDir: string,\n documents: SkillDocument[],\n meta: {\n endpoint?: string;\n base?: string;\n target?: SkillTarget;\n /** true = 这个目录订阅全集;一旦置上就不再回落(要退订就删清单重装) */\n all?: boolean;\n directIds: Set<string>;\n keepInstalledAt?: Set<string>;\n },\n): Promise<SkillsStateFile> {\n const state: SkillsStateFile = (await readSkillsState(baseDir)) ?? {\n version: 2,\n target: meta.target ?? 'claude',\n updatedAt: new Date().toISOString(),\n skills: {},\n };\n state.version = 2;\n if (meta.target) state.target = meta.target;\n if (meta.endpoint) state.endpoint = meta.endpoint;\n if (meta.base !== undefined) state.base = meta.base;\n if (meta.all) state.all = true;\n state.updatedAt = new Date().toISOString();\n for (const document of documents) {\n const previous = state.skills[document.id];\n state.skills[document.id] = {\n source: document.source,\n // 🔴 两个键同值:`source` 留给旧 CLI 读(降级不炸),新代码只读 `sourceLocator`。\n sourceKind: document.sourceKind ?? previous?.sourceKind ?? 'chiron',\n sourceLocator: document.source,\n sha256: sha256(document.markdown),\n installedAt: meta.keepInstalledAt?.has(document.id) && previous ? previous.installedAt : state.updatedAt,\n // 已经是直接安装的,不因为这次作为依赖被带进来就降级\n direct: meta.directIds.has(document.id) || Boolean(previous?.direct),\n references: Object.fromEntries(\n (document.references ?? []).map((reference) => [reference.path, sha256(reference.content)]),\n ),\n };\n }\n await writeSkillsState(baseDir, state);\n return state;\n}\n\nfunction invalid(message: string): CliError {\n return new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message });\n}\n\n// ================= hcm skills update =================\n\nexport type SkillUpdateStatus =\n | 'unchanged'\n | 'updated'\n | 'added'\n | 'locally-modified'\n | 'removed-upstream'\n /** 这一版 CLI 不再自带它。与 `removed-upstream` 严格对称,不是同一件事。 */\n | 'removed-in-cli'\n /** 本轮没核对它的来源(那个半边这一趟没看)。**不是**一个业务结论。 */\n | 'not-checked'\n /** `install --from` 装的:update 不管它。 */\n | 'local';\n\nexport interface SkillUpdateEntry {\n id: string;\n status: SkillUpdateStatus;\n note?: string;\n}\n\nexport interface SkillUpdatePlan {\n entries: SkillUpdateEntry[];\n /** 需要写盘的技能(status 为 added / updated) */\n documents: SkillDocument[];\n}\n\n/** 读磁盘上现有的 SKILL.md;不存在返回 undefined。 */\nasync function readInstalled(baseDir: string, id: string): Promise<string | undefined> {\n try {\n return await fsp.readFile(path.join(baseDir, id, 'SKILL.md'), 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') return undefined;\n throw cause;\n }\n}\n\nasync function readInstalledReference(baseDir: string, id: string, relative: string): Promise<string | undefined> {\n try {\n return await fsp.readFile(path.join(baseDir, id, 'references', relative), 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') return undefined;\n throw cause;\n }\n}\n\n/**\n * 算出这次升级会变什么。\n *\n * 🔴 三种「不一样」必须分开,否则升级会悄悄吃掉顾问在现场改过的技能:\n * - 磁盘内容 == 安装时记下的指纹,但和服务端不同 → **产品更新了**,覆盖\n * - 磁盘内容 != 安装时记下的指纹 → **本地改过**,不覆盖(除非 --force)\n * - 磁盘上没有 → 新增(多半是产品新加的依赖)\n *\n * 只按「和服务端一不一样」判断的话,第二种会被当成第一种直接冲掉,而且不会有任何提示。\n */\nexport async function planSkillUpdate(options: {\n state: SkillsStateFile;\n manifest?: ChironManifest;\n /**\n * 本轮的统一 catalog。不传时按「只看了睿戎那一半」构造——\n * 🔴 这不是兼容垫片,是**如实**:没给 catalog 就等于没看自带那一半,\n * 于是自带记录判 `not-checked` 而不是 `removed-in-cli`。\n */\n catalog?: UnifiedCatalog;\n baseDir: string;\n force: boolean;\n /** 订阅全集:把产品当前目录里的技能一并纳入,补上新增的 */\n all?: boolean;\n fetchDocument: (skill: ChironSkill) => Promise<SkillDocument>;\n /** 取一份自带技能的当前内容。缺省实现读这份 CLI 的 dist/skills。 */\n fetchBundled?: (id: string) => Promise<SkillDocument>;\n}): Promise<SkillUpdatePlan> {\n const { state, baseDir, force, fetchDocument } = options;\n const manifest = options.manifest;\n const catalog =\n options.catalog\n ?? buildUnifiedCatalog({ source: 'chiron', chironManifest: manifest, cliVersion: CLI_VERSION });\n const fetchBundled = options.fetchBundled ?? ((id: string) => readBundledSkillDocument(id));\n const all = options.all ?? Boolean(state.all);\n\n const recorded = Object.entries(state.skills);\n // 老清单里可能没有 direct 标记;那就把记下来的都当直接安装,宁可多查不要漏\n const directIds = recorded.some(([, r]) => r.direct)\n ? recorded.filter(([, r]) => r.direct).map(([id]) => id)\n : recorded.map(([id]) => id);\n\n const entries: SkillUpdateEntry[] = [];\n\n // ① 先按**来源**分档。这一步产出的每一档都不进闭包:\n // local 不参与升级;not-checked 是「这一趟没核」;两个 removed 是「真没了」。\n const live: Array<{ id: string; kind: 'chiron' | 'cli' }> = [];\n for (const id of directIds.sort()) {\n const record = state.skills[id]!;\n const status = classifyInstalledSource(id, record, catalog);\n if (status === 'present') {\n live.push({ id, kind: (record.sourceKind ?? 'chiron') === 'cli' ? 'cli' : 'chiron' });\n continue;\n }\n entries.push({ id, status, note: SOURCE_STATUS_NOTE[status] });\n }\n\n // ② 订阅全集:并上**两个半边各自取到的**全集。没取到的半边不并——\n // 否则「这一趟没看」会被当成「产品这一版没有」。\n if (all) {\n const known = new Set(live.map((x) => x.id));\n for (const kind of ['chiron', 'cli'] as const) {\n const half = kind === 'chiron' ? catalog.chiron : catalog.cli;\n if (half.status !== 'fetched') continue;\n for (const id of half.entries.keys()) {\n if (known.has(id)) continue;\n known.add(id);\n live.push({ id, kind });\n }\n }\n }\n\n // ③ 展开依赖闭包(各走各的半边;自带 → 睿戎那几条交给睿戎侧解)\n const closure = new Map<string, { kind: 'chiron' | 'cli'; skill?: ChironSkill }>();\n const chironNeeded = new Set<string>();\n for (const item of live) {\n if (item.kind === 'cli') {\n // 🔴 自带侧闭包从 **catalog 的 requires** 展开,不再回盘上读一遍:\n // 盘上那份读法(`resolveBundledClosure`)是**装**的时候用的,\n // 升级判定这里再走一遍等于同一件事有两条路径,而它们会各自漂移。\n // 用 visited 收敛,成环不会转不出来(成环本身由内容契约 C3 在作者面拦)。\n const queue = [item.id];\n while (queue.length > 0) {\n const id = queue.shift()!;\n if (closure.has(id)) continue;\n const entry = catalog.cli.entries.get(id);\n if (!entry) {\n // 半边里没有它 —— ① 里已经判过的那些不会走到这儿;这里是**依赖**指向了\n // 自带侧不存在的 id,那就是一条跨到睿戎的边(spec §6 允许的方向)。\n chironNeeded.add(id);\n continue;\n }\n closure.set(id, { kind: 'cli' });\n for (const need of entry.meta.requires ?? []) queue.push(need);\n }\n continue;\n }\n chironNeeded.add(item.id);\n }\n for (const id of chironNeeded) {\n if (!manifest) continue;\n try {\n for (const skill of resolveSkillInstallOrder(manifest, id)) {\n if (!closure.has(skill.id)) closure.set(skill.id, { kind: 'chiron', skill });\n }\n } catch {\n // 已装记录的那些在 ① 里判过了;这里能走到的是**依赖**解不出来。\n if (!entries.some((e) => e.id === id)) {\n entries.push({ id, status: 'removed-upstream', note: SOURCE_STATUS_NOTE['removed-upstream'] });\n }\n }\n }\n\n const documents: SkillDocument[] = [];\n for (const [id, item] of closure) {\n const record = state.skills[id];\n const onDisk = await readInstalled(baseDir, id);\n const fetch = async (): Promise<SkillDocument> =>\n item.kind === 'cli' ? await fetchBundled(id) : await fetchDocument(item.skill!);\n if (onDisk === undefined) {\n documents.push(await fetch());\n entries.push({\n id,\n status: 'added',\n note: record\n ? '本地文件缺失,重新装回'\n : all ? '产品这一版新增的技能' : '产品新增的前置技能',\n });\n continue;\n }\n\n const remote = await fetch();\n const remoteReferences = remote.references ?? [];\n let differsFromRemote = remote.markdown !== onDisk;\n let editedLocally = record !== undefined && sha256(onDisk) !== record.sha256;\n for (const reference of remoteReferences) {\n const installed = await readInstalledReference(baseDir, id, reference.path);\n if (installed !== reference.content) differsFromRemote = true;\n const recordedSha = record?.references?.[reference.path];\n if (installed !== undefined && recordedSha && sha256(installed) !== recordedSha) editedLocally = true;\n }\n\n if (!differsFromRemote) {\n entries.push({ id, status: 'unchanged' });\n continue;\n }\n if (editedLocally && !force) {\n entries.push({\n id,\n status: 'locally-modified',\n note: '本地改过,没有覆盖;确定要用产品这一版就加 --force',\n });\n continue;\n }\n documents.push(remote);\n entries.push({\n id,\n status: 'updated',\n note: editedLocally ? '本地改过,--force 已覆盖' : undefined,\n });\n }\n\n entries.sort((a, b) => a.id.localeCompare(b.id));\n return { entries, documents };\n}\n\nconst UPDATE_STATUS_LABEL: Record<SkillUpdateStatus, string> = {\n updated: '已更新',\n added: '已补装',\n unchanged: '已是最新',\n 'locally-modified': '本地改过·跳过',\n 'removed-upstream': '产品已移除',\n 'removed-in-cli': 'CLI 不再自带',\n // 🔴 这一档不是结论,是「这一趟没核」。文案上必须看得出区别,\n // 否则顾问会把它读成「没问题」,而它可能正藏着一份真的被移除了的技能。\n 'not-checked': '本轮未核',\n local: '本地来源·不管',\n};\n\n/**\n * `hcm skills update` —— 把装过的技能升到目标环境这一版。\n *\n * 依据是 `<baseDir>/.hcm-skills.json`:装的时候记下了「装了哪些、来自哪里、当时的内容指纹」,\n * 所以升级不需要顾问自己记得装过什么,也能分清「产品更新了」和「我在现场改过」。\n */\nexport async function skillsUpdateCommand(args: SkillsArgs): Promise<void> {\n try {\n const layout = await resolveInstallLayout(args);\n const state = await readSkillsState(layout.baseDir);\n if (!state || Object.keys(state.skills).length === 0) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n `${path.join(layout.baseDir, SKILLS_STATE_FILE)} 不存在或为空 —— 这个目录下还没有用本 CLI 装过技能。`\n + '先 `hcm skills install <id>`;如果技能是手工拷进来的,重装一次即可接管升级。',\n });\n }\n\n const source: SourceFilter = parseSourceFilter(args.source);\n const endpoint = decideTrackedEndpoint({\n explicit: Boolean(args.endpoint || args.env),\n current: await resolveEndpoint(args).catch(() => undefined),\n recorded: state.endpoint,\n });\n let manifest: ChironManifest | undefined;\n let base: string | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let http: any;\n if (source !== 'cli') {\n const client = await chironClient({ ...args, endpoint });\n http = client.http;\n base = client.base;\n manifest = await fetchSkillCatalog(http, base);\n }\n const bundled = source === 'chiron' ? undefined : listBundledSkills();\n const catalog = buildUnifiedCatalog({ source, chironManifest: manifest, bundled, cliVersion: CLI_VERSION });\n\n // `--all` 既是「这次也把没装的补齐」,也是「从今往后跟随全集」——后者要落盘\n const all = Boolean(args.all) || Boolean(state.all);\n const plan = await planSkillUpdate({\n state,\n manifest,\n catalog,\n baseDir: layout.baseDir,\n force: Boolean(args.force),\n all,\n fetchDocument: (skill) => fetchSkillDocument(http, skill, endpoint, base!),\n });\n\n // 订阅刚打开时即使一个字节都不用写,也要把标记落下去,否则下次 update 又退回只看清单\n // 陈旧参考文件:产品这一版撤掉的那些。与写入**同一个**提交窗口。\n const stale = await planStaleReferences(state, plan.documents, layout.baseDir);\n\n const subscriptionChanged = all && !state.all;\n if (!args.check && (plan.documents.length > 0 || subscriptionChanged)) {\n await writeSkillDocuments(plan.documents, layout.baseDir, stale.remove);\n await recordInstalled(layout.baseDir, plan.documents, {\n endpoint,\n base,\n target: layout.target,\n all,\n directIds: all ? new Set(plan.documents.map((document) => document.id)) : new Set<string>(),\n });\n if (layout.agentsFile) await syncAgentsIndex(layout, manifest);\n }\n\n const changed = plan.entries.filter((e) => e.status === 'updated' || e.status === 'added');\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(formatObject({\n endpoint,\n baseDir: layout.baseDir,\n target: layout.target,\n dryRun: Boolean(args.check),\n all,\n changed: changed.length,\n sources: {\n cli: { status: catalog.cli.status, count: catalog.cli.entries.size },\n chiron: { status: catalog.chiron.status, count: catalog.chiron.entries.size },\n },\n cliVersion: CLI_VERSION,\n staleReferences: stale,\n entries: plan.entries,\n }, { format: fmt }) + '\\n');\n process.exit(0);\n }\n\n process.stdout.write(`技能升级 — ${source === 'cli' ? `@hcmai/cli@${CLI_VERSION}(未连网)` : endpoint}\\n`);\n process.stdout.write(`落点 ${layout.baseDir}(${layout.target})`\n + (all ? ' 跟随全集:产品新增的技能会自动补上\\n\\n' : '\\n\\n'));\n for (const entry of plan.entries) {\n const mark = entry.status === 'unchanged' ? ' ' : entry.status === 'locally-modified' ? '!' : '·';\n process.stdout.write(` ${mark} ${entry.id.padEnd(30)} ${UPDATE_STATUS_LABEL[entry.status]}\\n`);\n if (entry.note) process.stdout.write(` ${entry.note}\\n`);\n }\n process.stdout.write('\\n');\n // 🔴 「没有写入」不等于「全部最新」:被跳过的那些正是最需要顾问知道的\n const skipped = plan.entries.filter((e) => e.status === 'locally-modified').length;\n const removed = plan.entries.filter((e) => e.status === 'removed-upstream').length;\n const removedInCli = plan.entries.filter((e) => e.status === 'removed-in-cli').length;\n const notChecked = plan.entries.filter((e) => e.status === 'not-checked').length;\n const tail = [\n skipped > 0 ? `${skipped} 个本地改过被跳过(--force 覆盖)` : '',\n removed > 0 ? `${removed} 个产品已移除(本地文件保留)` : '',\n removedInCli > 0 ? `${removedInCli} 个这一版 CLI 不再自带(本地文件保留)` : '',\n notChecked > 0 ? `${notChecked} 个本轮未核(那一半这趟没看)` : '',\n ].filter(Boolean).join(',');\n\n // 🔴 必须说出来的两句(spec §7.4 / §7.3):\n // ① 升级 CLI 本身**不会**改动已装的技能文件(`npm i -g` 不碰 .claude/skills/),\n // 所以「我升了 CLI」和「我的技能跟上了」是两回事;\n // ② `--source cli` 装了一半,但订阅的是全库——不说的话下次 update 的行为无从解释。\n const cliCount = plan.entries.filter(\n (e) => (state.skills[e.id]?.sourceKind ?? 'chiron') === 'cli',\n ).length;\n if (cliCount > 0) {\n process.stdout.write(` 自带技能 ${cliCount} 个已跟随当前 CLI ${CLI_VERSION}\\n`);\n }\n if (source === 'cli' && all) {\n process.stdout.write(\n ' 本趟只看了自带那一半;这个目录订阅的是全库,联网后 update 会补齐睿戎那一半\\n',\n );\n }\n if (stale.remove.length > 0) {\n process.stdout.write(\n ` ${args.check ? '会删掉' : '已删掉'} ${stale.remove.length} 个产品这一版撤掉的参考文件`\n + `(${stale.remove.map((r) => `${r.id}/references/${r.path}`).join('、')})\\n`,\n );\n }\n if (stale.keptLocallyModified.length > 0) {\n // 🔴 本地改过的不删,但必须报出来:不报的话顾问不知道盘上留着一份产品已经不认的文件。\n process.stdout.write(\n ` ${stale.keptLocallyModified.length} 个产品已撤掉但本地改过的参考文件保留了`\n + `(${stale.keptLocallyModified.map((r) => `${r.id}/references/${r.path}`).join('、')})\\n`,\n );\n }\n\n if (changed.length === 0 && skipped === 0 && removed === 0) {\n process.stdout.write(args.check ? ' 全部已是最新(--check 只看不动)\\n' : ' 全部已是最新,没有改动\\n');\n } else {\n const head = args.check\n ? (changed.length > 0 ? `有 ${changed.length} 个可以更新,去掉 --check 就会写入` : '没有可写入的更新')\n : (changed.length > 0 ? `已更新 ${changed.length} 个` : '没有写入任何改动');\n process.stdout.write(` ${[head, tail].filter(Boolean).join(';')}\\n`);\n }\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n","/**\n * 统一 catalog:把「睿戎技能库」与「CLI 自带技能」两个半边并成一份目录(刀 5.5 spec §5)。\n *\n * 🔴 **每个半边都带着自己的 `status`**,这不是可有可无的元数据,是判据的前提:\n * `--source cli` 不连网 ⇒ 睿戎那一半是**空的**。若判据只写「不在睿戎半边 ⇒ 产品已移除」,\n * 离线跑一次 `update --source cli` 会把顾问装的**每一份**睿戎技能报成「产品已移除」——\n * 一次报 40 份,而它们一个都没被移除。前提不成立时要说「本轮未核」,\n * 不能给一个像业务结论的答案。\n *\n * 🔴 `HalfStatus` 只有两值,**没有 `unreachable`**:取目录失败是硬失败(根本走不到判定这一步),\n * 包内资源读不到报 `E_SKILL_SOURCE_UNREACHABLE`。留一个走不到的枚举值,\n * 下一个人就会给它写一条恒不触发的分支。\n */\nimport type { ChironManifest, ChironSkill } from '@hcmai/sdk';\nimport { flattenSkills, CliError, CliErrorCode } from '@hcmai/sdk';\nimport type { CatalogSourceKind, InstalledSkillRecord, RecordSourceKind } from './skills';\nimport type { BundledSkillEntry } from './skills-manifest';\n\nexport type HalfStatus = 'fetched' | 'skipped';\n\n/** `--source` 的取值域。🔴 **不含 `local`**——没有任何一趟会去「扫 local 来源」。 */\nexport type SourceFilter = CatalogSourceKind | 'all';\n\n/** 两来源共有的那一半元信息。 */\nexport interface SkillMeta {\n id: string;\n title: string;\n description: string;\n category: string;\n stages: string[];\n actionSurface: 'cli' | 'curl';\n requires?: string[];\n bytes: number;\n files?: Array<{ path: string; bytes: number; sha256: string }>;\n}\n\nexport type SkillLocator =\n | { kind: 'chiron'; markdownUrl: string }\n | { kind: 'cli'; packagePath: string; cliVersion: string };\n\nexport interface CatalogEntry {\n meta: SkillMeta;\n locator: SkillLocator;\n}\n\nexport interface CatalogHalf {\n status: HalfStatus;\n entries: Map<string, CatalogEntry>;\n}\n\nexport interface UnifiedCatalog {\n chiron: CatalogHalf;\n cli: CatalogHalf;\n}\n\n/**\n * 自带技能的一等分类。\n *\n * 🔴 **不能叫 `operations`**:睿戎现有 9 个分类里第 9 个就叫 `operations`,\n * 只差一个前缀。撞上的后果不是静默合并,是 §5.2 那条报错。\n */\nexport const CLI_CATEGORY_KEY = 'cli-operations';\nexport const CLI_CATEGORY_NAME = 'CLI 操作';\n\nexport function chironEntry(skill: ChironSkill): CatalogEntry {\n return {\n meta: {\n id: skill.id,\n title: skill.title,\n description: skill.description,\n category: skill.category,\n stages: skill.stages ?? [],\n actionSurface: skill.actionSurface,\n requires: skill.requires,\n bytes: skill.bytes,\n files: skill.files,\n },\n locator: { kind: 'chiron', markdownUrl: skill.markdownUrl },\n };\n}\n\nexport function bundledEntry(entry: BundledSkillEntry, cliVersion: string): CatalogEntry {\n return {\n meta: {\n id: entry.id,\n title: entry.title ?? entry.id,\n description: entry.description ?? '',\n category: entry.category ?? CLI_CATEGORY_KEY,\n stages: entry.stages ?? [],\n // 自带技能讲的就是本 CLI 的命令,恒为 cli。\n actionSurface: 'cli',\n requires: entry.requires,\n bytes: entry.bytes,\n files: entry.files,\n },\n locator: { kind: 'cli', packagePath: `skills/${entry.id}`, cliVersion },\n };\n}\n\n/** 自带技能的 `sourceLocator` 写法:带版本,看得出它是跟着哪一版 CLI 装的。 */\nexport function cliLocatorString(id: string, cliVersion: string): string {\n return `@hcmai/cli@${cliVersion}:skills/${id}`;\n}\n\n/** `--source` 的取值域是**闭集**:写错一个词不能被当成缺省的 `all` 悄悄放过。 */\nexport const SOURCE_FILTERS: readonly SourceFilter[] = ['cli', 'chiron', 'all'];\n\nexport function parseSourceFilter(raw: string | undefined): SourceFilter {\n if (raw === undefined) return 'all';\n if ((SOURCE_FILTERS as readonly string[]).includes(raw)) return raw as SourceFilter;\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n `--source 只认 ${SOURCE_FILTERS.join(' / ')},收到 \"${raw}\"。` +\n '(`local` 不是取值:没有哪一趟会去「扫 local 来源」,' +\n 'install --from 装的那些在任何 --source 下都单列、都不参与升级。)',\n });\n}\n\nexport function emptyHalf(): CatalogHalf {\n return { status: 'skipped', entries: new Map() };\n}\n\nexport function buildUnifiedCatalog(input: {\n source: SourceFilter;\n /** 传了就表示这一半真的取到了;没传就是这一趟没看它。 */\n chironManifest?: ChironManifest;\n bundled?: BundledSkillEntry[];\n cliVersion: string;\n}): UnifiedCatalog {\n const chiron = emptyHalf();\n const cli = emptyHalf();\n if (input.source !== 'cli' && input.chironManifest) {\n chiron.status = 'fetched';\n for (const skill of flattenSkills(input.chironManifest)) chiron.entries.set(skill.id, chironEntry(skill));\n }\n if (input.source !== 'chiron' && input.bundled) {\n cli.status = 'fetched';\n for (const entry of input.bundled) cli.entries.set(entry.id, bundledEntry(entry, input.cliVersion));\n }\n return { chiron, cli };\n}\n\n// ================= id 冲突:确定性拒绝 =================\n\nexport interface ConflictReport {\n /** false = 这一趟没做跨来源冲突检查(有半边没看)。 */\n checked: boolean;\n ids: string[];\n}\n\n/**\n * 同 id ⇒ 报错退出,不静默取其一。\n *\n * 🔴 **检测本身也有前提**:「同 id ⇒ 报错」隐含两个半边都 `fetched`。\n * `--source cli` 时睿戎半边 `skipped` ⇒ 冲突永远检测不出来 ⇒ 静默装上自带那份。\n * 于是机器 A(缺省 all,在线)拒绝、机器 B(`--source cli`)装上且无提示——\n * **同一条命令在两台机器上装出不同内容,而顾问看不出差别**,\n * 正是本设计用来否决「来源优先级」的那句话,只是换了个触发条件。\n * ⇒ 任一半 `skipped` 时**不做**跨来源冲突判定,并且**说出来**(`checked: false`)。\n */\nexport function detectIdConflicts(catalog: UnifiedCatalog): ConflictReport {\n if (catalog.chiron.status !== 'fetched' || catalog.cli.status !== 'fetched') {\n return { checked: false, ids: [] };\n }\n const ids = [...catalog.cli.entries.keys()].filter((id) => catalog.chiron.entries.has(id)).sort();\n return { checked: true, ids };\n}\n\nexport function conflictMessage(ids: string[], endpoint: string): string {\n return (\n `技能 id \\`${ids.join('`、`')}\\` 在 CLI 自带与 ${endpoint} 的睿戎目录里同时存在。\\n` +\n '两边各自主张的东西不同,取任何一份都会让另一份的读者拿到错的合同。\\n' +\n '出路只有两条:① 升级 CLI(产品把它收编了,新版 CLI 会撤掉自带的那份);\\n' +\n '② 这是一次归属未定,把 id 与两处出处报给产品侧裁决。'\n );\n}\n\n/** 半边没看全时要说的那句话(§5.2 结论)。 */\nexport function unconfirmedConflictNote(source: SourceFilter): string {\n return `本趟只看了${source === 'cli' ? 'CLI 自带' : '睿戎'}来源,未做跨来源冲突检查`;\n}\n\n// ================= update 的三态判定(§9.3)=================\n\nexport type SourceCheckStatus = 'present' | 'removed-upstream' | 'removed-in-cli' | 'not-checked' | 'local';\n\n/**\n * 一条已装记录在本轮 catalog 下的来源判定。\n *\n * 🔴 **两侧严格对称**:不许给 cli 那一侧写「恒为 fetched——它是包内资源」。\n * 那句话有两个毛病:① 它与 `--source chiron` 直接冲突(那一趟的意思就是「不看 cli 这一半」),\n * 照「恒 fetched」往下走,顾问装的每一份自带技能都会报「这一版 CLI 不再自带它」;\n * ② 恒真前置等于没有前置——它不会报错,只会在假设被打破的那天给出一个像业务结论的答案。\n */\nexport function classifyInstalledSource(\n id: string,\n record: Pick<InstalledSkillRecord, 'sourceKind'>,\n catalog: UnifiedCatalog,\n): SourceCheckStatus {\n const kind: RecordSourceKind = record.sourceKind ?? 'chiron';\n if (kind === 'local') return 'local';\n const half = kind === 'cli' ? catalog.cli : catalog.chiron;\n if (half.status !== 'fetched') return 'not-checked';\n if (half.entries.has(id)) return 'present';\n return kind === 'cli' ? 'removed-in-cli' : 'removed-upstream';\n}\n\nexport const SOURCE_STATUS_NOTE: Record<Exclude<SourceCheckStatus, 'present'>, string> = {\n 'removed-upstream': '产品这一版的技能目录里已经没有它了;本地文件保留不动',\n 'removed-in-cli': '这一版 CLI 不再自带它(多半是被产品收编了,跑 hcm skills list 看看)',\n 'not-checked': '本轮没连网核对它的来源(--source cli),它是不是还在产品目录里这一趟不知道',\n local: '本地来源(install --from 装的),update 不管它;要更新就再 install --from 一次',\n};\n\n// ================= 跨来源 requires(§6)=================\n\nexport interface RequiresViolation {\n from: string;\n to: string;\n reason: string;\n}\n\n/**\n * 「睿戎 → 自带」是**禁止**方向:产品知识不得依赖客户端某个版本才存在的东西。\n * 允许它,等于产品的可读性取决于顾问装了哪版 CLI。\n *\n * 另三个方向都允许:自带→睿戎(`hcm delivery recon` 的用法自然要先懂 model-query-dsl)、\n * 自带→自带、睿戎→睿戎。\n */\nexport function checkCrossSourceRequires(catalog: UnifiedCatalog): RequiresViolation[] {\n if (catalog.chiron.status !== 'fetched' || catalog.cli.status !== 'fetched') return [];\n const out: RequiresViolation[] = [];\n for (const [id, entry] of catalog.chiron.entries) {\n for (const need of entry.meta.requires ?? []) {\n if (catalog.chiron.entries.has(need)) continue;\n if (catalog.cli.entries.has(need)) {\n out.push({\n from: id,\n to: need,\n reason: '睿戎技能不得依赖 CLI 自带技能:产品知识的可读性不能取决于顾问装了哪版 CLI',\n });\n }\n }\n }\n return out;\n}\n","/**\n * 自带技能的**运行时读取**:从这份 CLI 自己的 `dist/skills/` 里取正文与参考文件。\n *\n * 🔴 与 `skills-manifest.ts` 的分工:那边负责**导出清单**(构建期与 `hcm skills manifest`),\n * 这边负责**装的时候读内容**。两边共用同一个 `bundledSkillsDir()`,\n * 所以「清单里有、装的时候找不到」这种不一致在构造上不可能。\n *\n * 🔴 读不到不是网络问题:报 `SKILL_SOURCE_UNREACHABLE`(安装损坏),\n * 让顾问去重装 `@hcmai/cli`,而不是去查 VPN。\n */\nimport { promises as fsp } from 'node:fs';\nimport * as path from 'node:path';\nimport { CliError, CliErrorCode, assertSafeReferencePath, parseSkillRequirements } from '@hcmai/sdk';\nimport { bundledSkillsDir, collectBundledSkills, type BundledSkillEntry } from './skills-manifest';\nimport { cliLocatorString } from './skills-catalog';\nimport { CLI_VERSION } from '../package-version';\nimport type { SkillDocument, SkillReferenceDocument } from './skills';\n\nexport function listBundledSkills(dir = bundledSkillsDir()): BundledSkillEntry[] {\n return collectBundledSkills(dir);\n}\n\nfunction unreachable(id: string, detail: string): CliError {\n return new CliError({\n code: CliErrorCode.SKILL_SOURCE_UNREACHABLE,\n message:\n `装在这份 CLI 里的技能资源读不到(${detail}),重装 @hcmai/cli。` +\n `\\n技能 id:${id};找的位置:${bundledSkillsDir()}`,\n });\n}\n\nasync function readBundledReferences(skillDir: string): Promise<SkillReferenceDocument[]> {\n const root = path.join(skillDir, 'references');\n const out: SkillReferenceDocument[] = [];\n const walk = async (dir: string, prefix: string): Promise<void> => {\n let items;\n try {\n items = await fsp.readdir(dir, { withFileTypes: true });\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') return;\n throw cause;\n }\n for (const item of items.sort((a, b) => a.name.localeCompare(b.name))) {\n const relative = prefix ? `${prefix}/${item.name}` : item.name;\n if (item.isDirectory()) {\n await walk(path.join(dir, item.name), relative);\n continue;\n }\n if (!item.isFile()) continue;\n assertSafeReferencePath(relative);\n out.push({ path: relative, content: await fsp.readFile(path.join(dir, item.name), 'utf8') });\n }\n };\n await walk(root, '');\n return out;\n}\n\nexport async function readBundledSkillDocument(\n id: string,\n dir = bundledSkillsDir(),\n): Promise<SkillDocument> {\n const skillDir = path.join(dir, id);\n let markdown: string;\n try {\n markdown = await fsp.readFile(path.join(skillDir, 'SKILL.md'), 'utf8');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((cause as any)?.code === 'ENOENT') throw unreachable(id, 'SKILL.md 不存在');\n throw cause;\n }\n if (!markdown.trim()) throw unreachable(id, 'SKILL.md 是空的');\n return {\n id,\n markdown,\n source: cliLocatorString(id, CLI_VERSION),\n sourceKind: 'cli',\n references: await readBundledReferences(skillDir),\n };\n}\n\n/**\n * 自带技能的**自带侧**依赖闭包(自带 → 自带)。\n *\n * 🔴 解不到的 id **不在这里报错**:它可能是一条合法的「自带 → 睿戎」依赖(spec §6 允许),\n * 该由调用方连网去睿戎那边解。这里只把解不到的原样回给调用方。\n * 在这里就报错,等于把一条允许的方向判成断链。\n */\nexport async function resolveBundledClosure(\n targetId: string,\n dir = bundledSkillsDir(),\n): Promise<{ documents: SkillDocument[]; external: string[] }> {\n const documents: SkillDocument[] = [];\n const external = new Set<string>();\n const state = new Map<string, 'visiting' | 'done'>();\n const stack: string[] = [];\n const available = new Set(listBundledSkills(dir).map((s) => s.id));\n\n const visit = async (id: string): Promise<void> => {\n if (state.get(id) === 'done') return;\n if (state.get(id) === 'visiting') {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `自带技能依赖成环:${[...stack, id].join(' → ')}`,\n });\n }\n state.set(id, 'visiting');\n stack.push(id);\n const document = await readBundledSkillDocument(id, dir);\n for (const need of parseSkillRequirements(document.markdown, id)) {\n if (available.has(need)) await visit(need);\n else external.add(need);\n }\n stack.pop();\n state.set(id, 'done');\n documents.push(document);\n };\n\n await visit(targetId);\n return { documents, external: [...external].sort() };\n}\n","/**\n * `hcm skills manifest` —— 机器可读的**命令面 + 自带技能**清单(刀 5.5 spec §8)。\n *\n * 🔴 **必须从 commander 注册表导出,不许手抄**。再手抄一份只是把 ADR-319 §7.1 的 G8\n * 缺口(核心仓 `ChironCliCommandArchTest` 抄的命令表与真实 CLI 无绑定)从核心仓挪到 CLI 仓。\n *\n * 清单随包发布在 `dist/skills/manifest.json`,由构建脚本**执行本命令**产出——\n * 也就是说清单是 CLI 自己吐的,与注册表漂移在构造上不可能。\n *\n * 🔴 本命令**不连网、不读凭据**:它是给守卫和外部工具用的静态事实。\n */\nimport { readFileSync, readdirSync, statSync, existsSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { Command } from 'commander';\nimport { formatObject, parseSkillFrontmatter, type OutputFormat } from '@hcmai/sdk';\nimport { CLI_VERSION } from '../package-version';\n\nexport interface CommandSurface {\n /** 空格分隔的完整路径,如 `delivery doctor`。不含 `hcm` 本身。 */\n path: string;\n options: string[];\n}\n\nexport interface BundledSkillEntry {\n id: string;\n title?: string;\n description?: string;\n category?: string;\n stages?: string[];\n actionSurface?: string;\n requires?: string[];\n bytes: number;\n files: Array<{ path: string; bytes: number; sha256: string }>;\n}\n\nexport interface SkillsManifest {\n schemaVersion: 1;\n cliVersion: string;\n commands: CommandSurface[];\n skills: BundledSkillEntry[];\n}\n\n/**\n * 遍历 commander 注册表,导出**完整命令面 + 每条的 option 名单**。\n *\n * 🔴 `option.flags` 形如 `--output <fmt>` / `-y, --yes`。只取长选项名,\n * 因为守卫要判的是「正文里点名的 `--flag` 存在吗」。\n */\nexport function collectCommandSurface(root: Command): CommandSurface[] {\n const out: CommandSurface[] = [];\n const walk = (cmd: Command, prefix: string[]): void => {\n for (const sub of cmd.commands) {\n const segs = [...prefix, sub.name()];\n const options = sub.options\n .map((o) => /(--[a-zA-Z0-9][\\w-]*)/.exec(o.flags)?.[1] ?? '')\n .filter((s) => s.length > 0);\n out.push({ path: segs.join(' '), options: [...new Set(options)].sort() });\n walk(sub, segs);\n }\n };\n walk(root, []);\n // 排序让清单在两次构建之间逐字稳定——否则 diff 全是噪声,守卫也没法比。\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/**\n * 自带技能的落点。\n *\n * 🔴 **从安装后的 CLI 出发定位**,不依赖仓库 cwd:顾问是在客户目录里敲这条命令的,\n * 用 `process.cwd()` 找资源会在仓库外面全部落空(刀 5.5 spec §12.2 的 R3)。\n */\nexport function bundledSkillsDir(): string {\n // 本文件构建后落在 `dist/index.js` 里,技能在 `dist/skills/`。\n const here = path.dirname(fileURLToPath(import.meta.url));\n return path.join(here, 'skills');\n}\n\nfunction sha256(buf: Buffer): string {\n return createHash('sha256').update(buf).digest('hex');\n}\n\nfunction listFiles(dir: string, rel = ''): string[] {\n const out: string[] = [];\n for (const name of readdirSync(dir)) {\n const p = path.join(dir, name);\n const r = rel ? `${rel}/${name}` : name;\n if (statSync(p).isDirectory()) out.push(...listFiles(p, r));\n else out.push(r);\n }\n return out;\n}\n\n/** 扫自带技能目录,产出 `skills[]`。目录不存在时回空数组(还没落任何自带技能)。 */\nexport function collectBundledSkills(dir = bundledSkillsDir()): BundledSkillEntry[] {\n if (!existsSync(dir)) return [];\n const out: BundledSkillEntry[] = [];\n for (const id of readdirSync(dir).sort()) {\n const skillDir = path.join(dir, id);\n if (!statSync(skillDir).isDirectory()) continue;\n const files = listFiles(skillDir).sort();\n if (!files.includes('SKILL.md')) continue;\n let bytes = 0;\n const fileRows = files.map((rel) => {\n const buf = readFileSync(path.join(skillDir, rel));\n bytes += buf.byteLength;\n return { path: rel, bytes: buf.byteLength, sha256: sha256(buf) };\n });\n const body = readFileSync(path.join(skillDir, 'SKILL.md'), 'utf8');\n const fm = parseSkillFrontmatter(body, id) as Record<string, unknown>;\n out.push({\n id,\n title: str(fm.title),\n description: str(fm.description),\n category: str(fm.category),\n stages: strArray(fm.stages),\n actionSurface: str(fm.actionSurface),\n requires: strArray(fm.requires),\n bytes,\n files: fileRows,\n });\n }\n return out;\n}\n\nexport function buildManifest(root: Command, skillsDir = bundledSkillsDir()): SkillsManifest {\n return {\n schemaVersion: 1,\n cliVersion: CLI_VERSION,\n commands: collectCommandSurface(root),\n skills: collectBundledSkills(skillsDir),\n };\n}\n\nexport interface SkillsManifestArgs {\n output?: OutputFormat;\n}\n\nexport function skillsManifestCommand(root: Command, args: SkillsManifestArgs): void {\n const manifest = buildManifest(root);\n process.stdout.write(formatObject(manifest, { format: args.output ?? 'json' }) + '\\n');\n}\n\nfunction str(v: unknown): string | undefined {\n return typeof v === 'string' && v ? v : undefined;\n}\nfunction strArray(v: unknown): string[] | undefined {\n return Array.isArray(v) ? v.map(String) : undefined;\n}\n","import { createHash } from 'node:crypto';\nimport { promises as fs } from 'node:fs';\nimport type { Dirent } from 'node:fs';\nimport path from 'node:path';\nimport {\n CliError,\n CliErrorCode,\n assertSafeSkillFilePath,\n assertSafeSkillId,\n normalizeReferences,\n resolveSkillInstallOrder,\n type ChironManifest,\n} from '@hcmai/sdk';\nimport type { PreparedRuntimeFile, WorkBuddyRuntime } from './skills-runtime';\n\nexport interface PreparedSkillFile {\n path: string;\n content: Buffer;\n bytes: number;\n sha256: string;\n}\n\nexport interface PreparedSkillDocument {\n id: string;\n markdown: string;\n bytes: number;\n sha256: string;\n files: PreparedSkillFile[];\n}\n\nexport interface ChironLock {\n schemaVersion: 1;\n source: {\n endpointOriginSha256: string;\n catalogPath: '/skills.json';\n catalogSha256: string;\n };\n selection: { requestedSkill: string };\n resolvedSkills: Array<{\n id: string;\n bytes: number;\n sha256: string;\n /** 旧锁没有该字段;新写锁始终逐文件记录。 */\n files?: Array<{ path: string; bytes: number; sha256: string }>;\n }>;\n /** 旧锁没有该字段;WP2 新写锁记录能力与启动文件摘要,不记录本机绝对路径。 */\n runtime?: {\n capabilities: string[];\n capabilitiesSha256: string;\n launch: WorkBuddyRuntime['launch'];\n files: Array<{ path: string; bytes: number; sha256: string; mode: number }>;\n };\n ownedFiles: string[];\n syncedAt: string;\n}\n\nexport interface WorkBuddySyncInput {\n project: string;\n endpoint: string;\n catalog: ChironManifest;\n requestedSkill: string;\n documents: PreparedSkillDocument[];\n runtime: WorkBuddyRuntime;\n now?: string;\n}\n\nexport interface WorkBuddySyncResult {\n changed: boolean;\n requestedSkill: string;\n resolvedSkills: string[];\n project: string;\n skillsDir: string;\n lockPath: string;\n runnerPath: string;\n capabilitiesSha256: string;\n installed: string[];\n removed: string[];\n}\n\ninterface PreparedOwnedFile {\n content: Buffer;\n bytes: number;\n sha256: string;\n mode?: number;\n}\n\ninterface LockedOwnedFile {\n sha256: string;\n mode?: number;\n}\n\ninterface SyncJournal {\n schemaVersion: 1;\n project: string;\n affectedFiles: string[];\n oldLockExisted: boolean;\n}\n\n/**\n * 下载前先解析完整依赖闭包;全部下载成功、动作面与字节数都通过后才返回。\n * 调用方只有拿到完整返回值后才进入文件系统同步,所以网络失败不会留下半套 Skill。\n */\nexport async function prepareSkillDocuments(\n catalog: ChironManifest,\n requestedSkill: string,\n fetchMarkdown: (id: string) => Promise<string>,\n fetchFile?: (id: string, relativePath: string) => Promise<Buffer>,\n fetchReference?: (id: string, relativePath: string) => Promise<string | Buffer>,\n): Promise<PreparedSkillDocument[]> {\n const order = resolveSkillInstallOrder(catalog, requestedSkill);\n for (const skill of order) {\n if (skill.actionSurface !== 'cli') {\n throw invalid(`技能 ${skill.id} 尚未收敛到 hcm CLI,不能同步为 WorkBuddy 正式执行 Skill`);\n }\n }\n\n return Promise.all(\n order.map(async (skill) => {\n let files: PreparedSkillFile[];\n if (skill.files === undefined) {\n const markdown = await fetchMarkdown(skill.id);\n const content = Buffer.from(markdown, 'utf8');\n const references = normalizeReferences(skill.references, skill.id);\n if (references.length > 0 && !fetchReference) {\n throw invalid(`技能 ${skill.id} 声明了 references,但调用方没有参考文件下载能力`);\n }\n const referenceFiles = await Promise.all(\n references.map(async (relativePath) => {\n const targetPath = `references/${relativePath}`;\n assertSafeSkillFilePath(targetPath);\n const fetched = await fetchReference!(skill.id, relativePath);\n const referenceContent = Buffer.isBuffer(fetched)\n ? Buffer.from(fetched)\n : Buffer.from(fetched, 'utf8');\n return {\n path: targetPath,\n content: referenceContent,\n bytes: referenceContent.length,\n sha256: sha256(referenceContent),\n };\n }),\n );\n files = [\n {\n path: 'SKILL.md',\n content,\n bytes: content.length,\n sha256: sha256(content),\n },\n ...referenceFiles,\n ];\n } else {\n if (!Array.isArray(skill.files) || skill.files.length === 0) {\n throw invalid(`技能 ${skill.id} 的 files 目录为空`);\n }\n if (!fetchFile) throw invalid(`技能 ${skill.id} 提供完整目录,但调用方没有文件下载能力`);\n const seen = new Set<string>();\n for (const file of skill.files) {\n assertSafeSkillFilePath(file.path);\n if (seen.has(file.path))\n throw invalid(`技能 ${skill.id} 的 files 包含重复路径: ${file.path}`);\n seen.add(file.path);\n if (\n !Number.isInteger(file.bytes) ||\n file.bytes < 0 ||\n !/^[a-f0-9]{64}$/.test(file.sha256)\n ) {\n throw invalid(`技能 ${skill.id} 的文件目录元数据非法: ${file.path}`);\n }\n }\n if (!seen.has('SKILL.md')) throw invalid(`技能 ${skill.id} 的完整目录缺少 SKILL.md`);\n files = await Promise.all(\n skill.files.map(async (file) => {\n const content = Buffer.from(await fetchFile(skill.id, file.path));\n if (content.length !== file.bytes) {\n throw invalid(\n `技能 ${skill.id}/${file.path} 字节数与目录不一致:目录=${file.bytes},实际=${content.length}`,\n );\n }\n const digest = sha256(content);\n if (digest !== file.sha256) {\n throw invalid(`技能 ${skill.id}/${file.path} 摘要与目录不一致`);\n }\n return { path: file.path, content, bytes: content.length, sha256: digest };\n }),\n );\n }\n\n const root = files.find((file) => file.path === 'SKILL.md');\n if (!root) throw invalid(`技能 ${skill.id} 的完整目录缺少 SKILL.md`);\n const markdown = root.content.toString('utf8');\n if (!markdown.trim()) throw invalid(`技能 ${skill.id} 内容为空`);\n validateWorkBuddyFrontmatter(markdown, skill.id);\n const bytes = root.bytes;\n if (Number.isFinite(skill.bytes) && skill.bytes > 0 && skill.bytes !== bytes) {\n throw invalid(`技能 ${skill.id} 字节数与目录不一致:目录=${skill.bytes},实际=${bytes}`);\n }\n return { id: skill.id, markdown, bytes, sha256: root.sha256, files };\n }),\n );\n}\n\n/** 把一组已完整校验的 Skill 同步进项目,并由一份锁文件明确所有权。 */\nexport async function syncWorkBuddyProject(\n input: WorkBuddySyncInput,\n): Promise<WorkBuddySyncResult> {\n const project = path.resolve(input.project);\n const metaDir = path.join(project, '.hcm-delivery');\n const skillsDir = path.join(project, '.codebuddy', 'skills');\n const lockPath = path.join(metaDir, 'chiron.lock.json');\n assertSafeSkillId(input.requestedSkill);\n validatePreparedDocuments(input.documents, input.requestedSkill);\n validatePreparedRuntime(input.runtime);\n\n await recoverInterruptedSyncs(project, metaDir, lockPath);\n\n const oldLock = await readLock(lockPath);\n const skillEntries = input.documents.flatMap((document) =>\n document.files.map((file) => [ownedFile(document.id, file.path), file] as const),\n );\n const runtimeEntries = input.runtime.files.map((file) => [file.path, file] as const);\n const desiredEntries: Array<readonly [string, PreparedOwnedFile]> = [\n ...skillEntries,\n ...runtimeEntries,\n ];\n const desiredFiles = desiredEntries.map(([file]) => file);\n const desiredByFile = new Map(desiredEntries);\n const oldOwned = new Set(oldLock?.ownedFiles ?? []);\n const oldDigestByFile = lockDigests(oldLock);\n\n for (const file of oldOwned) validateOwnedFile(file);\n for (const file of desiredFiles) {\n const absolute = path.join(project, file);\n const current = await readOptionalBytes(absolute);\n if (current !== undefined && !oldOwned.has(file)) {\n throw invalid(`目标文件不属于上一份 Chiron 锁,拒绝覆盖顾问文件:${file}`);\n }\n }\n\n for (const file of oldOwned) {\n const absolute = path.join(project, file);\n const current = await readOptionalBytes(absolute);\n if (current === undefined) continue;\n const expected = oldDigestByFile.get(file);\n if (\n !expected ||\n sha256(current) !== expected.sha256 ||\n !(await fileModeMatches(absolute, expected.mode))\n ) {\n throw invalid(`上一份锁拥有的生成文件已被人工修改,拒绝覆盖或清理:${file}`);\n }\n }\n\n const newLock: ChironLock = {\n schemaVersion: 1,\n source: {\n endpointOriginSha256: sha256(normalizeEndpoint(input.endpoint)),\n catalogPath: '/skills.json',\n catalogSha256: sha256(stableJson(input.catalog)),\n },\n selection: { requestedSkill: input.requestedSkill },\n resolvedSkills: input.documents.map(({ id, bytes, sha256: digest, files: skillFiles }) => ({\n id,\n bytes,\n sha256: digest,\n files: skillFiles.map(({ path: filePath, bytes: fileBytes, sha256: fileSha256 }) => ({\n path: filePath,\n bytes: fileBytes,\n sha256: fileSha256,\n })),\n })),\n runtime: {\n capabilities: input.runtime.capabilities,\n capabilitiesSha256: input.runtime.capabilitiesSha256,\n launch: input.runtime.launch,\n files: input.runtime.files.map(({ path: filePath, bytes, sha256: digest, mode }) => ({\n path: filePath,\n bytes,\n sha256: digest,\n mode,\n })),\n },\n ownedFiles: desiredFiles,\n syncedAt: input.now ?? new Date().toISOString(),\n };\n\n if (\n oldLock &&\n sameLockContent(oldLock, newLock) &&\n (await desiredFilesMatch(project, desiredByFile))\n ) {\n return result(false, input, project, skillsDir, lockPath, [], []);\n }\n\n const obsolete = [...oldOwned].filter((file) => !desiredByFile.has(file));\n await fs.mkdir(metaDir, { recursive: true });\n const staging = await fs.mkdtemp(path.join(metaDir, '.staging-'));\n const stagedFiles = path.join(staging, 'new');\n const backups = path.join(staging, 'backup');\n const stagedLock = path.join(staging, 'chiron.lock.json');\n const journalPath = path.join(staging, 'journal.json');\n let journalReady = false;\n\n try {\n for (const [file, preparedFile] of desiredByFile) {\n const staged = path.join(stagedFiles, file);\n await fs.mkdir(path.dirname(staged), { recursive: true });\n await fs.writeFile(\n staged,\n preparedFile.content,\n preparedFile.mode === undefined ? undefined : { mode: preparedFile.mode },\n );\n }\n await fs.writeFile(stagedLock, `${JSON.stringify(newLock, null, 2)}\\n`, 'utf8');\n\n const affected = [...new Set([...desiredFiles, ...obsolete])];\n for (const file of affected) {\n const target = path.join(project, file);\n if (!(await exists(target))) continue;\n const backup = path.join(backups, file);\n await fs.mkdir(path.dirname(backup), { recursive: true });\n await fs.copyFile(target, backup);\n }\n\n const oldLockExisted = await exists(lockPath);\n if (oldLockExisted) {\n const backupLock = path.join(backups, '.hcm-delivery', 'chiron.lock.json');\n await fs.mkdir(path.dirname(backupLock), { recursive: true });\n await fs.copyFile(lockPath, backupLock);\n }\n const journal: SyncJournal = {\n schemaVersion: 1,\n project,\n affectedFiles: affected,\n oldLockExisted,\n };\n await fs.writeFile(journalPath, `${JSON.stringify(journal, null, 2)}\\n`, 'utf8');\n journalReady = true;\n\n for (const file of desiredFiles) {\n const target = path.join(project, file);\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.rm(target, { force: true });\n await fs.rename(path.join(stagedFiles, file), target);\n }\n for (const file of obsolete) await fs.unlink(path.join(project, file)).catch(ignoreMissing);\n await fs.rm(lockPath, { force: true });\n await fs.rename(stagedLock, lockPath);\n\n // 锁最后替换;删除 journal 表示整组文件已经提交。若在此前被中断,下次运行会回滚。\n await fs.unlink(journalPath);\n journalReady = false;\n } catch (cause) {\n if (journalReady) await recoverStaging(project, staging, lockPath);\n throw cause;\n } finally {\n await fs.rm(staging, { recursive: true, force: true });\n }\n\n return result(\n true,\n input,\n project,\n skillsDir,\n lockPath,\n input.documents.map((document) => document.id),\n [...new Set(obsolete.map(idFromOwnedFile).filter((id): id is string => id !== undefined))],\n );\n}\n\n/** 启动同步前回滚上一次未提交的文件组,避免 kill/crash 后留下混合版本。 */\nasync function recoverInterruptedSyncs(\n project: string,\n metaDir: string,\n lockPath: string,\n): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await fs.readdir(metaDir, { withFileTypes: true });\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw cause;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith('.staging-')) continue;\n const staging = path.join(metaDir, entry.name);\n if (await exists(path.join(staging, 'journal.json'))) {\n await recoverStaging(project, staging, lockPath);\n }\n await fs.rm(staging, { recursive: true, force: true });\n }\n}\n\nasync function recoverStaging(project: string, staging: string, lockPath: string): Promise<void> {\n const journalPath = path.join(staging, 'journal.json');\n const journal = parseJournal(await fs.readFile(journalPath, 'utf8'), project);\n const backups = path.join(staging, 'backup');\n\n for (const file of journal.affectedFiles) {\n const target = path.join(project, file);\n const backup = path.join(backups, file);\n if (await exists(backup)) {\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.rm(target, { force: true });\n await fs.rename(backup, target);\n } else {\n await fs.rm(target, { force: true });\n }\n }\n\n const backupLock = path.join(backups, '.hcm-delivery', 'chiron.lock.json');\n if (journal.oldLockExisted) {\n if (!(await exists(backupLock))) throw invalid(`同步恢复缺少旧锁备份:${backupLock}`);\n await fs.mkdir(path.dirname(lockPath), { recursive: true });\n await fs.rm(lockPath, { force: true });\n await fs.rename(backupLock, lockPath);\n } else {\n await fs.rm(lockPath, { force: true });\n }\n}\n\nfunction parseJournal(content: string, project: string): SyncJournal {\n let journal: Partial<SyncJournal>;\n try {\n journal = JSON.parse(content) as Partial<SyncJournal>;\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.CONFIG_PARSE_ERROR,\n message: 'Chiron 同步恢复日志损坏',\n cause,\n });\n }\n if (\n journal.schemaVersion !== 1 ||\n journal.project !== project ||\n !Array.isArray(journal.affectedFiles) ||\n typeof journal.oldLockExisted !== 'boolean'\n ) {\n throw invalid('Chiron 同步恢复日志合同不匹配,拒绝猜测恢复范围');\n }\n for (const file of journal.affectedFiles) validateOwnedFile(file);\n return journal as SyncJournal;\n}\n\nfunction validatePreparedDocuments(\n documents: PreparedSkillDocument[],\n requestedSkill: string,\n): void {\n const seen = new Set<string>();\n for (const document of documents) {\n assertSafeSkillId(document.id);\n if (seen.has(document.id)) throw invalid(`同步闭包包含重复技能: ${document.id}`);\n seen.add(document.id);\n if (!document.markdown.trim()) throw invalid(`技能 ${document.id} 内容为空`);\n const paths = new Set<string>();\n for (const file of document.files) {\n assertSafeSkillFilePath(file.path);\n if (paths.has(file.path)) throw invalid(`技能 ${document.id} 包含重复文件: ${file.path}`);\n paths.add(file.path);\n if (file.content.length !== file.bytes || sha256(file.content) !== file.sha256) {\n throw invalid(`技能 ${document.id}/${file.path} 的已准备内容摘要不一致`);\n }\n }\n const root = document.files.find((file) => file.path === 'SKILL.md');\n if (\n !root ||\n !root.content.equals(Buffer.from(document.markdown, 'utf8')) ||\n root.bytes !== document.bytes ||\n root.sha256 !== document.sha256\n ) {\n throw invalid(`技能 ${document.id} 的已准备内容摘要不一致`);\n }\n }\n if (!seen.has(requestedSkill)) throw invalid(`同步闭包不包含目标技能: ${requestedSkill}`);\n}\n\nfunction validatePreparedRuntime(runtime: WorkBuddyRuntime): void {\n if (!Array.isArray(runtime.capabilities) || runtime.capabilities.length === 0) {\n throw invalid('WorkBuddy CLI 能力集合为空');\n }\n const capabilities = new Set<string>();\n for (const capability of runtime.capabilities) {\n if (!/^[a-z0-9]+(?:[.-][a-z0-9]+)*$/.test(capability) || capabilities.has(capability)) {\n throw invalid(`WorkBuddy CLI 能力标识非法或重复:${capability}`);\n }\n capabilities.add(capability);\n }\n if (\n !validDigest(runtime.capabilitiesSha256) ||\n runtime.capabilitiesSha256 !== sha256(`${runtime.capabilities.join('\\n')}\\n`)\n ) {\n throw invalid('WorkBuddy CLI 能力摘要不一致');\n }\n if (!validDigest(runtime.launch.executableSha256)) {\n throw invalid('WorkBuddy CLI 可执行文件摘要非法');\n }\n if (runtime.launch.kind === 'node-entry' && !validDigest(runtime.launch.entrySha256)) {\n throw invalid('WorkBuddy CLI 入口摘要非法');\n }\n if (!Array.isArray(runtime.files) || runtime.files.length !== 2) {\n throw invalid('WorkBuddy 运行入口必须同时包含 Unix 与 Windows 文件');\n }\n const files = new Set<string>();\n for (const file of runtime.files) {\n validateRuntimeFile(file);\n if (files.has(file.path)) throw invalid(`WorkBuddy 运行入口重复:${file.path}`);\n files.add(file.path);\n }\n if (!files.has('.hcm-delivery/bin/hcm') || !files.has('.hcm-delivery/bin/hcm.cmd')) {\n throw invalid('WorkBuddy 运行入口合同不完整');\n }\n}\n\nfunction validateRuntimeFile(file: PreparedRuntimeFile): void {\n validateOwnedFile(file.path);\n if (\n file.content.length !== file.bytes ||\n sha256(file.content) !== file.sha256 ||\n !Number.isInteger(file.mode) ||\n file.mode < 0 ||\n file.mode > 0o777\n ) {\n throw invalid(`WorkBuddy 运行入口摘要或权限不一致:${file.path}`);\n }\n}\n\nfunction validateWorkBuddyFrontmatter(markdown: string, skillId: string): void {\n const match = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/.exec(markdown);\n if (!match) throw invalid(`技能 ${skillId} 缺少 YAML frontmatter`);\n const frontmatter = match[1] ?? '';\n const name = /^name:\\s*['\"]?([^'\"\\s]+)['\"]?\\s*$/m.exec(frontmatter)?.[1];\n const description = /^description:\\s*(.+)$/m.exec(frontmatter)?.[1]?.trim();\n if (name !== skillId) throw invalid(`技能 ${skillId} 的 frontmatter name 不一致`);\n if (!description) throw invalid(`技能 ${skillId} 缺少 description,WorkBuddy 无法发现`);\n}\n\nasync function readLock(lockPath: string): Promise<ChironLock | undefined> {\n const content = await readOptional(lockPath);\n if (content === undefined) return undefined;\n try {\n const lock = JSON.parse(content) as Partial<ChironLock>;\n if (\n lock.schemaVersion !== 1 ||\n !lock.source ||\n !lock.selection?.requestedSkill ||\n !Array.isArray(lock.resolvedSkills) ||\n !Array.isArray(lock.ownedFiles)\n ) {\n throw new Error('schema mismatch');\n }\n assertSafeSkillId(lock.selection.requestedSkill);\n for (const skill of lock.resolvedSkills) {\n assertSafeSkillId(skill.id);\n if (\n !Number.isInteger(skill.bytes) ||\n skill.bytes < 0 ||\n !/^[a-f0-9]{64}$/.test(skill.sha256)\n ) {\n throw new Error('invalid skill digest');\n }\n if (skill.files !== undefined) {\n if (!Array.isArray(skill.files) || skill.files.length === 0)\n throw new Error('invalid files');\n const seen = new Set<string>();\n for (const file of skill.files) {\n assertSafeSkillFilePath(file.path);\n if (\n seen.has(file.path) ||\n !Number.isInteger(file.bytes) ||\n file.bytes < 0 ||\n !/^[a-f0-9]{64}$/.test(file.sha256)\n ) {\n throw new Error('invalid file digest');\n }\n seen.add(file.path);\n }\n if (!seen.has('SKILL.md')) throw new Error('missing SKILL.md');\n }\n }\n if (lock.runtime !== undefined) validateLockedRuntime(lock.runtime);\n for (const file of lock.ownedFiles) validateOwnedFile(file);\n return lock as ChironLock;\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.CONFIG_PARSE_ERROR,\n message: `Chiron 锁文件损坏,拒绝猜测文件所有权:${lockPath}`,\n cause,\n });\n }\n}\n\nfunction validateLockedRuntime(runtime: NonNullable<ChironLock['runtime']>): void {\n if (\n !Array.isArray(runtime.capabilities) ||\n runtime.capabilities.length === 0 ||\n !validDigest(runtime.capabilitiesSha256) ||\n runtime.capabilitiesSha256 !== sha256(`${runtime.capabilities.join('\\n')}\\n`) ||\n !runtime.launch ||\n !validDigest(runtime.launch.executableSha256) ||\n !Array.isArray(runtime.files) ||\n runtime.files.length !== 2\n ) {\n throw new Error('invalid runtime');\n }\n if (runtime.launch.kind === 'node-entry') {\n if (!validDigest(runtime.launch.entrySha256)) throw new Error('invalid runtime entry');\n } else if (runtime.launch.kind !== 'executable') {\n throw new Error('invalid runtime launch kind');\n }\n const capabilities = new Set<string>();\n for (const capability of runtime.capabilities) {\n if (!/^[a-z0-9]+(?:[.-][a-z0-9]+)*$/.test(capability) || capabilities.has(capability)) {\n throw new Error('invalid runtime capability');\n }\n capabilities.add(capability);\n }\n const files = new Set<string>();\n for (const file of runtime.files) {\n validateOwnedFile(file.path);\n if (\n files.has(file.path) ||\n !Number.isInteger(file.bytes) ||\n file.bytes < 0 ||\n !validDigest(file.sha256) ||\n !Number.isInteger(file.mode) ||\n file.mode < 0 ||\n file.mode > 0o777\n ) {\n throw new Error('invalid runtime file');\n }\n files.add(file.path);\n }\n if (!files.has('.hcm-delivery/bin/hcm') || !files.has('.hcm-delivery/bin/hcm.cmd')) {\n throw new Error('missing runtime file');\n }\n}\n\nfunction sameLockContent(left: ChironLock, right: ChironLock): boolean {\n const withoutTime = (lock: ChironLock) => ({ ...lock, syncedAt: undefined });\n return stableJson(withoutTime(left)) === stableJson(withoutTime(right));\n}\n\nasync function desiredFilesMatch(\n project: string,\n desired: Map<string, PreparedOwnedFile>,\n): Promise<boolean> {\n for (const [file, preparedFile] of desired) {\n const absolute = path.join(project, file);\n const current = await readOptionalBytes(absolute);\n if (\n current === undefined ||\n sha256(current) !== preparedFile.sha256 ||\n !(await fileModeMatches(absolute, preparedFile.mode))\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction result(\n changed: boolean,\n input: WorkBuddySyncInput,\n project: string,\n skillsDir: string,\n lockPath: string,\n installed: string[],\n removed: string[],\n): WorkBuddySyncResult {\n return {\n changed,\n requestedSkill: input.requestedSkill,\n resolvedSkills: input.documents.map((document) => document.id),\n project,\n skillsDir,\n lockPath,\n runnerPath: path.join(project, '.hcm-delivery', 'bin', 'hcm'),\n capabilitiesSha256: input.runtime.capabilitiesSha256,\n installed,\n removed,\n };\n}\n\nfunction ownedFile(id: string, relativePath = 'SKILL.md'): string {\n assertSafeSkillId(id);\n assertSafeSkillFilePath(relativePath);\n return `.codebuddy/skills/${id}/${relativePath}`;\n}\n\nfunction idFromOwnedFile(file: string): string | undefined {\n validateOwnedFile(file);\n if (!file.startsWith('.codebuddy/skills/')) return undefined;\n return file.split('/')[2] ?? '';\n}\n\nfunction validateOwnedFile(file: string): void {\n if (file === '.hcm-delivery/bin/hcm' || file === '.hcm-delivery/bin/hcm.cmd') return;\n const match = /^\\.codebuddy\\/skills\\/([a-z0-9][a-z0-9-]{0,63})\\/(.+)$/.exec(file);\n if (!match) throw invalid(`锁文件包含非法所有权路径:${file}`);\n const id = match[1];\n const relativePath = match[2];\n if (!id || !relativePath) throw invalid(`锁文件包含非法所有权路径:${file}`);\n assertSafeSkillId(id);\n try {\n assertSafeSkillFilePath(relativePath);\n } catch {\n throw invalid(`锁文件包含非法所有权路径:${file}`);\n }\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n let url: URL;\n try {\n url = new URL(endpoint);\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `非法 endpoint:${endpoint}`,\n cause,\n });\n }\n url.username = '';\n url.password = '';\n url.search = '';\n url.hash = '';\n url.pathname = url.pathname.replace(/\\/+$/, '');\n return url.toString().replace(/\\/$/, '');\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction stableJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableJson).join(',')}]`;\n if (value && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n return `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${stableJson(item)}`).join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nasync function readOptional(file: string): Promise<string | undefined> {\n try {\n return await fs.readFile(file, 'utf8');\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw cause;\n }\n}\n\nasync function readOptionalBytes(file: string): Promise<Buffer | undefined> {\n try {\n return await fs.readFile(file);\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw cause;\n }\n}\n\nasync function exists(file: string): Promise<boolean> {\n try {\n await fs.access(file);\n return true;\n } catch (cause) {\n if ((cause as NodeJS.ErrnoException).code === 'ENOENT') return false;\n throw cause;\n }\n}\n\nfunction lockDigests(lock: ChironLock | undefined): Map<string, LockedOwnedFile> {\n const digests = new Map<string, LockedOwnedFile>();\n for (const skill of lock?.resolvedSkills ?? []) {\n if (skill.files === undefined) {\n digests.set(ownedFile(skill.id), { sha256: skill.sha256 });\n continue;\n }\n for (const file of skill.files) {\n digests.set(ownedFile(skill.id, file.path), { sha256: file.sha256 });\n }\n }\n for (const file of lock?.runtime?.files ?? []) {\n digests.set(file.path, { sha256: file.sha256, mode: file.mode });\n }\n return digests;\n}\n\nasync function fileModeMatches(file: string, expected: number | undefined): Promise<boolean> {\n if (expected === undefined || process.platform === 'win32') return true;\n const stat = await fs.stat(file);\n return (stat.mode & 0o777) === expected;\n}\n\nfunction validDigest(value: unknown): value is string {\n return typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);\n}\n\nfunction ignoreMissing(cause: unknown): void {\n if ((cause as NodeJS.ErrnoException).code !== 'ENOENT') throw cause;\n}\n\nfunction invalid(message: string): CliError {\n return new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message });\n}\n","import { execFile } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { createReadStream, promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\nimport { CliError, CliErrorCode } from '@hcmai/sdk';\n\nconst execFileAsync = promisify(execFile);\nconst REQUIRED_CAPABILITIES = [\n 'hcm.help.skills',\n 'hcm.skills.help.sync',\n 'hcm.skills.sync.option.project',\n 'hcm.skills.sync.option.target',\n] as const;\n\nexport interface RuntimeProbeInput {\n /** 显式 CLI 入口;相对路径按当前工作目录解析。 */\n candidate?: string;\n /** 默认使用当前 Node,测试和受管包装器可显式传入。 */\n nodeExecutable?: string;\n /** 未传 candidate 时使用的当前 CLI 入口;默认 process.argv[1]。 */\n currentEntry?: string;\n /** 调用方已在当前 CLI 的 skills sync action 内,命令注册本身即能力证明。 */\n currentEntryHasRequiredCapabilities?: boolean;\n /** 禁止作为上游候选的项目入口,避免生成会执行自身的包装器。 */\n forbiddenCandidatePaths?: string[];\n timeoutMs?: number;\n}\n\nexport interface PreparedRuntimeFile {\n path: '.hcm-delivery/bin/hcm' | '.hcm-delivery/bin/hcm.cmd';\n content: Buffer;\n bytes: number;\n sha256: string;\n mode: number;\n}\n\nexport interface WorkBuddyRuntime {\n capabilities: string[];\n capabilitiesSha256: string;\n launch:\n | {\n kind: 'node-entry';\n executableSha256: string;\n entrySha256: string;\n }\n | {\n kind: 'executable';\n executableSha256: string;\n };\n files: PreparedRuntimeFile[];\n}\n\ninterface ResolvedLaunch {\n kind: 'node-entry' | 'executable';\n executable: string;\n entry?: string;\n}\n\n/**\n * 只通过本地帮助命令确认 WorkBuddy 所需合同,再生成不依赖 PATH 的项目启动入口。\n * 不读取 HCM 配置,不登录,也不向后端发请求。\n */\nexport async function prepareWorkBuddyRuntime(\n input: RuntimeProbeInput = {},\n): Promise<WorkBuddyRuntime> {\n const candidate = input.candidate?.trim() || input.currentEntry || process.argv[1];\n if (!candidate) throw invalid('无法解析当前 HCM CLI 入口;请传 --cli <path>');\n\n const launch = await resolveLaunch(candidate, input.nodeExecutable ?? process.execPath);\n const launchTarget = launch.kind === 'node-entry' ? launch.entry! : launch.executable;\n for (const forbidden of input.forbiddenCandidatePaths ?? []) {\n if ((await comparablePath(forbidden)) === launchTarget) {\n throw invalid('候选 HCM CLI 不能指向待生成的项目稳定入口');\n }\n }\n if (!(input.currentEntryHasRequiredCapabilities && !input.candidate?.trim())) {\n const beforeProbe = await launchIdentity(launch);\n // 一个成功的嵌套帮助调用已经同时证明顶层 skills、sync 子命令和选项合同。\n // 避免为同一事实启动三次短命 Node,WorkBuddy/macOS 的冷启动成本会被放大。\n const syncHelp = await runProbe(launch, ['skills', 'sync', '--help'], input.timeoutMs).catch(\n () => '',\n );\n const missing: string[] = [];\n if (!/\\bhcm\\s+skills\\s+sync\\b/.test(syncHelp)) {\n missing.push(REQUIRED_CAPABILITIES[0], REQUIRED_CAPABILITIES[1]);\n }\n if (!/--project(?:\\s|=|<|\\[|$)/.test(syncHelp)) missing.push(REQUIRED_CAPABILITIES[2]);\n if (!/--target(?:\\s|=|<|\\[|$)/.test(syncHelp)) missing.push(REQUIRED_CAPABILITIES[3]);\n if (missing.length > 0) {\n throw invalid(`候选 HCM CLI 缺少 WorkBuddy 所需能力:${missing.join(', ')}`);\n }\n if ((await launchIdentity(launch)) !== beforeProbe) {\n throw invalid('候选 HCM CLI 在能力探针期间发生变化,请重试同步');\n }\n }\n\n const capabilities = [...REQUIRED_CAPABILITIES];\n const capabilitiesSha256 = sha256(`${capabilities.join('\\n')}\\n`);\n const executableSha256 = await sha256File(launch.executable);\n const launchRecord: WorkBuddyRuntime['launch'] =\n launch.kind === 'node-entry'\n ? {\n kind: 'node-entry',\n executableSha256,\n entrySha256: await sha256File(launch.entry!),\n }\n : { kind: 'executable', executableSha256 };\n const unixContent = Buffer.from(unixLauncher(launch), 'utf8');\n const windowsContent = Buffer.from(windowsLauncher(launch), 'utf8');\n\n return {\n capabilities,\n capabilitiesSha256,\n launch: launchRecord,\n files: [\n preparedFile('.hcm-delivery/bin/hcm', unixContent, 0o755),\n preparedFile('.hcm-delivery/bin/hcm.cmd', windowsContent, 0o644),\n ],\n };\n}\n\nasync function resolveLaunch(candidate: string, nodeExecutable: string): Promise<ResolvedLaunch> {\n const requested = path.resolve(candidate);\n const resolvedCandidate = await realFile(requested, '候选 HCM CLI');\n const header = (await readPrefix(resolvedCandidate, 256)).toString('utf8');\n const nodeEntry = /^(?:#![^\\r\\n]*\\bnode\\b)|\\.(?:c|m)?js$/i.test(\n header.startsWith('#!') ? (header.split(/\\r?\\n/, 1)[0] ?? '') : resolvedCandidate,\n );\n\n if (nodeEntry) {\n return {\n kind: 'node-entry',\n executable: await realFile(path.resolve(nodeExecutable), 'Node 可执行文件'),\n entry: resolvedCandidate,\n };\n }\n return { kind: 'executable', executable: resolvedCandidate };\n}\n\nasync function realFile(file: string, label: string): Promise<string> {\n try {\n const resolved = await fs.realpath(file);\n const stat = await fs.stat(resolved);\n if (!stat.isFile()) throw new Error('not a regular file');\n return resolved;\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `${label}不可用:${file}`,\n cause,\n });\n }\n}\n\nasync function comparablePath(file: string): Promise<string> {\n const absolute = path.resolve(file);\n return fs.realpath(absolute).catch(() => absolute);\n}\n\nasync function launchIdentity(launch: ResolvedLaunch): Promise<string> {\n const files =\n launch.kind === 'node-entry' ? [launch.executable, launch.entry!] : [launch.executable];\n const identities = await Promise.all(\n files.map(async (file) => {\n const stat = await fs.stat(file, { bigint: true });\n return [file, stat.dev, stat.ino, stat.size, stat.mtimeNs, stat.ctimeNs]\n .map(String)\n .join('\\0');\n }),\n );\n return identities.join('\\n');\n}\n\nasync function readPrefix(file: string, bytes: number): Promise<Buffer> {\n const handle = await fs.open(file, 'r');\n try {\n const buffer = Buffer.alloc(bytes);\n const result = await handle.read(buffer, 0, bytes, 0);\n return buffer.subarray(0, result.bytesRead);\n } finally {\n await handle.close();\n }\n}\n\nasync function runProbe(\n launch: ResolvedLaunch,\n args: string[],\n timeoutMs = 5_000,\n): Promise<string> {\n const command = launch.executable;\n const commandArgs = launch.kind === 'node-entry' ? [launch.entry!, ...args] : args;\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n CI: '1',\n NO_COLOR: '1',\n HCM_RUNTIME_PROBE: '1',\n };\n const nodeOptions = normalizeWorkBuddyNodeOptions(env.NODE_OPTIONS);\n if (nodeOptions === undefined) delete env.NODE_OPTIONS;\n else env.NODE_OPTIONS = nodeOptions;\n try {\n const { stdout, stderr } = await execFileAsync(command, commandArgs, {\n encoding: 'utf8',\n timeout: timeoutMs,\n maxBuffer: 256 * 1024,\n windowsHide: true,\n env,\n });\n return `${stdout}\\n${stderr}`;\n } catch (cause) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `候选 HCM CLI 能力探针失败:hcm ${args.join(' ')}`,\n cause,\n });\n }\n}\n\nfunction unixLauncher(launch: ResolvedLaunch): string {\n const command = shellQuote(launch.executable);\n const entry = launch.kind === 'node-entry' ? ` ${shellQuote(launch.entry!)}` : '';\n return `#!/bin/sh\nset -eu\n\n# WorkBuddy on macOS may inject --use-system-ca. Node can then spend minutes\n# evaluating the Keychain when a short-lived CLI process exits. Preserve every\n# other host option (including safety --require hooks) and change only this CA mode.\nwb_node_options=\"\\${NODE_OPTIONS-}\"\nif [ \"$(uname -s 2>/dev/null || printf '%s' unknown)\" = 'Darwin' ] && \\\n printf '%s\\n' \"$wb_node_options\" | grep -Eq '(^|[[:space:]])--use-system-ca([[:space:]]|$)'; then\n while printf '%s\\n' \"$wb_node_options\" | grep -Eq '(^|[[:space:]])--use-system-ca([[:space:]]|$)'; do\n wb_next_options=\"$(printf '%s\\n' \"$wb_node_options\" | sed -E 's/(^|[[:space:]])--use-system-ca([[:space:]]|$)/\\\\1\\\\2/g')\"\n [ \"$wb_next_options\" != \"$wb_node_options\" ] || break\n wb_node_options=\"$wb_next_options\"\n done\n if ! printf '%s\\n' \"$wb_node_options\" | grep -Eq '(^|[[:space:]])--use-bundled-ca([[:space:]]|$)'; then\n wb_node_options=\"\\${wb_node_options:+$wb_node_options }--use-bundled-ca\"\n fi\n NODE_OPTIONS=\"$wb_node_options\"\n export NODE_OPTIONS\nfi\n\nexec ${command}${entry} \"$@\"\n`;\n}\n\n/**\n * WorkBuddy 的其他 NODE_OPTIONS 属于宿主能力,不能整体清空。\n * 这里只在 macOS 精确替换已确认会触发 Keychain 慢路径的 CA 选项。\n */\nexport function normalizeWorkBuddyNodeOptions(\n value: string | undefined,\n platform: NodeJS.Platform = process.platform,\n): string | undefined {\n if (platform !== 'darwin' || value === undefined) return value;\n const systemCa = /(^|[\\t\\n\\r ])--use-system-ca(?=$|[\\t\\n\\r ])/;\n if (!systemCa.test(value)) return value;\n\n let normalized = value;\n while (systemCa.test(normalized)) normalized = normalized.replace(systemCa, '$1');\n normalized = normalized.trim();\n const bundledCa = /(^|[\\t\\n\\r ])--use-bundled-ca(?=$|[\\t\\n\\r ])/;\n if (!bundledCa.test(normalized)) {\n normalized = `${normalized}${normalized ? ' ' : ''}--use-bundled-ca`;\n }\n return normalized;\n}\n\nfunction windowsLauncher(launch: ResolvedLaunch): string {\n const command = cmdQuote(launch.executable);\n const entry = launch.kind === 'node-entry' ? ` ${cmdQuote(launch.entry!)}` : '';\n return `@echo off\\r\\n${command}${entry} %*\\r\\n`;\n}\n\nfunction shellQuote(value: string): string {\n if (/[\\r\\n\\0]/.test(value)) throw invalid('CLI 启动路径包含非法控制字符');\n return `'${value.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction cmdQuote(value: string): string {\n if (/[\\r\\n\\0\"]/g.test(value)) throw invalid('CLI 启动路径包含非法控制字符');\n return `\"${value.replace(/%/g, '%%')}\"`;\n}\n\nfunction preparedFile(\n filePath: PreparedRuntimeFile['path'],\n content: Buffer,\n mode: number,\n): PreparedRuntimeFile {\n return { path: filePath, content, bytes: content.length, sha256: sha256(content), mode };\n}\n\nasync function sha256File(file: string): Promise<string> {\n const hash = createHash('sha256');\n await new Promise<void>((resolve, reject) => {\n const stream = createReadStream(file);\n stream.on('data', (chunk) => hash.update(chunk));\n stream.on('error', reject);\n stream.on('end', resolve);\n });\n return hash.digest('hex');\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction invalid(message: string): CliError {\n return new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message });\n}\n","import {\n bootstrapTenant,\n createHttpClient,\n formatObject,\n fromAxiosError,\n loadEnv,\n loadGlobalConfig,\n resolveActiveEnv,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { promptSecret, promptConfirm, readStdin } from '../utils/prompt';\nimport { exitWithError } from '../utils/exit';\n\nexport interface TenantBootstrapArgs {\n tenantId?: string;\n adminUsername?: string;\n adminPassword?: string;\n adminPasswordStdin?: boolean;\n tenantName?: string;\n bootstrapKey?: string;\n bootstrapKeyStdin?: boolean;\n endpoint?: string;\n env?: string;\n yes?: boolean;\n output?: OutputFormat;\n}\n\n/**\n * 解析 bootstrap key。优先级:env var → --bootstrap-key-stdin → --bootstrap-key(警告)→ 交互。\n *\n * 🔴 key 是「无租户无用户」时刻的唯一凭据,等价于建租户的权限。绝不接受写进\n * skill 正文或提交进仓库的用法——命令行明文传参会警告。\n */\nasync function resolveBootstrapKey(args: TenantBootstrapArgs, stdinTaken: boolean): Promise<string> {\n const fromEnv = process.env.HCM_BOOTSTRAP_KEY;\n if (fromEnv) return fromEnv;\n if (args.bootstrapKeyStdin) {\n if (stdinTaken) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--bootstrap-key-stdin 与 --admin-password-stdin 不能同时用(stdin 只有一路);'\n + '把其中一个改走 HCM_BOOTSTRAP_KEY 环境变量或交互输入',\n });\n }\n return (await readStdin()).trim();\n }\n if (args.bootstrapKey) {\n process.stderr.write(\n '[hcm] WARNING: --bootstrap-key <k> 会泄漏到 shell history / ps aux。'\n + '推荐 HCM_BOOTSTRAP_KEY 环境变量或 --bootstrap-key-stdin。\\n',\n );\n return args.bootstrapKey;\n }\n return promptSecret('Bootstrap key: ');\n}\n\nasync function resolveAdminPassword(args: TenantBootstrapArgs): Promise<{ pwd: string; stdinTaken: boolean }> {\n if (args.adminPasswordStdin) return { pwd: (await readStdin()).trim(), stdinTaken: true };\n if (args.adminPassword) {\n process.stderr.write(\n '[hcm] WARNING: --admin-password <p> 会泄漏到 shell history / ps aux。推荐 --admin-password-stdin。\\n',\n );\n return { pwd: args.adminPassword, stdinTaken: false };\n }\n return { pwd: await promptSecret('Admin password: '), stdinTaken: false };\n}\n\nasync function resolveEndpoint(args: TenantBootstrapArgs): Promise<string> {\n if (args.endpoint) return args.endpoint;\n const g = await loadGlobalConfig();\n const envName = resolveActiveEnv({ envFlag: args.env }, process.env, g);\n const env = await loadEnv(envName).catch(() => null);\n if (!env?.endpoint) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`',\n });\n }\n return env.endpoint;\n}\n\n/**\n * `hcm tenant bootstrap` —— 开通新租户(建租户 + admin 用户 + 租户结构 reconcile)。\n *\n * 交付旅程的第一步,且是**唯一在没有任何租户/用户时可用**的写入口。不可逆,\n * 故默认过确认闸(`--yes` 跳过,供 CI 用)。\n */\nexport async function tenantBootstrapCommand(args: TenantBootstrapArgs): Promise<void> {\n try {\n if (!args.tenantId || !args.adminUsername) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '--tenant-id 与 --admin-username 必填',\n });\n }\n const endpoint = await resolveEndpoint(args);\n const { pwd, stdinTaken } = await resolveAdminPassword(args);\n const key = await resolveBootstrapKey(args, stdinTaken);\n\n if (!args.yes) {\n const ok = await promptConfirm(\n `将在 ${endpoint} 创建租户 \"${args.tenantId}\"(admin: ${args.adminUsername})。此操作不可逆,继续?`,\n );\n if (!ok) {\n process.stderr.write('已取消\\n');\n process.exit(1);\n }\n }\n\n // bootstrap 端点不走 Bearer —— 用无认证 client,凭 X-Bootstrap-Key 通过\n const http = createHttpClient({\n endpoint,\n getAccessToken: async () => null,\n onRefresh: async () => {},\n });\n const result = await bootstrapTenant(http, key, {\n tenantId: args.tenantId,\n adminUsername: args.adminUsername,\n adminPassword: pwd,\n tenantName: args.tenantName,\n });\n\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') {\n process.stdout.write(\n `✅ 租户 ${result.tenantId} 已开通(adminUserId ${result.adminUserId ?? '-'})\\n`\n + ` 下一步:hcm env add <name> --endpoint ${endpoint} && hcm login --env <name>\\n`,\n );\n }\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 403) {\n exitWithError(new Error('bootstrap key 无效(403)—— 核对部署方提供的 key,勿复用其他环境的'));\n } else if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.env));\n } else {\n exitWithError(e);\n }\n }\n}\n","import { promises as fsp } from 'node:fs';\nimport {\n HcmClient,\n formatObject,\n fromAxiosError,\n listTenantMeta,\n getTenantMeta,\n saveTenantMeta,\n deleteTenantMeta,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { promptConfirm } from '../utils/prompt';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface MetaArgs {\n keyword?: string;\n type?: string;\n page?: string;\n pageSize?: string;\n file?: string;\n dryRun?: boolean;\n yes?: boolean;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nasync function client(args: MetaArgs): Promise<HcmClient> {\n return HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n}\n\nfunction fail(e: unknown, args: MetaArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 403) {\n exitWithError(\n new Error('元数据写入被拒(403)—— 需 config-admin 身份且当前 source 可写;'\n + '若在租户开发空间外,先 `hcm workspace bind <key>`'),\n );\n }\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm meta list` —— 列出租户元数据文件。 */\nexport async function metaListCommand(args: MetaArgs): Promise<void> {\n try {\n const c = await client(args);\n const { items, total } = await listTenantMeta(c.raw(), {\n keyword: args.keyword,\n type: args.type,\n page: args.page ? Number(args.page) : undefined,\n pageSize: args.pageSize ? Number(args.pageSize) : undefined,\n });\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`📄 ${items.length} 份${total ? ` / 共 ${total}` : ''}\\n`);\n process.stdout.write(formatObject(items, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/** `hcm meta get <path>` —— 打印 meta 原文(YAML/properties 原样,便于管道消费)。 */\nexport async function metaGetCommand(path: string, args: MetaArgs): Promise<void> {\n try {\n const c = await client(args);\n const content = await getTenantMeta(c.raw(), path);\n process.stdout.write(content.endsWith('\\n') ? content : content + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm meta set <path> --file <f> [--dry-run]` —— 写入 meta 原文。\n *\n * 默认对着**客户环境**写配置,故支持 `--dry-run` 先看要写什么。\n * 写完须清元数据缓存才生效:`hcm cache clear-meta <Model>`。\n */\nexport async function metaSetCommand(path: string, args: MetaArgs): Promise<void> {\n try {\n if (!args.file) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '--file <path> 必填(从文件读取 meta 原文;用 - 表示 stdin)',\n });\n }\n const content =\n args.file === '-'\n ? await new Promise<string>((resolve, reject) => {\n let buf = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (d) => (buf += d));\n process.stdin.on('end', () => resolve(buf));\n process.stdin.on('error', reject);\n })\n : await fsp.readFile(args.file, 'utf8');\n\n if (args.dryRun) {\n process.stdout.write(\n `[dry-run] 将写入 ${path}(${Buffer.byteLength(content)} B)——未实际写入\\n---\\n${content}\\n`,\n );\n process.exit(0);\n }\n\n const c = await client(args);\n const result = await saveTenantMeta(c.raw(), path, content);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') {\n process.stdout.write(`✅ 已写入 ${path}\\n 记得清缓存:hcm cache clear-meta <Model>\\n`);\n }\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((e as any)?.code === 'ENOENT') exitWithError(new Error(`文件不存在:${args.file}`));\n fail(e, args);\n }\n}\n\n/** `hcm meta delete <path> [--yes]` —— 删除 meta(不可逆,默认过确认闸)。 */\nexport async function metaDeleteCommand(path: string, args: MetaArgs): Promise<void> {\n try {\n if (!args.yes) {\n const ok = await promptConfirm(`将删除元数据 ${path},此操作不可逆。继续?`);\n if (!ok) {\n process.stderr.write('已取消\\n');\n process.exit(1);\n }\n }\n const c = await client(args);\n const result = await deleteTenantMeta(c.raw(), path);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`🗑️ 已删除 ${path}\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n","import * as crypto from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n buildMiniPreviewTargets,\n buildMiniVerifyAgentReport,\n createWorkspaceFile,\n deleteWorkspaceFile,\n formatMiniVerifyReport,\n formatObject,\n formatRows,\n getMiniStatus,\n HcmClient,\n initMiniAppProject,\n inferMiniWritableTemplateOptionsFromModel,\n listWorkspaceFiles,\n loadWorkspaceFileContent,\n pullMiniAppProject,\n pushMiniAppProject,\n runMiniSmokeChecks,\n saveWorkspaceFileContent,\n validateMiniProject,\n fromAxiosError,\n type MiniPreviewTarget,\n type MiniPushConflict,\n type MiniPushPlanItem,\n type MiniPushResult,\n type MiniStatusEntry,\n type MiniSurface,\n type MiniTemplateKind,\n type MiniValidationResult,\n type MiniVerifyReport,\n type OutputFormat,\n type WorkspaceFileItem,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport {\n toWorkspaceListRows,\n type TenantExtensionWorkspaceRow,\n} from './workspace-format';\n\nconst DEFAULT_FRONTEND_URL = 'http://127.0.0.1:5179';\nconst WORKSPACE_CONTEXT_FILE = 'hcm.workspace.json';\nconst WORKSPACE_CONTEXT_KIND = 'hcm-workspace';\nconst WORKSPACE_CONTEXT_VERSION = 1;\nconst WORKSPACE_STATE_DIR = '.hcm';\nconst WORKSPACE_PULL_MANIFEST_FILE = 'workspace-manifest.json';\nconst MINI_APPS_DIR = 'mini_apps';\nconst RAW_WORKSPACE_EXCLUDED_DIRS = new Set([\n '.git',\n WORKSPACE_STATE_DIR,\n MINI_APPS_DIR,\n 'node_modules',\n 'dist',\n]);\nconst RAW_WORKSPACE_EXCLUDED_FILES = new Set([WORKSPACE_CONTEXT_FILE, '.DS_Store']);\n\ninterface WorkspaceContext {\n kind: typeof WORKSPACE_CONTEXT_KIND;\n version: typeof WORKSPACE_CONTEXT_VERSION;\n workspaceKey: string;\n tenantId?: string;\n endpoint?: string;\n profile?: string;\n updatedAt: string;\n}\n\ninterface WorkspaceDirArgs {\n dir?: string;\n output?: OutputFormat;\n}\n\n/**\n * Common env/identity flags accepted by every business sub-command (T15).\n * `profile` is kept as a deprecated alias of `env`; transpiled in\n * `getActiveAuthContextFromCli`.\n */\ninterface CommonAuthArgs {\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n}\n\ninterface WorkspaceListArgs extends CommonAuthArgs {\n keyword?: string;\n limit?: string | number;\n output?: OutputFormat;\n}\n\ninterface WorkspaceActiveArgs extends WorkspaceDirArgs, CommonAuthArgs {}\n\ninterface WorkspaceBindArgs extends WorkspaceDirArgs, CommonAuthArgs {\n tenant?: string;\n endpoint?: string;\n force?: boolean;\n}\n\ninterface WorkspaceCreateArgs extends WorkspaceDirArgs, CommonAuthArgs {\n description?: string;\n activate?: boolean;\n force?: boolean;\n}\n\ninterface WorkspacePullArgs extends WorkspaceDirArgs, CommonAuthArgs {\n workspace?: string;\n force?: boolean;\n}\n\ninterface WorkspaceAddMiniArgs extends WorkspaceDirArgs, CommonAuthArgs {\n name?: string;\n template?: string;\n model?: string;\n fields?: string;\n defaults?: string;\n surface?: string;\n scopes?: string;\n tenant?: string;\n force?: boolean;\n}\n\ninterface WorkspacePushArgs extends WorkspaceDirArgs, CommonAuthArgs {\n dryRun?: boolean;\n}\n\ninterface WorkspacePreviewArgs extends WorkspaceDirArgs {\n frontend?: string;\n surface?: string;\n}\n\ninterface WorkspaceVerifyArgs extends WorkspaceDirArgs, CommonAuthArgs {\n frontend?: string;\n surface?: string;\n smoke?: boolean;\n}\n\ninterface MiniAppDir {\n appCode: string;\n dir: string;\n}\n\ninterface WorkspaceMiniVerifyItem {\n appCode: string;\n dir: string;\n report: MiniVerifyReport;\n agentReport: ReturnType<typeof buildMiniVerifyAgentReport>;\n}\n\ninterface WorkspaceRawLocalFile {\n localPath: string;\n absolutePath: string;\n content: string;\n sha256: string;\n size: number;\n}\n\ninterface WorkspaceRawFileSnapshot {\n localPath: string;\n remotePath: string;\n fileId?: string;\n sha256: string;\n size: number;\n lastModified?: number | string | null;\n}\n\ninterface WorkspaceRawPullManifest {\n version: typeof WORKSPACE_CONTEXT_VERSION;\n workspaceKey: string;\n profile?: string;\n pulledAt: string;\n files: WorkspaceRawFileSnapshot[];\n}\n\ninterface WorkspaceRawPushResult {\n workspaceKey: string;\n dryRun: boolean;\n operations: MiniPushPlanItem[];\n conflicts: MiniPushConflict[];\n}\n\ninterface WorkspaceActiveView {\n activeWorkspaceKey: string | null;\n localWorkspaceKey: string | null;\n matchesLocal: boolean | null;\n profile: string;\n tenantId: string;\n endpoint: string;\n rootDir: string;\n}\n\nexport async function workspaceListCommand(args: WorkspaceListArgs): Promise<void> {\n try {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const limit = parsePositiveInt(args.limit, 50, '--limit');\n const result = await client.query<TenantExtensionWorkspaceRow>('TenantExtensionWorkspace', {\n keyword: args.keyword,\n fields: [\n 'workspaceKey',\n 'description',\n 'ownerUserName',\n 'sharedUsers',\n 'filesCount',\n 'myLockCount',\n 'devModeEnabled',\n 'updateTime',\n ],\n sort: [{ field: 'devModeEnabled', desc: true }, { field: 'updateTime', desc: true }],\n limit,\n });\n writeWorkspaceListResult(result.rows, args.output ?? 'table', result.total);\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceActiveCommand(args: WorkspaceActiveArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const localContext = await readWorkspaceContext(rootDir);\n // Fallback: if user did not pass --env / --profile but local hcm.workspace.json\n // remembers the env this dir was bound to, honor that.\n const ctx = await getActiveAuthContextFromCli(args, {\n fallbackEnv: localContext?.profile,\n });\n const client = HcmClient.fromAuthContext(ctx);\n const result = await client.query<TenantExtensionWorkspaceRow>('TenantExtensionWorkspace', {\n filter: { devModeEnabled: true },\n fields: ['workspaceKey', 'devModeEnabled'],\n limit: 1,\n });\n const activeWorkspaceKey = optionalText(result.rows[0]?.workspaceKey) ?? null;\n const view: WorkspaceActiveView = {\n activeWorkspaceKey,\n localWorkspaceKey: localContext?.workspaceKey ?? null,\n matchesLocal:\n activeWorkspaceKey && localContext?.workspaceKey\n ? activeWorkspaceKey === localContext.workspaceKey\n : null,\n profile: client.profile,\n tenantId: client.tenantId,\n endpoint: client.endpoint,\n rootDir,\n };\n writeWorkspaceActiveResult(view, args.output ?? 'table');\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceBindCommand(\n workspaceKey: string,\n args: WorkspaceBindArgs,\n): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const existing = await readWorkspaceContext(rootDir);\n if (existing && !args.force && existing.workspaceKey !== workspaceKey) {\n throw new Error(\n `${WORKSPACE_CONTEXT_FILE} already binds workspace '${existing.workspaceKey}'; use --force to rebind`,\n );\n }\n const client = await loadProfileClient(args);\n const context = buildWorkspaceContext({\n workspaceKey,\n profile: args.env ?? args.profile ?? client?.profile,\n tenantId: args.tenant ?? client?.tenantId,\n endpoint: args.endpoint ?? client?.endpoint,\n });\n await fs.mkdir(rootDir, { recursive: true });\n await writeWorkspaceContext(rootDir, context);\n writeWorkspaceBindResult(context, rootDir, args.output ?? 'table');\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceCreateCommand(\n workspaceKey: string,\n args: WorkspaceCreateArgs,\n): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const existing = await readWorkspaceContext(rootDir);\n if (existing && !args.force && existing.workspaceKey !== workspaceKey) {\n throw new Error(\n `${WORKSPACE_CONTEXT_FILE} already binds workspace '${existing.workspaceKey}'; use --force to rebind`,\n );\n }\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const normalizedWorkspaceKey = normalizeWorkspaceKey(workspaceKey);\n const resp = await client.raw().post('/api/models/TenantExtensionWorkspace', {\n workspaceKey: normalizedWorkspaceKey,\n description: args.description ?? '',\n });\n const created = asRecord(unwrapData(resp.data));\n const id = stringOptional(created.id);\n if (args.activate) {\n if (!id) throw new Error('created workspace response does not include id');\n await client.action('TenantExtensionWorkspace', 'activate', { id });\n }\n const context = buildWorkspaceContext({\n workspaceKey: normalizedWorkspaceKey,\n profile: args.profile ?? client.profile,\n tenantId: client.tenantId,\n endpoint: client.endpoint,\n });\n await fs.mkdir(rootDir, { recursive: true });\n await writeWorkspaceContext(rootDir, context);\n writeWorkspaceCreateResult(\n {\n workspaceKey: normalizedWorkspaceKey,\n id: id ?? '-',\n rootDir,\n activated: !!args.activate,\n profile: client.profile,\n tenantId: client.tenantId,\n },\n args.output ?? 'table',\n );\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspacePullCommand(args: WorkspacePullArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const existing = await readWorkspaceContext(rootDir);\n const workspaceKey = args.workspace ?? existing?.workspaceKey;\n if (!workspaceKey) {\n throw new Error(\n `workspace key is required; pass --workspace <key> or run hcm workspace bind <key> first`,\n );\n }\n const client = HcmClient.fromAuthContext(\n await getActiveAuthContextFromCli(args, { fallbackEnv: existing?.profile }),\n );\n const context = buildWorkspaceContext({\n workspaceKey,\n profile: args.profile ?? existing?.profile ?? client.profile,\n tenantId: client.tenantId ?? existing?.tenantId,\n endpoint: client.endpoint ?? existing?.endpoint,\n });\n await fs.mkdir(rootDir, { recursive: true });\n await writeWorkspaceContext(rootDir, context);\n\n const files = await listWorkspaceFiles(client.raw(), workspaceKey, { pageSize: 5000 });\n const miniApps = detectRemoteMiniApps(files.data);\n const pulledMiniApps = [];\n for (const appCode of miniApps) {\n const result = await pullMiniAppProject({\n http: client.raw(),\n appCode,\n workspaceKey,\n targetDir: path.join(rootDir, MINI_APPS_DIR, appCode),\n tenantId: client.tenantId,\n endpoint: client.endpoint,\n profile: args.profile ?? client.profile,\n force: !!args.force,\n });\n pulledMiniApps.push(result);\n }\n\n const rawFiles = files.data.filter(\n (file) => !isDirectoryMarker(file.relativePath) && !isMiniAppPath(file.relativePath),\n );\n const pulledRawFiles = [];\n const rawRemoteByLocalPath = new Map<string, WorkspaceFileItem>();\n for (const file of rawFiles) {\n const content = await loadWorkspaceFileContent(client.raw(), file.id);\n const target = path.join(rootDir, content.relativePath);\n await writeTextFile(target, content.content, !!args.force);\n pulledRawFiles.push(content.relativePath);\n rawRemoteByLocalPath.set(content.relativePath, file);\n }\n await writeWorkspaceRawState(\n rootDir,\n context,\n await readWorkspaceRawLocalFiles(rootDir),\n rawRemoteByLocalPath,\n );\n\n writeWorkspacePullResult(\n {\n workspaceKey,\n rootDir,\n totalRemoteFiles: files.data.length,\n miniApps: pulledMiniApps.map((item) => ({\n appCode: item.appCode,\n files: item.files.length,\n })),\n rawFiles: pulledRawFiles,\n },\n args.output ?? 'table',\n );\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceAddMiniCommand(\n appCode: string,\n args: WorkspaceAddMiniArgs,\n): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const templateKind = parseTemplateKind(args.template);\n validateWritableOptions(templateKind, args);\n const model = parseModelKey(args.model);\n const client = await loadProfileClient({\n ...args,\n env: args.env ?? args.profile ?? context.profile,\n });\n const autoOptions = await resolveWritableAutoOptions({\n client,\n templateKind,\n model,\n fields: args.fields,\n defaults: args.defaults,\n });\n const result = await initMiniAppProject({\n appCode,\n workspaceKey: context.workspaceKey,\n targetDir: path.join(rootDir, MINI_APPS_DIR, appCode),\n name: args.name,\n defaultSurface: parseSurface(args.surface),\n templateKind,\n writableModel: model,\n writableFields: autoOptions.fields ?? parseCsv(args.fields),\n writableDefaults: autoOptions.defaults ?? parseJsonObject(args.defaults, '--defaults'),\n writableTodayDefaultFields: autoOptions.todayDefaultFields,\n requiredScopes: parseScopes(args.scopes),\n tenantId: args.tenant ?? client?.tenantId ?? context.tenantId,\n endpoint: client?.endpoint ?? context.endpoint,\n profile: args.env ?? args.profile ?? client?.profile ?? context.profile,\n force: !!args.force,\n });\n writeWorkspaceAddMiniResult(result, rootDir, args.output ?? 'table');\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceStatusCommand(args: WorkspaceDirArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const rawStatus = await getWorkspaceRawStatus(rootDir, context);\n const rows: Array<Record<string, unknown>> = rawStatus.map((item) => ({\n artifact: 'workspace',\n status: item.status,\n file: item.localPath,\n remote: item.remotePath,\n }));\n for (const app of miniApps) {\n try {\n const status = await getMiniStatus(app.dir);\n rows.push(\n ...status.map((item) => ({\n artifact: `mini:${app.appCode}`,\n status: item.status,\n file: item.localPath,\n remote: item.remotePath,\n })),\n );\n } catch (e) {\n rows.push({\n artifact: `mini:${app.appCode}`,\n status: 'invalid',\n file: '-',\n remote: (e as Error).message,\n });\n }\n }\n if (args.output === 'json' || args.output === 'yaml') {\n process.stdout.write(\n formatObject({ rootDir, miniApps: rows }, { format: args.output }) + '\\n',\n );\n } else {\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n }\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e);\n }\n}\n\nexport async function workspaceValidateCommand(args: WorkspaceDirArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const results = await Promise.all(\n miniApps.map(async (app) => ({ app, result: await validateMiniProject(app.dir) })),\n );\n writeWorkspaceValidateResult(results, args.output ?? 'table');\n process.exit(results.every((item) => item.result.valid) ? 0 : 1);\n } catch (e) {\n exitWorkspaceError(e);\n }\n}\n\nexport async function workspacePushCommand(args: WorkspacePushArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const client = HcmClient.fromAuthContext(\n await getActiveAuthContextFromCli(args, { fallbackEnv: context.profile }),\n );\n const rawResult = await pushWorkspaceRawFiles({\n http: client.raw(),\n rootDir,\n context,\n dryRun: !!args.dryRun,\n });\n const results = [];\n for (const app of miniApps) {\n const result = await pushMiniAppProject({\n http: client.raw(),\n rootDir: app.dir,\n dryRun: !!args.dryRun,\n });\n results.push({ app, result });\n }\n writeWorkspacePushResult(rawResult, results, args.output ?? 'table');\n process.exit(\n rawResult.conflicts.length || results.some((item) => item.result.conflicts.length) ? 3 : 0,\n );\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspacePreviewCommand(args: WorkspacePreviewArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const frontend = args.frontend ?? process.env.HCM_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n const rows = [];\n for (const app of miniApps) {\n const targets = filterPreviewTargets(\n await buildMiniPreviewTargets(app.dir, frontend),\n args.surface ?? 'all',\n );\n rows.push(\n ...targets.map((item) => ({\n artifact: `mini:${app.appCode}`,\n surface: item.key,\n url: item.url,\n })),\n );\n }\n if (args.output === 'json' || args.output === 'yaml') {\n process.stdout.write(formatObject(rows, { format: args.output }) + '\\n');\n } else {\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n }\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e);\n }\n}\n\nexport async function workspaceVerifyCommand(args: WorkspaceVerifyArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const frontend = args.frontend ?? process.env.HCM_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n const authArgs: CommonAuthArgs = {\n ...args,\n env: args.env ?? args.profile ?? context.profile,\n };\n const client = await loadProfileClient(authArgs);\n const smokeAccessToken = args.smoke\n ? await loadSmokeAccessToken(client, authArgs)\n : null;\n const rawStatus = await getWorkspaceRawStatus(rootDir, context);\n let rawPlan: WorkspaceRawPushResult | null = null;\n let rawPlanSkipped: string | undefined;\n if (!client) {\n rawPlanSkipped = 'profile not configured';\n } else {\n try {\n rawPlan = await pushWorkspaceRawFiles({\n http: client.raw(),\n rootDir,\n context,\n dryRun: true,\n });\n } catch (planErr) {\n rawPlanSkipped = (planErr as Error).message ?? 'workspace raw dry-run failed';\n }\n }\n const reports: WorkspaceMiniVerifyItem[] = [];\n\n for (const app of miniApps) {\n const validation = await validateMiniProject(app.dir);\n const status = await readMiniStatusSafely(app);\n let plan: MiniVerifyReport['plan'] = null;\n let planSkipped: string | undefined;\n\n if (!validation.valid) {\n planSkipped = 'validation failed';\n } else if (!client) {\n planSkipped = 'profile not configured';\n } else {\n try {\n const pushResult = await pushMiniAppProject({\n http: client.raw(),\n rootDir: app.dir,\n dryRun: true,\n });\n plan = { operations: pushResult.operations, conflicts: pushResult.conflicts };\n } catch (planErr) {\n planSkipped = (planErr as Error).message ?? 'push dry-run failed';\n }\n }\n\n const previewTargets = await buildMiniPreviewTargets(app.dir, frontend).catch(\n () => [] as MiniPreviewTarget[],\n );\n const preview = filterPreviewTargets(previewTargets, args.surface ?? 'all');\n const smoke = args.smoke\n ? await runMiniSmokeChecks({\n rootDir: app.dir,\n frontendBaseUrl: frontend,\n previewTargets: preview,\n accessToken: smokeAccessToken,\n })\n : null;\n const ok = validation.valid && !!plan && plan.conflicts.length === 0 && (!smoke || smoke.ok);\n const report: MiniVerifyReport = {\n ok,\n validate: validation,\n status,\n plan,\n planSkipped,\n preview,\n smoke,\n };\n reports.push({\n appCode: app.appCode,\n dir: app.dir,\n report,\n agentReport: buildMiniVerifyAgentReport(report),\n });\n }\n\n writeWorkspaceVerifyResult(\n context,\n rootDir,\n { status: rawStatus, plan: rawPlan, planSkipped: rawPlanSkipped },\n reports,\n args.output ?? 'table',\n );\n const rawOk = !!rawPlan && rawPlan.conflicts.length === 0;\n process.exit(rawOk && reports.every((item) => item.report.ok) ? 0 : 1);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport function removedMiniCommand(): never {\n exitWithError(\n new Error(\n [\n 'hcm mini has been removed.',\n 'Use hcm workspace bind <workspaceKey>, hcm workspace add mini <appCode>, hcm workspace verify, and hcm workspace push.',\n ].join(' '),\n ),\n );\n}\n\nfunction resolveRootDir(dir?: string): string {\n return path.resolve(dir ?? '.');\n}\n\nfunction buildWorkspaceContext(args: {\n workspaceKey: string;\n tenantId?: string;\n endpoint?: string;\n profile?: string;\n}): WorkspaceContext {\n return {\n kind: WORKSPACE_CONTEXT_KIND,\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: normalizeWorkspaceKey(args.workspaceKey),\n tenantId: args.tenantId,\n endpoint: args.endpoint,\n profile: args.profile,\n updatedAt: new Date().toISOString(),\n };\n}\n\nasync function readWorkspaceContext(rootDir: string): Promise<WorkspaceContext | null> {\n try {\n const parsed = JSON.parse(\n await fs.readFile(path.join(rootDir, WORKSPACE_CONTEXT_FILE), 'utf-8'),\n ) as Record<string, unknown>;\n if (parsed.kind !== WORKSPACE_CONTEXT_KIND || parsed.version !== WORKSPACE_CONTEXT_VERSION) {\n throw new Error(`${WORKSPACE_CONTEXT_FILE} is not an HCM workspace context`);\n }\n return {\n kind: WORKSPACE_CONTEXT_KIND,\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: normalizeWorkspaceKey(stringRequired(parsed.workspaceKey, 'workspaceKey')),\n tenantId: stringOptional(parsed.tenantId),\n endpoint: stringOptional(parsed.endpoint),\n profile: stringOptional(parsed.profile),\n updatedAt: stringOptional(parsed.updatedAt) ?? new Date(0).toISOString(),\n };\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw e;\n }\n}\n\nasync function requireWorkspaceContext(rootDir: string): Promise<WorkspaceContext> {\n const context = await readWorkspaceContext(rootDir);\n if (!context) {\n throw new Error(\n `${WORKSPACE_CONTEXT_FILE} not found; run hcm workspace bind <workspaceKey> first`,\n );\n }\n return context;\n}\n\nasync function writeWorkspaceContext(rootDir: string, context: WorkspaceContext): Promise<void> {\n await fs.writeFile(\n path.join(rootDir, WORKSPACE_CONTEXT_FILE),\n JSON.stringify(context, null, 2) + '\\n',\n );\n}\n\nasync function writeTextFile(file: string, content: string, force: boolean): Promise<void> {\n try {\n await fs.access(file);\n if (!force) throw new Error(`${file} already exists; use --force to overwrite`);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') throw e;\n }\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content);\n}\n\nasync function readWorkspaceRawManifest(rootDir: string, context: WorkspaceContext): Promise<WorkspaceRawPullManifest> {\n try {\n const parsed = JSON.parse(\n await fs.readFile(path.join(rootDir, WORKSPACE_STATE_DIR, WORKSPACE_PULL_MANIFEST_FILE), 'utf-8'),\n ) as WorkspaceRawPullManifest;\n if (parsed.version !== WORKSPACE_CONTEXT_VERSION || parsed.workspaceKey !== context.workspaceKey) {\n throw new Error(`${WORKSPACE_PULL_MANIFEST_FILE} does not match workspace ${context.workspaceKey}`);\n }\n return parsed;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') throw e;\n return {\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: context.workspaceKey,\n profile: context.profile,\n pulledAt: new Date(0).toISOString(),\n files: [],\n };\n }\n}\n\nasync function writeWorkspaceRawState(\n rootDir: string,\n context: WorkspaceContext,\n files: WorkspaceRawLocalFile[],\n remoteByLocalPath: Map<string, WorkspaceFileItem>,\n): Promise<void> {\n const stateDir = path.join(rootDir, WORKSPACE_STATE_DIR);\n await fs.mkdir(stateDir, { recursive: true });\n const snapshots = files.map((file): WorkspaceRawFileSnapshot => ({\n localPath: file.localPath,\n remotePath: file.localPath,\n fileId: remoteByLocalPath.get(file.localPath)?.id,\n sha256: file.sha256,\n size: file.size,\n lastModified: remoteByLocalPath.get(file.localPath)?.lastModified,\n }));\n await fs.writeFile(\n path.join(stateDir, WORKSPACE_PULL_MANIFEST_FILE),\n JSON.stringify(\n {\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: context.workspaceKey,\n profile: context.profile,\n pulledAt: new Date().toISOString(),\n files: snapshots,\n } satisfies WorkspaceRawPullManifest,\n null,\n 2,\n ) + '\\n',\n 'utf-8',\n );\n}\n\nasync function readWorkspaceRawLocalFiles(rootDir: string): Promise<WorkspaceRawLocalFile[]> {\n const files: WorkspaceRawLocalFile[] = [];\n await walkWorkspaceRawFiles(rootDir, '', files);\n files.sort((a, b) => a.localPath.localeCompare(b.localPath));\n return files;\n}\n\nasync function walkWorkspaceRawFiles(\n rootDir: string,\n relativeDir: string,\n files: WorkspaceRawLocalFile[],\n): Promise<void> {\n const absoluteDir = path.join(rootDir, relativeDir);\n let entries;\n try {\n entries = await fs.readdir(absoluteDir, { withFileTypes: true });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw e;\n }\n for (const entry of entries) {\n if (entry.isDirectory() && RAW_WORKSPACE_EXCLUDED_DIRS.has(entry.name)) continue;\n if (entry.isFile() && RAW_WORKSPACE_EXCLUDED_FILES.has(entry.name)) continue;\n const localPath = normalizeRelativePath(path.posix.join(toPosix(relativeDir), entry.name));\n const absolutePath = path.join(rootDir, localPath);\n if (entry.isDirectory()) {\n await walkWorkspaceRawFiles(rootDir, localPath, files);\n continue;\n }\n if (!entry.isFile()) continue;\n const content = await fs.readFile(absolutePath, 'utf-8');\n files.push({\n localPath,\n absolutePath,\n content,\n sha256: sha256(content),\n size: Buffer.byteLength(content, 'utf-8'),\n });\n }\n}\n\nasync function getWorkspaceRawStatus(\n rootDir: string,\n context: WorkspaceContext,\n): Promise<MiniStatusEntry[]> {\n const manifest = await readWorkspaceRawManifest(rootDir, context);\n return computeWorkspaceRawStatus(manifest, await readWorkspaceRawLocalFiles(rootDir));\n}\n\nasync function pushWorkspaceRawFiles(args: {\n http: ReturnType<HcmClient['raw']>;\n rootDir: string;\n context: WorkspaceContext;\n dryRun: boolean;\n}): Promise<WorkspaceRawPushResult> {\n const manifest = await readWorkspaceRawManifest(args.rootDir, args.context);\n const localFiles = await readWorkspaceRawLocalFiles(args.rootDir);\n const remoteFiles = await loadWorkspaceRawRemoteFiles(args.http, args.context.workspaceKey);\n const plan = buildWorkspaceRawPushPlan(manifest, localFiles, remoteFiles);\n const result: WorkspaceRawPushResult = {\n workspaceKey: args.context.workspaceKey,\n dryRun: args.dryRun,\n operations: plan.operations,\n conflicts: plan.conflicts,\n };\n if (args.dryRun || plan.conflicts.length) return result;\n\n const localByPath = new Map(localFiles.map((file) => [file.localPath, file] as const));\n for (const operation of plan.operations) {\n if (operation.operation === 'skip') continue;\n if (operation.operation === 'delete') {\n if (operation.fileId) await deleteWorkspaceFile(args.http, operation.fileId);\n continue;\n }\n const localFile = localByPath.get(operation.localPath);\n if (!localFile) continue;\n if (operation.operation === 'create') {\n await createWorkspaceFile(\n args.http,\n args.context.workspaceKey,\n operation.remotePath,\n localFile.content,\n );\n continue;\n }\n if (operation.operation === 'update' && operation.fileId) {\n await saveWorkspaceFileContent(args.http, operation.fileId, localFile.content);\n }\n }\n\n const latestRemoteFiles = await loadWorkspaceRawRemoteFiles(args.http, args.context.workspaceKey);\n const latestRemoteByLocalPath = new Map(latestRemoteFiles.map((file) => [file.item.relativePath, file.item] as const));\n await writeWorkspaceRawState(args.rootDir, args.context, localFiles, latestRemoteByLocalPath);\n return result;\n}\n\nasync function loadWorkspaceRawRemoteFiles(\n http: ReturnType<HcmClient['raw']>,\n workspaceKey: string,\n): Promise<Array<{ item: WorkspaceFileItem; content: string }>> {\n const list = await listWorkspaceFiles(http, workspaceKey, { pageSize: 5000 });\n const result: Array<{ item: WorkspaceFileItem; content: string }> = [];\n for (const item of list.data) {\n if (isDirectoryMarker(item.relativePath) || isMiniAppPath(item.relativePath)) continue;\n const content = await loadWorkspaceFileContent(http, item.id);\n result.push({ item, content: content.content });\n }\n return result;\n}\n\nfunction buildWorkspaceRawPushPlan(\n manifest: WorkspaceRawPullManifest,\n localFiles: WorkspaceRawLocalFile[],\n remoteFiles: Array<{ item: WorkspaceFileItem; content: string }>,\n): { operations: MiniPushPlanItem[]; conflicts: MiniPushConflict[] } {\n const status = computeWorkspaceRawStatus(manifest, localFiles);\n const baseByLocal = new Map(manifest.files.map((file) => [file.localPath, file] as const));\n const remoteByLocal = new Map(remoteFiles.map((file) => [file.item.relativePath, file] as const));\n const operations: MiniPushPlanItem[] = [];\n const conflicts: MiniPushConflict[] = [];\n for (const entry of status) {\n const remote = remoteByLocal.get(entry.localPath);\n const base = baseByLocal.get(entry.localPath);\n const remoteSha = remote ? sha256(remote.content) : undefined;\n if (entry.status === 'added') {\n if (remote) {\n conflicts.push(workspaceRawConflict(entry, 'remote file already exists but was not in local snapshot'));\n } else {\n operations.push({ operation: 'create', localPath: entry.localPath, remotePath: entry.remotePath });\n }\n continue;\n }\n if (entry.status === 'modified') {\n if (!remote) {\n conflicts.push(workspaceRawConflict(entry, 'remote file was deleted after last pull'));\n } else if (base && remoteSha !== base.sha256) {\n conflicts.push(workspaceRawConflict(entry, 'remote file changed after last pull'));\n } else {\n operations.push({\n operation: 'update',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n fileId: remote.item.id,\n });\n }\n continue;\n }\n if (entry.status === 'deleted') {\n if (!remote) {\n operations.push({\n operation: 'skip',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n reason: 'already deleted remotely',\n });\n } else if (base && remoteSha !== base.sha256) {\n conflicts.push(workspaceRawConflict(entry, 'remote file changed after last pull'));\n } else {\n operations.push({\n operation: 'delete',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n fileId: remote.item.id,\n });\n }\n continue;\n }\n operations.push({\n operation: 'skip',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n fileId: remote?.item.id,\n reason: 'unchanged',\n });\n }\n return { operations, conflicts };\n}\n\nfunction computeWorkspaceRawStatus(\n manifest: WorkspaceRawPullManifest,\n localFiles: WorkspaceRawLocalFile[],\n): MiniStatusEntry[] {\n const baseByLocal = new Map(manifest.files.map((file) => [file.localPath, file] as const));\n const localByPath = new Map(localFiles.map((file) => [file.localPath, file] as const));\n const paths = [...new Set([...baseByLocal.keys(), ...localByPath.keys()])].sort();\n return paths.map((localPath) => {\n const base = baseByLocal.get(localPath);\n const local = localByPath.get(localPath);\n const remotePath = base?.remotePath ?? localPath;\n if (!base && local) {\n return { localPath, remotePath, status: 'added', sha256: local.sha256 };\n }\n if (base && !local) {\n return {\n localPath,\n remotePath,\n status: 'deleted',\n fileId: base.fileId,\n baseSha256: base.sha256,\n };\n }\n if (base && local && base.sha256 !== local.sha256) {\n return {\n localPath,\n remotePath,\n status: 'modified',\n fileId: base.fileId,\n sha256: local.sha256,\n baseSha256: base.sha256,\n };\n }\n return {\n localPath,\n remotePath,\n status: 'unchanged',\n fileId: base?.fileId,\n sha256: local?.sha256,\n baseSha256: base?.sha256,\n };\n });\n}\n\nfunction workspaceRawConflict(entry: MiniStatusEntry, reason: string): MiniPushConflict {\n return {\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n reason,\n };\n}\n\nasync function discoverMiniApps(rootDir: string): Promise<MiniAppDir[]> {\n const appsRoot = path.join(rootDir, MINI_APPS_DIR);\n let entries;\n try {\n entries = await fs.readdir(appsRoot, { withFileTypes: true });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw e;\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({ appCode: entry.name, dir: path.join(appsRoot, entry.name) }))\n .sort((a, b) => a.appCode.localeCompare(b.appCode));\n}\n\nfunction detectRemoteMiniApps(files: WorkspaceFileItem[]): string[] {\n const appCodes = new Set<string>();\n for (const file of files) {\n const match = /^mini_apps\\/([^/]+)\\//.exec(file.relativePath);\n if (match?.[1]) appCodes.add(match[1]);\n }\n return Array.from(appCodes).sort();\n}\n\nfunction isMiniAppPath(relativePath: string): boolean {\n return relativePath === MINI_APPS_DIR || relativePath.startsWith(`${MINI_APPS_DIR}/`);\n}\n\nfunction isDirectoryMarker(relativePath: string): boolean {\n return relativePath.endsWith('/');\n}\n\nasync function readMiniStatusSafely(app: MiniAppDir) {\n try {\n return await getMiniStatus(app.dir);\n } catch {\n return [];\n }\n}\n\n/**\n * Tolerant variant of `getActiveAuthContextFromCli` + `HcmClient.fromAuthContext`:\n * returns `null` (instead of throwing) when no env/identity is configured,\n * so workspace bind / add mini / verify can still run partially without auth.\n *\n * If the caller explicitly passed an env (`--env` or legacy `--profile`) and\n * resolution fails, we still throw — the user asked for that env, so silent\n * fallback would be wrong.\n */\nasync function loadProfileClient(\n args: CommonAuthArgs,\n): Promise<HcmClient | null> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n return HcmClient.fromAuthContext(ctx);\n } catch (e) {\n if (args.env || args.profile) throw e;\n return null;\n }\n}\n\nasync function loadSmokeAccessToken(\n client: HcmClient | null,\n args: CommonAuthArgs,\n): Promise<string | null> {\n try {\n const smokeClient = client ?? (await loadProfileClient(args));\n return smokeClient ? smokeClient.getAccessToken() : null;\n } catch {\n return null;\n }\n}\n\nasync function resolveWritableAutoOptions(args: {\n client: HcmClient | null;\n templateKind: MiniTemplateKind;\n model?: string;\n fields?: string;\n defaults?: string;\n}): Promise<{\n fields?: string[];\n defaults?: Record<string, unknown>;\n todayDefaultFields?: string[];\n}> {\n if (args.templateKind !== 'writable-workbench') return {};\n const explicitAutoFields = isAuto(args.fields);\n const explicitAutoDefaults = isAuto(args.defaults);\n const shouldInferFields = explicitAutoFields || (!!args.model && args.fields === undefined);\n const shouldInferDefaults = explicitAutoDefaults || (!!args.model && args.defaults === undefined);\n if (!shouldInferFields && !shouldInferDefaults) return {};\n if (!args.client) {\n if (explicitAutoFields || explicitAutoDefaults) {\n throw new Error('--fields auto and --defaults auto require a configured HCM profile');\n }\n return {};\n }\n const model = args.model ?? 'OrgUnit';\n const inferred = inferMiniWritableTemplateOptionsFromModel(await args.client.describe(model));\n return {\n fields: shouldInferFields ? inferred.fields : undefined,\n defaults: shouldInferDefaults ? inferred.defaults : undefined,\n todayDefaultFields: shouldInferDefaults ? inferred.todayDefaultFields : undefined,\n };\n}\n\nfunction parseTemplateKind(value?: string): MiniTemplateKind {\n const templateKind = (value || 'dashboard').trim();\n if (templateKind !== 'dashboard' && templateKind !== 'multi-page' && templateKind !== 'writable-workbench') {\n throw new Error(`unsupported mini template: ${value}`);\n }\n return templateKind;\n}\n\nfunction parseSurface(value: string | undefined): MiniSurface {\n if (!value) return 'embedded';\n if (value === 'embedded' || value === 'standalone') return value;\n throw new Error('--surface must be embedded or standalone');\n}\n\nfunction parseScopes(value: string | undefined): string[] | undefined {\n return parseCsv(value);\n}\n\nfunction parseCsv(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n if (isAuto(value)) return undefined;\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction parseModelKey(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const model = value.trim();\n if (!/^[A-Z][A-Za-z0-9]*$/.test(model)) {\n throw new Error('--model must be a Model key, for example OrgUnit');\n }\n return model;\n}\n\nfunction parseJsonObject(\n value: string | undefined,\n flagName: string,\n): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (isAuto(value)) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new Error(`${flagName} must be valid JSON object`);\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(`${flagName} must be valid JSON object`);\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction validateWritableOptions(templateKind: MiniTemplateKind, args: WorkspaceAddMiniArgs): void {\n if (templateKind === 'writable-workbench') return;\n if (templateKind === 'multi-page') {\n if (args.fields || args.defaults) {\n throw new Error('--fields and --defaults are only supported with --template writable-workbench');\n }\n return;\n }\n if (args.model || args.fields || args.defaults) {\n throw new Error(\n '--model is only supported with --template multi-page or writable-workbench; --fields and --defaults are only supported with --template writable-workbench',\n );\n }\n}\n\nfunction isAuto(value: string | undefined): boolean {\n return value?.trim().toLowerCase() === 'auto';\n}\n\nfunction parsePositiveInt(value: string | number | undefined, fallback: number, flag: string): number {\n if (value === undefined || value === null || value === '') return fallback;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${flag} must be a positive integer`);\n }\n return parsed;\n}\n\nfunction filterPreviewTargets(targets: MiniPreviewTarget[], surface: string): MiniPreviewTarget[] {\n if (surface === 'all') return targets;\n if (surface === 'bare' || surface === 'standalone' || surface === 'embedded') {\n return targets.filter((item) => item.key === surface);\n }\n throw new Error('--surface must be all, bare, standalone or embedded');\n}\n\nfunction normalizeWorkspaceKey(value: string): string {\n const key = value.trim();\n if (!key) throw new Error('workspaceKey is required');\n return key;\n}\n\nfunction normalizeRelativePath(value: string): string {\n const normalized = toPosix(value).replace(/^\\/+/, '').replace(/\\/+/g, '/');\n if (!normalized || normalized === '.' || normalized.includes('\\0')) {\n throw new Error('path is empty');\n }\n for (const segment of normalized.split('/')) {\n if (!segment || segment === '.' || segment === '..') {\n throw new Error(`unsafe path segment: ${segment}`);\n }\n }\n return normalized;\n}\n\nfunction toPosix(value: string): string {\n return value.split(path.sep).join('/');\n}\n\nfunction sha256(content: string): string {\n return crypto.createHash('sha256').update(content, 'utf-8').digest('hex');\n}\n\nfunction stringRequired(value: unknown, field: string): string {\n if (typeof value === 'string' && value.trim()) return value;\n throw new Error(`${field} is required`);\n}\n\nfunction stringOptional(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n}\n\nfunction unwrapData(value: unknown): unknown {\n if (value && typeof value === 'object' && 'data' in value) {\n return (value as { data?: unknown }).data;\n }\n return value;\n}\n\nfunction optionalText(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n const text = String(value).trim();\n return text || undefined;\n}\n\nfunction writeWorkspaceListResult(\n rows: TenantExtensionWorkspaceRow[],\n format: OutputFormat,\n total?: number,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject({ rows, total }, { format }) + '\\n');\n return;\n }\n process.stdout.write(formatRows(toWorkspaceListRows(rows), { format: 'table' }) + '\\n');\n if (total !== undefined) {\n process.stdout.write(`Showing ${rows.length} of ${total} workspaces.\\n`);\n }\n}\n\nfunction writeWorkspaceActiveResult(view: WorkspaceActiveView, format: OutputFormat): void {\n if (format !== 'table') {\n process.stdout.write(formatObject(view, { format }) + '\\n');\n return;\n }\n const rows = [\n {\n activeWorkspaceKey: view.activeWorkspaceKey ?? '-',\n localWorkspaceKey: view.localWorkspaceKey ?? '-',\n matchesLocal:\n view.matchesLocal === null ? '-' : view.matchesLocal ? 'yes' : 'no',\n profile: view.profile,\n tenant: view.tenantId,\n endpoint: view.endpoint,\n dir: view.rootDir,\n },\n ];\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n}\n\nfunction writeWorkspaceBindResult(\n context: WorkspaceContext,\n rootDir: string,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject({ ...context, rootDir }, { format }) + '\\n');\n return;\n }\n process.stdout.write(\n [\n `workspace bound: ${context.workspaceKey}`,\n `directory: ${rootDir}`,\n `profile: ${context.profile ?? '-'}`,\n `tenant: ${context.tenantId ?? '-'}`,\n ].join('\\n') + '\\n',\n );\n}\n\nfunction writeWorkspaceCreateResult(\n result: {\n workspaceKey: string;\n id: string;\n rootDir: string;\n activated: boolean;\n profile: string;\n tenantId: string;\n },\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject(result, { format }) + '\\n');\n return;\n }\n process.stdout.write(\n [\n `workspace created: ${result.workspaceKey}`,\n `id: ${result.id}`,\n `directory: ${result.rootDir}`,\n `profile: ${result.profile}`,\n `tenant: ${result.tenantId}`,\n `activated: ${result.activated ? 'yes' : 'no'}`,\n ].join('\\n') + '\\n',\n );\n}\n\nfunction writeWorkspacePullResult(\n result: {\n workspaceKey: string;\n rootDir: string;\n totalRemoteFiles: number;\n miniApps: Array<{ appCode: string; files: number }>;\n rawFiles: string[];\n },\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject(result, { format }) + '\\n');\n return;\n }\n const lines = [\n `workspace pulled: ${result.workspaceKey}`,\n `directory: ${result.rootDir}`,\n `remote files: ${result.totalRemoteFiles}`,\n `mini apps: ${result.miniApps.length}`,\n `raw files: ${result.rawFiles.length}`,\n ];\n if (result.miniApps.length) {\n lines.push('mini artifacts:');\n for (const app of result.miniApps) lines.push(` - ${app.appCode}: ${app.files} files`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\nfunction writeWorkspaceAddMiniResult(\n result: { appCode: string; workspaceKey: string; targetDir: string; files: unknown[] },\n rootDir: string,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject({ ...result, workspaceRoot: rootDir }, { format }) + '\\n');\n return;\n }\n process.stdout.write(\n [\n `workspace artifact added: mini:${result.appCode}`,\n `workspace: ${result.workspaceKey}`,\n `workspace root: ${rootDir}`,\n `directory: ${result.targetDir}`,\n `files: ${result.files.length}`,\n ].join('\\n') + '\\n',\n );\n}\n\nfunction writeWorkspaceValidateResult(\n results: Array<{ app: MiniAppDir; result: MiniValidationResult }>,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(\n formatObject(\n results.map((item) => ({ artifact: `mini:${item.app.appCode}`, ...item.result })),\n { format },\n ) + '\\n',\n );\n return;\n }\n const rows = results.map((item) => ({\n artifact: `mini:${item.app.appCode}`,\n valid: item.result.valid ? 'yes' : 'no',\n errors: item.result.errors.length,\n warnings: item.result.warnings.length,\n }));\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n for (const item of results) {\n if (!item.result.errors.length && !item.result.warnings.length) continue;\n process.stdout.write(`\\nmini:${item.app.appCode}\\n`);\n for (const error of item.result.errors) process.stdout.write(` error: ${error}\\n`);\n for (const warning of item.result.warnings) process.stdout.write(` warning: ${warning}\\n`);\n }\n}\n\nfunction writeWorkspacePushResult(\n rawResult: WorkspaceRawPushResult,\n results: Array<{ app: MiniAppDir; result: MiniPushResult }>,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(\n formatObject(\n {\n workspaceFiles: { artifact: 'workspace', ...rawResult },\n miniApps: results.map((item) => ({ artifact: `mini:${item.app.appCode}`, ...item.result })),\n },\n { format },\n ) + '\\n',\n );\n return;\n }\n const rawConflicts = rawResult.conflicts.map((conflict) => ({\n artifact: 'workspace',\n file: conflict.localPath,\n remote: conflict.remotePath,\n reason: conflict.reason,\n }));\n const miniConflicts = results.flatMap((item) =>\n item.result.conflicts.map((conflict) => ({\n artifact: `mini:${item.app.appCode}`,\n file: conflict.localPath,\n remote: conflict.remotePath,\n reason: conflict.reason,\n })),\n );\n const conflicts = [...rawConflicts, ...miniConflicts];\n if (conflicts.length) {\n process.stdout.write('conflicts:\\n' + formatRows(conflicts, { format: 'table' }) + '\\n');\n return;\n }\n const rawOperations = rawResult.operations.map((operation) => ({\n artifact: 'workspace',\n op: operation.operation,\n file: operation.localPath,\n remote: operation.remotePath,\n reason: operation.reason ?? '',\n }));\n const miniOperations = results.flatMap((item) =>\n item.result.operations.map((operation) => ({\n artifact: `mini:${item.app.appCode}`,\n op: operation.operation,\n file: operation.localPath,\n remote: operation.remotePath,\n reason: operation.reason ?? '',\n })),\n );\n const operations = [...rawOperations, ...miniOperations];\n process.stdout.write(formatRows(operations, { format: 'table' }) + '\\n');\n if (rawResult.dryRun || results.some((item) => item.result.dryRun)) {\n process.stdout.write('dry-run: no remote changes were written\\n');\n }\n}\n\nfunction writeWorkspaceVerifyResult(\n context: WorkspaceContext,\n rootDir: string,\n raw: {\n status: MiniStatusEntry[];\n plan: WorkspaceRawPushResult | null;\n planSkipped?: string;\n },\n reports: WorkspaceMiniVerifyItem[],\n format: OutputFormat,\n): void {\n const rawOk = !!raw.plan && raw.plan.conflicts.length === 0;\n const ok = rawOk && reports.every((item) => item.report.ok);\n if (format === 'json') {\n process.stdout.write(\n formatObject(\n {\n ok,\n workspaceKey: context.workspaceKey,\n rootDir,\n workspaceFiles: {\n ok: rawOk,\n status: summarizeStatus(raw.status),\n plan: raw.plan\n ? {\n operations: raw.plan.operations,\n conflicts: raw.plan.conflicts,\n }\n : null,\n planSkipped: raw.planSkipped,\n },\n miniApps: reports.map((item) => ({\n appCode: item.appCode,\n dir: item.dir,\n ...item.agentReport,\n })),\n },\n { format },\n ) + '\\n',\n );\n return;\n }\n if (format !== 'table') {\n process.stdout.write(\n formatObject(\n {\n ok,\n workspaceKey: context.workspaceKey,\n rootDir,\n workspaceFiles: raw,\n miniApps: reports,\n },\n { format },\n ) + '\\n',\n );\n return;\n }\n const lines = [\n `workspace verify: ${ok ? 'OK' : 'FAIL'}`,\n `workspace: ${context.workspaceKey}`,\n `directory: ${rootDir}`,\n `workspace files: ${raw.status.length}`,\n `mini apps: ${reports.length}`,\n ];\n lines.push('', 'workspace files');\n if (raw.planSkipped) {\n lines.push(` dry-run skipped: ${raw.planSkipped}`);\n } else if (raw.plan) {\n lines.push(\n ` status: ${formatStatusSummary(summarizeStatus(raw.status))}`,\n ` dry-run: ${raw.plan.conflicts.length ? 'CONFLICT' : 'OK'} (${raw.plan.operations.length} operations)`,\n );\n for (const conflict of raw.plan.conflicts) {\n lines.push(` conflict: ${conflict.localPath} -> ${conflict.reason}`);\n }\n }\n for (const item of reports) {\n lines.push('', `mini:${item.appCode}`, formatMiniVerifyReport(item.report));\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\nfunction summarizeStatus(status: MiniStatusEntry[]): Record<MiniStatusEntry['status'], number> {\n return status.reduce(\n (acc, item) => {\n acc[item.status] += 1;\n return acc;\n },\n { added: 0, modified: 0, deleted: 0, unchanged: 0 },\n );\n}\n\nfunction formatStatusSummary(summary: Record<MiniStatusEntry['status'], number>): string {\n return `added=${summary.added}, modified=${summary.modified}, deleted=${summary.deleted}, unchanged=${summary.unchanged}`;\n}\n\nfunction exitWorkspaceError(err: unknown, profile?: string): never {\n const maybeAxios = err as { isAxiosError?: boolean };\n if (maybeAxios?.isAxiosError) {\n exitWithError(fromAxiosError(err, profile));\n }\n exitWithError(err);\n}\n","export interface TenantExtensionWorkspaceRow {\n workspaceKey?: unknown;\n description?: unknown;\n ownerUserName?: unknown;\n sharedUsers?: unknown;\n filesCount?: unknown;\n myLockCount?: unknown;\n devModeEnabled?: unknown;\n updateTime?: unknown;\n}\n\nexport interface WorkspaceListRow {\n [key: string]: unknown;\n current: string;\n workspaceKey: string;\n description: string;\n owner: string;\n files: string;\n locks: string;\n updatedAt: string;\n}\n\nexport function toWorkspaceListRows(rows: TenantExtensionWorkspaceRow[]): WorkspaceListRow[] {\n return rows.map((row) => ({\n current: boolValue(row.devModeEnabled) ? '*' : '',\n workspaceKey: stringValue(row.workspaceKey) ?? '-',\n description: stringValue(row.description) ?? '',\n owner: stringValue(row.ownerUserName) ?? '-',\n files: numberValue(row.filesCount),\n locks: numberValue(row.myLockCount),\n updatedAt: stringValue(row.updateTime) ?? '-',\n }));\n}\n\nfunction stringValue(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n const text = String(value).trim();\n return text || undefined;\n}\n\nfunction numberValue(value: unknown): string {\n if (typeof value === 'number') return String(value);\n if (typeof value === 'string' && value.trim()) return value.trim();\n return '0';\n}\n\nfunction boolValue(value: unknown): boolean {\n return value === true || value === 'true';\n}\n","import {\n loadEnv,\n saveEnv,\n loadIdentity,\n listIdentities,\n deleteIdentity,\n loadGlobalConfig,\n TokenStore,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitOk, exitWithError } from '../utils/exit';\n\nexport async function identityList(args: { env?: string }): Promise<void> {\n try {\n const g = await loadGlobalConfig();\n const filter = args.env === 'all' ? undefined : (args.env ?? g.activeEnv);\n const names = await listIdentities(filter);\n if (names.length === 0) {\n exitOk('(no identities)');\n return;\n }\n const lines: string[] = [];\n for (const n of names) {\n const meta = await loadIdentity(n);\n const env = await loadEnv(meta.env).catch(() => null);\n const isDefault = env?.defaultIdentity === n ? '*' : ' ';\n const expired = meta.expiresAt && new Date(meta.expiresAt) < new Date() ? ' (expired)' : '';\n lines.push(`${isDefault} ${n} scheme=${meta.scheme} env=${meta.env}${expired}`);\n }\n exitOk(lines.join('\\n'));\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function identityUse(name: string): Promise<void> {\n try {\n const meta = await loadIdentity(name); // throws IDENTITY_NOT_FOUND on missing\n // Orphan identity: env was deleted but identity meta lingered. Remap\n // ENV_NOT_FOUND → IDENTITY_NOT_IN_ENV so the error code matches the user's\n // mental model (\"I'm using `identity use`, not `env use`\").\n const env = await loadEnv(meta.env).catch(() => {\n throw new CliError({\n code: CliErrorCode.IDENTITY_NOT_IN_ENV,\n message: `identity '${name}' references env '${meta.env}' which no longer exists. Re-create the env, or remove this orphan: hcm identity remove ${name}`,\n });\n });\n env.defaultIdentity = name;\n await saveEnv(meta.env, env);\n exitOk(`✅ default identity for env '${meta.env}': ${name}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function identityRemove(name: string): Promise<void> {\n try {\n const meta = await loadIdentity(name);\n try {\n await TokenStore.forIdentity(name).clear();\n } catch (err) {\n process.stderr.write(\n `[hcm] event=identity_cleanup_failed identity=${name} reason=${JSON.stringify(String((err as Error).message))}\\n`,\n );\n }\n await deleteIdentity(name);\n // if this was the env's default, clear it\n const env = await loadEnv(meta.env).catch(() => null);\n if (env?.defaultIdentity === name) {\n env.defaultIdentity = undefined;\n await saveEnv(meta.env, env);\n }\n exitOk(`✅ identity '${name}' removed`);\n } catch (e) {\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n type ActionMeta,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport {\n assessDeliveryCommand,\n type DeliveryActionResolution,\n type DeliveryAssessment,\n} from './delivery';\n\nexport interface DeliveryActionRequest {\n model: string;\n action: string;\n httpMethod: string;\n scope: string;\n env?: string;\n identity?: string;\n profile?: string;\n}\n\nexport type ResolveDeliveryAction = (\n request: DeliveryActionRequest,\n) => Promise<DeliveryActionResolution>;\n\nexport interface EffectiveDeliveryAssessmentDependencies {\n resolveAction?: ResolveDeliveryAction;\n}\n\n/**\n * 仅 Action 需要读取 Core 的既有声明;其他命令继续使用纯本地评估。\n */\nexport async function assessEffectiveDeliveryCommand(\n inputArgv: string[],\n dependencies: EffectiveDeliveryAssessmentDependencies = {},\n): Promise<DeliveryAssessment> {\n const local = assessDeliveryCommand(inputArgv);\n if (local.reasonCode !== 'action-effect-unclassified') return local;\n\n const request = parseActionRequest(inputArgv);\n if ('status' in request) {\n return assessDeliveryCommand(inputArgv, { actionResolution: request });\n }\n\n const resolution = await (dependencies.resolveAction ?? resolveCoreAction)(request);\n return assessDeliveryCommand(inputArgv, { actionResolution: resolution });\n}\n\nexport async function deliveryAssessCommand(\n argv: string[],\n args: { output?: OutputFormat },\n): Promise<void> {\n const assessment = await assessEffectiveDeliveryCommand(argv);\n process.stdout.write(formatObject(assessment, { format: args.output ?? 'json' }) + '\\n');\n}\n\nasync function resolveCoreAction(request: DeliveryActionRequest): Promise<DeliveryActionResolution> {\n try {\n const auth = await getActiveAuthContextFromCli({\n env: request.env,\n as: request.identity,\n profile: request.profile,\n });\n const description = await HcmClient.fromAuthContext(auth).describe(request.model);\n const matches = description.actions.filter((action) => matchesRequest(action, request));\n if (matches.length === 0) {\n return failed(\n 'action-metadata-not-found',\n 'Core 元数据中没有与本次 method/scope 精确匹配的 Action,拒绝执行。',\n );\n }\n if (matches.length > 1) {\n return failed(\n 'action-metadata-ambiguous',\n 'Core 元数据存在多个与本次 method/scope 匹配的 Action,无法唯一判定,拒绝执行。',\n );\n }\n\n const action = matches[0]!;\n if (typeof action.readOnly !== 'boolean') {\n return failed(\n 'action-readonly-unclassified',\n 'Core 未返回 Action 的 readOnly 声明,按安全默认拒绝执行。',\n );\n }\n return {\n status: 'resolved',\n policy: {\n scope: action.scope!,\n httpMethod: action.httpMethod!.toUpperCase(),\n readOnly: action.readOnly,\n ...(action.source ? { source: action.source } : {}),\n },\n };\n } catch {\n return failed(\n 'action-metadata-unavailable',\n '无法读取 Core Action 元数据,按安全默认拒绝执行。',\n );\n }\n}\n\nfunction matchesRequest(action: ActionMeta, request: DeliveryActionRequest): boolean {\n return action.name === request.action\n && action.httpMethod?.toUpperCase() === request.httpMethod\n && action.scope?.toLowerCase() === request.scope;\n}\n\nfunction parseActionRequest(inputArgv: string[]): DeliveryActionRequest | DeliveryActionResolution {\n const argv = inputArgv[0] === '--' ? inputArgv.slice(1) : [...inputArgv];\n const spec = argv[1] ?? '';\n const separator = spec.indexOf('.');\n if (separator <= 0 || separator === spec.length - 1) {\n return failed('invalid-action-spec', 'Action 必须使用 <Model>.<Action> 格式。');\n }\n\n const httpMethod = (flagValue(argv, '--method') ?? 'POST').toUpperCase();\n if (!['GET', 'POST', 'PUT', 'DELETE'].includes(httpMethod)) {\n return failed('invalid-action-method', 'Action method 必须是 GET、POST、PUT 或 DELETE。');\n }\n const explicitScope = flagValue(argv, '--scope');\n const scope = explicitScope ?? (flagValue(argv, '--id') ? 'object' : 'class');\n if (scope !== 'class' && scope !== 'object') {\n return failed('invalid-action-scope', 'Action scope 必须是 class 或 object。');\n }\n\n return {\n model: spec.slice(0, separator),\n action: spec.slice(separator + 1),\n httpMethod,\n scope,\n env: flagValue(argv, '--env'),\n identity: flagValue(argv, '--as'),\n profile: flagValue(argv, '--profile'),\n };\n}\n\nfunction failed(reasonCode: string, reason: string): DeliveryActionResolution {\n return { status: 'failed', reasonCode, reason };\n}\n\nfunction flagValue(argv: string[], flag: string): string | undefined {\n const equals = argv.find((arg) => arg.startsWith(`${flag}=`));\n if (equals) return equals.slice(flag.length + 1);\n const index = argv.indexOf(flag);\n return index >= 0 ? argv[index + 1] : undefined;\n}\n","import { createHash } from 'node:crypto';\n\nexport type DeliveryRisk = 'R0' | 'R1' | 'R2' | 'R3';\nexport type DeliveryExecution = 'direct' | 'guarded' | 'forbidden';\nexport type DeliveryModeDecision = 'allow' | 'deny';\n\nexport interface DeliveryAssessment {\n schemaVersion: 1;\n contractVersion: '2026-08-29';\n assessmentId: string;\n commandSha256: string;\n command: {\n name: string;\n subcommand?: string;\n };\n risk: DeliveryRisk;\n execution: DeliveryExecution;\n guardedExecutionAvailable: boolean;\n effect: string;\n reasonCode: string;\n reason: string;\n environment: {\n envAlias?: string;\n identityAlias?: string;\n };\n target: Record<string, unknown>;\n requirements: string[];\n evidenceRequirements: string[];\n sensitiveFlags: string[];\n modePolicy: {\n planOnly: DeliveryModeDecision;\n controlled: DeliveryModeDecision;\n };\n}\n\ninterface Classification {\n risk: DeliveryRisk;\n execution: DeliveryExecution;\n effect: string;\n reasonCode: string;\n reason: string;\n}\n\nexport interface DeliveryActionPolicy {\n scope: string;\n httpMethod: string;\n readOnly: boolean;\n source?: string;\n}\n\nexport type DeliveryActionResolution =\n | { status: 'resolved'; policy: DeliveryActionPolicy }\n | { status: 'failed'; reasonCode: string; reason: string };\n\nexport interface DeliveryAssessmentOptions {\n actionResolution?: DeliveryActionResolution;\n}\n\nconst APPROVAL_BYPASS_FLAGS = new Set(['-y', '--yes', '--force', '--auto-approve']);\nconst CREDENTIAL_FLAGS = new Set([\n '--password',\n '--password-stdin',\n '--client-secret',\n '--pat',\n '--pat-stdin',\n '--new-password',\n '--new-password-stdin',\n]);\nconst PAYLOAD_FLAGS = ['--data', '--params'];\nconst GUARDED_EXECUTOR_REASON_CODES = new Set([\n 'record-create',\n 'record-update',\n 'cache-mutation',\n 'setting-write',\n 'credential-reset',\n 'action-write',\n]);\n\n/**\n * 对一次结构化 HCM argv 做纯本地风险评估。\n *\n * 调用方必须传子命令本身,不传 `hcm` 或稳定入口;例如:\n * `['create', 'Employee', '--data', '{...}', '--env', 'prod', '--as', 'consultant']`。\n */\nexport function assessDeliveryCommand(\n inputArgv: string[],\n options: DeliveryAssessmentOptions = {},\n): DeliveryAssessment {\n const argv = inputArgv[0] === '--' ? inputArgv.slice(1) : [...inputArgv];\n const commandSha256 = sha256(JSON.stringify(argv));\n const name = argv[0] ?? '';\n const subcommand = argv[1] && !argv[1].startsWith('-') ? argv[1] : undefined;\n const envAlias = flagValue(argv, '--env');\n const identityAlias = flagValue(argv, '--as');\n const sensitiveFlags = [\n ...new Set([...PAYLOAD_FLAGS, ...CREDENTIAL_FLAGS].filter((flag) => hasFlag(argv, flag))),\n ];\n const target = summarizeTarget(argv, options.actionResolution);\n\n let classification = classify(argv, options.actionResolution);\n const invalidPayload = payloadError(argv);\n if (invalidPayload) {\n classification = forbidden('invalid-input', 'JSON payload 无效,不能进入任何执行路径。');\n }\n\n const requirements: string[] = [];\n const guardedExecutionAvailable =\n classification.risk === 'R2' && GUARDED_EXECUTOR_REASON_CODES.has(classification.reasonCode);\n if (classification.risk === 'R2') {\n if (!envAlias) requirements.push('explicit-env');\n if (!identityAlias) requirements.push('explicit-identity');\n if (guardedExecutionAvailable) {\n requirements.push('change-plan', 'rollback-plan', 'human-approval', 'single-use-plan');\n } else {\n requirements.push('guarded-executor');\n }\n } else if (classification.risk === 'R3') {\n requirements.push('governance-escalation');\n }\n\n const allowed = classification.risk === 'R0' || classification.risk === 'R1';\n return {\n schemaVersion: 1,\n contractVersion: '2026-08-29',\n assessmentId: sha256(`2026-08-29\\n${commandSha256}`).slice(0, 24),\n commandSha256,\n command: { name: name || '(empty)', ...(subcommand ? { subcommand } : {}) },\n ...classification,\n guardedExecutionAvailable,\n environment: {\n ...(envAlias ? { envAlias } : {}),\n ...(identityAlias ? { identityAlias } : {}),\n },\n target,\n requirements,\n evidenceRequirements: evidenceFor(classification.risk),\n sensitiveFlags,\n modePolicy: {\n planOnly: allowed ? 'allow' : 'deny',\n controlled: allowed || guardedExecutionAvailable ? 'allow' : 'deny',\n },\n };\n}\n\nfunction classify(\n argv: string[],\n actionResolution?: DeliveryActionResolution,\n): Classification {\n const name = argv[0] ?? '';\n const subcommand = argv[1] ?? '';\n\n if (argv.some((arg) => APPROVAL_BYPASS_FLAGS.has(flagName(arg)))) {\n return forbidden('approval-bypass', '命令包含跳过确认的旗标,顾问交付面不执行。');\n }\n if (name === 'user' && subcommand === 'reset-password') {\n const nonStdinCredential = argv.some((arg) => {\n const flag = flagName(arg);\n return CREDENTIAL_FLAGS.has(flag) && flag !== '--password-stdin';\n });\n if (nonStdinCredential || !argv.includes('--password-stdin')) {\n return forbidden(\n 'credential-governance',\n '用户密码重置只能通过 --password-stdin 进入受控凭据流程。',\n );\n }\n return guarded('credential-write', 'credential-reset');\n }\n if (argv.some((arg) => CREDENTIAL_FLAGS.has(flagName(arg)))) {\n return forbidden('credential-governance', '命令携带身份凭据参数,必须转交身份治理流程。');\n }\n\n if (name === 'version') return direct('R0', 'product-discovery', 'product-discovery');\n if (name === 'delivery' && subcommand === 'assess') {\n return direct('R0', 'local-discovery', 'risk-assessment');\n }\n\n if (name === 'skills') {\n if (subcommand === 'list' || subcommand === 'show') {\n return direct('R0', 'product-discovery', 'skill-discovery');\n }\n if (subcommand === 'sync' || subcommand === 'install') {\n return direct('R1', 'managed-local-write', 'skill-managed-write');\n }\n return forbidden('unknown-command', '未知 skills 子命令按最高风险关闭。');\n }\n\n if (name === 'env') {\n if (subcommand === 'list' || subcommand === 'current' || subcommand === 'show') {\n return direct('R0', 'local-discovery', 'environment-read');\n }\n return forbidden('identity-governance', '环境新增、切换、编辑或删除属于治理操作。');\n }\n\n if (name === 'identity') {\n if (subcommand === 'list') return direct('R0', 'local-discovery', 'identity-read');\n return forbidden('identity-governance', '身份切换或删除属于治理操作。');\n }\n\n if (name === 'query' || name === 'describe' || name === 'trace') {\n return direct('R1', 'remote-read', 'business-read');\n }\n\n if (name === 'cache') {\n if (subcommand === 'stats') return direct('R1', 'remote-read', 'cache-read');\n if (subcommand === 'clear' || subcommand === 'clear-meta') {\n return guarded('operational-write', 'cache-mutation');\n }\n }\n\n if (name === 'meta') {\n if (subcommand === 'list' || subcommand === 'get') {\n return direct('R1', 'remote-read', 'metadata-read');\n }\n if (subcommand === 'set' && hasFlag(argv, '--dry-run')) {\n return direct('R1', 'local-validation', 'metadata-dry-run');\n }\n if (subcommand === 'set') return guarded('tenant-config-write', 'metadata-write');\n if (subcommand === 'delete') return forbidden('destructive', '元数据删除不可由顾问插件执行。');\n }\n\n if (name === 'setting') {\n if (subcommand === 'get') return direct('R1', 'remote-read', 'setting-read');\n if (subcommand === 'set' && hasFlag(argv, '--dry-run')) {\n return direct('R1', 'local-validation', 'setting-dry-run');\n }\n if (subcommand === 'set' || subcommand === 'reset') {\n return guarded('tenant-config-write', 'setting-write');\n }\n }\n\n if (name === 'workspace') {\n if (subcommand === 'push' && hasFlag(argv, '--dry-run')) {\n return direct('R1', 'remote-read', 'workspace-push-dry-run');\n }\n if (['list', 'active', 'status', 'validate', 'verify', 'preview'].includes(subcommand)) {\n return direct('R1', 'remote-read', 'workspace-read');\n }\n if (subcommand === 'pull') {\n return direct('R1', 'managed-local-write', 'workspace-pull');\n }\n if (subcommand === 'bind' || (subcommand === 'add' && argv[2] === 'mini')) {\n return guarded('managed-local-write', 'workspace-local-change');\n }\n if (subcommand === 'create') return guarded('tenant-write', 'workspace-create');\n if (subcommand === 'push') return forbidden('publish', '开发空间发布属于 R3。');\n }\n\n if (name === 'import') {\n if (hasFlag(argv, '--dry-run')) {\n return direct('R1', 'local-validation', 'import-dry-run');\n }\n return guarded('bulk-tenant-write', 'import-write');\n }\n\n if (name === 'create' || name === 'update') {\n return guarded('tenant-write', name === 'create' ? 'record-create' : 'record-update');\n }\n\n if (name === 'upload') return guarded('tenant-write', 'document-upload');\n if (name === 'download') return direct('R1', 'managed-local-write', 'document-download');\n\n if (name === 'action') {\n if (actionResolution?.status === 'resolved') {\n return classifyAction(actionResolution.policy);\n }\n if (actionResolution?.status === 'failed') {\n return forbidden(actionResolution.reasonCode, actionResolution.reason);\n }\n return forbidden(\n 'action-effect-unclassified',\n '尚未读取 Core Action 风控声明,不能按名称猜测后放行。',\n );\n }\n if (name === 'delete' || (name === 'meta' && subcommand === 'delete')) {\n return forbidden('destructive', '删除操作不进入顾问插件执行面。');\n }\n if (name === 'tenant') {\n return forbidden('tenant-governance', '租户开通或治理必须升级治理人员。');\n }\n if (name === 'login' || name === 'logout') {\n return forbidden('identity-governance', '登录与登出属于身份治理操作。');\n }\n if (name === 'chat') {\n return forbidden('agent-autonomy', '顾问插件不通过嵌套数字员工对话扩大自治执行面。');\n }\n\n return forbidden('unknown-command', '未知命令按最高风险关闭。');\n}\n\nfunction summarizeTarget(\n argv: string[],\n actionResolution?: DeliveryActionResolution,\n): Record<string, unknown> {\n const name = argv[0] ?? '';\n const subcommand = argv[1] ?? '';\n const target: Record<string, unknown> = {};\n\n if (['query', 'describe', 'create', 'update', 'delete'].includes(name) && subcommand) {\n target.model = subcommand;\n }\n if (name === 'action' && subcommand) {\n target.action = subcommand;\n if (actionResolution?.status === 'resolved') {\n target.actionPolicy = { ...actionResolution.policy };\n }\n }\n if (name === 'skills' && argv[2] && !argv[2].startsWith('-')) target.skill = argv[2];\n if (name === 'meta' && argv[2] && !argv[2].startsWith('-')) target.path = argv[2];\n if (name === 'cache' && argv[2] && !argv[2].startsWith('-')) {\n target.cacheOperation = subcommand;\n target.model = argv[2];\n }\n if (name === 'setting' && argv[2] && !argv[2].startsWith('-')) {\n target.domain = argv[2];\n const settingKeys = valuesAfterFlag(argv, '--set')\n .map((assignment) => assignment.split('=', 1)[0])\n .filter((key): key is string => Boolean(key))\n .sort();\n if (settingKeys.length > 0) target.settingKeys = settingKeys;\n }\n\n const id = flagValue(argv, '--id');\n if (name === 'user' && subcommand === 'reset-password') {\n if (id) target.userIdSha256 = sha256(id);\n const username = flagValue(argv, '--username');\n if (username) target.usernameSha256 = sha256(username);\n target.forceChangeOnNextLogin = !hasFlag(argv, '--no-force-change');\n } else if (id) {\n target.recordIdSha256 = sha256(id);\n }\n\n for (const flag of PAYLOAD_FLAGS) {\n const raw = flagValue(argv, flag);\n if (!raw) continue;\n target.payloadSha256 = sha256(raw);\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (isPlainObject(parsed)) target.fieldNames = Object.keys(parsed).sort();\n } catch {\n // payloadError 会把最终结果升级为 R3;摘要仍可用于关联失败输入。\n }\n }\n return target;\n}\n\nfunction payloadError(argv: string[]): boolean {\n for (const flag of PAYLOAD_FLAGS) {\n const raw = flagValue(argv, flag);\n if (raw === undefined) continue;\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!isPlainObject(parsed)) return true;\n } catch {\n return true;\n }\n }\n return false;\n}\n\nfunction direct(risk: 'R0' | 'R1', effect: string, reasonCode: string): Classification {\n return {\n risk,\n execution: 'direct',\n effect,\n reasonCode,\n reason:\n risk === 'R0' ? '纯发现操作,可直接执行。' : '只读或受管本地操作,可直接执行并保留结果。',\n };\n}\n\nfunction guarded(effect: string, reasonCode: string): Classification {\n return {\n risk: 'R2',\n execution: 'guarded',\n effect,\n reasonCode,\n reason:\n '普通副作用操作;只允许在 controlled 项目中通过 delivery prepare + delivery execute 单次受控执行。',\n };\n}\n\n/**\n * Action 档位只由 Core 的 `readOnly` 声明决定,与 create/update 同一套档位。\n *\n * 🔴 不消费 `requiresConfirmation`:它对 CLI 不承载可用信息。Core 侧 DEFAULT 按\n * httpMethod 派生,只读的 POST Action(如 previewWidgetDataSources)派生出来同样是\n * `true`,必须被忽略;而它唯一区分得开的情形是「非只读但免确认」——那是 GET 派生或\n * 显式 SKIP,把这批 Action 放进免收据直执行属于扩大直执行面,与本次阻塞无关。\n */\nfunction classifyAction(policy: DeliveryActionPolicy): Classification {\n if (policy.readOnly) {\n return {\n risk: 'R1',\n execution: 'direct',\n effect: 'remote-read',\n reasonCode: 'action-read-only',\n reason: 'Core 声明该 Action 为只读,与 Moirai 的只读 Action 路径一致,可直接执行。',\n };\n }\n return guarded('tenant-write', 'action-write');\n}\n\nfunction forbidden(reasonCode: string, reason: string): Classification {\n return { risk: 'R3', execution: 'forbidden', effect: reasonCode, reasonCode, reason };\n}\n\nfunction evidenceFor(risk: DeliveryRisk): string[] {\n if (risk === 'R0') return ['command-digest', 'discovery-result'];\n if (risk === 'R1') return ['command-digest', 'target-aliases', 'result-summary'];\n if (risk === 'R2') {\n return [\n 'command-digest',\n 'explicit-target-aliases',\n 'pre-state-or-dry-run',\n 'rollback-plan',\n 'execution-receipt',\n 'post-verification',\n ];\n }\n return ['governance-decision'];\n}\n\nfunction flagValue(argv: string[], flag: string): string | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === undefined) continue;\n if (arg === flag) return argv[index + 1];\n if (arg.startsWith(`${flag}=`)) return arg.slice(flag.length + 1);\n }\n return undefined;\n}\n\nfunction hasFlag(argv: string[], flag: string): boolean {\n return argv.some((arg) => arg === flag || arg.startsWith(`${flag}=`));\n}\n\nfunction flagName(arg: string): string {\n const equals = arg.indexOf('=');\n return equals < 0 ? arg : arg.slice(0, equals);\n}\n\nfunction valuesAfterFlag(argv: string[], flag: string): string[] {\n const index = argv.indexOf(flag);\n if (index < 0) return [];\n const values: string[] = [];\n for (let cursor = index + 1; cursor < argv.length; cursor += 1) {\n const value = argv[cursor];\n if (value === undefined || value.startsWith('-')) break;\n values.push(value);\n }\n return values;\n}\n\nfunction sha256(value: string): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","/**\n * `hcm delivery doctor` —— 顾问到现场敲的第一条命令。\n *\n * 四条锚点:**我连上了吗 / 我是谁 / 我有没有 configAdmin / 我站在哪一层**。\n * 判据全在 `@hcmai/sdk` 的 `fde/doctor` 里,这一层只负责:\n * 解析身份上下文 → 用既有 axios 管道适配出侦察端口 → 渲染 → 定退出码。\n *\n * 🔴 **不在这里重写任何判据**。命令层多一处判断,就会与 core 里的那份漂移,\n * 而顾问看到的是命令层这一份。\n */\nimport {\n HcmClient,\n fetchReconIdentity,\n formatObject,\n fromAxiosError,\n httpProbe,\n runDoctor,\n type DoctorReport,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DeliveryDoctorArgs {\n env?: string;\n profile?: string;\n as?: string;\n output?: OutputFormat;\n capabilities?: string;\n}\n\n/** 与产品端默认一致的 capability 串;它是**爬法**属性,会随四元组落档。 */\nconst DEFAULT_CAPABILITIES = 'default';\n\nfunction render(report: DoctorReport): string {\n const lines: string[] = [];\n for (const c of report.checks) {\n // 🔴 四条锚点恒存在,逐条打——少打一条,顾问会以为那一层查过了。\n lines.push(`${c.ok ? '✅' : '❌'} ${c.anchor.padEnd(13)} ${c.detail}`);\n }\n lines.push('');\n lines.push(\n report.ok\n ? '四条锚点全绿:可以开始 recon。'\n : '有锚点没过——先按上面各条的下一步处理,不要在这个状态上爬基线。',\n );\n return lines.join('\\n');\n}\n\nexport async function deliveryDoctorCommand(args: DeliveryDoctorArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n // 🔴 复用既有管道(认证 / 刷新 / 拦截器),不另造一份 HTTP 客户端。\n const probe = httpProbe(client.raw(), args.capabilities ?? DEFAULT_CAPABILITIES);\n // `ctx.tenantId` 是**顾问要的**租户;token 实际归属的那个现打 /api/auth/info 拿。\n const identity = await fetchReconIdentity(probe, ctx.tenantId);\n const report = await runDoctor(probe, identity);\n\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(render(report) + '\\n');\n process.stdout.write(formatObject(report, { format: fmt }) + '\\n');\n // 🔴 有锚点没过 ⇒ 非零退出码:doctor 会被写进脚本里当前置闸,\n // 恒 0 会让「没过」在自动化里静默通过。\n process.exit(report.ok ? 0 : 1);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n }\n}\n","/**\n * `hcm delivery recon` —— 顾问在现场爬一份**可带走的**基线。\n *\n * 两个动作,性质完全不同,别混:\n * · `recon`(默认):**要联网**,把这个环境的模型 / 字段 / 只读闸 / 依赖图 / 码表 /\n * 可写性画像整套爬下来落盘;\n * · `recon round`:**零网络**,只读盘上已有的一份基线,回答「它是不是一轮完整跑出来的」。\n * 气隙机器上、或者刚被 Ctrl-C 打断之后,顾问手上就只有那几个文件 —— 被打断的那一轮\n * **不会打印任何摘要**,所以这个判断不能只活在摘要里。\n *\n * 🔴 **这一层不重写任何判据**。分档、措辞、边界全部照用 `@hcmai/sdk` 里的\n * `runRecon` / `inspectRound` / `renderRound`,命令层只做三件事:\n * 解析身份上下文 → 用既有 axios 管道适配出侦察端口 → 渲染与定退出码。\n * 命令层多一处判断,就会与 core 里的那份漂移,而顾问看到的是命令层这一份。\n */\nimport {\n HcmClient,\n ReconLayout,\n ROUND_EXIT_CODES,\n computeReconSourceKey,\n formatObject,\n fromAxiosError,\n httpProbe,\n inspectRound,\n renderRound,\n runRecon,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DeliveryReconArgs {\n env?: string;\n profile?: string;\n as?: string;\n out?: string;\n state?: string;\n model?: string;\n output?: OutputFormat;\n capabilities?: string;\n}\n\nexport interface DeliveryReconRoundArgs {\n dir?: string;\n output?: OutputFormat;\n}\n\n/**\n * ⚠️ **`round` 子命令不声明自己的 `--output`**,它读父命令 `recon` 上那一个。\n *\n * 🔴 这是实测出来的,不是设计偏好:commander 默认允许父命令的选项出现在子命令名**之后**,\n * 于是 `hcm delivery recon round --dir X --output table` 里那个 `table`\n * **落在父命令上**;子命令若也声明一个同名选项,拿到的永远是它自己的缺省 `json`。\n * 现场表现是:顾问照着产物 note 敲那条命令,**人话判读那一半根本不出来**,\n * 而退出码和 JSON 都正常 —— 一个不报错、只是少给你一半信息的静默缺陷(本刀真跑逮到)。\n *\n * ⇒ 两条路都不走:\n * · 子命令再声明一个 `--output`:它**永远赢不了**,是一处不会生效的装饰;\n * · 开 `enablePositionalOptions()`:那会改掉**整个 CLI** 的解析规则\n * (父命令选项从此必须写在子命令名之前),为一处收益动全局是本仓明令的反面。\n * ⇒ 只在父命令上声明一次,子命令读它。`round --help` 里看不到 `--output`,\n * 而这恰恰是**准确**的:那个选项确实属于 `recon`。\n */\n\n\n/** 与产品端默认一致的 capability 串;它是**爬法**属性,会随四元组落档。 */\nconst DEFAULT_CAPABILITIES = 'default';\n\nexport async function deliveryReconCommand(args: DeliveryReconArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n // 🔴 复用既有管道(认证 / 刷新 / 拦截器),不另造一份 HTTP 客户端。\n const probe = httpProbe(client.raw(), args.capabilities ?? DEFAULT_CAPABILITIES);\n\n // 🔴 产物目录按**爬取身份**分叉,而 sourceKey 从 **meta** 端点的响应头探\n // (不是 `/api/system/models`)。这里错一次的后果比 doctor 更重:**产物目录名**\n // 会恒为 `unknown-<摘要>`,两个站在不同层上的顾问于是写进同一个目录。\n // ⚠️ 判据整个在 `computeReconSourceKey()` 里(它内部从 `modelKeys()` 这**唯一一道门**\n // 取 key,dict 过滤 / 空串过滤 / 排序都在那儿)—— 命令层不许自己就地取。\n const sourceKey = await computeReconSourceKey(probe);\n const layout = new ReconLayout(args.out ?? '.', ctx.tenantId, sourceKey);\n\n const summary = await runRecon(probe, layout, {\n state: args.state ?? '',\n onlyModel: args.model ?? null,\n identity: ctx.tenantId ? { requestedTenantId: ctx.tenantId } : null,\n });\n\n process.stdout.write(formatObject(summary, { format: args.output ?? 'json' }) + '\\n');\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n }\n}\n\n/**\n * `hcm delivery recon round --dir <产物目录>` —— **零网络**,不读身份、不发请求。\n *\n * 🔴 参数是**产物目录本身**(`<out>/recon/<租户段>/<来源段>`),不是产物根:\n * 判读只需要那几个文件,多一层「在同一租户下选哪一份基线」的推断就多一处会错的地方,\n * 而顾问手上那份目录他自己看得见。产物里的 roundNote 教的也是这条。\n *\n * 🔴 **档位由 `inspectRound` 给**,这里只做「档位 → 退出码」一次查表,一个字都不重判。\n *\n * ⚠️ Python 侧那句「查不到就按 mixed 兜底」在这里**故意没有**:`ROUND_EXIT_CODES` 是\n * `Record<RoundState, number>`,档位取值域是全的 —— 兜底分支**永远走不到**(实测:\n * 把它改成按 complete 兜底,一条用例都不红,因为那一支根本执行不到)。\n * 而「以后多一档忘了配退出码」这件事由**类型**接住:往 `ROUND_STATES` 加一档,\n * `ROUND_EXIT_CODES` 的字面量当场编译不过 —— 比一个运行时兜底更早、更硬。\n * 留一条永不执行的兜底只会让人以为它在保护什么。\n */\nexport async function deliveryReconRoundCommand(args: DeliveryReconRoundArgs): Promise<void> {\n // 🔴 **先算出退出码,再退出** —— `process.exit()` 不放在 `try` 里面。\n // 生产上二者行为逐字相同(真 Node 里 `process.exit` 直接终止进程,不会被 catch 到),\n // 但把它留在 try 内会让这条命令**测不了**:用例要观测退出码只能把 `process.exit`\n // 换成抛异常,而那一抛会被下面这个 catch 接住、翻译成「出错了 ⇒ 1」——\n // 于是一条 complete 的基线在用例里表现为 rc=1(实测栽过一次)。\n // 判据能不能自证前提,取决于前提能不能被观测到;这里的形态就是为了让它能。\n let code: number;\n try {\n const result = inspectRound(args.dir ?? '.');\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(renderRound(result));\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n code = ROUND_EXIT_CODES[result.state];\n } catch (e) {\n exitWithError(e);\n code = 1;\n }\n process.exit(code);\n}\n","/**\n * `hcm delivery gate0` —— **成稿期**的闸:把环境事实挡在 skill 正文之外。\n *\n * 🔴 **零网络**:它只读已落盘的产物(recon 基线 + 顾问手写的映射工件 + 随包的协议事实\n * 登记册)与 skill 目录,一个字节都不发出去。门 0 判的是「环境事实有没有被写进 skill 正文」\n * —— 那件事在写下的**当时**就已经成立,不需要任何一次请求来确认。\n *\n * 🔴 rc 三档**不许合并**(取值由 `exitCode` 给,这一层一个字都不重判):\n * 0 无判红 / 1 有判红 / 2 前提不成立(产物缺失、某个 A 类子集为空、产物**部分**读不出、\n * naturalKey 无工件、登记册没立住、扫描面为空、有文件读不动、基线不是一轮跑出来的、\n * 有软链没扫到)。\n * 「查过且为空」与「根本没查」共用一个值,正是这条命令在治的病。\n *\n * 🔴 **有前提不成立也照打判红清单**:rc 是给脚本的闸,清单是给人的依据 ——\n * 只给一个 rc=2 会让人以为什么都没扫。\n *\n * ## 与 kit `hcmnx-kit gate0` 的两处入参差异(都是刻意的)\n *\n * 1. **`--recon` 指的是产物目录本身**,不是产物根 + 一套「同租户下选哪一份基线」的推断。\n * 与 `hcm delivery recon round --dir` 同一条纪律:多一层推断就多一处会错的地方,\n * 而顾问手上那份目录他自己看得见。\n * 2. **没有 `--facts`**:登记一条协议事实要附一个断行为的探针,而探针跑在 CLI 仓的 CI 里\n * —— 现场登记不了。理由与判词的出路都写在 `@hcmai/sdk` 的 `gate0/facts.ts` 里。\n */\nimport {\n baselineRoundPremise,\n checkPremise,\n CHANNELS,\n deriveAclass,\n exitCode as gate0ExitCode,\n formatObject,\n inspectRound,\n loadProtocolFacts,\n scan,\n type OutputFormat,\n type ScanResult,\n} from '@hcmai/sdk';\nimport * as path from 'node:path';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DeliveryGate0Args {\n skills?: string;\n recon?: string;\n mapping?: string;\n output?: OutputFormat;\n}\n\n/**\n * 判红清单的正文。**逐条点名通道与 token**。\n *\n * 🔴 扫描面**说得出是哪个目录**:只报一个「N 个文件」时,「扫的是我以为的那份 skill」\n * 是读的人自己脑补的 —— 而 `--skills` 指错一层(指到 `skills/` 而不是 `skills/<某一份>/`)\n * 照样扫得出文件、照样 rc=0。\n */\nexport function renderGate0(result: ScanResult, skillRoot?: string): string {\n const where = skillRoot ? `(${path.resolve(skillRoot)})` : '';\n const lines = [\n `扫描面${where}:${result.scanned.length} 个文件;判红 ${result.red.length} 条;` +\n `缺口放行 ${result.gaps.length} 条。`,\n ];\n for (const channel of CHANNELS) {\n const rows = result.channels[channel];\n // 🔴 空通道也印一行:「这条通道一条都没判红」与「本版没有这条通道」在屏幕上必须分得开\n // —— 后者读起来像「这一面查过了」。\n lines.push(` [${channel}] ${rows.length} 条`);\n for (const red of rows) lines.push(` - (${red.reason}) ${red.message}`);\n }\n // 🔴 缺口**逐条印出**:它们**不顶 rc**,但「查过、按缺口放行」与「压根没查」在屏幕上\n // 必须分得开 —— 只印一个条数,读的人无从知道放行了什么。中文那一桶尤其要印:\n // 它是「说不准」,正等着人看一眼。\n if (result.gaps.length > 0) {\n lines.push(` [gaps] ${result.gaps.length} 条(不顶 rc,请自己看一眼)`);\n for (const gap of result.gaps) lines.push(` - (${gap.reason}) ${gap.why}`);\n }\n return `${lines.join('\\n')}\\n`;\n}\n\nexport async function deliveryGate0Command(args: DeliveryGate0Args): Promise<void> {\n // 🔴 **先算出退出码,再退出** —— `process.exit()` 不放在 `try` 里面。生产上二者行为\n // 逐字相同,但把它留在 try 内会让这条命令**测不了**:用例要观测退出码只能把\n // `process.exit` 换成抛异常,而那一抛会被 catch 接住、翻译成「出错了 ⇒ 1」。\n let code: number;\n try {\n const skillRoot = args.skills ?? '.';\n const reconDir = args.recon ?? '.';\n // 🔴 工件不在 ⇒ `naturalKey` 这一类**没有来源** ⇒ 那一类的门 0 恒绿 ⇒ `scan` 把它升成\n // 前提级 rc=2。**这里不许悄悄兜底成「就当查过了」**。\n const { aclass, problems: aclassProblems } = deriveAclass(reconDir, args.mapping ?? null);\n const { facts, problems: factsProblems } = loadProtocolFacts();\n const result = scan(skillRoot, aclass, facts, { aclassProblems, factsProblems });\n // 🔴 轮次不是 complete ⇒ **前提级 rc=2**,判据在 `baselineRoundPremise` 里,\n // 这一层只负责把它并进同一份台账 —— 并回 `checkPremise` 一次,让新档位照样受取值域约束。\n const premise = checkPremise([\n ...result.premise,\n ...baselineRoundPremise(inspectRound(reconDir)),\n ]);\n const merged: ScanResult = { ...result, premise };\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(renderGate0(merged, skillRoot));\n process.stdout.write(`${formatObject(merged, { format: fmt })}\\n`);\n // 前提级落 stderr:它说的是「这一轮的结论不算数」,不是判红结果本身。\n for (const problem of premise) {\n process.stderr.write(`🔴 前提不成立(${problem.reason}):${problem.message}\\n`);\n }\n code = gate0ExitCode(merged);\n } catch (e) {\n exitWithError(e);\n code = 1;\n }\n process.exit(code);\n}\n","import { createHash, randomBytes as secureRandomBytes } from 'node:crypto';\nimport { spawn } from 'node:child_process';\nimport { createReadStream, promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { CliError, CliErrorCode, formatObject, type OutputFormat } from '@hcmai/sdk';\nimport type { DeliveryAssessment } from './delivery';\nimport { assessEffectiveDeliveryCommand } from './delivery-action-policy';\nimport { exitWithError } from '../utils/exit';\n\nconst EXECUTION_CONTRACT_VERSION = '2026-08-29.controlled-v2' as const;\nconst DEFAULT_TTL_SECONDS = 15 * 60;\nconst MIN_TTL_SECONDS = 60;\nconst MAX_TTL_SECONDS = 60 * 60;\nconst PLAN_ID_PATTERN = /^[a-f0-9]{24}$/;\n\nexport type DeliveryRuntimeIdentity =\n | {\n kind: 'node-entry';\n executableSha256: string;\n entrySha256: string;\n }\n | {\n kind: 'executable';\n executableSha256: string;\n };\n\ninterface BoundDocument {\n path: string;\n sha256: string;\n}\n\nexport interface DeliveryExecutionPlan {\n schemaVersion: 1;\n contractVersion: typeof EXECUTION_CONTRACT_VERSION;\n planId: string;\n nonceSha256: string;\n createdAt: string;\n expiresAt: string;\n chironLockSha256: string;\n runtime: DeliveryRuntimeIdentity;\n assessment: DeliveryAssessment;\n documents: {\n change: BoundDocument;\n rollback: BoundDocument;\n };\n /**\n * 被 `--data-file` / `--params-file` 引用的载荷文件及其摘要。\n *\n * 🔴 少了它,`--data-file` 就是受控路径上的一个洞:计划只对 argv 取摘要,内联 `--data`\n * 的载荷在 argv 里因而被覆盖,而 `--data-file` 的载荷在文件里——prepare 与 execute\n * 之间把文件改掉不会被任何检查发现,\"这份计划批的是这份内容\"就不成立了。\n *\n * 守住它的是两件事,缺一不可:`isExecutionPlan` 强制本字段存在(旧结构的计划连 schema\n * 都过不了),以及 EXECUTION_CONTRACT_VERSION 随结构一起升版(旧契约的计划一律拒绝)。\n * 不要再加\"argv 用了 --data-file 就检查计划里有没有绑\"这类断言——手改计划在\n * `computePlanId(plan) !== planId` 那步就已经被挡住,那条断言变异删掉也不会红。\n */\n payloads: BoundDocument[];\n evidenceDir: string;\n}\n\nexport interface DeliveryExecutionReceipt {\n schemaVersion: 1;\n contractVersion: typeof EXECUTION_CONTRACT_VERSION;\n planId: string;\n assessmentId: string;\n commandSha256: string;\n startedAt: string;\n completedAt: string;\n exitCode: number;\n stdoutSha256: string;\n stderrSha256: string;\n}\n\ninterface DeliveryStreams {\n stdout(chunk: Buffer): void;\n stderr(chunk: Buffer): void;\n}\n\nexport type RunDeliveryCommand = (\n argv: string[],\n cwd: string,\n streams: DeliveryStreams,\n) => Promise<{ exitCode: number }>;\n\ninterface DeliveryExecutionDependencies {\n now?: () => Date;\n runtimeIdentity?: () => Promise<DeliveryRuntimeIdentity>;\n assessCommand?: (argv: string[]) => Promise<DeliveryAssessment>;\n}\n\nexport interface PrepareDeliveryInput extends DeliveryExecutionDependencies {\n project: string;\n argv: string[];\n changeRef: string;\n rollbackRef: string;\n evidenceDir: string;\n ttlSeconds?: number;\n randomBytes?: (size: number) => Buffer;\n}\n\nexport interface ExecuteDeliveryInput extends DeliveryExecutionDependencies {\n project: string;\n planId: string;\n argv: string[];\n runCommand?: RunDeliveryCommand;\n}\n\nexport interface DeliveryPrepareArgs {\n project?: string;\n changeRef?: string;\n rollbackRef?: string;\n evidenceDir?: string;\n ttlSeconds?: string;\n output?: OutputFormat;\n}\n\nexport interface DeliveryExecuteArgs {\n project?: string;\n output?: OutputFormat;\n}\n\nexport async function prepareDeliveryExecution(\n input: PrepareDeliveryInput,\n): Promise<DeliveryExecutionPlan> {\n const project = await realProject(input.project);\n await readProjectMode(project);\n const assessment = await (input.assessCommand ?? assessEffectiveDeliveryCommand)(input.argv);\n assertGuardedAssessment(assessment, input.argv);\n\n const ttlSeconds = input.ttlSeconds ?? DEFAULT_TTL_SECONDS;\n if (\n !Number.isInteger(ttlSeconds) ||\n ttlSeconds < MIN_TTL_SECONDS ||\n ttlSeconds > MAX_TTL_SECONDS\n ) {\n throw invalid(`--ttl-seconds 必须是 ${MIN_TTL_SECONDS} 到 ${MAX_TTL_SECONDS} 的整数`);\n }\n\n const change = await bindDocument(project, input.changeRef, '变更说明');\n const rollback = await bindDocument(project, input.rollbackRef, '回滚说明');\n const payloads = await bindPayloadFiles(project, input.argv);\n const evidence = await bindEvidenceDirectory(project, input.evidenceDir);\n const { bytes: lockBytes, runtime: lockedRuntime } = await readChironLock(project);\n const runtime = await (input.runtimeIdentity ?? currentRuntimeIdentity)();\n assertRuntimeMatches(runtime, lockedRuntime);\n\n const created = (input.now ?? (() => new Date()))();\n if (Number.isNaN(created.getTime())) throw invalid('当前时间无效');\n const core = {\n schemaVersion: 1 as const,\n contractVersion: EXECUTION_CONTRACT_VERSION,\n nonceSha256: sha256((input.randomBytes ?? secureRandomBytes)(12)),\n createdAt: created.toISOString(),\n expiresAt: new Date(created.getTime() + ttlSeconds * 1000).toISOString(),\n chironLockSha256: sha256(lockBytes),\n runtime,\n assessment,\n documents: { change, rollback },\n payloads,\n evidenceDir: evidence.relative,\n };\n const planId = sha256(canonicalJson(core)).slice(0, 24);\n const plan: DeliveryExecutionPlan = { ...core, planId };\n const plansDir = path.join(project, '.hcm-delivery', 'execution-plans');\n await safeManagedDirectory(project, '.hcm-delivery/execution-plans', plansDir);\n const planFile = path.join(plansDir, `${planId}.json`);\n try {\n await fs.writeFile(planFile, `${JSON.stringify(plan, null, 2)}\\n`, {\n encoding: 'utf8',\n mode: 0o600,\n flag: 'wx',\n });\n } catch (cause) {\n throw invalid(`执行计划写入失败或 planId 已存在:${planId}`, cause);\n }\n return plan;\n}\n\nexport async function executeDeliveryPlan(\n input: ExecuteDeliveryInput,\n): Promise<DeliveryExecutionReceipt> {\n if (!PLAN_ID_PATTERN.test(input.planId)) throw invalid('planId 必须是 24 位小写十六进制');\n const project = await realProject(input.project);\n if ((await readProjectMode(project)) !== 'controlled') {\n throw invalid('项目不是 controlled,不能执行 R2 计划');\n }\n\n const planFile = path.join(project, '.hcm-delivery', 'execution-plans', `${input.planId}.json`);\n const plan = await readPlan(project, planFile);\n if (plan.planId !== input.planId || computePlanId(plan) !== input.planId) {\n throw invalid('执行计划内容与 planId 摘要不一致');\n }\n\n const now = (input.now ?? (() => new Date()))();\n if (Number.isNaN(now.getTime())) throw invalid('当前时间无效');\n const expiresAt = Date.parse(plan.expiresAt);\n const createdAt = Date.parse(plan.createdAt);\n if (\n !Number.isFinite(createdAt) ||\n !Number.isFinite(expiresAt) ||\n expiresAt - createdAt < MIN_TTL_SECONDS * 1000 ||\n expiresAt - createdAt > MAX_TTL_SECONDS * 1000\n ) {\n throw invalid('执行计划时间窗口无效');\n }\n if (now.getTime() < createdAt - 5_000) throw invalid('当前时间早于计划创建时间');\n if (now.getTime() > expiresAt) throw invalid('执行计划已过期,请重新 prepare');\n\n const assessment = await (input.assessCommand ?? assessEffectiveDeliveryCommand)(input.argv);\n assertGuardedAssessment(assessment, input.argv);\n if (canonicalJson(assessment) !== canonicalJson(plan.assessment)) {\n throw invalid('实际 argv 与执行计划的命令摘要或风险事实不一致');\n }\n\n const { bytes: lockBytes, runtime: lockedRuntime } = await readChironLock(project);\n if (sha256(lockBytes) !== plan.chironLockSha256) {\n throw invalid('Chiron 锁摘要已漂移,请重新评估并 prepare');\n }\n const runtime = await (input.runtimeIdentity ?? currentRuntimeIdentity)();\n assertRuntimeMatches(runtime, lockedRuntime);\n if (canonicalJson(runtime) !== canonicalJson(plan.runtime)) {\n throw invalid('CLI 运行时摘要与执行计划不一致');\n }\n await assertDocumentUnchanged(project, plan.documents.change, '变更说明');\n await assertDocumentUnchanged(project, plan.documents.rollback, '回滚说明');\n // argv 摘要覆盖不到外部载荷文件的内容,这里补上——否则 prepare 批的和 execute 跑的\n // 可以是两份不同的数据。\n await assertPayloadsUnchanged(project, plan.payloads);\n const evidenceDir = await bindEvidenceDirectory(project, plan.evidenceDir);\n const receiptFile = path.join(evidenceDir.absolute, `${plan.planId}.receipt.json`);\n if (await pathExists(receiptFile)) throw invalid(`执行收据已存在,拒绝再次执行:${plan.planId}`);\n\n const claimsDir = path.join(project, '.hcm-delivery', 'execution-claims');\n await safeManagedDirectory(project, '.hcm-delivery/execution-claims', claimsDir);\n const claimFile = path.join(claimsDir, `${plan.planId}.json`);\n try {\n await fs.writeFile(\n claimFile,\n `${JSON.stringify({ schemaVersion: 1, planId: plan.planId, claimedAt: now.toISOString() }, null, 2)}\\n`,\n { encoding: 'utf8', mode: 0o600, flag: 'wx' },\n );\n } catch (cause) {\n throw invalid(`执行计划已消费,拒绝重复执行:${plan.planId}`, cause);\n }\n\n const stdoutHash = createHash('sha256');\n const stderrHash = createHash('sha256');\n const run = input.runCommand ?? runCurrentCliCommand;\n let exitCode: number;\n try {\n ({ exitCode } = await run(input.argv, project, {\n stdout: (chunk) => stdoutHash.update(chunk),\n stderr: (chunk) => stderrHash.update(chunk),\n }));\n } catch (cause) {\n stderrHash.update(\n Buffer.from(`delivery executor failed: ${String((cause as Error).message)}\\n`),\n );\n exitCode = 1;\n }\n\n const completed = (input.now ?? (() => new Date()))();\n if (Number.isNaN(completed.getTime())) throw invalid('完成时间无效');\n if (!Number.isInteger(exitCode) || exitCode < 0) exitCode = 1;\n const receipt: DeliveryExecutionReceipt = {\n schemaVersion: 1,\n contractVersion: EXECUTION_CONTRACT_VERSION,\n planId: plan.planId,\n assessmentId: plan.assessment.assessmentId,\n commandSha256: plan.assessment.commandSha256,\n startedAt: now.toISOString(),\n completedAt: completed.toISOString(),\n exitCode,\n stdoutSha256: stdoutHash.digest('hex'),\n stderrSha256: stderrHash.digest('hex'),\n };\n await writeReceiptExclusive(receiptFile, receipt);\n return receipt;\n}\n\nexport async function deliveryPrepareCommand(\n argv: string[],\n args: DeliveryPrepareArgs,\n): Promise<void> {\n try {\n if (!args.changeRef) throw invalid('--change-ref <file> 必填');\n if (!args.rollbackRef) throw invalid('--rollback-ref <file> 必填');\n if (!args.evidenceDir) throw invalid('--evidence-dir <dir> 必填');\n const ttlSeconds = parseTtl(args.ttlSeconds);\n const plan = await prepareDeliveryExecution({\n project: args.project ?? process.cwd(),\n argv,\n changeRef: args.changeRef,\n rollbackRef: args.rollbackRef,\n evidenceDir: args.evidenceDir,\n ...(ttlSeconds === undefined ? {} : { ttlSeconds }),\n });\n process.stdout.write(formatObject(plan, { format: args.output ?? 'json' }) + '\\n');\n } catch (cause) {\n exitWithError(cause);\n }\n}\n\nexport async function deliveryExecuteCommand(\n planId: string,\n argv: string[],\n args: DeliveryExecuteArgs,\n): Promise<void> {\n try {\n const receipt = await executeDeliveryPlan({\n project: args.project ?? process.cwd(),\n planId,\n argv,\n });\n process.stdout.write(formatObject(receipt, { format: args.output ?? 'json' }) + '\\n');\n process.exitCode = receipt.exitCode;\n } catch (cause) {\n exitWithError(cause);\n }\n}\n\nasync function readProjectMode(project: string): Promise<'plan-only' | 'controlled'> {\n const file = path.join(project, '.hcm-delivery', 'project.yml');\n const content = await readSafeFile(project, file, '项目配置');\n const match = content\n .toString('utf8')\n .match(\n /^deliveryMode:\\s*(?:\"(plan-only|controlled)\"|'(plan-only|controlled)'|(plan-only|controlled))\\s*$/m,\n );\n const mode = match?.[1] ?? match?.[2] ?? match?.[3];\n if (mode !== 'plan-only' && mode !== 'controlled') {\n throw invalid('project.yml 缺少合法 deliveryMode');\n }\n return mode;\n}\n\nasync function readChironLock(\n project: string,\n): Promise<{ bytes: Buffer; runtime: DeliveryRuntimeIdentity }> {\n const file = path.join(project, '.hcm-delivery', 'chiron.lock.json');\n const bytes = await readSafeFile(project, file, 'Chiron 锁');\n let parsed: unknown;\n try {\n parsed = JSON.parse(bytes.toString('utf8')) as unknown;\n } catch (cause) {\n throw invalid('Chiron 锁不是合法 JSON', cause);\n }\n const launch = (parsed as { runtime?: { launch?: unknown } })?.runtime?.launch;\n if (!isRuntimeIdentity(launch)) throw invalid('Chiron 锁缺少合法 runtime.launch 摘要');\n return { bytes, runtime: launch };\n}\n\nasync function bindDocument(\n project: string,\n reference: string,\n label: string,\n): Promise<BoundDocument> {\n const relative = safeRelative(reference, label);\n if (!(relative.startsWith('work/') || relative.startsWith('decisions/'))) {\n throw invalid(`${label}必须位于项目 work/ 或 decisions/ 下`);\n }\n const file = path.join(project, relative);\n const bytes = await readSafeFile(project, file, label);\n return { path: relative, sha256: sha256(bytes) };\n}\n\nasync function assertDocumentUnchanged(\n project: string,\n document: BoundDocument,\n label: string,\n): Promise<void> {\n const current = await bindDocument(project, document.path, label);\n if (current.sha256 !== document.sha256) throw invalid(`${label}摘要已漂移,请重新 prepare`);\n}\n\nasync function bindEvidenceDirectory(\n project: string,\n reference: string,\n): Promise<{ relative: string; absolute: string }> {\n const relative = safeRelative(reference, 'evidence 目录');\n if (!(relative === 'evidence' || relative.startsWith('evidence/'))) {\n throw invalid('evidence 目录必须位于项目 evidence/ 下');\n }\n const absolute = path.join(project, relative);\n await assertNoSymlinkComponents(project, relative);\n const stat = await fs.stat(absolute).catch((cause) => {\n throw invalid(`evidence 目录不可用:${relative}`, cause);\n });\n if (!stat.isDirectory()) throw invalid(`evidence 路径不是目录:${relative}`);\n return { relative, absolute };\n}\n\nasync function readPlan(project: string, file: string): Promise<DeliveryExecutionPlan> {\n const bytes = await readSafeFile(project, file, '执行计划');\n let plan: unknown;\n try {\n plan = JSON.parse(bytes.toString('utf8')) as unknown;\n } catch (cause) {\n throw invalid('执行计划不是合法 JSON', cause);\n }\n if (!isExecutionPlan(plan)) throw invalid('执行计划 schema 无效');\n return plan;\n}\n\nfunction computePlanId(plan: DeliveryExecutionPlan): string {\n const core: Partial<DeliveryExecutionPlan> = { ...plan };\n delete core.planId;\n return sha256(canonicalJson(core)).slice(0, 24);\n}\n\nfunction assertGuardedAssessment(assessment: DeliveryAssessment, argv: string[]): void {\n if (assessment.risk !== 'R2') throw invalid('只有 R2 命令可以进入受控执行计划');\n if (!assessment.guardedExecutionAvailable) {\n throw invalid('该 R2 命令不在首批受控执行器支持面');\n }\n if (!assessment.environment.envAlias) throw invalid('R2 argv 必须显式包含 --env 环境别名');\n if (!assessment.environment.identityAlias) {\n throw invalid('R2 argv 必须显式包含 --as 身份别名');\n }\n validateSupportedCommandShape(assessment.reasonCode, argv);\n}\n\nfunction validateSupportedCommandShape(reasonCode: string, argv: string[]): void {\n if (reasonCode === 'credential-reset') {\n if (argv[0] !== 'user' || argv[1] !== 'reset-password') {\n throw invalid('credential-reset 只支持 user reset-password');\n }\n const userId = optionalFlagValue(argv, '--id');\n const username = optionalFlagValue(argv, '--username');\n if (Boolean(userId) === Boolean(username)) {\n throw invalid('user reset-password 必须且只能包含 --id 或 --username');\n }\n if (!argv.includes('--password-stdin')) {\n throw invalid('user reset-password 必须包含独立的 --password-stdin');\n }\n if (\n argv.some((value) =>\n [\n '--password',\n '--new-password',\n '--client-secret',\n '--pat',\n '--new-password-stdin',\n '--pat-stdin',\n ].includes(value.split('=', 1)[0] ?? ''),\n ) ||\n argv.some((value) => value.startsWith('--password-stdin='))\n ) {\n throw invalid('user reset-password 不允许在 argv 中携带明文凭据');\n }\n return;\n }\n if (reasonCode === 'record-create') {\n requireExactlyOnePayload(argv, 'create');\n return;\n }\n if (reasonCode === 'record-update') {\n requireFlagValue(argv, '--id', 'update 必须包含 --id <id>');\n requireExactlyOnePayload(argv, 'update');\n return;\n }\n if (reasonCode === 'cache-mutation') {\n if (!argv[2] || argv[2].startsWith('-')) throw invalid('cache clear 必须包含 Model');\n return;\n }\n if (reasonCode === 'setting-write') {\n if (!argv[2] || argv[2].startsWith('-')) throw invalid('setting 写命令必须包含 domain');\n if (argv[1] === 'set') {\n requireFlagValue(argv, '--set', 'setting set 必须包含 --set <assignment>');\n return;\n }\n if (argv[1] === 'reset' && (!argv[3] || !argv[4])) {\n throw invalid('setting reset 必须包含 domain、namespace 与 key');\n }\n }\n}\n\nfunction optionalFlagValue(argv: string[], flag: string): string | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const value = argv[index];\n if (value === flag) {\n const next = argv[index + 1];\n return next && !next.startsWith('-') ? next : undefined;\n }\n if (value?.startsWith(`${flag}=`) && value.length > flag.length + 1) {\n return value.slice(flag.length + 1);\n }\n }\n return undefined;\n}\n\n/**\n * 写命令的载荷必须来自 `--data` 或 `--data-file` 之一,恰好一个。\n *\n * 受控路径此前只认内联 `--data`,与 `hcm create/update` 本身和交付 Skill(明写\"复杂配置\n * 用 --data-file\")互相打架:复杂配置根本进不了 guarded 执行,只能被迫塞进一行 shell\n * 字符串或干脆走不通。2026-08-29 顾问仿真实测即卡在这里。\n */\nfunction requireExactlyOnePayload(argv: string[], command: string): void {\n const inline = optionalFlagValue(argv, '--data') !== undefined;\n const fromFile = optionalFlagValue(argv, '--data-file') !== undefined;\n if (inline && fromFile) {\n throw invalid(`${command} 的 --data 与 --data-file 互斥,只能给一个`);\n }\n if (!inline && !fromFile) {\n throw invalid(`${command} 必须包含 --data <JSON> 或 --data-file <文件>`);\n }\n}\n\n/** argv 里所有引用外部载荷的开关;它们的内容必须随计划一起被钉住。 */\nconst PAYLOAD_FILE_FLAGS = ['--data-file', '--params-file'] as const;\n\nasync function bindPayloadFiles(project: string, argv: string[]): Promise<BoundDocument[]> {\n const bound: BoundDocument[] = [];\n for (const flag of PAYLOAD_FILE_FLAGS) {\n const reference = optionalFlagValue(argv, flag);\n if (reference === undefined) continue;\n bound.push(await bindPayloadFile(project, reference, `${flag} 载荷`));\n }\n return bound;\n}\n\nasync function bindPayloadFile(\n project: string,\n reference: string,\n label: string,\n): Promise<BoundDocument> {\n const relative = safeRelative(reference, label);\n const file = path.join(project, relative);\n const bytes = await readSafeFile(project, file, label);\n return { path: relative, sha256: sha256(bytes) };\n}\n\nasync function assertPayloadsUnchanged(\n project: string,\n payloads: BoundDocument[],\n): Promise<void> {\n for (const payload of payloads) {\n const current = await bindPayloadFile(project, payload.path, `载荷 ${payload.path}`);\n if (current.sha256 !== payload.sha256) {\n throw invalid(`载荷文件 ${payload.path} 的内容已变更,请重新 prepare`);\n }\n }\n}\n\nfunction requireFlagValue(argv: string[], flag: string, message: string): string {\n for (let index = 0; index < argv.length; index += 1) {\n const value = argv[index];\n if (value === flag) {\n const next = argv[index + 1];\n if (next && !next.startsWith('-')) return next;\n throw invalid(message);\n }\n if (value?.startsWith(`${flag}=`) && value.length > flag.length + 1) {\n return value.slice(flag.length + 1);\n }\n }\n throw invalid(message);\n}\n\nfunction assertRuntimeMatches(\n actual: DeliveryRuntimeIdentity,\n expected: DeliveryRuntimeIdentity,\n): void {\n if (canonicalJson(actual) !== canonicalJson(expected)) {\n throw invalid('当前 CLI 运行时摘要与 Chiron 锁不一致,请重新 skills sync');\n }\n}\n\nasync function currentRuntimeIdentity(): Promise<DeliveryRuntimeIdentity> {\n const entry = process.argv[1];\n if (!entry) throw invalid('无法解析当前 CLI entry');\n return {\n kind: 'node-entry',\n executableSha256: await sha256File(process.execPath),\n entrySha256: await sha256File(entry),\n };\n}\n\nasync function runCurrentCliCommand(\n argv: string[],\n cwd: string,\n streams: DeliveryStreams,\n): Promise<{ exitCode: number }> {\n const entry = process.argv[1];\n if (!entry) throw invalid('无法解析当前 CLI entry');\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [entry, ...argv], {\n cwd,\n env: process.env,\n shell: false,\n stdio: ['inherit', 'pipe', 'pipe'],\n windowsHide: true,\n });\n child.stdout.on('data', (chunk: Buffer) => {\n streams.stdout(chunk);\n process.stdout.write(chunk);\n });\n child.stderr.on('data', (chunk: Buffer) => {\n streams.stderr(chunk);\n process.stderr.write(chunk);\n });\n child.once('error', reject);\n child.once('close', (code, signal) => resolve({ exitCode: code ?? (signal ? 1 : 0) }));\n });\n}\n\nasync function writeReceiptExclusive(\n target: string,\n receipt: DeliveryExecutionReceipt,\n): Promise<void> {\n const temp = `${target}.${process.pid}.${Date.now()}.tmp`;\n try {\n await fs.writeFile(temp, `${JSON.stringify(receipt, null, 2)}\\n`, {\n encoding: 'utf8',\n mode: 0o600,\n flag: 'wx',\n });\n await fs.link(temp, target);\n } catch (cause) {\n throw invalid(`执行收据写入失败或已存在:${path.basename(target)}`, cause);\n } finally {\n await fs.unlink(temp).catch(() => undefined);\n }\n}\n\nasync function safeManagedDirectory(\n project: string,\n relative: string,\n absolute: string,\n): Promise<void> {\n await assertNoSymlinkComponents(project, path.dirname(relative));\n const existing = await fs.lstat(absolute).catch(() => undefined);\n if (existing?.isSymbolicLink()) throw invalid(`受管目录不能是符号链接:${relative}`);\n if (existing && !existing.isDirectory()) throw invalid(`受管路径不是目录:${relative}`);\n if (!existing) await fs.mkdir(absolute, { mode: 0o700 });\n await fs.chmod(absolute, 0o700);\n}\n\nasync function pathExists(file: string): Promise<boolean> {\n return fs.lstat(file).then(\n () => true,\n (cause: NodeJS.ErrnoException) => {\n if (cause.code === 'ENOENT') return false;\n throw cause;\n },\n );\n}\n\nasync function readSafeFile(project: string, file: string, label: string): Promise<Buffer> {\n const relative = path.relative(project, file).split(path.sep).join('/');\n if (relative.startsWith('../') || path.isAbsolute(relative))\n throw invalid(`${label}路径逃逸项目`);\n await assertNoSymlinkComponents(project, relative);\n let stat;\n try {\n stat = await fs.lstat(file);\n } catch (cause) {\n throw invalid(`${label}不可用:${relative}`, cause);\n }\n if (stat.isSymbolicLink()) throw invalid(`${label}不能是符号链接:${relative}`);\n if (!stat.isFile()) throw invalid(`${label}不是普通文件:${relative}`);\n return fs.readFile(file);\n}\n\nasync function assertNoSymlinkComponents(project: string, relative: string): Promise<void> {\n const parts = relative.split('/').filter(Boolean);\n let current = project;\n for (const part of parts) {\n current = path.join(current, part);\n const stat = await fs.lstat(current).catch(() => undefined);\n if (stat?.isSymbolicLink()) throw invalid(`路径包含符号链接:${relative}`);\n if (!stat) break;\n }\n}\n\nasync function realProject(requested: string): Promise<string> {\n const absolute = path.resolve(requested);\n let project;\n try {\n project = await fs.realpath(absolute);\n } catch (cause) {\n throw invalid(`项目目录不可用:${absolute}`, cause);\n }\n const stat = await fs.stat(project);\n if (!stat.isDirectory()) throw invalid(`项目路径不是目录:${absolute}`);\n return project;\n}\n\nfunction safeRelative(reference: string, label: string): string {\n if (!reference || path.isAbsolute(reference) || /[\\r\\n\\0]/.test(reference)) {\n throw invalid(`${label}必须是项目内相对路径`);\n }\n const normalized = path.normalize(reference).split(path.sep).join('/');\n if (normalized === '..' || normalized.startsWith('../') || normalized === '.') {\n throw invalid(`${label}路径逃逸项目`);\n }\n return normalized.replace(/^\\.\\//, '');\n}\n\nfunction isRuntimeIdentity(value: unknown): value is DeliveryRuntimeIdentity {\n if (!isRecord(value) || !isSha(value.executableSha256)) return false;\n if (value.kind === 'executable') return true;\n return value.kind === 'node-entry' && isSha(value.entrySha256);\n}\n\nfunction isExecutionPlan(value: unknown): value is DeliveryExecutionPlan {\n if (!isRecord(value)) return false;\n return (\n value.schemaVersion === 1 &&\n value.contractVersion === EXECUTION_CONTRACT_VERSION &&\n typeof value.planId === 'string' &&\n PLAN_ID_PATTERN.test(value.planId) &&\n typeof value.createdAt === 'string' &&\n typeof value.expiresAt === 'string' &&\n isSha(value.nonceSha256) &&\n isSha(value.chironLockSha256) &&\n isRuntimeIdentity(value.runtime) &&\n isRecord(value.assessment) &&\n isRecord(value.documents) &&\n isBoundDocument(value.documents.change) &&\n isBoundDocument(value.documents.rollback) &&\n Array.isArray(value.payloads) &&\n value.payloads.every(isBoundDocument) &&\n typeof value.evidenceDir === 'string'\n );\n}\n\nfunction isBoundDocument(value: unknown): value is BoundDocument {\n return isRecord(value) && typeof value.path === 'string' && isSha(value.sha256);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isSha(value: unknown): value is string {\n return typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);\n}\n\nfunction parseTtl(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (!/^\\d+$/.test(value)) throw invalid('--ttl-seconds 必须是整数');\n return Number(value);\n}\n\nfunction canonicalJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`;\n if (isRecord(value)) {\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`)\n .join(',')}}`;\n }\n return JSON.stringify(value) ?? 'null';\n}\n\nfunction sha256(value: string | Buffer): string {\n return createHash('sha256').update(value).digest('hex');\n}\n\nasync function sha256File(file: string): Promise<string> {\n const hash = createHash('sha256');\n await new Promise<void>((resolve, reject) => {\n const stream = createReadStream(file);\n stream.on('data', (chunk) => hash.update(chunk));\n stream.on('error', reject);\n stream.on('end', resolve);\n });\n return hash.digest('hex');\n}\n\nfunction invalid(message: string, cause?: unknown): CliError {\n return new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message, cause });\n}\n","import {\n HcmClient,\n adminResetPassword,\n formatObject,\n fromAxiosError,\n CliError,\n CliErrorCode,\n type AdminResetPasswordRequest,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\nimport { promptSecret, readSecretFromStdin } from '../utils/prompt';\n\nexport interface UserResetPasswordArgs {\n id?: string;\n username?: string;\n passwordStdin?: boolean;\n forceChange?: boolean;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport function buildAdminResetPasswordRequest(\n args: Pick<UserResetPasswordArgs, 'id' | 'username' | 'forceChange'>,\n password: string,\n): AdminResetPasswordRequest {\n const hasId = Boolean(args.id);\n const hasUsername = Boolean(args.username);\n if (hasId === hasUsername) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--id <uuid> 与 --username <user> 必须且只能提供一个',\n });\n }\n if (!password) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '新密码不能为空',\n });\n }\n return {\n ...(args.id ? { userId: args.id } : {}),\n ...(args.username ? { username: args.username } : {}),\n newPassword: password,\n confirmPassword: password,\n forceChangeOnNextLogin: args.forceChange !== false,\n };\n}\n\nexport async function userResetPasswordCommand(args: UserResetPasswordArgs): Promise<void> {\n try {\n const password = args.passwordStdin ? await readSecretFromStdin() : await promptPasswordTwice();\n const request = buildAdminResetPasswordRequest(args, password);\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await adminResetPassword(client.raw(), request);\n process.stdout.write(formatObject(result, { format: args.output ?? 'json' }) + '\\n');\n } catch (cause) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = cause as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(cause);\n }\n}\n\nasync function promptPasswordTwice(): Promise<string> {\n const password = await promptSecret('新密码: ');\n const confirmation = await promptSecret('再次输入新密码: ');\n if (password !== confirmation) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '两次输入的新密码不一致',\n });\n }\n return password;\n}\n","/** 帮助、版本和纯本地 delivery 合同不读取身份配置,不应为历史 profile 迁移付启动成本。 */\nexport function needsLegacyProfileMigration(argv: string[]): boolean {\n const args = argv.slice(2);\n if (args[0] === 'delivery') return false;\n return !args.some((arg) => ['--help', '-h', '--version', '-V'].includes(arg));\n}\n"],"mappings":"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","names":["axios","loadGlobalConfig","loadEnv","loadIdentity","listEnvs","CliError","CliErrorCode","fs","path","meta","marked","markedTerminal","absoluteDownloadUrl","Box","Text","jsx","jsxs","lines","row","col","useEffect","useRef","useState","fs","Box","Text","useInput","marked","jsx","jsxs","result","meta","identity","path","React","HcmClient","DEFAULT_AGENT_ID","client","ans","readline","resolve","CliError","resolve","CliError","env","endpoint","fromAxiosError","meta","loadGlobalConfig","saveGlobalConfig","CliError","CliErrorCode","axios","loadEnv","saveEnv","loadGlobalConfig","saveGlobalConfig","loadIdentity","TokenStore","CliError","CliErrorCode","loadGlobalConfig","loadEnv","CliError","CliErrorCode","saveEnv","saveGlobalConfig","axios","loadIdentity","failed","TokenStore","CliError","CliErrorCode","loadGlobalConfig","saveGlobalConfig","CliError","CliErrorCode","client","result","HcmClient","fromAxiosError","CliError","CliErrorCode","CliError","CliErrorCode","CliError","CliErrorCode","client","HcmClient","result","fromAxiosError","HcmClient","formatObject","fromAxiosError","client","HcmClient","formatObject","fromAxiosError","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","CliError","CliErrorCode","client","HcmClient","result","formatObject","fromAxiosError","HcmClient","formatObject","formatRows","fromAxiosError","CliError","CliErrorCode","HcmClient","fromAxiosError","formatRows","formatObject","CliError","CliErrorCode","result","formatObject","fromAxiosError","loadEnv","loadGlobalConfig","resolveActiveEnv","CliError","CliErrorCode","env","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","client","readFileSync","HcmClient","formatObject","fromAxiosError","path","client","result","HcmClient","formatObject","fromAxiosError","client","HcmClient","WsClient","sendMessageAndStream","createConversation","DEFAULT_AGENT_ID","saveConversationState","formatObject","formatRows","fetchConversationTimeline","CliError","CliErrorCode","parseInteractionRequest","parseInteractionResolved","buildConfirm","buildReject","buildAnswer","chalk","fs","fail","client","result","runInkRepl","StreamPresenter","TerminalRenderer","buildResumeSummary","uploadDocument","meta","extractInlineFilePaths","resolveInteraction","resolve","readLineFromStdin","r","HcmClient","client","HcmClient","formatObject","formatRows","fromAxiosError","parsePositiveInt","client","HcmClient","formatObject","fromAxiosError","client","result","fail","HcmClient","formatObject","fromAxiosError","uploadDocument","client","meta","fsp","os","path","createHash","createHttpClient","assertSafeSkillId","assertSafeReferencePath","normalizeReferences","parseSkillRequirements","parseSkillFrontmatter","resolveSkillInstallOrder","formatObject","fromAxiosError","loadEnv","loadGlobalConfig","resolveActiveEnv","CliError","CliErrorCode","CliError","CliErrorCode","path","CliError","CliErrorCode","readFileSync","readdirSync","statSync","path","formatObject","readdirSync","statSync","readFileSync","manifest","formatObject","CliError","CliErrorCode","relative","createHash","fs","path","CliError","CliErrorCode","markdown","sha256","stableJson","preparedFile","createHash","fs","path","CliError","CliErrorCode","invalid","forbidden","sha256","result","env","resolve","skills","sha256","createHash","loadGlobalConfig","resolveActiveEnv","env","loadEnv","CliError","CliErrorCode","normalizeEndpoint","invalid","exists","fsp","path","os","createHttpClient","fail","fromAxiosError","manifest","client","formatObject","parseSkillFrontmatter","assertSafeSkillId","result","resolveSkillInstallOrder","normalizeReferences","relative","parseSkillRequirements","meta","assertSafeReferencePath","createHttpClient","formatObject","fromAxiosError","loadEnv","loadGlobalConfig","resolveActiveEnv","CliError","CliErrorCode","CliError","CliErrorCode","resolveEndpoint","loadGlobalConfig","resolveActiveEnv","env","loadEnv","createHttpClient","result","formatObject","fromAxiosError","fsp","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","client","HcmClient","fail","fromAxiosError","formatObject","path","CliError","CliErrorCode","resolve","fsp","result","fs","path","formatObject","formatRows","HcmClient","fromAxiosError","client","HcmClient","parsePositiveInt","result","formatObject","formatRows","sha256","manifest","flagName","fromAxiosError","loadEnv","saveEnv","loadIdentity","listIdentities","deleteIdentity","loadGlobalConfig","TokenStore","CliError","CliErrorCode","meta","env","HcmClient","formatObject","createHash","sha256","formatObject","HcmClient","action","flagValue","HcmClient","formatObject","fromAxiosError","render","client","identity","HcmClient","formatObject","fromAxiosError","httpProbe","DEFAULT_CAPABILITIES","client","result","formatObject","inspectRound","path","result","createHash","createReadStream","fs","path","CliError","CliErrorCode","formatObject","invalid","sha256","path","fs","createHash","formatObject","relative","sha256File","resolve","createReadStream","CliError","CliErrorCode","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","CliError","CliErrorCode","client","HcmClient","result","formatObject","fromAxiosError"]}