关于 cmux-artifact
cmux-artifact 是用于制作持久 HTML 文档的技能,可记录变更、操作演示和验证证据。它指导如何在 cmux 工作区中展示内容,并强调使用真实证据及减少对现有工作的干扰。
主要功能
- 01收集日志、截图和耗时信息
- 02创建独立的证据页面
- 03将产物保存到持久位置
- 04在 cmux 浏览器窗格中打开产物
- 05验证页面刷新和工作区标签
适用场景
- 01为代码变更整理评审材料
- 02在终端旁展示测试证据
- 03制作可长期查阅的演示或参考页
MCP 相关
此技能使用 cmux 工作区和浏览器表面展示 HTML 产物及相关证据;输入未说明其提供 MCP 服务端功能。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ manaflow-ai/ cmux-skills --skill cmux-artifact安装后在 Claude Code 中输入/cmux-artifact确认已加载。
附带文件AGENTS.mdagents/openai.yaml
详细介绍
cmux 工件
当用户要求提供 HTML 工件、操作演示、证据页、演示页、工件预览,或能帮助他们试用、验证或了解某项变更的工作区布局时,使用此技能。目标是创建持久、可检查的工件,并在 cmux 工作区中以不打扰用户的方式打开重要证据标签页。
前置条件
- 调用方的 cmux 工作区是默认目标,但不是必须目标。打开窗格、标签页、浏览器、日志、截图、视频或生成的文档时,请阅读
cmux-workspace技能。- 对于与任务直接相关的证据(试用证明、失败日志、验证页面),如果用户希望在触发工作的旁边查看,默认使用调用方工作区右侧的辅助窗格。
- 如果工件独立且需要长期保留(例如设计文档、报告或参考页面,用户之后还会返回查看),拆分调用方工作区会挤占正在使用的终端,或用户要求放到其他位置,则优先使用专用或新建的工作区。使用
cmux new-workspace以新增方式创建;仅当用户要求立即查看工件时才切换过去(明确要求“打开它”也算)。切勿臆测调用select-workspace/focus-pane。 - 如果不确定哪种方式合适,请询问,或选择影响最小的方案,并告知用户工件放置位置,方便他们调整。
- 优先使用真实的命令输出、日志、截图、跟踪记录和计时数据。不要编造证据。
- 最终面向用户的工件不要放在
/tmp下。
工件位置
将最终工件放在按分支划分的持久目录树下:
BRANCH="$(git -C <worktree-or-repo> branch --show-current 2>/dev/null || echo task)"
ASSET_ROOT="/cmux-assets/${BRANCH:-task}/<artifact-slug>"
mkdir -p "$ASSET_ROOT"
如果无法创建或写入 /cmux-assets,则使用当前仓库检出目录下的 cmux-assets/<branch>/<artifact-slug>,并说明这是备用位置。/tmp 仅用于临时文件。在打开或报告日志、截图、帧、视频和转录记录前,请先将确认保留的文件复制到持久目录树中。
工作流程
第 1 步:收集证据
收集能够说明任务情况的最少一组真实工件:
- 命令转录记录或终端输出
- 相关日志
- 截图、帧、视频或浏览器快照
- 标注精确时长的计时表
- 有用时,提供代码引用或 PR 链接
- 清理状态和剩余阻碍
使用简洁的名称,例如 run-transcript.md、server.log、failure.log、screenshot.png 和 index.html。
第 2 步:编写 index.html
创建一个可直接从文件系统打开的独立 HTML 文档。内容包括:
- 对测试内容或变更内容的通俗摘要
- 简短的时间线或步骤表
- 关键计时数据
- 使用相对路径指向本地复制的日志和媒体文件
- 观察到的失败情况及其直接后续操作
- 创建外部资源时的清理状态
采用适合工程评审的简洁、紧凑 UI。避免营销内容、大型主视觉布局、装饰性渐变或隐藏证据。
对于交互式工件,可以创建一个小型 React 网站,而不是单个静态文档。将其放在同一个持久化 ASSET_ROOT 下,例如 package.json、server.ts、src/main.jsx、src/styles.css 和 public/。优先使用无需安装的方案,例如现有仓库依赖或浏览器 ESM 导入。如果已安装 bun,且托管网站有助于用户体验 UI,则在可见的 cmux 辅助终端中运行前台 Bun 服务,然后在浏览器界面中打开确切的本地 URL。不要使用隐藏的 tmux、nohup、脱离终端运行的后台服务,也不要使用通用的 localhost 页面来托管工件。如果没有 Bun,或托管没有额外价值,则改用文件系统中的 index.html。
步骤 3:打开辅助标签页
将最终的 index.html 作为浏览器界面打开,并导航到其 file:// URL,同时不改变焦点。默认目标是调用方工作区右侧的辅助窗格,但根据前提条件,也可以使用专用工作区或新工作区(用于独立且持久的产物,或在拆分调用方工作区会挤占活动终端时)。使用单独的工作区时,请在下方的界面/窗格命令中传入 --workspace <that-workspace>,而不是 ${CMUX_WORKSPACE_ID}。不要使用 cmux open 打开 HTML 产物,因为这会创建文件预览,而不是在浏览器中运行该产物。处理好浏览器产物后,再使用 cmux open 打开日志、Markdown 转录、截图或视频等原始证据。
首先检查目标工作区或辅助窗格中是否已经打开同一个 index.html 产物。如果它已作为浏览器界面打开,请保留该界面;如有需要,将其导航到产物 URL,然后在更新 index.html 后,交接前务必重新加载:
FILE_URL="$(node -e 'const {pathToFileURL}=require("url"); console.log(pathToFileURL(process.argv[1]).href)' "$ASSET_ROOT/index.html")"
cmux browser --surface surface:<existing-artifact-browser> goto "$FILE_URL" --snapshot-after
cmux browser --surface surface:<existing-artifact-browser> reload --snapshot-after
重写同一个文件后,不要认为 goto 已经足够。浏览器界面可能会保留过时的文件内容;reload --snapshot-after 才能证明当前可见的产物已刷新。
如果现有产物是以文件预览或其他无法重新加载的界面打开的,请关闭那个确切的过时产物界面,然后在同一个辅助窗格中打开一个浏览器界面。如果同一产物有多个界面,只保留一个浏览器界面(如果有),关闭过时的重复界面,然后导航到保留的浏览器界面或重新加载它。不要为同一个产物保留多个 index.html 标签页,否则当前版本会变得不明确。
将产物放在独立窗格中,与工作内容并排显示。 目的是让证据显示在终端旁边,而不是藏在终端后面。如果调用方工作区已经有合适的右侧辅助窗格,请复用它。如果工作区只有一个窗格(仅有活动终端),不要在该窗格中将产物作为另一个界面打开:new-surface --pane <active-pane> 会创建一个堆叠在终端后面的后台标签页,用户看不到任何变化。应创建一个右侧分屏。使用 new-pane --direction right 直接在新的右侧窗格中打开浏览器,或者将已创建的界面 split-off。
FILE_URL="$(node -e 'const {pathToFileURL}=require("url"); console.log(pathToFileURL(process.argv[1]).href)' "$ASSET_ROOT/index.html")"
# Single-pane workspace (no right helper yet): open the artifact in a NEW right split.
cmux new-pane --workspace "${CMUX_WORKSPACE_ID:-}" \
--direction right \
--type browser \
--url "$FILE_URL" \
--focus false
# Already have a dedicated right helper pane: add the browser surface there.
cmux new-surface --workspace "${CMUX_WORKSPACE_ID:-}" \
--pane pane:<right-helper> \
--type browser \
--url "$FILE_URL" \
--focus false
# Recovery: artifact landed as a background tab in the active terminal's pane?
# Split that exact surface out to the right instead of leaving it buried.
cmux split-off --surface surface:<artifact-browser> right --focus false
cmux open "$ASSET_ROOT/failure.log" \
--workspace "${CMUX_WORKSPACE_ID:-}" \
--pane pane:<right-helper> \
--no-focus
对于托管的 React 产物,请在同一目标工作区/窗格中创建或复用辅助终端,在其中运行服务,确认服务正在运行,然后打开已提供服务的 URL:
cmux new-surface --workspace "${CMUX_WORKSPACE_ID:-}" \
--pane pane:<right-helper> \
--type terminal \
--focus false
cmux send --surface surface:<helper-terminal> \
"cd '$ASSET_ROOT' && PORT=<port> bun run server.ts\n"
curl -fsS "http://127.0.0.1:<port>/healthz"
cmux new-surface --workspace "${CMUX_WORKSPACE_ID:-}" \
--pane pane:<right-helper> \
--type browser \
--url "http://127.0.0.1:<port>/" \
--focus false
严格按照 cmux-workspace 技能中所述的方式确定辅助窗格。显然存在右侧辅助窗格时请复用;如果没有,则通过右侧分屏(new-pane --direction right 或 split-off)创建一个,而不是将产物堆叠在活动终端后面。如果 cmux open 因调用方环境已过时而失败,请使用 cmux identify --json 的输出重试一次;如果仍然失败,请报告确切路径。
第 4 步:验证
报告完成前:
test -f "$ASSET_ROOT/index.html"
ls -la "$ASSET_ROOT"
对于托管的产物,交接前还要验证服务:
curl -fsS "http://127.0.0.1:<port>/healthz"
cmux read-screen --workspace "${CMUX_WORKSPACE_ID:-}" --surface surface:<helper-terminal> --lines 20
如果在 cmux 中打开,请运行 cmux list-pane-surfaces --workspace "${CMUX_WORKSPACE_ID:-}" --json 或最接近的等效命令,以验证已创建相应标签页。
还要验证目标辅助窗格中,产物 index.html 只有一个可见界面。如果命令输出仍显示同一路径或标题的多个副本,请先关闭过时的副本,再报告完成。
请确认产物位于自己的窗格中,与工作区并排显示,而不是作为活动终端窗格中的后台标签页。使用 list-panes --json 确认工作区有一个单独的窗格,其中包含产物的浏览器界面(如果未选中的界面与活动终端共用同一窗格,说明它被终端遮挡)。如果产物被遮挡,请在报告完成前使用 split-off 将该界面分到右侧。
如果在此任务开始前产物就已打开,请确认保留的浏览器界面在最后一次写入后已重新加载。如果最后一次写入发生在上次浏览器命令之后,请再次运行重新加载。
规则
- 不要将最终产物只留在
/tmp中。 - 除非关联的记录表明运行已通过,否则不要声称运行已通过。
- 不要将机密粘贴到产物中。复制日志前,请遮盖 API 密钥、令牌、Cookie 和 Authorization 标头。
- 不要抢占焦点。请使用明确的工作区和窗格引用,并使用
--no-focus或--focus false。 - 调用方工作区是默认选项,但不是强制要求。独立且持久的产物可以在专用或新工作区中打开;请以增量方式创建工作区,且只有在用户要求现在查看时才切换过去。
- 如果存在特定的产物路径或深层链接,不要打开仓库顶层或通用 localhost 页面。
- 最后的聊天回复应简短,并包含持久的产物路径以及明确的下一步操作。