
【免费下载链接】answer-me-with-htmlAnswer me with HTML — an agent skill that answers hard questions with a one-page HTML you can actually read. 让 AI Agent 用一页 HTML 回答复杂问题。项目地址https://gitcode.com/gh_mirrors/an/answer-me-with-html点击查看免费下载本文是 answer-me-with-html一个让 AI Agent 用单文件 HTML 页面回答复杂问题的 agent skill的参考手册详解。它覆盖 skill 的全部作者侧约定——稿件 frontmatter 与面板排版、页面上回复与ask决策块、src/diff代码块、图片嵌入、语言识别、自定义主题、更新与清理、配置项和写作检查——并结合仓库源码src/下各模块逐条验证这些规则的底层实现与边界条件帮助你既能直接照抄这些写法也能理解每条规则为什么这样设计。前提需要 Node.js 20 或更新版本见 package.json 中engines.node: 20CLI 已随 skill 打包在 scripts/am.mjs没有单独的npm install步骤。稿件格式用 Markdown 写出一个页面Agent 写的是扩展 Markdown一段 frontmatter 决定模板与主题正文里每个##标题是一个面板代码围栏的语言名决定渲染成什么组件。完整骨架如下--- template: sheet # sheet 是多面板网格默认doc 是单栏长文加目录 theme: auto # auto默认长文用 paper有图表用 blueprint也可写 blueprint、shadcn、paper 或你自己的主题 title: 页面标题 subtitle: 一句话说明 cols: 3 # sheet 的列数 source: RFC 9293 # 其他任意字段会显示在标题下方 --- 导语写一两句核心结论。 ## A 面板标题 {span2 meta右上角的小字} 这里写普通 Markdown段落、列表、表格都行。 flow LR A - B: 标签 面板panel规则每个##开头的标题是一个面板。面板编号 A、B、C 可以不写会自动补上。span2让面板占两列rows2让面板占两行bare会去掉面板的标题栏。span只是提示页面会按内容调整每个面板的大小宽表格和宽图不需要写span只有想让某个面板更突出时才写span。rows只对普通网格生效关闭 JavaScript、打印和窄屏时浏览器里的对齐排版会忽略它。组件覆盖不到的情况可以用html或svg直接嵌入原始代码逃生舱。CLI 的am help html帮助里还建议原始标记中用主题变量var(--ink)、var(--accent)之类写颜色内容才能在不同主题和明暗模式下保持可读。host这样的占位符会按文字显示。句子里只保留行内标签b、kbd、sup、a、span、br、img等会破坏页面的标签script、style、iframe等也按文字显示。原始标记请放进html或svg代码块代码请放进反引号。渲染时会列出被改动的每个标签。最后一条背后是 raw-html.js 里的标签过滤器模块顶部维护了两份名单——NEVERscript、style、iframe、title、svg等 20 多个会改变页面解析或加载外部资源的元素一律降级为文字和PHRASINGa、b、kbd、sup、span、br、img等允许出现在句子中的行内元素。每一处被降级的标签都会通过note()上报一条提示CLI 打印在渲染输出里方便你回去改稿件。注释未闭合、标签名不合法、行内句子里塞块级元素等也各有专门的降级理由见 src/raw-html.js#L19-L28 的REASON表。一个带 frontmatter 和组件围栏的完整稿件可以见 examples/tcp.md。每个组件的完整写法随时可用am help 组件名查询am help format输出的是与本节一致的格式说明源码中的FORMAT字符串src/cli.js#L52-L82。在页面上回复评论与 ask 决策块每个页面都有回复按钮。读者可以在任意面板上写评论面板标题栏里的气泡按钮然后把一段 Markdown 回复复制给 Agent。刷新页面后选择和评论都还在。需要读者做决定时在受影响的面板里写一个ask块ask 用哪个缓存 * Redis | 重启后数据还在 - Memcached | 更简单不落盘 第一行是问题。每个选项以*建议项默认选中或-开头写 2 到 6 个选项。单选必须有且只有一个*。ask multi允许多选*标出默认勾选的选项。回复会写明每个决定是读者改过的、确认了建议还是没有作答。评论原文以引用的形式返回。完整写法am help ask仓库里另有一个ask组件的预设样张页面可作参照site/presets/components/ask.md。代码块引用真实代码用 diff 展示改动引用项目里已有的代码项目里已有的代码直接引用文件不用手抄ts srcserver/routes.ts lines18-30 hl22 语言名不是组件名的 fence 都是代码块带标题栏和复制按钮。src读取文件lines18-30选出要显示的行行号与文件一致。代码块里不写内容。路径从当前目录读取只引用当前目录里的文件。hl22或hl20-22,25高亮指定行。手写的代码用titlelimits.ts · sketch命名用start38让行号从 38 开始。代码块超过 40 行会收到提醒超过 200 行会报错。渲染结果会列出嵌入了哪些文件。页面会记住路径am patch会重新读取文件文件已经移动时就用页面里已有的那份。源码层面这些数字是写死的常量MAX_CODE_LINES 200、LONG_CODE_LINES 40src/code.js#L13-L15。超过 200 行抛出CodeError拒绝渲染40200 行之间只产生一条code-length警告页面照写。引用机制上还有限制文件体积不超过 2 MB、拒绝二进制文件的检查src/code.js#L83-L107。密钥保护规则。按惯例存放密钥的文件.env、*.pem、id_rsa、.ssh/、.git/等以及任何位置含有疑似密钥或 token 的文件都会被拒绝。规则与 html-plan 一致。实现上分三层src/code.js#L24-L33SECRET_FILE文件名模式匹配.env但放行.env.example/.env.sample/.env.template、.netrc、.npmrc、id_rsa/id_ed25519、credentials*、*secrets*、*.pem/*.key/*.tfstate/*.kdbx等SECRET_DIR路径中任何一层是.git、.ssh、.aws、.azure、.gnupg、.kube、.docker、.password-store就整体拒绝SECRET_TEXT全文扫描文本内容匹配sk-ant-、AKIA、-----BEGIN ... PRIVATE KEY、ghp_/github_pat_、Slackxox*、GoogleAIza、JWTeyJ...形态以及password/api_key/access_token等键名后跟 12 位以上非空值的情况——文件只要任何位置命中整份文件都不嵌入。只引用当前目录里的文件对应localPath()相对路径解析后如果离开baseDir..前缀或绝对路径逃逸返回 null 并报错outside the current folder。这样一份来自 stdin 的稿件无法把机器上其他目录的文件拉进页面。补丁时的回退。渲染出的每个代码块都带data-am-src/data-am-lines属性src/code.js#L164readEmbeddedCode()会把页面里已有的代码存成path#lines → 行内容的映射。am patch时若原文件已移动就用页面里记住的那份src/cli.js#L402 把knownCode传进renderDoc。diff 块CLI 负责绘制要展示一处改动在difffence 里贴上 unified diffdiff filesrc/code.js -60,3 60,3 export function parseCodeArgs(args) { - const attrs parseAttrs(args); const attrs parseAttrs(args, { diff: true }); const opts {}; 以开头的行是新增绿色-是删除红色空格开头是上下文。 -60,3 60,3 开始一个 hunk显示为一条细分隔行并决定行号旧行号和新行号各占一列。没有时startN从 N 开始编号两者都没有就不显示行号。file写在标题栏里语言标签取自它的扩展名没有file时用 b/path那一行的路径。标题栏还会显示统计例如1 −1。复制按钮按原样复制 diff。hl用新文件一侧的行号。diff --git、---、和\ No newline at end of file行可以保留但不会显示。不以、-、空格或开头的行会报错...这样的省略行也会报错请拆成两个 hunk。hunk 的行数与头不符会收到提醒。diff暂不支持src请直接贴 diff。限制与其他代码块相同。解析在 diff.js 中完成parseDiff()逐行校验并计算新旧行号格式问题抛DiffError带行号行数与头不符只产生警告。hunk 省略行.../...之所以是硬错误是因为行号栏无法知道跳过了多少行hl需要行号存在或start且只能指向新文件一侧的行src/code.js#L178-L181。完整写法am help code。图片把现有图片嵌入单文件页面图表表达不了的内容比如真实的界面可以用已经存在的图片文件游戏的三种观战视角图片单独写一行。alt 文字会成为图注所以要写这张图显示了什么。写作检查也会读它。请用绝对路径。相对路径从稿件文件所在的目录读取稿件来自 stdin 时从当前目录读取。路径里有空格也可以。支持 PNG、JPG、GIF、WebP、AVIF 和 SVG单个文件不超过 5 MB。图片会嵌入页面页面仍是一个能离线打开的文件。宽图会缩小到面板的宽度。http(s)链接和data:URI 保持原样。链接在打开页面时需要联网。页面会记住每张图片的路径。am patch会重新从文件嵌入图片文件已经移动时就用页面里已有的那份。本工具不生成图片。实现见 images.jsTYPES表定义了六种扩展名到 MIME 类型的映射MAX_IMAGE_BYTES 5 * 1024 * 1024超限时报出具体 MB 数并要求先压缩或裁剪。本地文件读成data:URI 内嵌同时在img上保留data-am-src属性草稿路径供am patch回读相对路径的解析基准在 src/cli.js#L258-L259 确定——文件稿件取稿件所在目录stdin 取当前目录。如果 Markdown 解析后...仍残留为可见文本通常是路径写错渲染直接报错而不是产出一个带破图说明的页面。完整写法am help image。不经过 Agent直接用命令行CLI 就是 skill 目录里的scripts/am.mjsAMskills/answer-me-with-html/scripts/am.mjs node $AM render examples/tcp.md # 渲染并用浏览器打开 node $AM render notes.md -o out.html --no-open # 指定输出位置不自动打开 node $AM render notes.md --theme shadcn # 这一次换主题 node $AM patch page.html --panel 为什么是三次 panel.md # 只换一个 ## 面板覆盖原 HTML node $AM lint notes.md # 只做写作检查 node $AM list # 列出所有组件 node $AM config # 查看配置 # 从 stdin 读取Agent 就是这样调用的 node $AM render - AM_EOF ## A 一个面板 flow A - B: 你好 AM_EOF页面默认保存在~/.answer-me-with-html/pages/。环境变量AM_HOME可以改位置。从 src/cli.js 的完整 USAGE 看CLI 还有以下子命令用法与am相同am是 package.json 中bin注册的名称命令作用am patch html --panel 标题只替换现有页面的一个##面板并原地覆盖该 HTMLam video file [--voice ...] [--mp4]把视频稿件渲染成 3Blue1Brown 风格的讲解视频播放页am theme check name\|file.json检查主题配色并生成样张页am clean [--days N] [--all] [--dry-run]删除过期页面、视频和配音缓存am config [set key value \| get key \| reset [key]]查看或修改配置am help [component\|format\|code\|image\|video\|patch\|theme]查语法几个值得知道的执行细节自动打开的优先级src/cli.js#L269-L275 的shouldOpen--open强制打开 --no-open 环境变量AM_NO_OPEN非 0 即生效CI环境 配置项open。也就是说在 CI 里渲染永远不会弹浏览器--open/--no-open只影响这一次运行。输出路径给了-o就按-o否则写到数据目录的pages/或视频的videos/文件名为标题 slug 时间戳。am patch的行为从页面里隐藏的#am-source一个textarea idam-source读回原始稿件用--panel指定的标题或其字母编号、编号 标题定位##段替换后用当前渲染器重新渲染并覆盖同一个 HTML 文件不产生新的时间戳文件。页面创建时记录的模板、主题、明暗模式和 STE 严格度会被保留src/cli.js#L384-L391之后再改配置不会影响已补丁的页面需要时可加--theme/--mode/--style覆盖。找不到面板或页面没有#am-source时退出码非零且文件不被改动。视频页面会走renderVideo而不是renderDoc配音保持原音--voice显式指定除外。错误输出渲染出错时 CLI 打印L行号 [组件名] 消息并附一段可直接参考的正确示例和am help 组件提示src/cli.js#L599-L604Agent 可以据此一次修好。渲染成功后的提示CLI 会在结果后附加维护通知清理提示、版本更新提示以!开头是给 Agent 看的——Agent 拿这些行去问你而不是自己执行删除。语言稿件语言决定整页的语言稿件的语言决定页面的lang属性、按钮和主题名的语言、字体以及视频播放器的文字。可以在稿头用lang:指定。不写时工具按正文的文字系统识别语言。lang:html lang文案和字体zh、zh-CN、zh-Hans按你写的单独的zh写成zh-CN简体中文zh-Hant、zh-TW、zh-HK、zh-MO按你写的繁体中文繁体字体排在前面en、en-US等英文标签按你写的英文ja、ja-JP按你写的日文日文字体排在前面其他标签如fr、ko按你写的英文文案标签按你写的原样输出zh-tw和zh_TW都会写成zh-TW。空值、und或无效的值会被忽略由正文决定。正文的文字识别为汉字zh-CN简体只在繁体里出现的字比只在简体里出现的字多时识别为zh-Hant汉字加假名ja谚文ko西里尔、阿拉伯、希伯来、泰、希腊文字ru、ar、he、th、el取该文字最常见的语言拉丁字母en写英文以外的拉丁字母语言时请显式声明语言。中文太短或太平淡、看不出繁体字时两种写法共用的字什么都说明不了会按简体处理也请声明。需要精确语言时同样要声明阿拉伯文字也用来写波斯语西里尔文字也用来写乌克兰语。打补丁am patch的页面会保留原来的语言除非稿件里声明了语言。实现集中在 language.js全仓库只有这一处决定语言页面、视频、按钮文案、字体、写作检查、旁白都读它的结果判定顺序是稿件声明的lang→ 页面原有语言补丁场景且不算声明→ 按正文检测resolveLanguagesrc/language.js#L93-L111。声明值用Intl.getCanonicalLocales校验空值、und、无效值返回 null 交给检测有效的值只把zh_tw这类下划线规范化为连字符大小写按你写的保留单独的zh则写成zh-CN。繁简判定比较只在简体中出现的字与只在繁体中出现的字两个字符表han-forms.js 的SIMPLIFIED_ONLY/TRADITIONAL_ONLY繁体独有字更多才判zh-Hant含假名判ja谚文密度超过汉字一半判ko西里尔等文字取该文字最常见的语言——注释里明确说这是启发式需要精确时应声明。图表换行与按语言走的检查。图表里的文字按各自文字系统的单位换行汉字、假名和全角字符一字一单位用空格分词的文字按词换行不用空格分词的文字泰文、老文、高棉文、缅甸文按词典分词长句不会把节点撑宽。整行放不下的词会退回到按字形簇grapheme拆分组合符号不会和基字符分开。写作检查同样按语言走中文、英文和日文保持原有规则其他语言只用语言中立的规则句长按词数计中日文按字数计段长不用空格分词的文字用与图表换行同一份文字列表找词。自定义主题一个 JSON 文件就是一个主题在~/.answer-me-with-html/themes/里放 JSON 文件一个文件就是一个主题文件名就是主题名themes/notes.json对应主题notes。选择方式和内置主题相同在稿件里写theme: notes或者用--theme notes、am config set theme notes。Agent 写的稿件不变所以自定义主题不会给每次回答增加成本。{ label: { zh: 笔记, en: Notes, ja: ノート }, tokens: { common: { --font-sans: \IBM Plex Sans\, \Noto Sans CJK SC\ }, light: { --bg: #f7f5ef, --paper: #fffdf8, --ink: #1f1d1a }, dark: { --bg: #14130f, --paper: #1c1b17, --ink: #eeeae0 } }, css: .am-panel-head { letter-spacing: 0.01em; } }亮色和暗色都要写全所有颜色变量。am help theme会列出这些变量源码中即COLOR_TOKENSsrc/themes/check.js并给出完整格式。字体只能写本机已安装的字体。系统会自动加上默认字体作为回退没装这些字体的读者也能正常阅读。css里每条选择器都以开头。代表主题的根节点这样这些规则只在这个主题下生效。每个页面都内嵌了内置主题和它自己的主题所以换一台电脑也能打开。am theme check notes会检查亮暗两套配色里缺少的变量、无效的颜色值和过低的对比度并生成两页包含全部组件的样张。am theme check的对比度门槛来自 src/cli.js 中的THEME_HELP低于 WCAG AA 会报告——正文文本 4.5:1状态徽章 3:1低于 4.5:1 给出警告。样张页会把所有组件各渲染一版specimenDraft()亮、暗各一页一眼看出主题在各组件上的效果。主题文件读取在 themes/user.js文件名只允许小写字母、数字和连字符且不能与内置主题同名有问题的文件会被跳过并给出一行警告。页面创建时主题名会记在根标签上因此用某个用户主题生成的页面如果之后该主题文件被删了am patch不会静默换肤而是要求你加--theme显式指定src/cli.js#L376-L381。更新与清理更新需要手动更新但有新版本时会提醒你。工具每周在后台向 GitHub 查询一次最新版本号只读这一个数字不上传任何内容也不会拖慢你要的页面。有新版本时下一次出页面会附一行提示Agent 会问你要不要更新。关掉提醒/answer-me-with-html:config update_check off。安装方式更新方法npx skills addnpx skills update answer-me-with-html -y或直接对 Agent 说更新一下 answer-me-with-htmlgit clonenpm link在仓库目录运行git pull npm installClaude Code 插件终端运行claude plugin update answer-me-with-htmlanswer-me-with-html或在/plugin→ Installed 里点 Update now再/reload-plugins。想自动更新就在/plugin→ Marketplaces 里给这个插件市场打开自动更新。第三方插件市场默认不自动更新后台检查由每次渲染成功后的afterRender触发src/housekeeping.js#L80-L96满足间隔条件时以__update-check子命令在后台 spawn 自己见 src/update.js提示只作为!行打印给 Agent。清理页面、视频和配音缓存都存在~/.answer-me-with-html/。目录超过 200 MB或超过 20 MB 且 30 天没清理过Agent 会问你要不要清理每周最多问一次。没有你的同意什么都不会删。/answer-me-with-html:clean插件或者直接说清理一下页面先预演再问你。am clean删除 30 天前的页面和视频清空配音缓存。--days N改天数--all删除全部页面和视频--dry-run只看不删。配置和主题始终保留。如果pages、videos或cache本身是软链接会被跳过am clean不会碰链接指向的文件用量统计和清理提示也不再计入。如果这些目录无法遍历比如没有读权限同样会被跳过其中的文件不计入用量统计和清理提示显示的大小可能低于实际占用清理也不会删除它们。阈值是常量CLEAN { days: 30, bigBytes: 200MB, staleDays: 30, staleBytes: 20MB, hintEveryDays: 7 }src/housekeeping.js#L8-L14与文档逐项一致。软链接与不可读目录的跳过靠的是walk()全程用lstat而不是stat符号链接目录不作为目录进入src/housekeeping.js#L17-L37所以删除操作永远不会越过链接碰到外部文件。clean()删除后写入lastClean状态--dry-run只统计不动文件。旧的高频模式插件。仓库里已经删掉它但你本机的副本会一直注入提醒直到你卸载。先执行/plugin uninstall answer-me-with-html-alwaysanswer-me-with-html再按 README 加上高频模式的规则。配置六个设置项配置项默认值作用openon生成后自动用浏览器打开。嫌弹窗打扰就关掉themeauto默认主题auto长文用 paper有图表用 blueprint、blueprint、shadcn、paper或你自己的主题modeauto默认明暗auto、light或darkstyle80写作检查off、80只提醒或strict不达标不生成update_checkon每周向 GitHub 查一次新版本并提醒你不会自己更新voiceauto视频配音auto有ELEVENLABS_API_KEY用 ElevenLabs否则用系统语音、elevenlabs、local、system或off配置保存在~/.answer-me-with-html/config.json。稿件里写明的主题优先于默认值。--open和--no-open只影响这一次。实现细节src/config.js六个键及其默认值集中定义在CONFIG_KEYSsrc/config.js#L17-L24与上表一一对应。文件里只保存你显式设置过的键读取时与默认值合并。文件损坏或某个值非法时回退到默认值并给一行警告——配置问题永远不会阻塞渲染例如默认主题指向的自定义主题文件被删掉时会提示正在改用默认主题。布尔值除了on/off还接受true/false/yes/no/1/0以及中文别名开/关/开启/关闭src/config.js#L26-L27。am config不带参数时列出全部键、当前值、可选值并标记你改过的项am config reset [key]恢复默认AM_NO_OPEN环境变量会覆盖open设置am config输出里会专门提示这一点。少一点主动默认情况下只要页面更好懂agent 就会出页面。嫌太多的话有两种办法。两种都不要和高频模式同时用。只在你用话要求时出。把这条规则加到你的规则文件里例如~/.claude/CLAUDE.md或AGENTS.md除非我要求生成页面、图示或可视化讲解或者说我没看懂否则不要使用 answer-me-with-html skill。这条规则在更新后还在。agent 仍然看得到这个 skill所以靠自己的判断遵守规则。只用斜杠命令触发Claude Code。在已安装的SKILL.md的 frontmatter 里加一行disable-model-invocation: true例如~/.claude/skills/answer-me-with-html/SKILL.md。之后 agent 完全看不到这个 skill只有你输入/answer-me-with-html才会出页面。更新会替换这个文件更新后要重新加这一行。写作检查STE 受控写作的机器可查部分Answer me with HTML 把其中容易用机器检查的部分做成了中英双语版每次渲染时顺带检查句长:操作步骤不超过 20 个英文词或 35 个汉字描述性句子不超过 25 词或 45 字。每段最多 6 句。用词:英文换成常见词比如 utilize 改成 use、prior to 改成 before。中文删掉虚动词比如进行优化直接写优化。句式:提示英文被动语态、一句里用了三个以上的的以及赋能闭环这类套话。中文词表:错别字登陆→登录、含糊的量词尽快、若干、大概、多次、数字后的以上 / 以下 / 以内以及一词多写单击→点击、键入→输入、入参→参数。只收几乎不会误报的词取自简明技术中文一套参照 STE 方法整理的中文受控写作规范。日文:含假名的稿件按日文处理页面按钮用日文页面带langja。只检查句长和段长字数上限同中文。要强制指定在稿件里写lang: ja。其他语言:其他语言只检查长度句子按词数计中日文按字数计段落按句数计。英文和中文的词表、被动语态规则都不会作用在它身上。用/answer-me-with-html:config style strict调整严格程度或者在单篇稿件里写style:。源码印证src/lint/ste.js上限是常量LIMITS { zh: { procedural: 35, descriptive: 45 }, en: { procedural: 20, descriptive: 25 } }MAX_SENTENCES 6src/lint/ste.js#L13-L14。列表项按操作步骤procedural计其余按描述性句子计。英文词表与替换建议、中文虚动词表、中文套话表、中文推荐词表分别在 wordlist.en.js 和 wordlist.zh.js被动语态是一条保守的正则is/are/was/were 过去分词。检查范围有意收窄代码和行内代码、删除线反例、状态为no的表格行、标题、callout以外的组件内容都不查图片 alt 文字则当作普通文本查。语言决定规则族ruleFamily()里只有zh/en/ja有专属规则其余语言一律落入neutral中性长度规则日语只跑句长和段长因为日语的的是词缀如基本的而不是中文的结构助词。style三档行为off不检查80默认打印警告但照写页面strict有警告时抛出LintError不写任何文件src/render.js 的LintError、src/cli.js#L586-L588 的退出码逻辑。单独跑am lint file只做检查不出页面strict下有警告时退出码为 1便于放进 Agent 的自检循环。收尾规则从哪里查参考文档的每一节都对应一个am help话题am help format稿件格式、am help code代码块与 diff、am help image图片、am help patch面板补丁、am help theme自定义主题、am help video视频稿件、am help 组件名单个组件语法附示例。这些帮助文本直接内嵌在 src/cli.js 中FORMAT、CODE_HELP、IMAGE_HELP、PATCH_HELP、THEME_HELP等常量随 CLI 一起分发离线可读行为由test/目录下的对应测试如 code.test.js、lint.test.js、patch.test.js约束。遇到文档与行为不一致的疑问以am help输出和源码常量为准——两者都由同一份代码生成与测试。赞分享【免费下载链接】answer-me-with-htmlAnswer me with HTML — an agent skill that answers hard questions with a one-page HTML you can actually read. 让 AI Agent 用一页 HTML 回答复杂问题。项目地址https://gitcode.com/gh_mirrors/an/answer-me-with-html点击查看免费下载相关推荐answer-me-with-html 参考手册草稿格式、代码与图片内嵌、CLI 直调、语言判定与自定义主题answer me with html 参考手册草稿格式、代码与图片内嵌、CLI 直调、语言判定与自定义主题 本篇基于仓库内 docs/reference.manswer-me-with-html用 am video 从一份 Markdown 草稿生成 3Blue1Brown 风格讲解视频的完整机制answer me with html用 am video 从一份 Markdown 草稿生成 3Blue1Brown 风格讲解视频的完整机制 本文基于 doAnswer me with HTML 实例拆解从 examples/tcp.en.md 看懂 Markdown 草稿到 TCP 握手页面的完整链路Answer me with HTML 实例拆解从 examples/tcp.en.md 看懂 Markdown 草稿到 TCP 握手页面的完整链路 exam上一篇如何选择Mihon动画插值器提升用户体验的微交互设计终极指南下一篇android-sunflower中的深色模式切换主题实现成本评估创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考