news 2026/10/13 15:30:56

showboat文档格式规范全解:5种块类型与CLI命令的1:1映射设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
showboat文档格式规范全解:5种块类型与CLI命令的1:1映射设计

【免费下载链接】showboat

Create executable documents that demonstrate an agent's work

项目地址:https://gitcode.com/gh_mirrors/sh/showboat
点击查看免费下载

showboat 是一个 Go 编写的 CLI 工具,专门帮助 AI Agent 构建可执行的 Markdown 演示文档——同一个文件里混合了解说文字、可执行代码块和捕获到的真实输出,既是给人读的文档,也是能被verify重新执行、逐条验证的"工作证明"。本文完整拆解 showboat 文档格式的5 种块类型,以及它们与CLI 命令之间 1:1 映射的精妙设计,帮你一次看懂这个开源项目的文档规范。

为什么 Agent 需要"可执行"的演示文档?

普通的 README 只能"说",却不能"证明"。当 Agent 完成一项任务后,用户往往想确认:这些命令现在还能跑出同样的结果吗?

showboat 的解法很简单:把演示过程实时追加进一个 Markdown 文件,每个代码块都带着当初真实运行的输出。之后任何人执行一次showboat verify,工具就会重新跑遍所有代码块并做 diff 比对——输出一致,文档就是可信的"证据链"。

项目 README 对它的定位是:

Create executable demo documents that show and prove an agent's work.

—— 见 README.md

安装也很直接,一条命令即可试用,无需先安装:

uvx showboat --help # 或正式安装 pip install showboat

5 种块类型:showboat 文档的"积木"

showboat 文档不是随意写的 Markdown,而是由 5 种**块(Block)**拼装而成的严格结构。所有块类型定义在 markdown/blocks.go 中,每种块实现统一的Type()接口:

#块类型Go 类型在 Markdown 中的样子由谁生成
1标题块TitleBlock# 标题+*时间戳*+ 文档 ID 注释init
2解说块CommentaryBlock自由格式的正文 Markdownnote
3代码块CodeBlock带语言标签的围栏代码块(可带{image}后缀)exec/image
4输出块OutputBlock```output围栏中的捕获文本exec(自动追加)
5图片输出块ImageOutputBlock独立的alt行image(自动追加)

一个完整的 showboat 文档长这样(摘自 help.txt 中的官方示例):

# Setting Up a Python Project *2026-02-06T15:30:00Z* <!-- showboat-id: 550e8400-e29b-41d4-a716-446655440000 --> First, let's create a virtual environment. ```bash python3 -m venv .venv && echo 'Done'
Done
print('Hello from Python')
Hello from Python
screenshot.png

screenshot

观察这个结构就能发现规律:**代码块和输出块总是成对出现**,解说块自由穿插在中间,标题块永远位于文档最顶部。 ## 1:1 映射设计:每条 CLI 命令对应一种文档模式 这是 showboat 最核心的设计哲学(出自 [docs/plans/2026-02-06-showboat-design.md](https://link.gitcode.com/i/13e91b98bd93614ae54341e8d47eb88a)): > **Markdown 文件就是唯一事实来源(source of truth)。** 每条 CLI 命令精确对应文档中的一种块模式,整个格式完全可往返(round-trippable)。 也就是说,showboat **没有数据库、没有外部状态**。每条命令的工作流程都一样:读文件 → 解析成块列表 → 追加新块 → 整体写回。这套读写逻辑集中在 [cmd/build.go](https://link.gitcode.com/i/5018a00a9a08e4aff35371fdcb48a52b) 的 `readBlocks` / `writeBlocks` 两个辅助函数里: ```text init → TitleBlock(标题 + 时间戳 + UUID) note → CommentaryBlock(一段解说文字) exec → CodeBlock + OutputBlock(代码 + 真实输出,成对追加) image → CodeBlock{image} + ImageOutputBlock(图片引用 + 图片行) pop → 删除文档"最后一个条目"(成对块一起删) verify → 重新执行所有代码块,diff 比对输出 extract → 反向输出重建文档所需的完整命令序列

写侧:命令如何追加块

  • init(cmd/init.go):创建文档,写入标题、RFC3339 时间戳和 UUID 文档 ID;文件已存在时直接报错,防止误覆盖。
  • note(cmd/build.go):把任意 Markdown 文字作为一个解说块追加到末尾。
  • exec(cmd/build.go):先真正执行代码、捕获输出,再把代码块和输出块成对追加。注意:它会把输出原样打印到终端、并透传退出码,这样 Agent 能"看见"发生了什么并对错误做出反应——即使命令失败,输出照样写入文档,失败现场也是演示的一部分。
  • image(cmd/build.go):把图片文件复制到文档同目录(生成带日期的独立文件名),追加一个```bash {image}代码块和一行alt图片引用。

读侧:verify 与 extract 如何"消费"块

  • verify(cmd/verify.go):解析文档后跳过所有图片块,按顺序重跑每个代码块,把新输出与文档中记录的输出逐字比对。有任何 diff 就打印差异并以退出码 1 结束;加--output <file>还能生成一份刷新了输出的副本,原文件保持不动。
  • extract(cmd/extract.go):遍历块列表,把每个块翻译回一条 CLI 命令(OutputBlock和ImageOutputBlock会被跳过,因为它们在重跑时会自然再生)。换句话说,extract是"文档 → 命令序列"的反编译器。

正是这种 1:1 映射,使得一份 showboat 文档既能被机器重放,也能被人类直接阅读——两头都不吃亏。

快速上手:一条完整的 showboat 工作流

7 条命令覆盖全流程(完整帮助信息见 help.txt,也可运行showboat --help):

# 1. 创建演示文档 showboat init demo.md "Setting Up a Python Project" # 2. 追加解说 showboat note demo.md "First, let's create a virtual environment." # 3. 执行代码并捕获输出(输出会打印到终端) showboat exec demo.md bash "python3 -m venv .venv && echo 'Done'" # 4. 出错了?一键撤销最后一条条目(代码块+输出块一起删除) showboat pop demo.md # 5. 插入一张截图(支持 alt 语法保留 alt 文本) showboat image demo.md 'Homepage screenshot' # 6. 验证文档:重跑所有代码块并比对输出 showboat verify demo.md # 7. 查看重建该文档的完整命令序列 showboat extract demo.md

三个实用细节:

  • 支持 stdin:省略文本/代码参数时从标准输入读取,例如echo "Hello" | showboat note demo.md、cat script.sh | showboat exec demo.md bash,对脚本化场景非常友好(见 main.go 的getTextArg)。
  • --workdir <dir>:全局参数,可指定代码执行时的工作目录。
  • 远程流式推送:设置SHOWBOAT_REMOTE_URL后,每条init/note/exec/image/pop都会把内容 POST 到远端,配合文档里的 UUID 注释即可实现"边写边看"的实时演示(实现见 cmd/remote.go)。

项目仓库里还有一份真实的 showboat 文档可以学习:demos/shell-output-and-pop.md,它用文档本身演示了"失败命令如何被pop干净撤销"的完整过程。

三个值得细看的设计细节

  1. 自适应围栏,防输出内容"破框":输出块固定用```output围栏,但如果输出本身包含反引号,围栏长度不够会破坏文档结构。markdown/writer.go 的fenceFor会扫描内容中最长的反引号序列,动态加长围栏,保证任何输出都能安全嵌入。
  2. 标题块不可动摇:markdown/parser.go 规定# 标题只在文档第一个位置被识别为TitleBlock,且必须连读时间戳和可选的<!-- showboat-id: ... -->注释;cmd/pop.go 则明确禁止pop删掉标题——文档永远有"头"。
  3. 成对块的原子性:exec/image追加的"代码+输出"永远被视为一个条目。pop一次移除两个块(cmd/pop.go),verify也只跳过图片块、逐个重跑代码块——块与块之间的这种"配对关系"是 1:1 映射能精确重建的前提。

如何阅读 showboat 源码:关键路径导航

想深入源码时,建议按"块定义 → 读写 → 命令 → 执行"的顺序阅读:

git clone https://gitcode.com/gh_mirrors/sh/showboat
想了解什么看哪里
5 种块类型的定义markdown/blocks.go
文档如何被解析成块markdown/parser.go
块如何序列化为 Markdown(含自适应围栏)markdown/writer.go
init/note/exec/image实现cmd/init.go、cmd/build.go
pop/verify/extract实现cmd/pop.go、cmd/verify.go、cmd/extract.go
远程流式推送cmd/remote.go
代码执行与图片复制exec/runner.go、exec/image.go
命令行入口与参数路由main.go
原始设计文档docs/plans/2026-02-06-showboat-design.md、docs/plans/2026-02-06-showboat-implementation.md

总结

showboat 的文档格式可以一句话概括:5 种块类型 × 7 条命令 × 1 个事实来源。

  • init/note/exec/image四种"写"命令,各自精确追加一种块模式;
  • pop让文档可撤销,verify让文档可自证,extract让文档可再生;
  • 没有隐藏的中间状态——你看到的那份 Markdown,就是全部数据。

如果你的 Agent 也需要交付"既好看又可信"的演示结果,这套 1:1 映射的设计思路非常值得借鉴。

【免费下载链接】showboat

Create executable documents that demonstrate an agent's work

项目地址:https://gitcode.com/gh_mirrors/sh/showboat
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 15:30:20

亿图图示9.0离线安装包部署与排错指南

简介&#xff1a;亿图图示9.0压缩包面向需要绘制流程图、思维导图、组织结构图、网络拓扑图等专业图表的职场人士和学生&#xff0c;提供无水印版本&#xff0c;创作成果可自由用于报告、演示及商业场景。压缩包整体约306.69MB&#xff0c;内含物料清单文档&#xff0c;对软件功…

作者头像 李华
网站建设 2026/10/13 15:28:59

志愿者公益网站毕设开题答辩全攻略:从选题到应答

站在答辩教室门口的时候&#xff0c;我手里捏着的PPT标题就是《志愿者公益网站的设计与实现》。说实话&#xff0c;这个题目乍看挺"普通"的——网站、设计与实现&#xff0c;每年答辩十个里能撞三四个。但正是这种"普通题"&#xff0c;才最容易在开题阶段被…

作者头像 李华
网站建设 2026/10/13 15:26:30

S7-1200 PLC与TP1200触摸屏在溢流水循环控制中的应用

1. 项目需求解析与方案选型 去年接了个溢流水循环系统的控制柜改造&#xff0c;客户拿来的需求很简单&#xff1a;一套冷却水池的溢流回收装置&#xff0c;两三个液位信号&#xff0c;两台循环泵&#xff0c;要求实现自动补水、溢流报警和泵的自动轮换&#xff0c;顺带要一块触…

作者头像 李华
网站建设 2026/10/13 15:26:26

轻量级多智能体系统:用LlamaIndex RAG实现手机客服场景的端到端协作

1. 项目概述&#xff1a;为什么一份手机数据集能跑通从单点问答到多智能体协作的完整链路&#xff1f;最近在某实验室带一个RAGAgent的实战训练营&#xff0c;学员普遍卡在一个认知盲区&#xff1a;总以为“多智能体”是高不可攀的架构设计&#xff0c;得先搭好消息总线、定义好…

作者头像 李华
网站建设 2026/10/13 15:25:17

ROS2 mcap bag文件损坏修复实战:诊断、抢救与验证

搞机器人开发和自动驾驶测试的&#xff0c;估计都经历过这个“至暗时刻”&#xff1a;熬夜录了三个小时的 ros2 bag&#xff0c;第二天要用&#xff0c; ros2 bag info 直接报错&#xff0c;要么提示无法打开存储&#xff0c;要么播放到某个时间点突然退出。尤其是从 ROS 2 H…

作者头像 李华
网站建设 2026/10/13 15:22:41

几何布朗运动模拟股价:原理、代码与实战陷阱

1. 项目概述&#xff1a;为什么用几何布朗运动模拟股价&#xff0c;而不是随便画条曲线&#xff1f;“用几何布朗运动模拟股价走势”——这标题乍看像金融系期末考题&#xff0c;但其实它是一把被无数量化团队、交易员和高校实验室反复打磨过的“基础手术刀”。我第一次在某高校…

作者头像 李华