<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Jacob's wiki Blog</title>
        <link>https://xiebo.fun/blog</link>
        <description>Jacob's wiki Blog</description>
        <lastBuildDate>Sun, 09 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <item>
            <title><![CDATA[GitHub Trending 周报：技能路由、团队记忆与轻量推理一起升温，非 AI 工具转向长期可复用底座（2026-08-09)]]></title>
            <link>https://xiebo.fun/blog/2026/8/9/</link>
            <guid>https://xiebo.fun/blog/2026/8/9/</guid>
            <pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 继续被 AI 主导，但焦点进一步从“单个模型能力”外移到技能路由、团队记忆、低资源推理与终端 agent 等可复用工作系统；与此同时，开源项目管理、隐私前端、数据工程知识库和系统设计教程也说明，开发者仍在持续追捧能长期沉淀的非 AI 底座。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）最值得注意的变化，不是又出现了哪个“更会聊天”的新模型，而是 <strong>围绕 AI 工作系统的中间层继续变热</strong>。榜单前排同时出现了技能路由包、团队级 agent memory、低显存推理方案、终端原生 coding agent，以及把技术资料直接转成 skill 的知识管线，这些项目共同说明：<strong>现在最容易被快速放大的，不是孤立能力，而是能被复用、治理和接进团队流程的 AI 基础设施。</strong></p>
<p>其中最有代表性的几条线非常清楚：像 <a href="https://github.com/zhaoxuya520/reverse-skill" target="_blank" rel="noopener noreferrer" class="">zhaoxuya520/reverse-skill</a> 这类“把复杂工作流封装成 skill router”的项目，说明大家已经不满足于零散提示词；<a href="https://github.com/TencentCloud/TencentDB-Agent-Memory" target="_blank" rel="noopener noreferrer" class="">TencentCloud/TencentDB-Agent-Memory</a> 则把 conversations、docs、code 收敛成共享记忆资产，明显是在回答“多 agent 如何长期协作”；而 <a href="https://github.com/lyogavin/airllm" target="_blank" rel="noopener noreferrer" class="">lyogavin/airllm</a> 与 <a href="https://github.com/esengine/DeepSeek-Reasonix" target="_blank" rel="noopener noreferrer" class="">esengine/DeepSeek-Reasonix</a> 的升温，又分别落在 <strong>低门槛推理</strong> 与 <strong>终端执行层</strong> 这两个最现实的工程落点上。</p>
<p>与此同时，本周非 AI 项目虽然明显更少，但并不弱。像 <a href="https://github.com/usekaneo/kaneo" target="_blank" rel="noopener noreferrer" class="">usekaneo/kaneo</a> 这种开源项目管理工具、<a href="https://github.com/iv-org/invidious" target="_blank" rel="noopener noreferrer" class="">iv-org/invidious</a> 这种隐私友好的 YouTube 前端、<a href="https://github.com/DataExpert-io/data-engineer-handbook" target="_blank" rel="noopener noreferrer" class="">DataExpert-io/data-engineer-handbook</a> 与 <a href="https://github.com/donnemartin/system-design-primer" target="_blank" rel="noopener noreferrer" class="">donnemartin/system-design-primer</a> 这种长期被复用的知识型仓库，都说明一个现实：<strong>当 AI 热点越来越偏“工作系统”时，非 AI 方向真正还能持续吸引注意力的，往往也是那些能沉淀为长期基础设施或长期学习资产的项目。</strong></p>
<blockquote>
<p>说明：本文主要依据 GitHub Trending weekly 页面（<a href="https://github.com/trending?since=weekly%EF%BC%89%E5%AE%9E%E6%97%B6%E6%8A%93%E5%8F%96%E7%BB%93%E6%9E%9C%E3%80%81%E4%BB%93%E5%BA%93%E5%85%AC%E5%BC%80%E6%8F%8F%E8%BF%B0%E4%B8%8E" target="_blank" rel="noopener noreferrer" class="">https://github.com/trending?since=weekly）实时抓取结果、仓库公开描述与</a> GitHub 元数据整理。本次 weekly 页面共解析出 16 个热门仓库；文中“本周新增 stars”来自当次 Trending 页面可见数据，“总 stars”来自写作时的 GitHub 仓库公开元数据。Trending 反映的是本周关注度，不等于长期采用率。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/8/9/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>AI 热点继续从模型能力外移到可复用工作系统。</strong> 技能路由、团队记忆、终端 agent、知识 skill 化与低门槛推理同时升温。</li>
<li class=""><strong>“把经验沉淀成资产”是本周最强信号之一。</strong> 无论是 reverse-skill、TencentDB-Agent-Memory 还是 book-to-skill，本质都在把一次性操作变成长期可共享能力。</li>
<li class=""><strong>推理成本与执行环境仍是刚需。</strong> airllm 的低显存叙事、DeepSeek-Reasonix 的终端原生工作方式，都抓住了开发者最现实的部署和使用痛点。</li>
<li class=""><strong>教育型 AI 内容没有退潮。</strong> AI-For-Beginners 再次走热，说明系统化学习资源依然是 AI 扩散的重要入口。</li>
<li class=""><strong>非 AI 榜单更像“长期底座精选”。</strong> 项目管理、隐私替代前端、数据工程知识库和系统设计教程，都是高复用、长生命周期资产。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/8/9/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-zhaoxuya520reverse-skill">1. <a href="https://github.com/zhaoxuya520/reverse-skill" target="_blank" rel="noopener noreferrer" class="">zhaoxuya520/reverse-skill</a><a href="https://xiebo.fun/blog/2026/8/9/#1-zhaoxuya520reverse-skill" class="hash-link" aria-label="1-zhaoxuya520reverse-skill的直接链接" title="1-zhaoxuya520reverse-skill的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向逆向工程、授权渗透测试和安全研究场景的 skill router pack，把 AI 路由、按需工具链自举和持续演化的知识库打包给 Claude Code、Cursor、Cline 等代码 AI 客户端使用。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>9.6k</strong> stars，总 stars 已达 <strong>2.1 万+</strong>。安全工作本来就高度依赖工具链与经验积累，这类把复杂流程封装成可调用 skill 的项目，天然容易引发专业开发者与安全研究者关注。</li>
<li class=""><strong>有什么新意</strong>：它的亮点不只是“又一个 skill 仓库”，而是把 <strong>技能路由 + 工具链按需启动 + 经验库自动进化</strong> 放在一起。换句话说，它想做的是让 agent 不只会回答，而是更像一套能持续成长的作业系统。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-tencentcloudtencentdb-agent-memory">2. <a href="https://github.com/TencentCloud/TencentDB-Agent-Memory" target="_blank" rel="noopener noreferrer" class="">TencentCloud/TencentDB-Agent-Memory</a><a href="https://xiebo.fun/blog/2026/8/9/#2-tencentcloudtencentdb-agent-memory" class="hash-link" aria-label="2-tencentcloudtencentdb-agent-memory的直接链接" title="2-tencentcloudtencentdb-agent-memory的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个团队级 AI Agent memory hub，把 conversations、docs、code 收敛为 Chat Memory、Skill、LLM-Wiki、Code-Graph 四类可治理、可共享的记忆资产。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>8.0k</strong> stars，总 stars 已到 <strong>1.8 万+</strong>。随着团队不再只用单个聊天助手，而是开始并行使用多个 agent，“记忆如何共享与治理”自然变成新的核心问题。</li>
<li class=""><strong>有什么新意</strong>：它不是简单提供向量库，而是把 <strong>记忆资产化、团队化、跨 agent 复用</strong> 这件事说清楚了。这说明本周的热门点已经从“模型记住什么”升级成“团队如何组织可继承知识”。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-microsoftai-for-beginners">3. <a href="https://github.com/microsoft/AI-For-Beginners" target="_blank" rel="noopener noreferrer" class="">microsoft/AI-For-Beginners</a><a href="https://xiebo.fun/blog/2026/8/9/#3-microsoftai-for-beginners" class="hash-link" aria-label="3-microsoftai-for-beginners的直接链接" title="3-microsoftai-for-beginners的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：微软维护的一套 AI 入门课程，以 12 周、24 课的结构系统讲解人工智能基础。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>7.5k</strong> stars，总 stars 已达 <strong>6.3 万+</strong>。在榜单明显偏向 agent 工程化的背景下，这种课程型项目仍能持续上榜，说明大量开发者仍在补基础，而不是只追逐工具表层体验。</li>
<li class=""><strong>有什么新意</strong>：它真正值得注意的地方，是 <strong>教育资源继续承担生态扩散底座</strong>。当 AI 工具越来越工程化，结构化学习内容反而更重要，因为它决定了更多人能否跟上这一波工具演进。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-lyogavinairllm">4. <a href="https://github.com/lyogavin/airllm" target="_blank" rel="noopener noreferrer" class="">lyogavin/airllm</a><a href="https://xiebo.fun/blog/2026/8/9/#4-lyogavinairllm" class="hash-link" aria-label="4-lyogavinairllm的直接链接" title="4-lyogavinairllm的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个强调超低硬件门槛的大模型推理方案，主打“单张 4GB GPU 也能跑 70B 推理”。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>5.7k</strong> stars，总 stars 已达 <strong>3.0 万+</strong>。无论模型叙事多热，算力门槛始终是最现实的问题之一，因此任何能显著降低本地推理成本的项目都会获得广泛传播。</li>
<li class=""><strong>有什么新意</strong>：它抓住的不是模型效果竞赛，而是 <strong>让更多普通硬件也能参与大模型实验</strong>。这一点非常关键，因为它直接扩大了本地 AI 的可达用户面，而不是只服务高配 GPU 拥有者。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-esenginedeepseek-reasonix">5. <a href="https://github.com/esengine/DeepSeek-Reasonix" target="_blank" rel="noopener noreferrer" class="">esengine/DeepSeek-Reasonix</a><a href="https://xiebo.fun/blog/2026/8/9/#5-esenginedeepseek-reasonix" class="hash-link" aria-label="5-esenginedeepseek-reasonix的直接链接" title="5-esenginedeepseek-reasonix的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 DeepSeek 原生的终端 AI coding agent，围绕 prefix-cache 稳定性来优化持续运行体验。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>4.7k</strong> stars，总 stars 已到 <strong>3.3 万+</strong>。终端原生 coding agent 仍是最容易直接进入开发者日常环境的 AI 形态之一，因此只要在稳定性、延迟和上下文利用上有改进，就很容易集中吸引关注。</li>
<li class=""><strong>有什么新意</strong>：它强调的是 <strong>让 agent 长时间留在终端里稳定工作</strong>，而不是一次性演示。这种对 prefix cache 和持续运行体验的重视，说明大家已经开始把 agent 当作常驻工作伙伴，而不是临时玩具。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-virgiliojr94book-to-skill">6. <a href="https://github.com/virgiliojr94/book-to-skill" target="_blank" rel="noopener noreferrer" class="">virgiliojr94/book-to-skill</a><a href="https://xiebo.fun/blog/2026/8/9/#6-virgiliojr94book-to-skill" class="hash-link" aria-label="6-virgiliojr94book-to-skill的直接链接" title="6-virgiliojr94book-to-skill的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：把技术书、PDF 和文档资料转成可直接给 Claude Code 使用的 skill。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>4.1k</strong> stars，总 stars 已达 <strong>1.9 万+</strong>。开发者越来越不想重复“读完资料再手动整理 prompt”的过程，而是希望把知识直接变成可调用能力。</li>
<li class=""><strong>有什么新意</strong>：它继续强化了今年非常重要的一条线：<strong>知识资产 skill 化</strong>。相比一次性总结文档，这种做法更接近生产管线，也更容易形成团队复用。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/8/9/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周 weekly 依然明显偏 AI，因此这里不刻意追求数量对称，只选出更能代表长期复用价值的非 AI / 泛基础设施项目。它们共同说明：<strong>当注意力高度集中在 AI 工作系统上时，非 AI 项目要想冲出来，往往必须足够“底座化”。</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-usekaneokaneo">1. <a href="https://github.com/usekaneo/kaneo" target="_blank" rel="noopener noreferrer" class="">usekaneo/kaneo</a><a href="https://xiebo.fun/blog/2026/8/9/#1-usekaneokaneo" class="hash-link" aria-label="1-usekaneokaneo的直接链接" title="1-usekaneokaneo的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源项目管理工具，主打不过度臃肿、适合团队真正日常使用的任务与协作体验。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>2.3k</strong> stars，总 stars 已到 <strong>7.7k+</strong>。在越来越多人反思 SaaS 复杂度和订阅成本的背景下，轻量、可自托管、体验现代化的项目管理工具很容易重新获得关注。</li>
<li class=""><strong>有什么新意</strong>：它的吸引力不在“再做一个 Jira 替代品”，而在于强调 <strong>功能克制、界面现代、部署可控</strong>。这类产品说明开发团队仍在积极寻找更低摩擦的协作底座。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-donnemartinsystem-design-primer">2. <a href="https://github.com/donnemartin/system-design-primer" target="_blank" rel="noopener noreferrer" class="">donnemartin/system-design-primer</a><a href="https://xiebo.fun/blog/2026/8/9/#2-donnemartinsystem-design-primer" class="hash-link" aria-label="2-donnemartinsystem-design-primer的直接链接" title="2-donnemartinsystem-design-primer的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个长期知名的系统设计学习仓库，覆盖大规模系统设计基础、面试准备和配套学习材料。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>2.6k</strong> stars，总 stars 已超过 <strong>36 万</strong>。它并不是新项目，却还能在周榜出现，说明结构化、高质量、可反复参考的经典知识库依然拥有极强传播力。</li>
<li class=""><strong>有什么新意</strong>：它的信号不在技术新鲜度，而在 <strong>知识资产的长期复利</strong>。当开发者面对 AI 带来的工具变化时，系统设计这种底层工程能力反而显得更重要。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-iv-orginvidious">3. <a href="https://github.com/iv-org/invidious" target="_blank" rel="noopener noreferrer" class="">iv-org/invidious</a><a href="https://xiebo.fun/blog/2026/8/9/#3-iv-orginvidious" class="hash-link" aria-label="3-iv-orginvidious的直接链接" title="3-iv-orginvidious的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 YouTube 的替代前端，强调隐私、自由访问与更轻量的观看体验。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>997</strong> stars，总 stars 已达 <strong>2.2 万+</strong>。在平台化服务越来越重、越来越依赖账号体系的环境下，替代前端依旧能持续获得关注，说明隐私与可控访问仍是长期需求。</li>
<li class=""><strong>有什么新意</strong>：它代表的不是“新技术炫技”，而是 <strong>去平台依赖的产品态度</strong>。当开发者越来越警惕平台锁定和体验臃肿时，这类项目就会不断被重新看见。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-dataexpert-iodata-engineer-handbook">4. <a href="https://github.com/DataExpert-io/data-engineer-handbook" target="_blank" rel="noopener noreferrer" class="">DataExpert-io/data-engineer-handbook</a><a href="https://xiebo.fun/blog/2026/8/9/#4-dataexpert-iodata-engineer-handbook" class="hash-link" aria-label="4-dataexpert-iodata-engineer-handbook的直接链接" title="4-dataexpert-iodata-engineer-handbook的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个汇集数据工程学习资源的知识型仓库，覆盖大数据、Spark、SQL 等大量主题。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>794</strong> stars，总 stars 已达 <strong>4.3 万+</strong>。虽然它不是新工具，但数据工程依然是企业最稳定的技术投入方向之一，这种高密度资源仓库天然具备持续吸引力。</li>
<li class=""><strong>有什么新意</strong>：它再次证明，<strong>高质量知识导航本身就是基础设施</strong>。尤其在 AI 噪音很多的阶段，能帮助工程师快速建立领域地图的仓库反而更有长期价值。</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="补充观察为什么本周非-ai-代表更像长期资产">补充观察：为什么本周非 AI 代表更像“长期资产”<a href="https://xiebo.fun/blog/2026/8/9/#%E8%A1%A5%E5%85%85%E8%A7%82%E5%AF%9F%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%AC%E5%91%A8%E9%9D%9E-ai-%E4%BB%A3%E8%A1%A8%E6%9B%B4%E5%83%8F%E9%95%BF%E6%9C%9F%E8%B5%84%E4%BA%A7" class="hash-link" aria-label="补充观察：为什么本周非 AI 代表更像“长期资产”的直接链接" title="补充观察：为什么本周非 AI 代表更像“长期资产”的直接链接" translate="no">​</a></h4>
<ul>
<li class="">严格意义上的非 AI 新项目并不多，因此能留下来的，大多是项目管理、隐私前端、知识库这类高复用方向。</li>
<li class="">这些项目虽然不一定最“炫”，但都非常容易解释“为什么开发者愿意立刻收藏并长期使用”。</li>
<li class="">这也说明：<strong>AI 越热，社区越会重新奖励那些真正能沉淀长期价值的底座项目。</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/8/9/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-技能层正在从提示词技巧变成真正的工作系统">1. 技能层正在从提示词技巧变成真正的工作系统<a href="https://xiebo.fun/blog/2026/8/9/#1-%E6%8A%80%E8%83%BD%E5%B1%82%E6%AD%A3%E5%9C%A8%E4%BB%8E%E6%8F%90%E7%A4%BA%E8%AF%8D%E6%8A%80%E5%B7%A7%E5%8F%98%E6%88%90%E7%9C%9F%E6%AD%A3%E7%9A%84%E5%B7%A5%E4%BD%9C%E7%B3%BB%E7%BB%9F" class="hash-link" aria-label="1. 技能层正在从提示词技巧变成真正的工作系统的直接链接" title="1. 技能层正在从提示词技巧变成真正的工作系统的直接链接" translate="no">​</a></h4>
<p>reverse-skill 与 book-to-skill 一起走热，说明 skill 已经不只是“写几个模板提示词”，而是在向 <strong>路由、编排、知识承载和经验复用</strong> 演进。接下来 skill layer 很可能会像插件生态一样继续扩张。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-团队级-memory-正成为多-agent-协作的关键中间层">2. 团队级 memory 正成为多 agent 协作的关键中间层<a href="https://xiebo.fun/blog/2026/8/9/#2-%E5%9B%A2%E9%98%9F%E7%BA%A7-memory-%E6%AD%A3%E6%88%90%E4%B8%BA%E5%A4%9A-agent-%E5%8D%8F%E4%BD%9C%E7%9A%84%E5%85%B3%E9%94%AE%E4%B8%AD%E9%97%B4%E5%B1%82" class="hash-link" aria-label="2. 团队级 memory 正成为多 agent 协作的关键中间层的直接链接" title="2. 团队级 memory 正成为多 agent 协作的关键中间层的直接链接" translate="no">​</a></h4>
<p>TencentDB-Agent-Memory 的热度非常说明问题。单个助手的记忆已经不够，大家更在意的是：一个团队里的多个 agent 能否共享上下文、继承经验、复用代码知识。这会是未来 agent 平台竞争的核心层之一。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-本地与低门槛推理仍然是不会过时的刚需">3. 本地与低门槛推理仍然是不会过时的刚需<a href="https://xiebo.fun/blog/2026/8/9/#3-%E6%9C%AC%E5%9C%B0%E4%B8%8E%E4%BD%8E%E9%97%A8%E6%A7%9B%E6%8E%A8%E7%90%86%E4%BB%8D%E7%84%B6%E6%98%AF%E4%B8%8D%E4%BC%9A%E8%BF%87%E6%97%B6%E7%9A%84%E5%88%9A%E9%9C%80" class="hash-link" aria-label="3. 本地与低门槛推理仍然是不会过时的刚需的直接链接" title="3. 本地与低门槛推理仍然是不会过时的刚需的直接链接" translate="no">​</a></h4>
<p>airllm 的传播力再次说明，开发者仍然非常在意“我自己的设备到底能不能跑”。只要算力门槛还高，任何能显著拉低硬件要求的方案都会持续受到欢迎。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-终端-agent-的竞争�焦点正在转向稳定常驻而不是单次演示">4. 终端 agent 的竞争焦点正在转向稳定常驻，而不是单次演示<a href="https://xiebo.fun/blog/2026/8/9/#4-%E7%BB%88%E7%AB%AF-agent-%E7%9A%84%E7%AB%9E%E4%BA%89%E7%84%A6%E7%82%B9%E6%AD%A3%E5%9C%A8%E8%BD%AC%E5%90%91%E7%A8%B3%E5%AE%9A%E5%B8%B8%E9%A9%BB%E8%80%8C%E4%B8%8D%E6%98%AF%E5%8D%95%E6%AC%A1%E6%BC%94%E7%A4%BA" class="hash-link" aria-label="4. 终端 agent 的竞争焦点正在转向稳定常驻，而不是单次演示的直接链接" title="4. 终端 agent 的竞争焦点正在转向稳定常驻，而不是单次演示的直接链接" translate="no">​</a></h4>
<p>DeepSeek-Reasonix 强调 prefix-cache 稳定性，本质是在回答一个更成熟的问题：agent 能否一直开着、持续可靠地工作。这个方向比单纯追求 demo 漂亮更贴近日常开发流程。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-非-ai-项目开始更集中地体现长期复用价值">5. 非 AI 项目开始更集中地体现“长期复用价值”<a href="https://xiebo.fun/blog/2026/8/9/#5-%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E5%BC%80%E5%A7%8B%E6%9B%B4%E9%9B%86%E4%B8%AD%E5%9C%B0%E4%BD%93%E7%8E%B0%E9%95%BF%E6%9C%9F%E5%A4%8D%E7%94%A8%E4%BB%B7%E5%80%BC" class="hash-link" aria-label="5. 非 AI 项目开始更集中地体现“长期复用价值”的直接链接" title="5. 非 AI 项目开始更集中地体现“长期复用价值”的直接链接" translate="no">​</a></h4>
<p>kaneo、Invidious、data-engineer-handbook、system-design-primer 虽然赛道不同，但都不是一次性热点项目，而是 <strong>可以长期使用、长期参考、长期沉淀</strong> 的底座型资产。这和 AI 榜单里的“技能化、记忆化、资产化”其实形成了镜像关系。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/8/9/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>Skill router 与知识 skill 化继续升温</strong>：AI 的可复用能力层，正在比单个 prompt 更重要。</li>
<li class=""><strong>团队级 memory 成为热门方向</strong>：多 agent 协作开始要求共享知识、共享代码理解与共享历史上下文。</li>
<li class=""><strong>低资源推理依旧能强烈引爆传播</strong>：只要能把大模型能力下沉到更普通的硬件，就会持续获得广泛注意力。</li>
<li class=""><strong>终端原生 coding agent 进入“稳定常驻”阶段</strong>：开发者开始更看重长时间运行的可靠性，而不是一次性演示效果。</li>
<li class=""><strong>非 AI 榜单更像长期底座精选</strong>：项目管理、隐私替代前端和工程知识库，说明社区依旧会为高复用资产买单。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/8/9/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>如果说前几周的 Trending 还在不断证明“AI 能接进更多场景”，那么这一周更像是在回答另一个问题：<strong>这些能力怎样才能被真正沉淀为长期可继承资产？</strong></p>
<p>本周最热的一批项目，恰好给出了几种不同答案：reverse-skill 在做技能路由与作业系统化，TencentDB-Agent-Memory 在做团队共享记忆层，book-to-skill 在做知识到技能的转译，airllm 在做低门槛推理可达性，DeepSeek-Reasonix 在做终端常驻执行层，AI-For-Beginners 则继续承担教育扩散底座。与此同时，kaneo、Invidious、data-engineer-handbook 和 system-design-primer 也提醒我们：真正能留下来的项目，无论是不是 AI，最终都要变成 <strong>可复用、可积累、可长期依赖</strong> 的基础设施。</p>
<p>我本周最想继续追踪的组合线，是 <strong>skill layer + 团队 memory + 低门槛推理 + 终端常驻 agent</strong>。因为当这几层越来越成熟之后，AI 才会更像一个真实可运营的工作系统，而不是一组分散的炫技能力。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Agent 浏览器、技能管线与统一网关继续升温，去中心化通信和空间工具稳住非 AI 代表（2026-08-02)]]></title>
            <link>https://xiebo.fun/blog/2026/8/2/</link>
            <guid>https://xiebo.fun/blog/2026/8/2/</guid>
            <pubDate>Sun, 02 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 明显由 agent 基础设施主导：浏览器自动化、代码评审、技能生成、统一 AI 网关和 AI 入门课程一起升温；与此同时，bitchat、Pascal Editor 与 GeoLibre 也说明，去中心化通信、3D 建筑编辑和云原生 GIS 这类真实工具仍能在 AI 高热榜单中持续吸引注意力。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）最鲜明的信号，是 <strong>AI 热点继续从“模型本身”外移到“围绕 agent 的执行环境、技能资产和接入层”</strong>。榜单里最有代表性的几个项目，不再只是新的聊天产品，而是让 AI 更容易接管浏览器、读代码、学习外部知识、统一调用模型和批量落地到开发工作流的基础设施。</p>
<p>像 <a href="https://github.com/citrolabs/ego-lite" target="_blank" rel="noopener noreferrer" class="">citrolabs/ego-lite</a> 这种给 agent 用的浏览器、<a href="https://github.com/alibaba/open-code-review" target="_blank" rel="noopener noreferrer" class="">alibaba/open-code-review</a> 这种把规则引擎和 LLM 结合起来做代码审查的工具、<a href="https://github.com/virgiliojr94/book-to-skill" target="_blank" rel="noopener noreferrer" class="">virgiliojr94/book-to-skill</a> 这种把 PDF/文档直接转成 skill 的管线、<a href="https://github.com/diegosouzapw/OmniRoute" target="_blank" rel="noopener noreferrer" class="">diegosouzapw/OmniRoute</a> 这种统一 AI 提供商入口的网关，都说明一件事：<strong>现在最容易爆发的，不只是“更聪明的模型”，而是“更低摩擦的 AI 使用系统”。</strong></p>
<p>与此同时，非 AI 项目虽然数量不多，但仍然很有代表性。像 <a href="https://github.com/permissionlesstech/bitchat" target="_blank" rel="noopener noreferrer" class="">permissionlesstech/bitchat</a> 这样的去中心化通信工具、<a href="https://github.com/pascalorg/editor" target="_blank" rel="noopener noreferrer" class="">pascalorg/editor</a> 这样的 3D 建筑编辑器、<a href="https://github.com/opengeos/GeoLibre" target="_blank" rel="noopener noreferrer" class="">opengeos/GeoLibre</a> 这样的云原生 GIS 平台，分别对应离线通信、专业创作和地理数据分析这些真实场景。它们提醒我们：<strong>当 AI 叙事越来越热时，真正能长期留下来的项目，往往仍然是那些能够直接进入具体工作场景的产品。</strong></p>
<blockquote>
<p>说明：本文主要依据 GitHub Trending weekly 页面（<a href="https://github.com/trending?since=weekly%EF%BC%89%E5%AE%9E%E6%97%B6%E6%8A%93%E5%8F%96%E7%BB%93%E6%9E%9C%E3%80%81%E4%BB%93%E5%BA%93%E5%85%AC%E5%BC%80%E6%8F%8F%E8%BF%B0%E3%80%81README" target="_blank" rel="noopener noreferrer" class="">https://github.com/trending?since=weekly）实时抓取结果、仓库公开描述、README</a> 与 GitHub 元数据整理。本次 weekly 页面共解析出 18 个热门仓库；文中“本周新增 stars”来自当次 Trending 页面可见数据，“总 stars”来自写作时的 GitHub 仓库公开元数据。Trending 反映的是本周关注度，不等于长期采用率。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/8/2/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>Agent 基础设施仍是本周主线。</strong> 浏览器执行层、代码审查层、技能生成层、统一网关层一起升温，说明开发者已经在补“如何把 AI 接进真实系统”。</li>
<li class=""><strong>“把知识做成 skill”正在变成热门模式。</strong> 无论是 book-to-skill 还是更广义的技能仓库思路，本质上都是把一次性阅读和提示词经验转成长期可复用资产。</li>
<li class=""><strong>统一 AI 接入层继续被追捧。</strong> OmniRoute 这类项目的热度，说明大家越来越不想为不同模型、不同额度和不同供应商分别维护复杂接入逻辑。</li>
<li class=""><strong>代码工作流里的 AI 正从写代码转向审代码。</strong> open-code-review 的走热很能说明问题：团队开始在意可审查、可治理、可落到 CI 的评审能力，而不是只看生成能力。</li>
<li class=""><strong>严格非 AI 项目仍然偏少，但都很像真实工具。</strong> bitchat、Pascal Editor、GeoLibre 代表的是通信、创作和地理分析这三类“离不开实际使用场景”的软件。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/8/2/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-diegosouzapwomniroute">1. <a href="https://github.com/diegosouzapw/OmniRoute" target="_blank" rel="noopener noreferrer" class="">diegosouzapw/OmniRoute</a><a href="https://xiebo.fun/blog/2026/8/2/#1-diegosouzapwomniroute" class="hash-link" aria-label="1-diegosouzapwomniroute的直接链接" title="1-diegosouzapwomniroute的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个统一 AI 网关，把数百个模型与提供商整合到单一入口里，支持 Claude Code、Codex、Cursor、Cline、Copilot 等常见开发者工具。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>7.3k</strong> stars，总 stars 已达 <strong>3.7 万+</strong>。这类项目持续升温，直接反映出开发者对“统一接入、自动回退、额度复用、少折腾”的强需求。</li>
<li class=""><strong>有什么新意</strong>：它不再只卖“多模型接入”这个概念，而是强调 <strong>免费额度聚合、配额感知和 token 压缩</strong>。换句话说，它要解决的是 AI 生产成本和供应商碎片化，而不是单纯做一层代理转发。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-virgiliojr94book-to-skill">2. <a href="https://github.com/virgiliojr94/book-to-skill" target="_blank" rel="noopener noreferrer" class="">virgiliojr94/book-to-skill</a><a href="https://xiebo.fun/blog/2026/8/2/#2-virgiliojr94book-to-skill" class="hash-link" aria-label="2-virgiliojr94book-to-skill的直接链接" title="2-virgiliojr94book-to-skill的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：把技术书、PDF、文档目录等资料转成可直接给 Claude Code、Copilot CLI 等工具使用的 agent skill。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>5.1k</strong> stars，总 stars 已到 <strong>1.5 万+</strong>。这个热度背后是一个很现实的需求：大家不想每次都重新读文档、重新写 prompt，而是想把知识直接沉淀成工具可调用的工作资产。</li>
<li class=""><strong>有什么新意</strong>：它抓住了今年非常重要的一条线——<strong>知识资产 skill 化</strong>。从“看书”到“把书变成 agent 能调用的能力”，中间少了很多手工整理成本，也让技能复用更接近工程流程。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-alibabaopen-code-review">3. <a href="https://github.com/alibaba/open-code-review" target="_blank" rel="noopener noreferrer" class="">alibaba/open-code-review</a><a href="https://xiebo.fun/blog/2026/8/2/#3-alibabaopen-code-review" class="hash-link" aria-label="3-alibabaopen-code-review的直接链接" title="3-alibabaopen-code-review的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源代码评审工具，采用“确定性规则流水线 + LLM Agent”的混合架构，支持行级评论，并内置常见代码风险规则。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>4.7k</strong> stars，总 stars 已达 <strong>1.7 万+</strong>。代码评审本来就是企业开发流程里最稳定的刚需之一，而“能接到 CI/PR 流程里”的 AI 审查工具，天然更容易获得团队关注。</li>
<li class=""><strong>有什么新意</strong>：它不是把评审完全交给模型，而是强调 <strong>规则与模型协同</strong>。这说明本周开发者更看重“可控、可审计、可规模化”的 AI，而不是只追求看起来聪明的生成结果。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-citrolabsego-lite">4. <a href="https://github.com/citrolabs/ego-lite" target="_blank" rel="noopener noreferrer" class="">citrolabs/ego-lite</a><a href="https://xiebo.fun/blog/2026/8/2/#4-citrolabsego-lite" class="hash-link" aria-label="4-citrolabsego-lite的直接链接" title="4-citrolabsego-lite的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个专门给 AI agent 用的浏览器，用来执行浏览器自动化任务，同时保留用户自己的标签页与登录态，不打扰日常使用。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>4.1k</strong> stars，总 stars 达到 <strong>7.4k+</strong>。浏览器自动化一直是 agent 落地最直接的场景之一，而“共享登录状态、零配置、并行执行”这几个关键词对开发者和重度 AI 用户都很有吸引力。</li>
<li class=""><strong>有什么新意</strong>：它体现的是 <strong>agent 专用执行环境</strong> 的产品思路，而不是把现成浏览器硬套给 AI。随着越来越多工作发生在 SaaS 界面里，浏览器层会成为 agent 竞争的关键入口。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-microsoftai-for-beginners">5. <a href="https://github.com/microsoft/AI-For-Beginners" target="_blank" rel="noopener noreferrer" class="">microsoft/AI-For-Beginners</a><a href="https://xiebo.fun/blog/2026/8/2/#5-microsoftai-for-beginners" class="hash-link" aria-label="5-microsoftai-for-beginners的直接链接" title="5-microsoftai-for-beginners的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：微软维护的一套 AI 入门课程，以 12 周、24 课的形式讲解人工智能基础知识。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>3.2k</strong> stars，总 stars 已达 <strong>5.7 万+</strong>。在一个高度被 agent 与工具链主导的榜单里，系统化课程仍然能持续走热，说明市场对 AI 学习内容的需求并没有退潮。</li>
<li class=""><strong>有什么新意</strong>：它的重要性不在“又来一个教程”，而在于 <strong>结构化学习资源仍然是大规模扩散的基础设施</strong>。当越来越多人需要把 AI 真正带进工作流时，入门课程就会重新被看见。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/8/2/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周 weekly 依旧明显偏 AI，因此这里不刻意追求数量对称，只挑出更能代表真实工具需求的非 AI / 泛基础设施项目。它们的共同点是：<strong>不靠 AI 概念，也能直接解释“为什么有人愿意立刻去试”。</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-permissionlesstechbitchat">1. <a href="https://github.com/permissionlesstech/bitchat" target="_blank" rel="noopener noreferrer" class="">permissionlesstech/bitchat</a><a href="https://xiebo.fun/blog/2026/8/2/#1-permissionlesstechbitchat" class="hash-link" aria-label="1-permissionlesstechbitchat的直接链接" title="1-permissionlesstechbitchat的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个去中心化点对点消息应用，支持本地蓝牙 mesh 网络离线通信，并结合 Nostr 做更广域的消息传播。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>5.7k</strong> stars，总 stars 已到 <strong>3.4 万+</strong>。离线通信、无账号、无中心服务器这些关键词，本身就非常容易在开发者和技术社区中引发讨论与尝试。</li>
<li class=""><strong>有什么新意</strong>：它把 <strong>本地蓝牙 mesh + 去中心化互联网协议</strong> 结合在一起，既有极客气质，也有非常清晰的真实使用场景。相较很多纯概念项目，这类“断网也能用”的工具更像底层基础设施。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-pascalorgeditor">2. <a href="https://github.com/pascalorg/editor" target="_blank" rel="noopener noreferrer" class="">pascalorg/editor</a><a href="https://xiebo.fun/blog/2026/8/2/#2-pascalorgeditor" class="hash-link" aria-label="2-pascalorgeditor的直接链接" title="2-pascalorgeditor的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个基于 React Three Fiber 和 WebGPU 的 3D 建筑编辑器，用来创建和分享建筑/空间项目。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>3.0k</strong> stars，总 stars 已达 <strong>2.0 万+</strong>。一方面，浏览器里的高性能 3D 工具本来就稀缺；另一方面，AEC（建筑、工程、施工）方向的开源工具如果做得足够直观，很容易收获跨领域关注。</li>
<li class=""><strong>有什么新意</strong>：它的亮点不在“3D 编辑”这个词本身，而在 <strong>WebGPU + 浏览器创作工具 + 可分享协作</strong> 的组合。这类项目说明专业软件仍在持续 web 化，而且体验正在变得更像现代前端产品。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-opengeosgeolibre">3. <a href="https://github.com/opengeos/GeoLibre" target="_blank" rel="noopener noreferrer" class="">opengeos/GeoLibre</a><a href="https://xiebo.fun/blog/2026/8/2/#3-opengeosgeolibre" class="hash-link" aria-label="3-opengeosgeolibre的直接链接" title="3-opengeosgeolibre的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个轻量、云原生的开源 GIS 平台，可在浏览器、桌面、移动端和 Jupyter Notebook 中使用，用于地理数据可视化、探索与分析。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>3.0k</strong> stars，总 stars 接近 <strong>4.9k</strong>。地理空间工具一直有稳定但相对专业的用户群，而一个强调本地隐私、跨端运行和现代技术栈的 GIS 平台，很容易在本周榜单里脱颖而出。</li>
<li class=""><strong>有什么新意</strong>：它把 <strong>Tauri、DuckDB-WASM Spatial、MapLibre、deck.gl</strong> 这类现代组件结合起来，说明专业分析软件也在走向更轻、更本地优先、更跨端的一体化产品形态。</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="补充观察为什么本周非-ai-项目依然偏少">补充观察：为什么本周非 AI 项目依然偏少<a href="https://xiebo.fun/blog/2026/8/2/#%E8%A1%A5%E5%85%85%E8%A7%82%E5%AF%9F%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%AC%E5%91%A8%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E4%BE%9D%E7%84%B6%E5%81%8F%E5%B0%91" class="hash-link" aria-label="补充观察：为什么本周非 AI 项目依然偏少的直接链接" title="补充观察：为什么本周非 AI 项目依然偏少的直接链接" translate="no">​</a></h4>
<ul>
<li class="">本周榜单前排几乎都在围绕 agent 的执行环境、知识技能化、统一接入和工作流落地展开。</li>
<li class="">能进入代表名单的非 AI 项目，几乎都不是“新奇点子”，而是 <strong>通信、3D 创作、空间分析</strong> 这些已有稳定需求的工具。</li>
<li class="">这再次说明：<strong>AI 越热，真正有生命力的非 AI 项目反而越需要直接对应明确场景。</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/8/2/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-ai-的新热点正在变成低摩擦接入层">1. AI 的新热点正在变成“低摩擦接入层”<a href="https://xiebo.fun/blog/2026/8/2/#1-ai-%E7%9A%84%E6%96%B0%E7%83%AD%E7%82%B9%E6%AD%A3%E5%9C%A8%E5%8F%98%E6%88%90%E4%BD%8E%E6%91%A9%E6%93%A6%E6%8E%A5%E5%85%A5%E5%B1%82" class="hash-link" aria-label="1. AI 的新热点正在变成“低摩擦接入层”的直接链接" title="1. AI 的新热点正在变成“低摩擦接入层”的直接链接" translate="no">​</a></h4>
<p>OmniRoute 这类项目走热，说明大家已经厌倦了为不同模型和不同免费额度到处切换。下一阶段真正有价值的，不只是更强模型，而是 <strong>谁能把模型资源更顺滑地组织起来</strong>。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-skill-化正在从提示词经验升级为知识生产线">2. Skill 化正在从提示词经验升级为知识生产线<a href="https://xiebo.fun/blog/2026/8/2/#2-skill-%E5%8C%96%E6%AD%A3%E5%9C%A8%E4%BB%8E%E6%8F%90%E7%A4%BA%E8%AF%8D%E7%BB%8F%E9%AA%8C%E5%8D%87%E7%BA%A7%E4%B8%BA%E7%9F%A5%E8%AF%86%E7%94%9F%E4%BA%A7%E7%BA%BF" class="hash-link" aria-label="2. Skill 化正在从提示词经验升级为知识生产线的直接链接" title="2. Skill 化正在从提示词经验升级为知识生产线的直接链接" translate="no">​</a></h4>
<p>book-to-skill 的热度很能说明问题。开发者现在要的不是“再给我一个 prompt”，而是 <strong>把书、文档、资料直接转成长期可复用能力</strong>。这会让 AI 的知识利用方式越来越工程化。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-ai-在软件工程里的价值重心正从生成转向治理">3. AI 在软件工程里的价值重心，正从生成转向治理<a href="https://xiebo.fun/blog/2026/8/2/#3-ai-%E5%9C%A8%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E9%87%8C%E7%9A%84%E4%BB%B7%E5%80%BC%E9%87%8D%E5%BF%83%E6%AD%A3%E4%BB%8E%E7%94%9F%E6%88%90%E8%BD%AC%E5%90%91%E6%B2%BB%E7%90%86" class="hash-link" aria-label="3. AI 在软件工程里的价值重心，正从生成转向治理的直接链接" title="3. AI 在软件工程里的价值重心，正从生成转向治理的直接链接" translate="no">​</a></h4>
<p>open-code-review 不是“帮你写更多代码”，而是“帮你更稳定地审代码”。这意味着团队使用 AI 的成熟度在提升：从追求生成速度，转向追求风险控制、规则一致性与流程接入。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-browser-automation-仍是-agent-最现实的落地方向之一">4. Browser automation 仍是 agent 最现实的落地方向之一<a href="https://xiebo.fun/blog/2026/8/2/#4-browser-automation-%E4%BB%8D%E6%98%AF-agent-%E6%9C%80%E7%8E%B0%E5%AE%9E%E7%9A%84%E8%90%BD%E5%9C%B0%E6%96%B9%E5%90%91%E4%B9%8B%E4%B8%80" class="hash-link" aria-label="4. Browser automation 仍是 agent 最现实的落地方向之一的直接链接" title="4. Browser automation 仍是 agent 最现实的落地方向之一的直接链接" translate="no">​</a></h4>
<p>ego-lite 的走热说明，浏览器仍然是 AI 与真实业务系统交互的关键界面。大量 SaaS 工具没有开放到足够好用的 API，能稳定驱动浏览器的 agent 执行层就会持续有价值。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-非-ai-项目继续证明真实工具需求不会消失">5. 非 AI 项目继续证明“真实工具需求”不会消失<a href="https://xiebo.fun/blog/2026/8/2/#5-%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E7%BB%A7%E7%BB%AD%E8%AF%81%E6%98%8E%E7%9C%9F%E5%AE%9E%E5%B7%A5%E5%85%B7%E9%9C%80%E6%B1%82%E4%B8%8D%E4%BC%9A%E6%B6%88%E5%A4%B1" class="hash-link" aria-label="5. 非 AI 项目继续证明“真实工具需求”不会消失的直接链接" title="5. 非 AI 项目继续证明“真实工具需求”不会消失的直接链接" translate="no">​</a></h4>
<p>bitchat、Pascal Editor、GeoLibre 看起来分属完全不同赛道，但本质一样：都直面明确场景，且能立刻上手。这类项目在 AI 高热期仍能拿到关注，说明开发者的注意力并没有完全脱离生产工具本身。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/8/2/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>统一 AI 网关继续变热</strong>：开发者越来越希望一次接入、自动切换、统一管理多个模型与额度。</li>
<li class=""><strong>知识 skill 化成为显性热点</strong>：把文档和书籍转成 agent skill，正在从小众技巧变成主流需求。</li>
<li class=""><strong>AI 代码评审成为更成熟的工程落地点</strong>：规则引擎与 LLM 混合架构，比纯生成叙事更接近团队真实采用。</li>
<li class=""><strong>Agent 浏览器/执行环境仍在上升</strong>：浏览器自动化层很可能会成为未来 agent 平台竞争的核心入口之一。</li>
<li class=""><strong>非 AI 代表更强调可立即使用的真实工具价值</strong>：离线通信、3D 建筑编辑、GIS 分析都说明“能直接解决问题”仍是最硬的热度来源。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/8/2/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>如果说前几周的 Trending 还在不断证明“AI 能做更多事情”，那这一周更像是在回答另一个问题：<strong>这些能力怎样才能被更低成本地接进工作流，并长期复用？</strong></p>
<p>本周最热的一批项目，恰好覆盖了这条链路上的几个关键环节：OmniRoute 负责统一入口，book-to-skill 负责把知识变成能力，open-code-review 负责把 AI 接进工程治理，ego-lite 负责浏览器执行层，AI-For-Beginners 则继续承担教育扩散的基础设施角色。与此同时，bitchat、Pascal Editor 和 GeoLibre 也说明，真正有长期生命力的项目，依然需要站在明确场景和真实工具需求上。</p>
<p>我本周最想继续追踪的组合线，是 <strong>统一 AI 网关 + skill 化知识生产线 + 审代码型 AI 工具 + agent 浏览器执行层</strong>。因为当这些基础层逐渐稳定后，AI 才会越来越像一个可维护、可治理、可复用的工作系统，而不是一组分散的单点能力。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Agent 教材、情报面板与并行工作台一起升温，非 AI 工具继续守住底座（2026-07-26)]]></title>
            <link>https://xiebo.fun/blog/2026/7/26/</link>
            <guid>https://xiebo.fun/blog/2026/7/26/</guid>
            <pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 的主线已经不只是“再来一个 coding agent”，而是 AI Agent 教材、情报面板、skills 资产、代码图谱与并行 agent 工作台同时升温；与此同时，RuView、croc、Pumpkin 也说明，感知底座、通用传输工具和经典开发者基础设施依然能在 AI 高热周期里获得大量关注。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）最明显的变化，是 <strong>开发者对 AI 的关注点继续从“模型会不会回答”外移到“工作系统怎么搭起来”</strong>。榜单前排同时出现了开源教材、情报监控界面、skills 仓库、代码知识图谱和并行 agent 工作台，这些项目虽然形态各不相同，但共同指向一件事：<strong>真正变热的，已经是围绕 agent 的整套生产基础设施。</strong></p>
<p>一边是 <a href="https://github.com/bojieli/ai-agent-book" target="_blank" rel="noopener noreferrer" class="">bojieli/ai-agent-book</a> 这种把设计原理、工程实践和配套代码系统化沉淀下来的教材型项目；另一边是 <a href="https://github.com/koala73/worldmonitor" target="_blank" rel="noopener noreferrer" class="">koala73/worldmonitor</a>、<a href="https://github.com/mattpocock/skills" target="_blank" rel="noopener noreferrer" class="">mattpocock/skills</a>、<a href="https://github.com/tirth8205/code-review-graph" target="_blank" rel="noopener noreferrer" class="">tirth8205/code-review-graph</a>、<a href="https://github.com/stablyai/orca" target="_blank" rel="noopener noreferrer" class="">stablyai/orca</a> 这样分别占据 <strong>情报界面、技能层、结构化代码理解、多 agent 并行调度</strong> 位置的项目。它们说明：今天大家抢的不是单个“最聪明助手”，而是 <strong>谁能把 AI 变成稳定可复用的工作面。</strong></p>
<p>与此同时，这周也不是纯 AI 单边行情。像 <a href="https://github.com/ruvnet/RuView" target="_blank" rel="noopener noreferrer" class="">ruvnet/RuView</a> 这样利用普通 Wi‑Fi 做空间感知的项目、<a href="https://github.com/schollz/croc" target="_blank" rel="noopener noreferrer" class="">schollz/croc</a> 这种老牌跨机传输工具，以及 <a href="https://github.com/Pumpkin-MC/Pumpkin" target="_blank" rel="noopener noreferrer" class="">Pumpkin-MC/Pumpkin</a> 这类高性能基础设施项目，依然能在周榜里拿到相当高的关注度。它们提醒我们：<strong>AI 叙事再热，真正能长期留下来的，通常还是那些能直接进入生产和真实环境的底层能力。</strong></p>
<blockquote>
<p>说明：本文主要依据 GitHub Trending weekly 页面实时抓取结果、仓库公开描述与 GitHub 元数据整理。本次 weekly 页面共解析出 23 个热门仓库；文中“本周新增 stars”来自当次 Trending 页面可见数据，“总 stars”来自写作时的 GitHub 仓库公开元数据。Trending 反映的是“本周被集中关注”，不等于长期采用率。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/7/26/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>“学会怎么做 agent”本身正在成为热点。</strong> ai-agent-book 的爆发说明，市场已经从“看演示”进入“补工程方法论”的阶段。</li>
<li class=""><strong>AI 产品形态继续从聊天框转向持续运行的界面。</strong> worldmonitor 代表的是情报工作台，而不是一次性问答工具。</li>
<li class=""><strong>skills 与代码图谱这类中间层仍在升温。</strong> skills 解决“怎么工作”，code-review-graph 解决“读什么代码”，这两层都比单纯堆模型更贴近落地。</li>
<li class=""><strong>并行 agent 工作台正在变成一条独立赛道。</strong> orca 的热度说明，越来越多人已经默认自己会同时跑多路代理。</li>
<li class=""><strong>严格非 AI 项目数量依旧不多，但能上榜的都很像底座。</strong> RuView、croc、Pumpkin 分别代表空间感知、传输工具和高性能服务基础设施。</li>
<li class=""><strong>本周最值得注意的不是“某个模型更强”，而是围绕 agent 的学习层、操作层和治理层一起冒头。</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/7/26/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-bojieliai-agent-book">1. <a href="https://github.com/bojieli/ai-agent-book" target="_blank" rel="noopener noreferrer" class="">bojieli/ai-agent-book</a><a href="https://xiebo.fun/blog/2026/7/26/#1-bojieliai-agent-book" class="hash-link" aria-label="1-bojieliai-agent-book的直接链接" title="1-bojieliai-agent-book的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一本围绕 AI Agent 的开源书籍仓库，包含《深入理解 AI Agent：设计原理与工程实践》正文、PDF 和按章节组织的配套代码。</li>
<li class=""><strong>为什么这周会热</strong>：它在本周 Trending 页面中拿到约 <strong>16.6k</strong> 新增 stars，是本周最醒目的热点之一。这个数字说明，大家现在不只想“试试 agent”，而是想系统理解 agent 的设计原理、工程结构和实践范式。</li>
<li class=""><strong>有什么新意</strong>：它代表一种非常强的信号——<strong>agent 教材化、课程化、工程知识体系化</strong>。当一个赛道开始需要教材，往往意味着它已经从早期猎奇阶段进入更广泛的工程扩散阶段。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-koala73worldmonitor">2. <a href="https://github.com/koala73/worldmonitor" target="_blank" rel="noopener noreferrer" class="">koala73/worldmonitor</a><a href="https://xiebo.fun/blog/2026/7/26/#2-koala73worldmonitor" class="hash-link" aria-label="2-koala73worldmonitor的直接链接" title="2-koala73worldmonitor的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个实时全球情报面板，把 AI 驱动的新闻聚合、地缘政治监测和基础设施追踪整合进统一界面。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>12.1k</strong> stars，总 stars 已到 <strong>7.4 万+</strong>。它继续走热，不是因为“新闻摘要”这个点子新，而是因为它把多源信息监控做成了一个持续可用的工作台。</li>
<li class=""><strong>有什么新意</strong>：它最关键的地方在于 <strong>把 AI 从对话框里拉出来，变成一直在线的观察面板</strong>。这比“一问一答”更接近真实分析、研究和监控软件。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-mattpocockskills">3. <a href="https://github.com/mattpocock/skills" target="_blank" rel="noopener noreferrer" class="">mattpocock/skills</a><a href="https://xiebo.fun/blog/2026/7/26/#3-mattpocockskills" class="hash-link" aria-label="3-mattpocockskills的直接链接" title="3-mattpocockskills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向工程师的开源 skills 仓库，把规划、调试、测试、评审、研究等工作方法沉淀为可复用的 agent 技能资产。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>11.8k</strong> stars，总 stars 已达 <strong>18.9 万+</strong>。随着 Claude Code、Codex、Cursor、Kimi Code 这类工具日常化，团队开始更关心“如何稳定复用一套工作方式”。</li>
<li class=""><strong>有什么新意</strong>：它把零散提示词经验升级成 <strong>可审查、可组合、可迁移的 skill layer</strong>。这意味着 agent 的竞争，正在从模型能力转向工作流资产。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-tirth8205code-review-graph">4. <a href="https://github.com/tirth8205/code-review-graph" target="_blank" rel="noopener noreferrer" class="">tirth8205/code-review-graph</a><a href="https://xiebo.fun/blog/2026/7/26/#4-tirth8205code-review-graph" class="hash-link" aria-label="4-tirth8205code-review-graph的直接链接" title="4-tirth8205code-review-graph的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 MCP 和 CLI 的本地优先代码智能图谱工具，为代码库建立持久结构图，让 AI 只读取真正相关的上下文。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>6.4k</strong> stars，总 stars 已到 <strong>2.6 万+</strong>。这说明大型仓库 review、上下文膨胀、token 成本和误读无关代码，仍然是工程团队的高频痛点。</li>
<li class=""><strong>有什么新意</strong>：它强调的是 <strong>“少读但读对”</strong>，不是简单把更多文件塞给模型，而是借助结构化图谱做精准理解。这比单纯拉大上下文窗口更有工程价值。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-stablyaiorca">5. <a href="https://github.com/stablyai/orca" target="_blank" rel="noopener noreferrer" class="">stablyai/orca</a><a href="https://xiebo.fun/blog/2026/7/26/#5-stablyaiorca" class="hash-link" aria-label="5-stablyaiorca的直接链接" title="5-stablyaiorca的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向并行 agent fleet 的 ADE（Agent Development Environment），支持在桌面、移动端和 VPS 上管理多路 coding agent。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>7.3k</strong> stars，总 stars 已达 <strong>2.9 万+</strong>。这背后反映的是用户习惯变化：很多人已经不是“开一个助手”，而是同时开多个代理分别做不同任务。</li>
<li class=""><strong>有什么新意</strong>：它做的不是另一个单体 agent，而是 <strong>agent 的工作台和调度层</strong>。这说明多 agent 编排已经从高阶玩法变成真实需求。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/7/26/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周 weekly 依旧明显偏 AI，因此这里不刻意追求和 AI 区数量对称，而是只挑出更有代表性的非 AI / 泛基础设施项目。它们共同说明：即便榜单被 agent 话题强势主导，开发者仍然会把注意力投给真正能落地的底层工具。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-ruvnetruview">1. <a href="https://github.com/ruvnet/RuView" target="_blank" rel="noopener noreferrer" class="">ruvnet/RuView</a><a href="https://xiebo.fun/blog/2026/7/26/#1-ruvnetruview" class="hash-link" aria-label="1-ruvnetruview的直接链接" title="1-ruvnetruview的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个把普通 Wi‑Fi 信号转成实时空间感知、生命体征监测和存在检测能力的项目，而且不依赖摄像头画面。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>5.3k</strong> stars，总 stars 已达 <strong>8.6 万+</strong>。它的传播力很强，因为“普通 Wi‑Fi + 无视频感知”同时踩中了低成本、隐私友好和未来感三个关键词。</li>
<li class=""><strong>有什么新意</strong>：它提醒我们，下一代智能系统的输入不一定是文字和图像，<strong>无线信号本身也可能成为重要感知介质</strong>。这更像长期底层能力，而不是短期话题。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-schollzcroc">2. <a href="https://github.com/schollz/croc" target="_blank" rel="noopener noreferrer" class="">schollz/croc</a><a href="https://xiebo.fun/blog/2026/7/26/#2-schollzcroc" class="hash-link" aria-label="2-schollzcroc的直接链接" title="2-schollzcroc的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个让两台电脑之间安全、快速传文件和文本的经典工具，主打“拿起来就能用”的跨机传输体验。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>2.8k</strong> stars。croc 并不新，但它在 AI 高热榜单里仍能冲出来，说明开发者对 <strong>简单、可靠、跨环境可用</strong> 的基础工具依旧有持续需求。</li>
<li class=""><strong>有什么新意</strong>：它没有依赖 AI 叙事，而是靠极强的问题契合度取胜。很多时候，真正有生命力的项目就是这种把一个常见痛点做到极简顺手的工具。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-pumpkin-mcpumpkin">3. <a href="https://github.com/Pumpkin-MC/Pumpkin" target="_blank" rel="noopener noreferrer" class="">Pumpkin-MC/Pumpkin</a><a href="https://xiebo.fun/blog/2026/7/26/#3-pumpkin-mcpumpkin" class="hash-link" aria-label="3-pumpkin-mcpumpkin的直接链接" title="3-pumpkin-mcpumpkin的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个强调高性能和高效率的 Minecraft 服务器实现，面向自建与托管场景。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>1.6k</strong> stars，总 stars 接近 <strong>1 万</strong>。游戏服务端并不是今年最热的话题，但“性能更高、资源更省、人人可自建”的方向一直稳定有需求。</li>
<li class=""><strong>有什么新意</strong>：它的价值不在概念，而在 <strong>基础设施工程化</strong>。越是长期运行、用户量稳定的服务场景，越会奖励这种真正把性能和部署体验做好的项目。</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="补充观察为什么本周非-ai-项目仍然偏少">补充观察：为什么本周非 AI 项目仍然偏少<a href="https://xiebo.fun/blog/2026/7/26/#%E8%A1%A5%E5%85%85%E8%A7%82%E5%AF%9F%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%AC%E5%91%A8%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E4%BB%8D%E7%84%B6%E5%81%8F%E5%B0%91" class="hash-link" aria-label="补充观察：为什么本周非 AI 项目仍然偏少的直接链接" title="补充观察：为什么本周非 AI 项目仍然偏少的直接链接" translate="no">​</a></h4>
<ul>
<li class="">Weekly 榜单的主要注意力，仍然被 agent、skills、代码图谱、工作台和教材化内容吸走。</li>
<li class="">但能冲出来的非 AI 项目，都非常“底层”：感知、传输、服务端、部署体验。</li>
<li class="">这说明一个现实：<strong>上层 AI 越热，下层基础设施越不会消失，反而更容易因为“真能用”而被重新看见。</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/7/26/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-赛道开始进入方法论补课期">1. Agent 赛道开始进入“方法论补课期”<a href="https://xiebo.fun/blog/2026/7/26/#1-agent-%E8%B5%9B%E9%81%93%E5%BC%80%E5%A7%8B%E8%BF%9B%E5%85%A5%E6%96%B9%E6%B3%95%E8%AE%BA%E8%A1%A5%E8%AF%BE%E6%9C%9F" class="hash-link" aria-label="1. Agent 赛道开始进入“方法论补课期”的直接链接" title="1. Agent 赛道开始进入“方法论补课期”的直接链接" translate="no">​</a></h4>
<p>ai-agent-book 的爆发说明，市场已经不满足于再看几个 demo。真正的需求变成：agent 应该怎么设计、怎么规划工具调用、怎么组织记忆、怎么做工程交付。教材型项目上榜，是赛道成熟度提升的一个标志。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-ai-产品界面正在从聊天框转向持续运行的工作面">2. AI 产品界面正在从聊天框转向持续运行的工作面<a href="https://xiebo.fun/blog/2026/7/26/#2-ai-%E4%BA%A7%E5%93%81%E7%95%8C%E9%9D%A2%E6%AD%A3%E5%9C%A8%E4%BB%8E%E8%81%8A%E5%A4%A9%E6%A1%86%E8%BD%AC%E5%90%91%E6%8C%81%E7%BB%AD%E8%BF%90%E8%A1%8C%E7%9A%84%E5%B7%A5%E4%BD%9C%E9%9D%A2" class="hash-link" aria-label="2. AI 产品界面正在从聊天框转向持续运行的工作面的直接链接" title="2. AI 产品界面正在从聊天框转向持续运行的工作面的直接链接" translate="no">​</a></h4>
<p>worldmonitor 很典型。很多用户想要的不是每次重新提问，而是一个一直在汇总、监控、提醒的界面。未来会有更多 agent 产品长得更像 dashboard、control plane，而不是聊天窗口。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-skills-与代码图谱正在成为-agent-落地的两块中间层">3. Skills 与代码图谱，正在成为 agent 落地的两块中间层<a href="https://xiebo.fun/blog/2026/7/26/#3-skills-%E4%B8%8E%E4%BB%A3%E7%A0%81%E5%9B%BE%E8%B0%B1%E6%AD%A3%E5%9C%A8%E6%88%90%E4%B8%BA-agent-%E8%90%BD%E5%9C%B0%E7%9A%84%E4%B8%A4%E5%9D%97%E4%B8%AD%E9%97%B4%E5%B1%82" class="hash-link" aria-label="3. Skills 与代码图谱，正在成为 agent 落地的两块中间层的直接链接" title="3. Skills 与代码图谱，正在成为 agent 落地的两块中间层的直接链接" translate="no">​</a></h4>
<p>skills 解决的是“用什么方法工作”，code-review-graph 解决的是“到底该读哪些上下文”。这两层都不是模型本身，但都决定 agent 是否能长期进入真实开发流程。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-多-agent-编排从高阶技巧变成大众开发者需求">4. 多 agent 编排从高阶技巧，变成大众开发者需求<a href="https://xiebo.fun/blog/2026/7/26/#4-%E5%A4%9A-agent-%E7%BC%96%E6%8E%92%E4%BB%8E%E9%AB%98%E9%98%B6%E6%8A%80%E5%B7%A7%E5%8F%98%E6%88%90%E5%A4%A7%E4%BC%97%E5%BC%80%E5%8F%91%E8%80%85%E9%9C%80%E6%B1%82" class="hash-link" aria-label="4. 多 agent 编排从高阶技巧，变成大众开发者需求的直接链接" title="4. 多 agent 编排从高阶技巧，变成大众开发者需求的直接链接" translate="no">​</a></h4>
<p>orca 的持续走热说明，同时开多路代理已经越来越常见。接下来大家拼的会是调度、可观测性、状态管理、会话切换和订阅复用，而不只是再做一个“会写代码的窗口”。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-非-ai-项目继续提醒我们底层能力依然是长期价值所在">5. 非 AI 项目继续提醒我们：底层能力依然是长期价值所在<a href="https://xiebo.fun/blog/2026/7/26/#5-%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E7%BB%A7%E7%BB%AD%E6%8F%90%E9%86%92%E6%88%91%E4%BB%AC%E5%BA%95%E5%B1%82%E8%83%BD%E5%8A%9B%E4%BE%9D%E7%84%B6%E6%98%AF%E9%95%BF%E6%9C%9F%E4%BB%B7%E5%80%BC%E6%89%80%E5%9C%A8" class="hash-link" aria-label="5. 非 AI 项目继续提醒我们：底层能力依然是长期价值所在的直接链接" title="5. 非 AI 项目继续提醒我们：底层能力依然是长期价值所在的直接链接" translate="no">​</a></h4>
<p>RuView、croc、Pumpkin 三个方向差异很大，但共同点很清楚：它们都直接对应真实世界中的长期需求。一个赛道是不是只有短期热度，往往就看这种底层项目还能不能持续获得注意力。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/7/26/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>AI Agent 的“教材化”正在发生。</strong> 这意味着工程方法论开始比单次体验更重要。</li>
<li class=""><strong>情报面板型产品继续升温。</strong> AI 正在被包装成持续运行的软件界面，而不是一次性对话。</li>
<li class=""><strong>Skill layer 和代码图谱仍是今年最值得盯的中间层。</strong> 它们直接决定 agent 的复用性与上下文效率。</li>
<li class=""><strong>并行 agent 工作台越来越像默认配置。</strong> 多代理协作从极客玩法变成日常需求。</li>
<li class=""><strong>非 AI 热点虽少，但更像真正承接生产的底座。</strong> 感知、传输与高性能服务基础设施仍然有强韧吸引力。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/7/26/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>如果说前几周的 Trending 还在不断证明“agent 可以做越来越多事”，那么这一周更值得记住的问题是：<strong>这些能力最终如何被教会、被组织、被调度、被稳定复用？</strong></p>
<p>本周榜单给出的答案相当清晰：有人在补教材，有人在做情报工作台，有人在沉淀技能资产，有人在建立代码图谱，有人在做多 agent 工作面。与此同时，RuView、croc、Pumpkin 也说明，真正能承接这波浪潮的，依然是那些可以进入现实环境、长期运行、稳定复用的基础设施。</p>
<p>我本周最想继续追踪的组合线，是 <strong>agent 教材化 + 情报工作台 + skill layer + 代码图谱 + 并行 agent 调度</strong>。因为当这几层逐步稳定后，AI 才会越来越像一个可运营、可维护、可治理的工作系统，而不只是一次次令人兴奋的演示。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Skills 成为 Agent 新分发层，视频编辑与知识图谱一起升温（2026-07-19）]]></title>
            <link>https://xiebo.fun/blog/2026/7/19/</link>
            <guid>https://xiebo.fun/blog/2026/7/19/</guid>
            <pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 的主线不再只是“又一个 agent”，而是 skills、知识图谱、办公文档、交易代理、并行编排与终端执行这些更贴近工作流落地的能力开始同时升温；严格非 AI 项目仍然稀少，但 OpenCut、Abseil、ui-skills 也说明内容生产底座、基础库与设计工程资产仍有稳定吸引力。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）最大的变化，是 <strong>Agent 生态开始出现更清晰的“能力封装层”</strong>。如果说前几周大家还在争论 agent 会不会写代码、能不能多开、能不能接浏览器或 Office，那么这周更值得注意的问题变成了：<strong>这些能力如何被沉淀成可复用、可传播、可组合的资产？</strong></p>
<p>从榜单看，答案越来越接近一个词：<strong>skills</strong>。无论是 <a href="https://github.com/mattpocock/skills" target="_blank" rel="noopener noreferrer" class="">mattpocock/skills</a>、<a href="https://github.com/Nutlope/hallmark" target="_blank" rel="noopener noreferrer" class="">Nutlope/hallmark</a>、<a href="https://github.com/ibelick/ui-skills" target="_blank" rel="noopener noreferrer" class="">ibelick/ui-skills</a>，还是更偏工程能力层的 <a href="https://github.com/Graphify-Labs/graphify" target="_blank" rel="noopener noreferrer" class="">Graphify-Labs/graphify</a>、<a href="https://github.com/iOfficeAI/OfficeCLI" target="_blank" rel="noopener noreferrer" class="">iOfficeAI/OfficeCLI</a>、<a href="https://github.com/stablyai/orca" target="_blank" rel="noopener noreferrer" class="">stablyai/orca</a>，它们都在指向同一件事：<strong>开发者已经不满足于“直接和模型对话”，而是开始沉淀一套能反复调用的工作方法、工具接口与上下文资产。</strong></p>
<p>另一条同步升温的线，是 <strong>知识工作和内容工作正在被 agent 更深地接管</strong>。一边是 <a href="https://github.com/Graphify-Labs/graphify" target="_blank" rel="noopener noreferrer" class="">Graphify-Labs/graphify</a> 这种把代码、文档、数据库模式甚至图片视频统一编织进知识图谱的项目；另一边是 <a href="https://github.com/OpenCut-app/OpenCut" target="_blank" rel="noopener noreferrer" class="">OpenCut-app/OpenCut</a> 这种更偏内容生产底座的开源视频编辑器开始冲高。它们说明，agent 的价值不再只存在于“写一段代码”或“跑一个命令”，而是在逐步进入真实生产链路：整理知识、调用技能、接管桌面、辅助交易、改写视频流程。</p>
<blockquote>
<p>本文主要基于 GitHub Trending weekly 页面中的仓库描述、本周新增 star，以及可直接获取的 GitHub 仓库元数据做归纳。Trending 反映的是“本周被集中关注”，并不等同于长期采用率；下文关于“为什么这周变热”的判断，更接近趋势分析，而不是确定性因果。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/7/19/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>Skills 正在成为 agent 时代的新分发层。</strong> 从工程技能包、设计技能包到反 AI 套壳设计规范，大家开始把“提示词 + 工具使用方式 + 工作流约束”封装成可共享资产。</li>
<li class=""><strong>知识图谱与长期上下文重新升温。</strong> <a href="https://github.com/Graphify-Labs/graphify" target="_blank" rel="noopener noreferrer" class="">Graphify-Labs/graphify</a> 的走热说明，单纯放大上下文窗口仍然不够，团队更想要能被查询、复用、跨媒介的结构化知识层。</li>
<li class=""><strong>可直接落地的工作代理比“抽象框架”更受欢迎。</strong> <a href="https://github.com/iOfficeAI/OfficeCLI" target="_blank" rel="noopener noreferrer" class="">iOfficeAI/OfficeCLI</a>、<a href="https://github.com/HKUDS/Vibe-Trading" target="_blank" rel="noopener noreferrer" class="">HKUDS/Vibe-Trading</a>、<a href="https://github.com/wonderwhy-er/DesktopCommanderMCP" target="_blank" rel="noopener noreferrer" class="">wonderwhy-er/DesktopCommanderMCP</a> 都很明确地占据了文档、交易、终端执行这类具体场景。</li>
<li class=""><strong>并行 agent 编排仍是高热方向。</strong> <a href="https://github.com/stablyai/orca" target="_blank" rel="noopener noreferrer" class="">stablyai/orca</a>、<a href="https://github.com/openai/codex" target="_blank" rel="noopener noreferrer" class="">openai/codex</a>、<a href="https://github.com/openinterpreter/openinterpreter" target="_blank" rel="noopener noreferrer" class="">openinterpreter/openinterpreter</a> 共同说明，终端型 coding agent 还在继续吞噬开发者工作台。</li>
<li class=""><strong>内容生产基础设施也在回潮。</strong> <a href="https://github.com/OpenCut-app/OpenCut" target="_blank" rel="noopener noreferrer" class="">OpenCut-app/OpenCut</a> 本周涨幅很高，表明开源视频编辑器这类“真正能用起来的创作底座”依旧有强吸引力。</li>
<li class=""><strong>严格非 AI 项目仍然偏少。</strong> 这不是因为基础设施不重要，而是因为本周榜单的注意力被 agent、skills、知识层几乎完全吸走；能挤进来并被看见的，反而更说明其底层价值。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/7/19/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-mattpocockskills">1. <a href="https://github.com/mattpocock/skills" target="_blank" rel="noopener noreferrer" class="">mattpocock/skills</a><a href="https://xiebo.fun/blog/2026/7/19/#1-mattpocockskills" class="hash-link" aria-label="1-mattpocockskills的直接链接" title="1-mattpocockskills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向工程师的 skills 仓库，把可复用的方法、规则、流程和操作套路直接沉淀为 agent 可调用的技能资产。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>11.1k stars</strong>。随着 Claude Code、Codex、Cursor 一类工具持续扩散，开发者开始意识到真正可迁移的，不只是模型，而是围绕模型形成的最佳实践。</li>
<li class=""><strong>有什么新意</strong>：它代表“skills-as-distribution”——比起再造一个 agent，越来越多人在争夺 <strong>agent 到底该如何工作</strong> 的默认模板层。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-graphify-labsgraphify">2. <a href="https://github.com/Graphify-Labs/graphify" target="_blank" rel="noopener noreferrer" class="">Graphify-Labs/graphify</a><a href="https://xiebo.fun/blog/2026/7/19/#2-graphify-labsgraphify" class="hash-link" aria-label="2-graphify-labsgraphify的直接链接" title="2-graphify-labsgraphify的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个把代码、SQL schema、文档、论文、图片乃至视频统一转成可查询知识图谱的 AI coding assistant skill。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>8.6k stars</strong>。大家越来越不满足于 agent 只能读当前目录或当前上下文，而是希望它能真正“理解整个工作素材集合”。</li>
<li class=""><strong>有什么新意</strong>：它不只是做代码索引，而是试图把 <strong>应用代码、数据库结构、基础设施、文档与多媒体</strong> 统一进一个查询层，这比单点的 RAG 或 repo index 更像长期知识底座。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-nutlopehallmark">3. <a href="https://github.com/Nutlope/hallmark" target="_blank" rel="noopener noreferrer" class="">Nutlope/hallmark</a><a href="https://xiebo.fun/blog/2026/7/19/#3-nutlopehallmark" class="hash-link" aria-label="3-nutlopehallmark的直接链接" title="3-nutlopehallmark的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 Claude Code、Cursor、Codex 的 anti-AI-slop 设计 skill，重点是约束生成式界面别落入“千篇一律的 AI 味设计”。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>8.8k stars</strong>。随着越来越多产品用 agent/LLM 辅助前端开发，开发者开始集中面对一个新问题：<strong>产得快，不代表做得好看。</strong></li>
<li class=""><strong>有什么新意</strong>：它把审美和设计约束也产品化为 skill，意味着 skill 的边界已经从工程自动化扩展到创意质量控制。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-shubhamsabooawesome-llm-apps">4. <a href="https://github.com/Shubhamsaboo/awesome-llm-apps" target="_blank" rel="noopener noreferrer" class="">Shubhamsaboo/awesome-llm-apps</a><a href="https://xiebo.fun/blog/2026/7/19/#4-shubhamsabooawesome-llm-apps" class="hash-link" aria-label="4-shubhamsabooawesome-llm-apps的直接链接" title="4-shubhamsabooawesome-llm-apps的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个收录 100+ 可直接运行的 AI Agent 与 RAG 应用集合，强调 clone、定制、上线的可操作性。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>6.1k stars</strong>。当市场开始从“看 demo”转向“我要现成可跑的样板”，这种带有强实战导向的应用库会自然吸引流量。</li>
<li class=""><strong>有什么新意</strong>：它不卖单一框架，而是卖 <strong>场景模板库</strong>。这说明很多团队已经进入“参考成熟样板、快速改造成自己版本”的阶段。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-stablyaiorca">5. <a href="https://github.com/stablyai/orca" target="_blank" rel="noopener noreferrer" class="">stablyai/orca</a><a href="https://xiebo.fun/blog/2026/7/19/#5-stablyaiorca" class="hash-link" aria-label="5-stablyaiorca的直接链接" title="5-stablyaiorca的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向并行 agent fleet 的 ADE（Agent Development Environment），支持在桌面和移动端运行不同 coding agent，并复用自己的订阅。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>5.5k stars</strong>。用户已经不再只开一个代理窗口，而是在多个 agent、多个任务、多个工作树之间并行切换。</li>
<li class=""><strong>有什么新意</strong>：它强调的不是“一个更强模型”，而是 <strong>一个管理 agent 队列的工作台</strong>。这预示着 agent IDE / ADE 将继续成为独立赛道。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-hkudsvibe-trading">6. <a href="https://github.com/HKUDS/Vibe-Trading" target="_blank" rel="noopener noreferrer" class="">HKUDS/Vibe-Trading</a><a href="https://xiebo.fun/blog/2026/7/19/#6-hkudsvibe-trading" class="hash-link" aria-label="6-hkudsvibe-trading的直接链接" title="6-hkudsvibe-trading的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个个人交易 agent，把交易研究、策略实验、回测与多 agent 协作结合到同一套框架中。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>5.6k stars</strong>。金融交易本来就是信息密度高、反馈速度快、很适合自动化辅助的场景，因此新一轮 agent 浪潮很容易切入这里。</li>
<li class=""><strong>有什么新意</strong>：它体现的是 <strong>垂直领域 agent 化</strong>：不是抽象地讨论 agent，而是把某一类专业工作的方法论、工具链与上下文打包进专用系统。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-iofficeaiofficecli">7. <a href="https://github.com/iOfficeAI/OfficeCLI" target="_blank" rel="noopener noreferrer" class="">iOfficeAI/OfficeCLI</a><a href="https://xiebo.fun/blog/2026/7/19/#7-iofficeaiofficecli" class="hash-link" aria-label="7-iofficeaiofficecli的直接链接" title="7-iofficeaiofficecli的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个专为 AI agents 设计的 Office CLI，让 agent 能直接读取、编辑和自动化处理 Word、Excel、PowerPoint 文件，而且不需要本机安装 Office。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>4.3k stars</strong>。企业真实资产里，很多内容根本不在 Git 仓库，而是在 docx、xlsx、pptx 这些办公文档中。</li>
<li class=""><strong>有什么新意</strong>：它继续强化了一个趋势：<strong>AI 的落地入口正在从代码库扩展到办公系统本身。</strong> 谁能打通 Office，谁就更接近真实知识工作的主战场。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-openaicodex">8. <a href="https://github.com/openai/codex" target="_blank" rel="noopener noreferrer" class="">openai/codex</a><a href="https://xiebo.fun/blog/2026/7/19/#8-openaicodex" class="hash-link" aria-label="8-openaicodex的直接链接" title="8-openaicodex的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个运行在终端中的轻量 coding agent。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>2.3k stars</strong>。终端型 agent 已经从新奇工具变成开发者默认会尝试的基础配置之一。</li>
<li class=""><strong>有什么新意</strong>：它的意义不只在仓库本身，而在于 <strong>terminal-first agent 已经成为稳定产品范式</strong>：命令行、worktree、审查、补丁、工具调用正在形成统一交互模型。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-wonderwhy-erdesktopcommandermcp">9. <a href="https://github.com/wonderwhy-er/DesktopCommanderMCP" target="_blank" rel="noopener noreferrer" class="">wonderwhy-er/DesktopCommanderMCP</a><a href="https://xiebo.fun/blog/2026/7/19/#9-wonderwhy-erdesktopcommandermcp" class="hash-link" aria-label="9-wonderwhy-erdesktopcommandermcp的直接链接" title="9-wonderwhy-erdesktopcommandermcp的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个给 Claude 提供终端控制、文件系统搜索和 diff 编辑能力的 MCP server。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>908 stars</strong>。虽然增量不算榜单最高，但它很典型地踩中了“让 agent 真正拥有执行权”的需求。</li>
<li class=""><strong>有什么新意</strong>：它强调的是 <strong>桌面执行能力的 MCP 化</strong>。相比单纯给模型更多上下文，这种把本地操作面暴露成标准工具接口的做法，更容易沉淀成生态层能力。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/7/19/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周严格意义上的非 AI 项目确实不多，因此这一节不刻意追求数量对称，而是挑出更能说明“AI 很热，但底座没有消失”的代表。这里既包括完全不以 AI 为主题的项目，也包括更偏内容生产或设计工程基础设施、而不是直接卷 agent 能力本身的项目。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-opencut-appopencut">1. <a href="https://github.com/OpenCut-app/OpenCut" target="_blank" rel="noopener noreferrer" class="">OpenCut-app/OpenCut</a><a href="https://xiebo.fun/blog/2026/7/19/#1-opencut-appopencut" class="hash-link" aria-label="1-opencut-appopencut的直接链接" title="1-opencut-appopencut的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源的 CapCut 替代品，定位很直接，就是面向大众内容创作的开源视频编辑器。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>13.3k stars</strong>，是整个榜单里最强的非 AI / 泛内容基础设施信号之一。短视频与内容生产仍然是高频需求，而开源、可自控的视频工具天然有传播力。</li>
<li class=""><strong>有什么新意</strong>：它提醒我们，创作者工作流并不只需要“AI 生成”，同样需要 <strong>真正可靠的编辑底座</strong>。谁掌握内容生产底盘，谁就能承接后续更多 AI 能力叠加。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-abseilabseil-cpp">2. <a href="https://github.com/abseil/abseil-cpp" target="_blank" rel="noopener noreferrer" class="">abseil/abseil-cpp</a><a href="https://xiebo.fun/blog/2026/7/19/#2-abseilabseil-cpp" class="hash-link" aria-label="2-abseilabseil-cpp的直接链接" title="2-abseilabseil-cpp的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Google 影响极深的一组 C++ 通用基础库集合，是大量工程项目底层依赖的一部分。</li>
<li class=""><strong>为什么这周会热</strong>：虽然本周新增仅约 <strong>481 stars</strong>，但它能在 AI 几乎霸榜的 weekly 视图里被看见，本身就说明经典基础库依旧在持续获得工程师注意力。</li>
<li class=""><strong>有什么新意</strong>：它没有“新概念”意义上的新意，但有 <strong>长期基础设施的稀缺性</strong>。越是在 agent 高歌猛进的时候，这类几十次被复用、几年后还在的底层库就越重要。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-ibelickui-skills">3. <a href="https://github.com/ibelick/ui-skills" target="_blank" rel="noopener noreferrer" class="">ibelick/ui-skills</a><a href="https://xiebo.fun/blog/2026/7/19/#3-ibelickui-skills" class="hash-link" aria-label="3-ibelickui-skills的直接链接" title="3-ibelickui-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向设计工程师的 skills 资产库，关注的是 UI 设计与前端实现的可复用经验沉淀。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>1.1k stars</strong>。一旦生成式工具提高了 UI 产出速度，团队就会更需要成体系的视觉和交互套路来维持质量。</li>
<li class=""><strong>有什么新意</strong>：它虽以 skills 形式存在，但更像 <strong>设计工程资产层</strong>，说明“可复用模板/规则”的价值不止在 AI agent，也在所有高频创作流程里成立。</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="补充观察为什么本周非-ai-项目仍然偏少">补充观察：为什么本周非 AI 项目仍然偏少<a href="https://xiebo.fun/blog/2026/7/19/#%E8%A1%A5%E5%85%85%E8%A7%82%E5%AF%9F%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%AC%E5%91%A8%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E4%BB%8D%E7%84%B6%E5%81%8F%E5%B0%91" class="hash-link" aria-label="补充观察：为什么本周非 AI 项目仍然偏少的直接链接" title="补充观察：为什么本周非 AI 项目仍然偏少的直接链接" translate="no">​</a></h4>
<ul>
<li class="">Weekly 榜单注意力几乎被 skills、agent、知识层、终端工作流吸走，严格非 AI 项目自然显得更少。</li>
<li class="">但能冲出来的非 AI / 泛基础设施项目，都很“底”：视频编辑底座、经典基础库、设计工程资产。</li>
<li class="">这反而说明一个现实：<strong>上层智能越热，下层可复用基础设施的价值越不会消失。</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/7/19/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-skills-正从小技巧合集升级为-agent-时代的标准能力封装">1. Skills 正从“小技巧合集”升级为 agent 时代的标准能力封装<a href="https://xiebo.fun/blog/2026/7/19/#1-skills-%E6%AD%A3%E4%BB%8E%E5%B0%8F%E6%8A%80%E5%B7%A7%E5%90%88%E9%9B%86%E5%8D%87%E7%BA%A7%E4%B8%BA-agent-%E6%97%B6%E4%BB%A3%E7%9A%84%E6%A0%87%E5%87%86%E8%83%BD%E5%8A%9B%E5%B0%81%E8%A3%85" class="hash-link" aria-label="1. Skills 正从“小技巧合集”升级为 agent 时代的标准能力封装的直接链接" title="1. Skills 正从“小技巧合集”升级为 agent 时代的标准能力封装的直接链接" translate="no">​</a></h4>
<p>本周最值得记住的不是某个单点模型突破，而是 skills 作为产品形态正在集体冒头。工程技能、设计技能、审美约束、知识图谱能力、Office 自动化，都开始被包装成可复用单元。未来 agent 生态的竞争，可能越来越像“谁拥有更强的 skill layer”。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-上下文问题的解法正��在从大窗口转向结构化知识层">2. 上下文问题的解法，正在从大窗口转向结构化知识层<a href="https://xiebo.fun/blog/2026/7/19/#2-%E4%B8%8A%E4%B8%8B%E6%96%87%E9%97%AE%E9%A2%98%E7%9A%84%E8%A7%A3%E6%B3%95%E6%AD%A3%E5%9C%A8%E4%BB%8E%E5%A4%A7%E7%AA%97%E5%8F%A3%E8%BD%AC%E5%90%91%E7%BB%93%E6%9E%84%E5%8C%96%E7%9F%A5%E8%AF%86%E5%B1%82" class="hash-link" aria-label="2. 上下文问题的解法，正在从大窗口转向结构化知识层的直接链接" title="2. 上下文问题的解法，正在从大窗口转向结构化知识层的直接链接" translate="no">​</a></h4>
<p>Graphify 的热度很能说明问题。开发者要的已经不是 agent 临时看几千行文件，而是能跨代码、数据库、文档、图片、视频建立持久索引与查询关系。这意味着知识图谱、结构化记忆、可查询上下文层会继续升温。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-终端型-agent-已经从新奇能力变成默认工作面">3. 终端型 agent 已经从新奇能力变成默认工作面<a href="https://xiebo.fun/blog/2026/7/19/#3-%E7%BB%88%E7%AB%AF%E5%9E%8B-agent-%E5%B7%B2%E7%BB%8F%E4%BB%8E%E6%96%B0%E5%A5%87%E8%83%BD%E5%8A%9B%E5%8F%98%E6%88%90%E9%BB%98%E8%AE%A4%E5%B7%A5%E4%BD%9C%E9%9D%A2" class="hash-link" aria-label="3. 终端型 agent 已经从新奇能力变成默认工作面的直接链接" title="3. 终端型 agent 已经从新奇能力变成默认工作面的直接链接" translate="no">​</a></h4>
<p>Codex、DesktopCommanderMCP、Orca 共同说明，命令行不再只是“模型的一个插件入口”，而正在变成 agent 真正的主战场。因为终端天然连接文件、进程、构建、测试、版本控制，也最接近实际执行权。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-垂直行业-agent-开始比通用-agent-更有辨识度">4. 垂直行业 agent 开始比通用 agent 更有辨识度<a href="https://xiebo.fun/blog/2026/7/19/#4-%E5%9E%82%E7%9B%B4%E8%A1%8C%E4%B8%9A-agent-%E5%BC%80%E5%A7%8B%E6%AF%94%E9%80%9A%E7%94%A8-agent-%E6%9B%B4%E6%9C%89%E8%BE%A8%E8%AF%86%E5%BA%A6" class="hash-link" aria-label="4. 垂直行业 agent 开始比通用 agent 更有辨识度的直接链接" title="4. 垂直行业 agent 开始比通用 agent 更有辨识度的直接链接" translate="no">​</a></h4>
<p>Vibe-Trading 这样的项目说明，一个把领域方法论、工具链和多 agent 流程结合起来的系统，往往比抽象的“万能助手”更容易激发关注。接下来还会看到更多金融、法务、研究、教育类垂直 agent 模板冒头。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-办公文档与创作工具正在成为-ai-落地的第二现场">5. 办公文档与创作工具，正在成为 AI 落地的第二现场<a href="https://xiebo.fun/blog/2026/7/19/#5-%E5%8A%9E%E5%85%AC%E6%96%87%E6%A1%A3%E4%B8%8E%E5%88%9B%E4%BD%9C%E5%B7%A5%E5%85%B7%E6%AD%A3%E5%9C%A8%E6%88%90%E4%B8%BA-ai-%E8%90%BD%E5%9C%B0%E7%9A%84%E7%AC%AC%E4%BA%8C%E7%8E%B0%E5%9C%BA" class="hash-link" aria-label="5. 办公文档与创作工具，正在成为 AI 落地的第二现场的直接链接" title="5. 办公文档与创作工具，正在成为 AI 落地的第二现场的直接链接" translate="no">​</a></h4>
<p>OfficeCLI 和 OpenCut 分别代表了知识工作与内容工作的两端：一端是 Word/Excel/PPT，另一端是视频编辑。它们共同说明，AI 的生产力叙事正在从“写代码”扩展到更大的工作软件版图。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/7/19/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>Skill 化正在成为 agent 能力传播的默认方式。</strong> 很多热门项目的核心价值，不再是模型本身，而是围绕模型沉淀出的技能资产。</li>
<li class=""><strong>知识图谱重新回到中心位置。</strong> 不是为了学术上的 graph，而是为了让 agent 跨仓库、跨文档、跨媒介理解真实工作材料。</li>
<li class=""><strong>终端执行权仍然是最关键的 agent 能力之一。</strong> 能不能调命令、改文件、连工作树，直接决定 agent 是否从“助手”变成“执行者”。</li>
<li class=""><strong>垂直场景会继续吞噬通用 agent 的叙事空间。</strong> 交易、办公、设计、内容生产这些具体场景，越来越容易跑出独立热点。</li>
<li class=""><strong>非 AI / 泛基础设施项目没有消失，只是更像底板。</strong> 真正能长期承接上层智能红利的，往往还是视频工具、基础库、设计工程资产这类可复用底层能力。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/7/19/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>如果说前几周的 Trending 还在回答“agent 会不会调用工具、能不能多开、能不能接浏览器”，那么这一周更像是在回答：<strong>这些能力怎样被沉淀、共享和规模化复制？</strong></p>
<p>榜单给出的答案相当明确：通过 skills、知识图谱、终端接口、Office 自动化、垂直工作流和并行编排，把“会做事的 agent”逐渐变成“可运营的 agent 系统”。与此同时，OpenCut、Abseil、ui-skills 这样的项目也提醒我们，任何上层智能浪潮最终都要落在可复用、可维护、可组合的底层资产之上。</p>
<p>我本周最想继续追踪的组合线是：<strong>skills 封装层 + 知识图谱层 + 终端执行层 + 垂直场景模板</strong>。因为只有这几层逐步稳定，agent 才会从一时热闹的演示能力，真正变成能长期进入生产环境的工作基础设施。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Agent 开始接管终端、浏览器、办公文档与本地会议记录（2026-07-12）]]></title>
            <link>https://xiebo.fun/blog/2026/7/12/</link>
            <guid>https://xiebo.fun/blog/2026/7/12/</guid>
            <pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 几乎被 AI agent 基础设施占满：终端多工、浏览器调试、文档自动化、沙箱、安全测试、本地会议助手与模型路由同时升温；而 Abseil、Astryx、RuView 这些非 AI / 泛基础设施项目则提醒我们，真正能承接 agent 爆发的，仍然是可靠底座与新型交互界面。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）非常像一张 <strong>“agent 基础设施分层图”</strong>：上层不再只是聊天机器人，而是开始分拆成会议记录、代码委派、终端多工、浏览器调试、Office 自动化、页面 GUI 操作、安全测试、隔离沙箱、模型网关等一整套工作组件。最热的仓库并不是在重复“再做一个 AI 助手”，而是在回答一个更工程化的问题：<strong>当 agent 真要进入日常生产链路，哪些环节必须先被产品化和标准化？</strong></p>
<p>从榜单结构看，这周的一个强烈信号是：<strong>agent 正从“模型能力展示”转向“工作环境接管”</strong>。你会看到 <a href="https://github.com/ChromeDevTools/chrome-devtools-mcp" target="_blank" rel="noopener noreferrer" class="">ChromeDevTools/chrome-devtools-mcp</a> 让 coding agent 真正进入浏览器调试现场，<a href="https://github.com/iOfficeAI/OfficeCLI" target="_blank" rel="noopener noreferrer" class="">iOfficeAI/OfficeCLI</a> 让 Word/Excel/PPT 成为 agent 可直接操作的对象，<a href="https://github.com/alibaba/page-agent" target="_blank" rel="noopener noreferrer" class="">alibaba/page-agent</a> 试图把网页 GUI 直接暴露给自然语言控制，<a href="https://github.com/TencentCloud/CubeSandbox" target="_blank" rel="noopener noreferrer" class="">TencentCloud/CubeSandbox</a> 和 <a href="https://github.com/usestrix/strix" target="_blank" rel="noopener noreferrer" class="">usestrix/strix</a> 则分别代表安全隔离与安全验证两端的能力补齐。</p>
<p>另一面是，严格意义上的非 AI 项目依旧不多，但并非不存在。<a href="https://github.com/abseil/abseil-cpp" target="_blank" rel="noopener noreferrer" class="">abseil/abseil-cpp</a>、<a href="https://github.com/facebook/astryx" target="_blank" rel="noopener noreferrer" class="">facebook/astryx</a>、<a href="https://github.com/ruvnet/RuView" target="_blank" rel="noopener noreferrer" class="">ruvnet/RuView</a> 这种项目说明：当 AI 热度达到高位，开发者并不会停止投资底层库、设计系统和新型硬件/空间交互方向。只是它们在榜单里不再以“宏大叙事”出现，而更像真正承载未来应用的底板。</p>
<blockquote>
<p>本文主要基于 GitHub Trending weekly 页面中的仓库描述、本周新增 star 数，以及可直接获取的 GitHub 仓库元数据归纳。Trending 反映的是“本周集中关注度”，不等同于生产采用率，因此下文对“为什么这周变热”的判断，更接近趋势分析，而不是确定性因果。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/7/12/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>Agent 已经从单点模型调用，扩展成完整工作环境接管。</strong> 终端、浏览器、Office、网页 GUI、会议记录都开始成为 agent 的原生操作面。</li>
<li class=""><strong>开发者真正愿意为“可落地”的 agent 工具买单。</strong> 本周最热项目大多不是抽象框架，而是能马上插进现有工作流的工具：DevTools、Office、MCP、CLI、沙箱、安全测试。</li>
<li class=""><strong>安全开始从附属话题升为主线。</strong> <a href="https://github.com/usestrix/strix" target="_blank" rel="noopener noreferrer" class="">usestrix/strix</a> 与 <a href="https://github.com/TencentCloud/CubeSandbox" target="_blank" rel="noopener noreferrer" class="">TencentCloud/CubeSandbox</a> 同时升温，说明大家一边想让 agent 获得更多执行权，一边也在补隔离和审计能力。</li>
<li class=""><strong>本地优先与成本敏感继续存在。</strong> <a href="https://github.com/Zackriya-Solutions/meetily" target="_blank" rel="noopener noreferrer" class="">Zackriya-Solutions/meetily</a> 的“100% 本地处理”与 <a href="https://github.com/diegosouzapw/OmniRoute" target="_blank" rel="noopener noreferrer" class="">diegosouzapw/OmniRoute</a> 的“多模型免费路由”代表了两个很现实的诉求：隐私和成本。</li>
<li class=""><strong>MCP / agent skill / 插件化生态正在走向标准层。</strong> <a href="https://github.com/openai/codex-plugin-cc" target="_blank" rel="noopener noreferrer" class="">openai/codex-plugin-cc</a>、<a href="https://github.com/ChromeDevTools/chrome-devtools-mcp" target="_blank" rel="noopener noreferrer" class="">ChromeDevTools/chrome-devtools-mcp</a>、<a href="https://github.com/google-labs-code/stitch-skills" target="_blank" rel="noopener noreferrer" class="">google-labs-code/stitch-skills</a>、<a href="https://github.com/alirezarezvani/claude-skills" target="_blank" rel="noopener noreferrer" class="">alirezarezvani/claude-skills</a> 共同说明，“让 agent 能调用什么”正在成为新的平台竞争点。</li>
<li class=""><strong>非 AI 榜单变少，不代表基础设施退场。</strong> 恰恰相反，越多团队把 agent 接进业务，越会重新重视底层通用库、设计系统与新交互底座。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/7/12/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-usestrixstrix">1. <a href="https://github.com/usestrix/strix" target="_blank" rel="noopener noreferrer" class="">usestrix/strix</a><a href="https://xiebo.fun/blog/2026/7/12/#1-usestrixstrix" class="hash-link" aria-label="1-usestrixstrix的直接链接" title="1-usestrixstrix的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源 AI 渗透测试工具，定位非常明确，就是帮助团队发现并修复 AI 应用中的安全漏洞。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>40.6k stars</strong>，在整个榜单里属于第一梯队。随着越来越多产品把 LLM 接到检索、客服、代码、后台操作链路中，AI 应用的攻击面已经不是概念问题，而是现实工程问题。</li>
<li class=""><strong>有什么新意</strong>：它代表安全方向从“讨论 prompt injection”进一步走向“把 AI 红队测试工具化”。真正被追捧的不是口号，而是能进流程的安全能力。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-chromedevtoolschrome-devtools-mcp">2. <a href="https://github.com/ChromeDevTools/chrome-devtools-mcp" target="_blank" rel="noopener noreferrer" class="">ChromeDevTools/chrome-devtools-mcp</a><a href="https://xiebo.fun/blog/2026/7/12/#2-chromedevtoolschrome-devtools-mcp" class="hash-link" aria-label="2-chromedevtoolschrome-devtools-mcp的直接链接" title="2-chromedevtoolschrome-devtools-mcp的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：把 Chrome DevTools 暴露给 coding agent 使用，让 agent 更直接地介入浏览器调试、页面检查和前端问题定位。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>46.7k stars</strong>。前端与全栈开发里最常见的真实故障，很多都发生在浏览器运行时，而不是静态代码里。</li>
<li class=""><strong>有什么新意</strong>：它把“DevTools 是人类手工调试器”这件事改写成“DevTools 是 agent 的可调用工具层”。这意味着 agent 将越来越少停留在代码生成，而更多进入运行时诊断。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-openaicodex-plugin-cc">3. <a href="https://github.com/openai/codex-plugin-cc" target="_blank" rel="noopener noreferrer" class="">openai/codex-plugin-cc</a><a href="https://xiebo.fun/blog/2026/7/12/#3-openaicodex-plugin-cc" class="hash-link" aria-label="3-openaicodex-plugin-cc的直接链接" title="3-openaicodex-plugin-cc的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：让 Claude Code 可以调用 Codex 来做代码审查或任务委派的插件。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>27.7k stars</strong>。开发者显然已经不满足于被绑定在单一 agent 生态里，而是希望不同 agent 之间可以互相借力、互相复核。</li>
<li class=""><strong>有什么新意</strong>：它传达的核心不是“又一个插件”，而是 <strong>跨 agent 协作正在成为正式产品形态</strong>。未来不同模型/代理之间的互操作性，很可能比单一模型能力更重要。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-zackriya-solutionsmeetily">4. <a href="https://github.com/Zackriya-Solutions/meetily" target="_blank" rel="noopener noreferrer" class="">Zackriya-Solutions/meetily</a><a href="https://xiebo.fun/blog/2026/7/12/#4-zackriya-solutionsmeetily" class="hash-link" aria-label="4-zackriya-solutionsmeetily的直接链接" title="4-zackriya-solutionsmeetily的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个隐私优先、本地运行的 AI 会议助手，支持实时转录、说话人区分和本地总结，核心强调 100% 本地处理。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>23.2k stars</strong>。会议纪要一直是高频、刚需、容易验证价值的 AI 应用场景，而“本地处理、不上云”会直接降低团队对敏感会议信息泄露的顾虑。</li>
<li class=""><strong>有什么新意</strong>：相比“在线会议摘要 SaaS”，它更像把会议助理变成可自托管、可本地化、可隐私合规部署的软件组件。AI 应用正在从云端演示走向本地生产工具。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-alibabapage-agent">5. <a href="https://github.com/alibaba/page-agent" target="_blank" rel="noopener noreferrer" class="">alibaba/page-agent</a><a href="https://xiebo.fun/blog/2026/7/12/#5-alibabapage-agent" class="hash-link" aria-label="5-alibabapage-agent的直接链接" title="5-alibabapage-agent的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 JavaScript in-page GUI agent，目标是直接用自然语言控制网页界面。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>26.1k stars</strong>。现实世界里还有大量系统没有完善 API，真正的工作入口仍然是运营后台、SaaS 管理台和企业内网页面。</li>
<li class=""><strong>有什么新意</strong>：它不是传统浏览器自动化脚本的另一层包装，而是把“理解页面状态并执行 GUI 操作”设计成 agent 原生能力。谁能打通 GUI，谁就能覆盖大量还未 API 化的业务流程。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-diegosouzapwomniroute">6. <a href="https://github.com/diegosouzapw/OmniRoute" target="_blank" rel="noopener noreferrer" class="">diegosouzapw/OmniRoute</a><a href="https://xiebo.fun/blog/2026/7/12/#6-diegosouzapwomniroute" class="hash-link" aria-label="6-diegosouzapwomniroute的直接链接" title="6-diegosouzapwomniroute的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个统一 AI gateway，主打多模型、多 provider、免费入口、自动 fallback、token 压缩与 MCP/A2A 能力整合。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>15.8k stars</strong>。当团队开始在 Claude、Codex、Gemini、Copilot、Cursor 之间来回切换时，模型路由和成本控制很快会从“优化项”变成“必需项”。</li>
<li class=""><strong>有什么新意</strong>：它把“模型选择、可用性兜底、免费资源利用、token 节流”聚合成单一接入层。未来很多 agent 产品的壁垒，不一定是拥有最强模型，而是拥有最聪明的路由层。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-stablyaiorca">7. <a href="https://github.com/stablyai/orca" target="_blank" rel="noopener noreferrer" class="">stablyai/orca</a><a href="https://xiebo.fun/blog/2026/7/12/#7-stablyaiorca" class="hash-link" aria-label="7-stablyaiorca的直接链接" title="7-stablyaiorca的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向并行 agent fleet 的 ADE（Agent Development Environment），支持在桌面和移动端运行多种 coding agent。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>16.4k stars</strong>。用户开始同时使用多个 coding agent 后，很快就会遇到任务切换、订阅分散、设备入口不统一的问题。</li>
<li class=""><strong>有什么新意</strong>：它说明“agent IDE / ADE”正在从概念变成产品分类。大家不再只想要一个命令行，而是想要一个能管理整支 agent 队伍的工作台。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-ogulcancelikherdr">8. <a href="https://github.com/ogulcancelik/herdr" target="_blank" rel="noopener noreferrer" class="">ogulcancelik/herdr</a><a href="https://xiebo.fun/blog/2026/7/12/#8-ogulcancelikherdr" class="hash-link" aria-label="8-ogulcancelikherdr的直接链接" title="8-ogulcancelikherdr的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个生活在终端里的 agent multiplexer，把多个 agent 任务和工作区组织成类似 tmux 的多工体验。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>15.5k stars</strong>。coding agent 越多，终端越容易变成混乱现场：不同上下文并行运行、不同任务窗口切换、不同工作树状态共存。</li>
<li class=""><strong>有什么新意</strong>：它把“终端复用器”升级成“agent 复用器”。这意味着未来的开发者工作流，很可能会从“我在用一个 AI 助手”，转向“我在调度一组并行 agent 工位”。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-tencentcloudcubesandbox">9. <a href="https://github.com/TencentCloud/CubeSandbox" target="_blank" rel="noopener noreferrer" class="">TencentCloud/CubeSandbox</a><a href="https://xiebo.fun/blog/2026/7/12/#9-tencentcloudcubesandbox" class="hash-link" aria-label="9-tencentcloudcubesandbox的直接链接" title="9-tencentcloudcubesandbox的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 AI agent 的轻量、安全、并发沙箱环境。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>9.7k stars</strong>。agent 一旦拥有执行 shell、读写文件、联网或操作浏览器的能力，隔离边界就会立刻变成高优先级问题。</li>
<li class=""><strong>有什么新意</strong>：它把“agent 运行环境”显式独立出来。很多团队过去先追求 agent 会做事，现在开始认真考虑：<strong>它应该在什么边界里做事。</strong></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-iofficeaiofficecli">10. <a href="https://github.com/iOfficeAI/OfficeCLI" target="_blank" rel="noopener noreferrer" class="">iOfficeAI/OfficeCLI</a><a href="https://xiebo.fun/blog/2026/7/12/#10-iofficeaiofficecli" class="hash-link" aria-label="10-iofficeaiofficecli的直接链接" title="10-iofficeaiofficecli的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个专为 AI agent 设计的 Office CLI，让 agent 能直接读取、编辑、自动化处理 Word、Excel 和 PowerPoint 文件。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>15.1k stars</strong>。现实企业工作里，大量关键资料不在 Git 仓库，而在 docx、xlsx、pptx 里。</li>
<li class=""><strong>有什么新意</strong>：它把办公室文档系统纳入 agent 可执行范围。对很多企业来说，这比再提升一点代码生成能力更有现实意义，因为它真正打通了“AI 进入知识工作”的最后几步。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/7/12/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周严格意义上的非 AI 热门项目确实偏少，因此这一节不刻意追求数量对称，而是挑出几类更能说明“底层仍然重要”的代表。它们有的完全不是 AI 项目，有的则更接近泛基础设施或新交互底座，而不是直接在卷 agent 能力本身。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-abseilabseil-cpp">1. <a href="https://github.com/abseil/abseil-cpp" target="_blank" rel="noopener noreferrer" class="">abseil/abseil-cpp</a><a href="https://xiebo.fun/blog/2026/7/12/#1-abseilabseil-cpp" class="hash-link" aria-label="1-abseilabseil-cpp的直接链接" title="1-abseilabseil-cpp的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Google 体系影响很深的 C++ 通用基础库集合，是很多工程项目都会依赖的底层公共能力。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>17.8k stars</strong>。这类项目能进入 weekly 榜，往往不是因为“营销”，而是因为大量开发者在真实工程中再次集中碰到并使用它。</li>
<li class=""><strong>有什么新意</strong>：它的新意并不在概念，而在持久性。AI 越火，越提醒人们：真正支撑复杂系统的，还是几十个不那么性感、但必须长期维护的基础库。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-facebookastryx">2. <a href="https://github.com/facebook/astryx" target="_blank" rel="noopener noreferrer" class="">facebook/astryx</a><a href="https://xiebo.fun/blog/2026/7/12/#2-facebookastryx" class="hash-link" aria-label="2-facebookastryx的直接链接" title="2-facebookastryx的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源设计系统，强调高度可定制，并且对 agent 使用场景友好。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>8.0k stars</strong>。生成式工具越多，团队越需要一套稳定、一致、可扩展的 UI 设计底座，来约束“自动产出界面”不要失控。</li>
<li class=""><strong>有什么新意</strong>：它提醒我们，agent 并不会消灭设计系统，反而会让设计系统更重要。因为当 UI 生产速度提高之后，统一约束和组件规范会变成更关键的工程护栏。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-ruvnetruview">3. <a href="https://github.com/ruvnet/RuView" target="_blank" rel="noopener noreferrer" class="">ruvnet/RuView</a><a href="https://xiebo.fun/blog/2026/7/12/#3-ruvnetruview" class="hash-link" aria-label="3-ruvnetruview的直接链接" title="3-ruvnetruview的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个利用普通 WiFi 信号做空间感知、生命体征监测和存在检测的项目，不依赖摄像头画面。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 <strong>80.1k stars</strong>，热度极高。原因很可能在于它把“环境感知”这件事做得非常直观：不用摄像头，也能做实时空间理解，天然容易引发开发者和普通用户的想象力。</li>
<li class=""><strong>有什么新意</strong>：它代表一种很重要的方向——下一代智能系统不一定只依赖视觉与文本，也可能来自更便宜、更隐私友好的感知输入。与其说它是 AI 热点，不如说它是“后摄像头时代”的交互底座尝试。</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="补充观察为什么本周非-ai-项目更少">补充观察：为什么本周非 AI 项目更少<a href="https://xiebo.fun/blog/2026/7/12/#%E8%A1%A5%E5%85%85%E8%A7%82%E5%AF%9F%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%AC%E5%91%A8%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E6%9B%B4%E5%B0%91" class="hash-link" aria-label="补充观察：为什么本周非 AI 项目更少的直接链接" title="补充观察：为什么本周非 AI 项目更少的直接链接" translate="no">​</a></h4>
<ul>
<li class="">Weekly 榜单的主线几乎完全被 agent 工具链占据，严格非 AI 项目数量自然被挤压。</li>
<li class="">即便如此，能冲出来的非 AI / 泛基础设施项目，往往都很底层：基础库、设计系统、空间感知。</li>
<li class="">这并不代表基础设施失去价值，反而说明：<strong>越靠近生产落地，开发者越会同时关注“上层 agent 能力”和“底层系统稳不稳”。</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/7/12/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-正在接管完整工作环境而不只是代码编辑器">1. Agent 正在接管完整工作环境，而不只是代码编辑器<a href="https://xiebo.fun/blog/2026/7/12/#1-agent-%E6%AD%A3%E5%9C%A8%E6%8E%A5%E7%AE%A1%E5%AE%8C%E6%95%B4%E5%B7%A5%E4%BD%9C%E7%8E%AF%E5%A2%83%E8%80%8C%E4%B8%8D%E5%8F%AA%E6%98%AF%E4%BB%A3%E7%A0%81%E7%BC%96%E8%BE%91%E5%99%A8" class="hash-link" aria-label="1. Agent 正在接管完整工作环境，而不只是代码编辑器的直接链接" title="1. Agent 正在接管完整工作环境，而不只是代码编辑器的直接链接" translate="no">​</a></h4>
<p>这周最明显的变化，是 agent 不再只围绕“写代码”展开，而是开始进入浏览器、Office、网页 GUI、会议记录等真实工作环境。Chrome DevTools、OfficeCLI、page-agent、Meetily 这些项目拼在一起时，会让人意识到：AI 的下一个战场不是对话框，而是整个知识工作桌面。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-安全能力正在分成两层运行隔离与攻击验证">2. 安全能力正在分成“两层”：运行隔离与攻击验证<a href="https://xiebo.fun/blog/2026/7/12/#2-%E5%AE%89%E5%85%A8%E8%83%BD%E5%8A%9B%E6%AD%A3%E5%9C%A8%E5%88%86%E6%88%90%E4%B8%A4%E5%B1%82%E8%BF%90%E8%A1%8C%E9%9A%94%E7%A6%BB%E4%B8%8E%E6%94%BB%E5%87%BB%E9%AA%8C%E8%AF%81" class="hash-link" aria-label="2. 安全能力正在分成“两层”：运行隔离与攻击验证的直接链接" title="2. 安全能力正在分成“两层”：运行隔离与攻击验证的直接链接" translate="no">​</a></h4>
<p>CubeSandbox 代表前者，Strix 代表后者。一个负责让 agent 在边界内运行，一个负责检测边界有没有被突破。未来成熟的 agent 平台，几乎不可能只做能力增强而不同时建设这两层安全设施。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-多-agent-协作开始从技巧变成默认产品能力">3. 多 agent 协作开始从技巧，变成默认产品能力<a href="https://xiebo.fun/blog/2026/7/12/#3-%E5%A4%9A-agent-%E5%8D%8F%E4%BD%9C%E5%BC%80%E5%A7%8B%E4%BB%8E%E6%8A%80%E5%B7%A7%E5%8F%98%E6%88%90%E9%BB%98%E8%AE%A4%E4%BA%A7%E5%93%81%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="3. 多 agent 协作开始从技巧，变成默认产品能力的直接链接" title="3. 多 agent 协作开始从技巧，变成默认产品能力的直接链接" translate="no">​</a></h4>
<p>codex-plugin-cc、orca、herdr 指向同一件事：大家已经默认会同时使用多个 agent，只是缺少更好的编排与协作界面。未来的竞争重点，可能不是谁先做到一个最强代理，而是谁更擅长组织一组代理协同工作。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-模型本身开始后退路由层与工具层开始前进">4. 模型本身开始后退，路由层与工具层开始前进<a href="https://xiebo.fun/blog/2026/7/12/#4-%E6%A8%A1%E5%9E%8B%E6%9C%AC%E8%BA%AB%E5%BC%80%E5%A7%8B%E5%90%8E%E9%80%80%E8%B7%AF%E7%94%B1%E5%B1%82%E4%B8%8E%E5%B7%A5%E5%85%B7%E5%B1%82%E5%BC%80%E5%A7%8B%E5%89%8D%E8%BF%9B" class="hash-link" aria-label="4. 模型本身开始后退，路由层与工具层开始前进的直接链接" title="4. 模型本身开始后退，路由层与工具层开始前进的直接链接" translate="no">​</a></h4>
<p>OmniRoute 的走红很说明问题。开发者的真实痛点正在从“选哪家模型”变成“怎么稳定切换、怎么降低成本、怎么容错、怎么把不同工具都接起来”。模型仍然重要，但工作流控制层和路由层正在快速上位。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-本地优先与隐私优先仍然是高价值卖点">5. 本地优先与隐私优先仍然是高价值卖点<a href="https://xiebo.fun/blog/2026/7/12/#5-%E6%9C%AC%E5%9C%B0%E4%BC%98%E5%85%88%E4%B8%8E%E9%9A%90%E7%A7%81%E4%BC%98%E5%85%88%E4%BB%8D%E7%84%B6%E6%98%AF%E9%AB%98%E4%BB%B7%E5%80%BC%E5%8D%96%E7%82%B9" class="hash-link" aria-label="5. 本地优先与隐私优先仍然是高价值卖点的直接链接" title="5. 本地优先与隐私优先仍然是高价值卖点的直接链接" translate="no">​</a></h4>
<p>Meetily 的本地转录与本地总结之所以能迅速吸引关注，说明企业和个人并没有因为 AI 普及就放弃对隐私的要求。尤其在会议、文档、办公流程这些高敏感场景里，“能不能不上云”会直接影响 adoption。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-非-ai-热点不再追逐概念而是回到真正可复用的底层能力">6. 非 AI 热点不再追逐概念，而是回到“真正可复用的底层能力”<a href="https://xiebo.fun/blog/2026/7/12/#6-%E9%9D%9E-ai-%E7%83%AD%E7%82%B9%E4%B8%8D%E5%86%8D%E8%BF%BD%E9%80%90%E6%A6%82%E5%BF%B5%E8%80%8C%E6%98%AF%E5%9B%9E%E5%88%B0%E7%9C%9F%E6%AD%A3%E5%8F%AF%E5%A4%8D%E7%94%A8%E7%9A%84%E5%BA%95%E5%B1%82%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="6. 非 AI 热点不再追逐概念，而是回到“真正可复用的底层能力”的直接链接" title="6. 非 AI 热点不再追逐概念，而是回到“真正可复用的底层能力”的直接链接" translate="no">​</a></h4>
<p>Abseil、Astryx、RuView 的共同点是，它们都更像基础组件或交互底座，而不是热点故事本身。这恰恰意味着，随着上层 agent 叙事越来越热，能长期留下来的价值仍然来自那些被反复复用的基础设施。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/7/12/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>浏览器调试正式进入 agent 工具层。</strong> Chrome DevTools 不再只是人类开发者的手工界面。</li>
<li class=""><strong>Office 文档自动化成为 AI 落地的新主战场。</strong> 企业知识工作的大量核心资产终于开始被 agent 直接触达。</li>
<li class=""><strong>安全不再是“上线后再补”的附属项。</strong> Strix 与 CubeSandbox 同时走热，非常说明问题。</li>
<li class=""><strong>本地隐私型 AI 工具仍然有巨大吸引力。</strong> Meetily 的爆发证明，很多团队仍在寻找不必上传敏感数据的解决方案。</li>
<li class=""><strong>多 agent 编排已经从玩法变成产品赛道。</strong> 插件、multiplexer、ADE 都在围绕同一个方向加速。</li>
<li class=""><strong>严格非 AI 热点虽少，但基础设施并没有沉寂。</strong> 只是它们更像“底板”，而不是“舞台中央的概念”。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/7/12/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>如果说过去几周的 Trending 还在强调 agent 有没有技能、能不能联网、会不会自动调用工具，那么这一周更像是在回答：<strong>当 agent 被认真接入日常工作之后，它到底要占据哪些操作面？</strong></p>
<p>答案已经非常具体：它要进终端、进浏览器、进 Office、进网页 GUI、进会议流程，也要进安全隔离和安全验证体系。与此同时，像 Abseil、Astryx、RuView 这样的项目又提醒我们，所有这些上层繁荣都离不开更稳的底层库、更好的设计系统，以及新的环境感知接口。</p>
<p>我最想继续追踪的，是 <strong>“工作环境接管 + 多 agent 编排 + 安全边界 + 路由层成本控制”</strong> 这条组合线。因为它们拼在一起，才像一个真正能长期运行的 agent 系统：不只是会回答问题，而是能在真实生产环境里被部署、被约束、被调度、被复用。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[用 CI Workflow 与 ArgoCD ApplicationSet 做多分支 Preview 环境]]></title>
            <link>https://xiebo.fun/blog/2026/7/8/</link>
            <guid>https://xiebo.fun/blog/2026/7/8/</guid>
            <pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[介绍一种基于 CI Workflow、镜像 tag、ArgoCD ApplicationSet 和 Kubernetes namespace 的多分支 Preview 环境设计，让需要验证的 PR 拥有独立、可追踪、可回收的临时测试环境。]]></description>
            <content:encoded><![CDATA[<p>很多团队最早的测试环境都很简单：大家共用一套 <code>dev</code>，分支一提交，CI 构建镜像，然后更新部署仓库里的镜像 tag，最后由 ArgoCD 同步到 Kubernetes。</p>
<p>这套方式在团队规模小、需求串行推进时非常够用。但只要多个功能分支开始并行测试，问题就会迅速暴露：A 分支刚部署完，B 分支又覆盖了环境；测试同学发现一个问题，却很难判断当前环境到底对应哪个 PR、哪个 commit；开发排查时还要先问一句“现在 dev 上是谁的版本”。</p>
<p>更好的办法是把“公共测试环境”之外的并行验证能力单独拆出来：<strong>只有明确需要验证的 PR，才创建一套临时 Preview 环境；PR 更新时环境自动更新；PR 关闭后环境自动回收。</strong></p>
<p>这篇文章整理一种相对轻量的实现方式：用 CI Workflow 负责构建不可变镜像，用 ArgoCD ApplicationSet 根据 PR 状态声明式创建应用，用 Kubernetes namespace 做环境隔离，再通过固定域名加 cookie 路由访问不同 PR 环境。</p>
<p>为便于公开分享，文中的业务名称、域名、仓库名、镜像仓库和集群地址都使用通用占位符。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="先说目标preview-环境不是再造一套-dev">先说目标：Preview 环境不是“再造一套 dev”<a href="https://xiebo.fun/blog/2026/7/8/#%E5%85%88%E8%AF%B4%E7%9B%AE%E6%A0%87preview-%E7%8E%AF%E5%A2%83%E4%B8%8D%E6%98%AF%E5%86%8D%E9%80%A0%E4%B8%80%E5%A5%97-dev" class="hash-link" aria-label="先说目标：Preview 环境不是“再造一套 dev”的直接链接" title="先说目标：Preview 环境不是“再造一套 dev”的直接链接" translate="no">​</a></h2>
<p>Preview 环境的目标不是把测试环境数量简单乘以 N，而是解决多分支并行验证时的几个核心问题：</p>
<ol>
<li class=""><strong>不是所有 PR 都创建环境</strong>：否则资源会被大量临时分支拖垮。</li>
<li class=""><strong>每个环境能对应到明确 PR 和 commit</strong>：方便定位问题、追溯版本。</li>
<li class=""><strong>CI 只负责构建镜像</strong>：不要让 CI 直接持有 Kubernetes 高权限。</li>
<li class=""><strong>ArgoCD 负责声明式部署和回收</strong>：让环境生命周期跟 PR 状态绑定。</li>
<li class=""><strong>Preview 环境可追踪、可回收、可扩展</strong>：后续可以扩展后端、MQ、资源配额和访问控制。</li>
</ol>
<p>换句话说，它不是“谁提交代码谁覆盖 dev”，而是：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">一个需要测试的 PR -&gt; 一套独立的临时运行环境 -&gt; 一个可追踪的镜像版本</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总体架构ci-产物与-gitops-部署解耦">总体架构：CI 产物与 GitOps 部署解耦<a href="https://xiebo.fun/blog/2026/7/8/#%E6%80%BB%E4%BD%93%E6%9E%B6%E6%9E%84ci-%E4%BA%A7%E7%89%A9%E4%B8%8E-gitops-%E9%83%A8%E7%BD%B2%E8%A7%A3%E8%80%A6" class="hash-link" aria-label="总体架构：CI 产物与 GitOps 部署解耦的直接链接" title="总体架构：CI 产物与 GitOps 部署解耦的直接链接" translate="no">​</a></h2>
<p>整体链路可以概括为：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">开发创建 PR</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; PR 满足 preview 触发条件</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; CI Workflow 构建镜像</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 镜像 tag 使用 pr-&lt;PR_NUMBER&gt;-&lt;SHORT_SHA&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; ArgoCD ApplicationSet 发现该 PR</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 自动生成一个 ArgoCD Application</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; Application 部署到独立 namespace</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 用户通过固定域名 + cookie 路由访问对应 PR 环境</span><br></span></code></pre></div></div>
<p>如果画成流程图，大概是这样：</p>
<!-- -->
<p>这里最重要的是职责拆分：</p>
<ul>
<li class=""><strong>源码仓库</strong>：负责 CI workflow、镜像构建、测试通知。</li>
<li class=""><strong>部署仓库</strong>：负责 Kubernetes manifests、Kustomize overlay、ArgoCD ApplicationSet。</li>
<li class=""><strong>ArgoCD</strong>：负责根据 PR 状态创建、更新、删除 Application。</li>
<li class=""><strong>Kubernetes</strong>：负责承载每个 PR 的独立 namespace 和运行资源。</li>
</ul>
<p>这个拆法的好处是：CI 不需要知道集群细节，ArgoCD 也不需要构建镜像。两边通过一个稳定的事实对齐：<strong>镜像 tag</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="preview-触发条件显式-opt-in而不是所有-pr-自动部署">Preview 触发条件：显式 opt-in，而不是所有 PR 自动部署<a href="https://xiebo.fun/blog/2026/7/8/#preview-%E8%A7%A6%E5%8F%91%E6%9D%A1%E4%BB%B6%E6%98%BE%E5%BC%8F-opt-in%E8%80%8C%E4%B8%8D%E6%98%AF%E6%89%80%E6%9C%89-pr-%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="Preview 触发条件：显式 opt-in，而不是所有 PR 自动部署的直接链接" title="Preview 触发条件：显式 opt-in，而不是所有 PR 自动部署的直接链接" translate="no">​</a></h2>
<p>Preview 环境通常会占用真实集群资源，所以不建议所有 PR 都自动创建。更稳妥的方式是让开发显式 opt-in。</p>
<p>最简单的做法是要求 PR 标题包含：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">[preview]</span><br></span></code></pre></div></div>
<p>例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">[preview] 调整订单列表筛选逻辑</span><br></span></code></pre></div></div>
<p>CI Workflow 中可以用条件判断：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">pull_request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">opened</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> synchronize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> reopened</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> edited</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">build_preview_image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> contains(gitea.event.pull_request.title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">preview</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">')</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Checkout</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> actions/checkout@v4</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Build and push preview image</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          echo "build preview image here"</span><br></span></code></pre></div></div>
<p>ApplicationSet 里也使用相同过滤条件：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">filters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">titleMatch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'.*\[preview\].*'</span><br></span></code></pre></div></div>
<p>这样只有满足条件的 PR 才会触发三件事：</p>
<ol>
<li class="">构建 preview 镜像。</li>
<li class="">创建 ArgoCD Application。</li>
<li class="">部署独立 preview namespace。</li>
</ol>
<p>后续如果需要更强控制，可以把触发条件从 PR 标题升级为 PR label，例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">preview/enabled</span><br></span></code></pre></div></div>
<p>标题方式实现简单，label 方式更适合生产流程，因为 label 可以由维护者、机器人或审批流程控制。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="镜像-tag让-pr-和-commit-成为可追踪事实">镜像 Tag：让 PR 和 commit 成为可追踪事实<a href="https://xiebo.fun/blog/2026/7/8/#%E9%95%9C%E5%83%8F-tag%E8%AE%A9-pr-%E5%92%8C-commit-%E6%88%90%E4%B8%BA%E5%8F%AF%E8%BF%BD%E8%B8%AA%E4%BA%8B%E5%AE%9E" class="hash-link" aria-label="镜像 Tag：让 PR 和 commit 成为可追踪事实的直接链接" title="镜像 Tag：让 PR 和 commit 成为可追踪事实的直接链接" translate="no">​</a></h2>
<p>Preview 镜像 tag 建议同时包含 PR 编号和 commit 短 SHA：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">pr-&lt;PR_NUMBER&gt;-&lt;SHORT_SHA&gt;</span><br></span></code></pre></div></div>
<p>例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">pr-123-a1b2c3d</span><br></span></code></pre></div></div>
<p>它有几个直接好处：</p>
<ul>
<li class="">一眼能看出镜像来自哪个 PR。</li>
<li class="">一眼能看出镜像来自哪个 commit。</li>
<li class="">PR 更新后，镜像 tag 自动变化。</li>
<li class="">ArgoCD 可以根据 PR 当前 head sha 推导目标镜像。</li>
</ul>
<p>CI 构建完成后推送镜像：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">registry.example.com/project/frontend:pr-123-a1b2c3d</span><br></span></code></pre></div></div>
<p>对应到 workflow，大致可以这样组织：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">build_preview_image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> contains(gitea.event.pull_request.title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">preview</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">')</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Checkout</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> actions/checkout@v4</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Compute image tag</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> vars</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          SHORT_SHA=$(echo "${{ gitea.event.pull_request.head.sha }}" | cut -c1-7)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          echo "tag=pr-${{ gitea.event.pull_request.number }}-${SHORT_SHA}" &gt;&gt; "$GITHUB_OUTPUT"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Build image</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          docker build \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            -t registry.example.com/project/frontend:${{ steps.vars.outputs.tag }} \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            .</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Push image</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          docker push registry.example.com/project/frontend:${{ steps.vars.outputs.tag }}</span><br></span></code></pre></div></div>
<p>这里的关键点是：<strong>preview 镜像应该是不可变产物</strong>。不要给多个 commit 复用同一个 <code>preview-latest</code>，否则测试环境的可追踪性会被破坏。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="applicationset根据-pr-自动生成-application">ApplicationSet：根据 PR 自动生成 Application<a href="https://xiebo.fun/blog/2026/7/8/#applicationset%E6%A0%B9%E6%8D%AE-pr-%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90-application" class="hash-link" aria-label="ApplicationSet：根据 PR 自动生成 Application的直接链接" title="ApplicationSet：根据 PR 自动生成 Application的直接链接" translate="no">​</a></h2>
<p>ApplicationSet 使用 Pull Request Generator 监听代码平台里的 PR。下面是一个基于 Gitea 的示例结构：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ApplicationSet</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> project</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">preview</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">pr</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> argocd</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">goTemplate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">generators</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">pullRequest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">gitea</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">owner</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> &lt;org</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">repo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> &lt;source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">repo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">api</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//git.example.com/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tokenRef</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">secretName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> gitea</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">token</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> token</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">filters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">titleMatch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'.*\[preview\].*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">requeueAfterSeconds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">180</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'preview-pr-{{ .number }}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">project</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> project</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">preview</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">repoURL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//git.example.com/&lt;org</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">/&lt;deploy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">repo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">.git</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">targetRevision</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> main</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> previews/project</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">kustomize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'preview-pr-{{ .number }}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">images</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'registry.example.com/project/frontend:pr-{{ .number }}-{{ .head_short_sha_7 }}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">destination</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">server</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//kubernetes.default.svc</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'preview-pr-{{ .number }}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">syncPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">automated</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">prune</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">selfHeal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">syncOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> CreateNamespace=true</span><br></span></code></pre></div></div>
<p>ApplicationSet 的行为可以理解为：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">PR 满足条件</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 创建 preview-pr-&lt;PR_NUMBER&gt; Application</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">PR 更新</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 重新渲染 Application 参数，例如镜像 tag</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">PR 关闭或移除 [preview]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 删除对应 Application</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Application 删除</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; ArgoCD prune 该 Application 管理的资源</span><br></span></code></pre></div></div>
<p>这里有一个很有价值的边界：<strong>CI 不需要去改 ApplicationSet，也不需要直接 kubectl apply</strong>。它只要把符合命名规则的镜像推到仓库即可。ApplicationSet 会根据 PR 当前 head sha 自己推导出应该部署哪个镜像。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ci-与-argocd-是最终一致而不是强事务">CI 与 ArgoCD 是最终一致，而不是强事务<a href="https://xiebo.fun/blog/2026/7/8/#ci-%E4%B8%8E-argocd-%E6%98%AF%E6%9C%80%E7%BB%88%E4%B8%80%E8%87%B4%E8%80%8C%E4%B8%8D%E6%98%AF%E5%BC%BA%E4%BA%8B%E5%8A%A1" class="hash-link" aria-label="CI 与 ArgoCD 是最终一致，而不是强事务的直接链接" title="CI 与 ArgoCD 是最终一致，而不是强事务的直接链接" translate="no">​</a></h2>
<p>这套设计里，CI 和 ArgoCD 是两条解耦链路：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">CI Workflow</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 构建并推送镜像</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ArgoCD ApplicationSet</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 根据 PR 状态生成期望部署状态</span><br></span></code></pre></div></div>
<p>这意味着它们不是强事务关系，可能出现一种短暂状态：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">ArgoCD 已经开始同步</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">但镜像还没推送完成</span><br></span></code></pre></div></div>
<p>此时 Pod 可能会短暂出现：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">ImagePullBackOff</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ErrImagePull</span><br></span></code></pre></div></div>
<p>通常这不是设计错误。镜像推送完成后，Kubernetes 会自动重试拉取并恢复。</p>
<p>如果业务要求严格保证“镜像构建完成后才部署”，可以升级成更复杂的 ready 标记机制，例如：</p>
<ul>
<li class="">CI 构建成功后写入 deploy repo。</li>
<li class="">CI 构建成功后给 PR 打 <code>build-ready</code> label。</li>
<li class="">CI 写入一个 preview metadata 文件，ApplicationSet 或其他控制器再读取。</li>
</ul>
<p>但这会增加控制面复杂度。多数 Preview 场景可以接受最终一致，因为 Preview 环境本身服务的是短周期验证，不是生产发布。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="访问路由固定域名加-cookie-区分-pr">访问路由：固定域名加 cookie 区分 PR<a href="https://xiebo.fun/blog/2026/7/8/#%E8%AE%BF%E9%97%AE%E8%B7%AF%E7%94%B1%E5%9B%BA%E5%AE%9A%E5%9F%9F%E5%90%8D%E5%8A%A0-cookie-%E5%8C%BA%E5%88%86-pr" class="hash-link" aria-label="访问路由：固定域名加 cookie 区分 PR的直接链接" title="访问路由：固定域名加 cookie 区分 PR的直接链接" translate="no">​</a></h2>
<p>如果每个 PR 都申请一个独立域名，DNS、证书、Ingress 规则都会变复杂。更轻量的方式是使用固定域名：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">https://preview.example.com</span><br></span></code></pre></div></div>
<p>然后通过 cookie 区分当前要访问哪个 PR：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">preview_route=pr-123.</span><br></span></code></pre></div></div>
<p>Ingress 里可以配置基于 cookie 的转发条件，例如：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">alb.ingress.kubernetes.io/conditions.frontend</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">  [{"field":"http-header","httpHeaderConfig":{"httpHeaderName":"Cookie","values":["*preview_route=pr-123.*"]}}]</span><br></span></code></pre></div></div>
<p>这里建议 cookie value 带一个结束符，比如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">pr-123.</span><br></span></code></pre></div></div>
<p>而不是简单写成：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">pr-123</span><br></span></code></pre></div></div>
<p>原因是要避免 <code>pr-12</code> 误匹配到 <code>pr-123</code>。</p>
<p>这种设计的核心思路是：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">同一个 preview 域名</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 根据 cookie 选择不同 PR namespace 下的服务</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="selector-页面不要让开发手动改-cookie">Selector 页面：不要让开发手动改 cookie<a href="https://xiebo.fun/blog/2026/7/8/#selector-%E9%A1%B5%E9%9D%A2%E4%B8%8D%E8%A6%81%E8%AE%A9%E5%BC%80%E5%8F%91%E6%89%8B%E5%8A%A8%E6%94%B9-cookie" class="hash-link" aria-label="Selector 页面：不要让开发手动改 cookie的直接链接" title="Selector 页面：不要让开发手动改 cookie的直接链接" translate="no">​</a></h2>
<p>为了避免开发和测试手动设置 cookie，可以提供一个 selector 页面：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">https://preview.example.com/select</span><br></span></code></pre></div></div>
<p>用户输入 PR 编号后，selector 写入 cookie：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">preview_route=pr-123.</span><br></span></code></pre></div></div>
<p>然后跳转到：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">https://preview.example.com/app</span><br></span></code></pre></div></div>
<p>也可以支持直接链接：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">https://preview.example.com/select?pr=123</span><br></span></code></pre></div></div>
<p>这样 CI 通知里就可以直接发送 selector 链接：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Preview 环境已创建：</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">https://preview.example.com/select?pr=123</span><br></span></code></pre></div></div>
<p>selector 页面不需要复杂，它本质上只是一个“路由选择器”。但它能显著降低使用成本：开发、测试、产品只需要点链接，不需要理解 cookie 和 Ingress 细节。</p>
<p>需要注意：<strong>cookie 路由不是鉴权</strong>。它只是把请求路由到不同 Preview 环境，不应该被当作安全边界。真正的访问控制应该放在统一认证层、网关、WAF 或内网访问控制中。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="appproject给-preview-环境单独收权限">AppProject：给 Preview 环境单独收权限<a href="https://xiebo.fun/blog/2026/7/8/#appproject%E7%BB%99-preview-%E7%8E%AF%E5%A2%83%E5%8D%95%E7%8B%AC%E6%94%B6%E6%9D%83%E9%99%90" class="hash-link" aria-label="AppProject：给 Preview 环境单独收权限的直接链接" title="AppProject：给 Preview 环境单独收权限的直接链接" translate="no">​</a></h2>
<p>Preview 环境会自动创建很多 Application，如果不加限制，很容易变成一个权限过大的自动化入口。建议为 Preview 单独创建 ArgoCD AppProject：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> AppProject</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> project</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">preview</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> argocd</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">sourceRepos</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//git.example.com/&lt;org</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">/&lt;deploy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">repo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">.git</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">destinations</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">server</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//kubernetes.default.svc</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> preview</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">pr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">*</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">clusterResourceWhitelist</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Namespace</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">namespaceResourceWhitelist</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><br></span></code></pre></div></div>
<p>AppProject 的作用是限制：</p>
<ol>
<li class="">哪些 Git 仓库可以作为部署来源。</li>
<li class="">可以部署到哪些 namespace。</li>
<li class="">可以创建哪些 Kubernetes 资源。</li>
</ol>
<p>这里要特别注意：<code>sourceRepos</code> 只是权限白名单，不是 Git 凭据。ArgoCD 仍然需要单独配置 repository credential，否则 repo-server 拉部署仓库时仍然会报：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Git authentication required</span><br></span></code></pre></div></div>
<p>这类问题不要误判成 Pull Request Generator 的 token 失效。PR token 负责读 PR，repo credential 负责拉部署仓库，它们是两套凭据。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pr-关闭后的资源回收重点盯住-namespace">PR 关闭后的资源回收：重点盯住 namespace<a href="https://xiebo.fun/blog/2026/7/8/#pr-%E5%85%B3%E9%97%AD%E5%90%8E%E7%9A%84%E8%B5%84%E6%BA%90%E5%9B%9E%E6%94%B6%E9%87%8D%E7%82%B9%E7%9B%AF%E4%BD%8F-namespace" class="hash-link" aria-label="PR 关闭后的资源回收：重点盯住 namespace的直接链接" title="PR 关闭后的资源回收：重点盯住 namespace的直接链接" translate="no">​</a></h2>
<p>PR 关闭后，ApplicationSet 下一轮轮询时会发现该 PR 不再存在，或者不再满足过滤条件，于是删除对应 Application。</p>
<p>但这里有个容易踩的坑：如果 namespace 是通过下面这个 sync option 自动创建的：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">syncOptions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> CreateNamespace=true</span><br></span></code></pre></div></div>
<p>那么 namespace 本身不一定会随着 Application 删除而删除。</p>
<p>也就是说，Application 管理的 Deployment、Service、Ingress 等资源可能被 prune 掉了，但 namespace 还留着。</p>
<p>解决方式通常有两种。</p>
<p>第一种：把 Namespace 显式放进 manifests，让它成为 ArgoCD 管理资源：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> v1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Namespace</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> preview</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">pr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">123</span><br></span></code></pre></div></div>
<p>第二种：定期运行 cleanup job，删除已经没有对应 Application 的 preview namespace：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">列出 preview-pr-* namespace</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 查询是否存在同名 ArgoCD Application</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 不存在则删除 namespace</span><br></span></code></pre></div></div>
<p>生产级 Preview 环境建议至少实现一种 namespace 清理机制，否则 PR 关闭后可能留下大量空 namespace、Secret、ConfigMap 或 ResourceQuota。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="secret-与配置复用-dev但不要把明文放进-git">Secret 与配置：复用 dev，但不要把明文放进 Git<a href="https://xiebo.fun/blog/2026/7/8/#secret-%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%A4%8D%E7%94%A8-dev%E4%BD%86%E4%B8%8D%E8%A6%81%E6%8A%8A%E6%98%8E%E6%96%87%E6%94%BE%E8%BF%9B-git" class="hash-link" aria-label="Secret 与配置：复用 dev，但不要把明文放进 Git的直接链接" title="Secret 与配置：复用 dev，但不要把明文放进 Git的直接链接" translate="no">​</a></h2>
<p>Preview 环境通常会复用 dev 环境的大部分配置，但不建议把明文 Secret 提交到 Git。</p>
<p>常见做法有三类：</p>
<ol>
<li class="">使用集群内已有 Secret，并通过复制器同步到 preview namespace。</li>
<li class="">使用 External Secrets 从外部密钥系统拉取。</li>
<li class="">使用 Sealed Secrets 加密后提交到 Git。</li>
</ol>
<p>如果每个 Preview 环境需要少量差异化配置，可以拆成两层：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">公共配置</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; preview-common-secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">单 PR 覆盖</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; preview-overrides-secret</span><br></span></code></pre></div></div>
<p>Deployment 中按顺序挂载：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">envFrom</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">secretRef</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> preview</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">common</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">secretRef</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> preview</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">overrides</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">optional</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><br></span></code></pre></div></div>
<p>这样大部分配置复用公共 Secret，少量 PR 特有配置可以单独覆盖。<code>optional: true</code> 可以避免没有覆盖 Secret 时 Pod 启动失败。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="扩展到后端服务前端和后端必须命中同一个-pr">扩展到后端服务：前端和后端必须命中同一个 PR<a href="https://xiebo.fun/blog/2026/7/8/#%E6%89%A9%E5%B1%95%E5%88%B0%E5%90%8E%E7%AB%AF%E6%9C%8D%E5%8A%A1%E5%89%8D%E7%AB%AF%E5%92%8C%E5%90%8E%E7%AB%AF%E5%BF%85%E9%A1%BB%E5%91%BD%E4%B8%AD%E5%90%8C%E4%B8%80%E4%B8%AA-pr" class="hash-link" aria-label="扩展到后端服务：前端和后端必须命中同一个 PR的直接链接" title="扩展到后端服务：前端和后端必须命中同一个 PR的直接链接" translate="no">​</a></h2>
<p>如果 Preview 只部署前端，问题相对简单。但很多真实系统是前后端分离的：前端打开的是 PR 环境，请求却可能仍然打到公共 dev 后端。</p>
<p>这会让测试结果失真。</p>
<p>一种常见做法是给前后端都使用 preview 域名，并用同一个 cookie 区分 PR：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">frontend:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  https://preview.example.com/app</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">backend:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  https://preview-api.example.com</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">cookie:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  preview_route=pr-123.</span><br></span></code></pre></div></div>
<p>这时要满足几个条件：</p>
<ol>
<li class="">selector 写入跨子域 cookie，例如 <code>Domain=.example.com</code>。</li>
<li class="">前端构建时把后端 API URL 指向 preview 后端域名。</li>
<li class="">前端跨域请求需要携带 credentials。</li>
<li class="">后端 CORS 允许 preview 前端域名。</li>
<li class="">后端 Ingress 使用相同 cookie 条件做路由。</li>
</ol>
<p>否则就会出现一种很隐蔽的问题：页面本身来自 PR 环境，但 API 请求打到了公共 dev 后端。测试看到的行为就不再代表这个 PR 的完整系统状态。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mq-队列隔离不是所有依赖都要复制一份">MQ 队列隔离：不是所有依赖都要复制一份<a href="https://xiebo.fun/blog/2026/7/8/#mq-%E9%98%9F%E5%88%97%E9%9A%94%E7%A6%BB%E4%B8%8D%E6%98%AF%E6%89%80%E6%9C%89%E4%BE%9D%E8%B5%96%E9%83%BD%E8%A6%81%E5%A4%8D%E5%88%B6%E4%B8%80%E4%BB%BD" class="hash-link" aria-label="MQ 队列隔离：不是所有依赖都要复制一份的直接链接" title="MQ 队列隔离：不是所有依赖都要复制一份的直接链接" translate="no">​</a></h2>
<p>后端服务如果依赖 MQ，需要区分两类队列。</p>
<p>第一类是服务内部执行队列，例如 Redis/BullMQ。这类队列通常不需要真的创建独立基础设施，只需要按 PR 注入 key prefix：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">REDIS_KEY_PREFIX=preview:pr-123:</span><br></span></code></pre></div></div>
<p>这样多个 Preview 环境可以复用同一个 Redis，但 key 空间互相隔离。</p>
<p>第二类是外部回调队列，例如 RabbitMQ。每个 PR 可以注入独立队列名：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">TASK_CALLBACK_QUEUE=preview.pr-123.callback</span><br></span></code></pre></div></div>
<p>如果服务启动时会执行：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">assertQueue(queueName)</span><br></span></code></pre></div></div>
<p>那么队列可以由服务自动创建，不需要 workflow 提前创建。</p>
<p>但这里有一个关键前提：<strong>上游生产者也必须知道该把消息投递到哪个队列</strong>。如果上游只能投递到固定队列，那么每个 PR 独立队列并不会生效，需要增加 MQ router，或者改造上游投递逻辑。</p>
<p>队列回收可以交给 MQ policy，例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">匹配 preview.pr-*.callback</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">无 consumer 一段时间后自动删除</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">消息 TTL 限制为固定时间</span><br></span></code></pre></div></div>
<p>这样 PR 关闭后，后端 Pod 消失，队列最终自动过期删除。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="资源控制preview-环境一定要有上限">资源控制：Preview 环境一定要有上限<a href="https://xiebo.fun/blog/2026/7/8/#%E8%B5%84%E6%BA%90%E6%8E%A7%E5%88%B6preview-%E7%8E%AF%E5%A2%83%E4%B8%80%E5%AE%9A%E8%A6%81%E6%9C%89%E4%B8%8A%E9%99%90" class="hash-link" aria-label="资源控制：Preview 环境一定要有上限的直接链接" title="资源控制：Preview 环境一定要有上限的直接链接" translate="no">​</a></h2>
<p>Preview 环境最容易被低估的问题是资源。功能分支越多，临时环境越多，如果不做限制，很容易拖垮测试集群。</p>
<p>建议每个 Preview namespace 加：</p>
<ul>
<li class=""><code>ResourceQuota</code></li>
<li class=""><code>LimitRange</code></li>
</ul>
<p>可以限制：</p>
<ul>
<li class="">最多 Pod 数量。</li>
<li class="">CPU request / limit。</li>
<li class="">Memory request / limit。</li>
<li class="">禁止 <code>LoadBalancer</code> 类型 Service。</li>
</ul>
<p>例如：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> v1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ResourceQuota</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> preview</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">quota</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">hard</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">pods</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"10"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">requests.cpu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">requests.memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 4Gi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">limits.cpu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"4"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">limits.memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 8Gi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">services.loadbalancers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"0"</span><br></span></code></pre></div></div>
<p>同时，Preview 环境的默认副本数也应该更保守：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">1</span><br></span></code></pre></div></div>
<p>后端 worker 并发也可以降低：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">WORKER_CONCURRENCY=1</span><br></span></code></pre></div></div>
<p>Preview 的目标是验证功能，不是压测吞吐。资源约束越早做，后面越不容易因为“临时环境”变成新的基础设施负担。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="常见问题">常见问题<a href="https://xiebo.fun/blog/2026/7/8/#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" class="hash-link" aria-label="常见问题的直接链接" title="常见问题的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pr-更新后-argocd-偶尔报镜像拉取失败正常吗">PR 更新后 ArgoCD 偶尔报镜像拉取失败，正常吗？<a href="https://xiebo.fun/blog/2026/7/8/#pr-%E6%9B%B4%E6%96%B0%E5%90%8E-argocd-%E5%81%B6%E5%B0%94%E6%8A%A5%E9%95%9C%E5%83%8F%E6%8B%89%E5%8F%96%E5%A4%B1%E8%B4%A5%E6%AD%A3%E5%B8%B8%E5%90%97" class="hash-link" aria-label="PR 更新后 ArgoCD 偶尔报镜像拉取失败，正常吗？的直接链接" title="PR 更新后 ArgoCD 偶尔报镜像拉取失败，正常吗？的直接链接" translate="no">​</a></h3>
<p>多数情况下是正常的短暂状态。</p>
<p>原因是 ApplicationSet 先根据 PR head sha 渲染出了新镜像 tag，但 CI 还没把该 tag 推送完成。Kubernetes 会先拉取失败，出现 <code>ImagePullBackOff</code> 或 <code>ErrImagePull</code>，镜像推送完成后会自动重试恢复。</p>
<p>如果这种状态持续很久，才需要检查 CI 是否构建失败、镜像仓库权限是否正确、tag 是否和 ApplicationSet 模板一致。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pr-关闭后-namespace-为什么没删除">PR 关闭后 namespace 为什么没删除？<a href="https://xiebo.fun/blog/2026/7/8/#pr-%E5%85%B3%E9%97%AD%E5%90%8E-namespace-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%B2%A1%E5%88%A0%E9%99%A4" class="hash-link" aria-label="PR 关闭后 namespace 为什么没删除？的直接链接" title="PR 关闭后 namespace 为什么没删除？的直接链接" translate="no">​</a></h3>
<p>因为 <code>CreateNamespace=true</code> 自动创建的 namespace 不一定是 Application 管理资源。</p>
<p>解决方法是：</p>
<ul>
<li class="">把 Namespace 显式写入 manifests，让 ArgoCD 管理它；或者</li>
<li class="">做一个 cleanup job，定期清理没有对应 Application 的 <code>preview-pr-*</code> namespace。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-报-git-authentication-required-是-pr-token-的问题吗">ArgoCD 报 Git authentication required 是 PR token 的问题吗？<a href="https://xiebo.fun/blog/2026/7/8/#argocd-%E6%8A%A5-git-authentication-required-%E6%98%AF-pr-token-%E7%9A%84%E9%97%AE%E9%A2%98%E5%90%97" class="hash-link" aria-label="ArgoCD 报 Git authentication required 是 PR token 的问题吗？的直接链接" title="ArgoCD 报 Git authentication required 是 PR token 的问题吗？的直接链接" translate="no">​</a></h3>
<p>不一定。</p>
<p>Pull Request Generator 的 token 用来读取 PR；ArgoCD repo-server 拉部署仓库时用的是 repository credential。<code>Git authentication required</code> 通常是 repo credential 没配、repoURL 不匹配，或者凭据权限不足。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cookie-路由可以当鉴权吗">Cookie 路由可以当鉴权吗？<a href="https://xiebo.fun/blog/2026/7/8/#cookie-%E8%B7%AF%E7%94%B1%E5%8F%AF%E4%BB%A5%E5%BD%93%E9%89%B4%E6%9D%83%E5%90%97" class="hash-link" aria-label="Cookie 路由可以当鉴权吗？的直接链接" title="Cookie 路由可以当鉴权吗？的直接链接" translate="no">​</a></h3>
<p>不可以。</p>
<p>Cookie 路由只负责把请求送到对应 PR 环境，不应该承担安全职责。真正的访问控制应该放在统一认证层、网关、WAF、VPN 或内网访问控制中。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="是否应该给每个-pr-创建完整中间件">是否应该给每个 PR 创建完整中间件？<a href="https://xiebo.fun/blog/2026/7/8/#%E6%98%AF%E5%90%A6%E5%BA%94%E8%AF%A5%E7%BB%99%E6%AF%8F%E4%B8%AA-pr-%E5%88%9B%E5%BB%BA%E5%AE%8C%E6%95%B4%E4%B8%AD%E9%97%B4%E4%BB%B6" class="hash-link" aria-label="是否应该给每个 PR 创建完整中间件？的直接链接" title="是否应该给每个 PR 创建完整中间件？的直接链接" translate="no">​</a></h3>
<p>不一定。</p>
<p>Preview 环境应该优先隔离“应用运行态”和“容易污染的数据空间”。很多基础设施可以复用，但要用 namespace、key prefix、队列名、数据库 schema 或测试账号做逻辑隔离。只有当共享基础设施会导致强污染或安全问题时，才考虑为每个 PR 创建独立实例。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结多泳道测试的关键是把生命周期交给声明式系统">总结：多泳道测试的关键是把生命周期交给声明式系统<a href="https://xiebo.fun/blog/2026/7/8/#%E6%80%BB%E7%BB%93%E5%A4%9A%E6%B3%B3%E9%81%93%E6%B5%8B%E8%AF%95%E7%9A%84%E5%85%B3%E9%94%AE%E6%98%AF%E6%8A%8A%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%BA%A4%E7%BB%99%E5%A3%B0%E6%98%8E%E5%BC%8F%E7%B3%BB%E7%BB%9F" class="hash-link" aria-label="总结：多泳道测试的关键是把生命周期交给声明式系统的直接链接" title="总结：多泳道测试的关键是把生命周期交给声明式系统的直接链接" translate="no">​</a></h2>
<p>这套多分支 Preview 环境的关键，不是某一段 YAML，而是职责拆分：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">CI Workflow</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 负责构建不可变镜像</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ApplicationSet</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 负责根据 PR 状态生成 Application</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ArgoCD</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 负责持续同步、漂移修复和资源删除</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Ingress</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 负责将固定域名下的请求路由到不同 PR 环境</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Kubernetes</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 负责 namespace 级别隔离和资源限制</span><br></span></code></pre></div></div>
<p>最终效果是：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">PR 加 [preview]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 自动构建镜像</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 自动创建 Preview 环境</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; 自动发送访问入口</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; PR 更新后自动滚动更新</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  -&gt; PR 关闭后自动回收资源</span><br></span></code></pre></div></div>
<p>这种模式适合需要多分支并行验证的团队。它不会消除所有测试复杂度，但能把“谁覆盖了 dev”“现在环境是哪次提交”“这个临时环境什么时候删”这些问题，从人工约定变成系统事实。</p>
<p>从工程化角度看，Preview 环境真正带来的收益不是多跑几套服务，而是让每个需要验证的变更都拥有一条清晰、可追踪、可回收的生命周期。</p>]]></content:encoded>
            <category>Preview环境</category>
            <category>ArgoCD</category>
            <category>ApplicationSet</category>
            <category>GitOps</category>
            <category>CI/CD</category>
            <category>Kubernetes</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Agent 开始卷编排、记忆、视频与安全边界（2026-07-05）]]></title>
            <link>https://xiebo.fun/blog/2026/7/5/</link>
            <guid>https://xiebo.fun/blog/2026/7/5/</guid>
            <pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 几乎被 AI agent 项目占满，但热点已经从“再造一个聊天助手”进一步转向编排台、记忆层、免费模型网关、GUI 控制、视频生产和安全测试；与此同时，SimpleX、Logto、Maven 等非 AI / 泛基础设施项目也提醒我们，隐私通信、身份系统和构建底座依旧有稳定需求。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）给人的最强烈感受是：<strong>AI agent 叙事已经从“模型会不会写代码”切换到“一个 agent 团队怎么协作、怎么记住项目、怎么接管 GUI、怎么产出视频、怎么接入免费模型、怎么被安全验证”</strong>。高位项目里既有 <a href="https://github.com/usestrix/strix" target="_blank" rel="noopener noreferrer" class="">usestrix/strix</a> 这种 AI 渗透测试工具，也有 <a href="https://github.com/DeusData/codebase-memory-mcp" target="_blank" rel="noopener noreferrer" class="">DeusData/codebase-memory-mcp</a>、<a href="https://github.com/diegosouzapw/OmniRoute" target="_blank" rel="noopener noreferrer" class="">diegosouzapw/OmniRoute</a>、<a href="https://github.com/ogulcancelik/herdr" target="_blank" rel="noopener noreferrer" class="">ogulcancelik/herdr</a>、<a href="https://github.com/openai/codex-plugin-cc" target="_blank" rel="noopener noreferrer" class="">openai/codex-plugin-cc</a>、<a href="https://github.com/topoteretes/cognee" target="_blank" rel="noopener noreferrer" class="">topoteretes/cognee</a>、<a href="https://github.com/alibaba/page-agent" target="_blank" rel="noopener noreferrer" class="">alibaba/page-agent</a> 这样分别占据记忆、路由、编排、跨 agent 协作、长期记忆和页面操作层的位置。</p>
<p>另一面是，榜单里严格意义上的非 AI 项目明显偏少，但并没有消失。<a href="https://github.com/simplex-chat/simplex-chat" target="_blank" rel="noopener noreferrer" class="">simplex-chat/simplex-chat</a>、<a href="https://github.com/logto-io/logto" target="_blank" rel="noopener noreferrer" class="">logto-io/logto</a>、<a href="https://github.com/apache/maven" target="_blank" rel="noopener noreferrer" class="">apache/maven</a> 这些项目的热度说明：当大家都在给 agent 叠能力时，真正承载生产系统的通信隐私、认证授权、构建发布这些底层能力仍然有人持续投入。换句话说，AI 很热，但基础设施没有退场，只是被放到了更“必需品”的位置。</p>
<blockquote>
<p>本文基于 GitHub Trending weekly 页面展示的仓库描述、本周新增 star，以及 GitHub REST API 可访问的仓库元数据做归纳。Trending 反映的是“本周被集中关注”，并不等于生产采用率，因此“为什么这周变热”更接近趋势判断，而非确定性结论。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/7/5/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>Agent 正在从单体助手演化成“多角色编排系统”。</strong> <a href="https://github.com/msitarzewski/agency-agents" target="_blank" rel="noopener noreferrer" class="">msitarzewski/agency-agents</a>、<a href="https://github.com/ogulcancelik/herdr" target="_blank" rel="noopener noreferrer" class="">ogulcancelik/herdr</a>、<a href="https://github.com/stablyai/orca" target="_blank" rel="noopener noreferrer" class="">stablyai/orca</a>、<a href="https://github.com/openai/codex-plugin-cc" target="_blank" rel="noopener noreferrer" class="">openai/codex-plugin-cc</a> 同时出现，说明大家关心的已经不是一个 agent 会不会回答，而是多个 agent 怎么分工、复核和并行执行。</li>
<li class=""><strong>记忆与上下文仍然是 coding agent 的核心瓶颈。</strong> <a href="https://github.com/DeusData/codebase-memory-mcp" target="_blank" rel="noopener noreferrer" class="">DeusData/codebase-memory-mcp</a> 和 <a href="https://github.com/topoteretes/cognee" target="_blank" rel="noopener noreferrer" class="">topoteretes/cognee</a> 持续受关注，意味着“让 agent 记住代码库和长期状态”仍是高价值方向。</li>
<li class=""><strong>AI 工作流开始向 GUI 和多媒体扩张。</strong> <a href="https://github.com/alibaba/page-agent" target="_blank" rel="noopener noreferrer" class="">alibaba/page-agent</a>、<a href="https://github.com/browser-use/video-use" target="_blank" rel="noopener noreferrer" class="">browser-use/video-use</a>、<a href="https://github.com/calesthio/OpenMontage" target="_blank" rel="noopener noreferrer" class="">calesthio/OpenMontage</a> 代表 agent 从终端/文本任务走向网页界面和视频生产链路。</li>
<li class=""><strong>免费模型路由与成本敏感型基础设施继续爆发。</strong> <a href="https://github.com/diegosouzapw/OmniRoute" target="_blank" rel="noopener noreferrer" class="">diegosouzapw/OmniRoute</a> 这类统一网关项目能热起来，说明开发者对“多模型、低成本、自动 fallback、压缩 token”的需求已经很具体。</li>
<li class=""><strong>AI 安全开始更贴近实际攻击与审计。</strong> <a href="https://github.com/usestrix/strix" target="_blank" rel="noopener noreferrer" class="">usestrix/strix</a> 的高热说明，大家已经不满足于谈抽象的 prompt 安全，而是更关心 AI 应用如何被真实测试、扫描和修补。</li>
<li class=""><strong>非 AI 项目虽然少，但每一个都很“底层”。</strong> <a href="https://github.com/simplex-chat/simplex-chat" target="_blank" rel="noopener noreferrer" class="">simplex-chat/simplex-chat</a>、<a href="https://github.com/logto-io/logto" target="_blank" rel="noopener noreferrer" class="">logto-io/logto</a>、<a href="https://github.com/apache/maven" target="_blank" rel="noopener noreferrer" class="">apache/maven</a> 共同指向隐私通信、身份基础设施和构建系统这些长期需求。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/7/5/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-usestrixstrix">1. <a href="https://github.com/usestrix/strix" target="_blank" rel="noopener noreferrer" class="">usestrix/strix</a><a href="https://xiebo.fun/blog/2026/7/5/#1-usestrixstrix" class="hash-link" aria-label="1-usestrixstrix的直接链接" title="1-usestrixstrix的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源 AI 渗透测试工具，主打帮助开发者发现并修复 AI 应用漏洞，仓库主题直接落在 ai-pentesting、llm-security、red-teaming、security-automation 上。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 9.4k stars。随着越来越多团队把 LLM 接到产品、客服、代码和工作流里，“AI 应用有没有新型漏洞”已经从研究问题变成工程问题。</li>
<li class=""><strong>有什么新意</strong>：它不是泛泛地谈 AI 安全，而是把红队测试工具化。真正被关注的点在于：AI 安全开始从论文和 checklist 变成可以跑起来的实际测试流程。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-deusdatacodebase-memory-mcp">2. <a href="https://github.com/DeusData/codebase-memory-mcp" target="_blank" rel="noopener noreferrer" class="">DeusData/codebase-memory-mcp</a><a href="https://xiebo.fun/blog/2026/7/5/#2-deusdatacodebase-memory-mcp" class="hash-link" aria-label="2-deusdatacodebase-memory-mcp的直接链接" title="2-deusdatacodebase-memory-mcp的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个高性能代码智能 MCP server，把代码库索引成持久知识图谱，强调 158 种语言支持、毫秒级索引、亚毫秒查询和 99% token 节省。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 9.5k stars。coding agent 越深入真实项目，越会暴露“看不懂整个仓库”的问题。</li>
<li class=""><strong>有什么新意</strong>：它把代码理解从一次性上下文切换成可查询的长期结构化记忆，而且兼容 Claude Code、Codex、Cursor、Gemini CLI、OpenCode 等多类工具协议生态，这一点比单纯“更快索引”更关键。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-msitarzewskiagency-agents">3. <a href="https://github.com/msitarzewski/agency-agents" target="_blank" rel="noopener noreferrer" class="">msitarzewski/agency-agents</a><a href="https://xiebo.fun/blog/2026/7/5/#3-msitarzewskiagency-agents" class="hash-link" aria-label="3-msitarzewskiagency-agents的直接链接" title="3-msitarzewskiagency-agents的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个“完整 AI agency”式项目，内置多种具备角色设定、流程与产出的专门 agent，从前端、社区到策略类角色都有覆盖。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 11.0k stars，是榜单上最强的 agent 编排信号之一。大家对“一个万能 agent”越来越没耐心，开始转向“多个明确角色 agent 协作”。</li>
<li class=""><strong>有什么新意</strong>：它把 agency 概念产品化。未来很多团队未必直接买一个超级 agent，而是更愿意拼装一套各自负责研究、写作、开发、审校、投放的 agent roster。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-diegosouzapwomniroute">4. <a href="https://github.com/diegosouzapw/OmniRoute" target="_blank" rel="noopener noreferrer" class="">diegosouzapw/OmniRoute</a><a href="https://xiebo.fun/blog/2026/7/5/#4-diegosouzapwomniroute" class="hash-link" aria-label="4-diegosouzapwomniroute的直接链接" title="4-diegosouzapwomniroute的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个统一 AI gateway，把 231+ provider、50+ 免费模型入口、自动 fallback、token 压缩、MCP/A2A、多模态 API 和桌面/PWA 体验打包到一个端点里。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 4.1k stars。模型选择和成本控制已经成为开发者日常痛点，尤其是 coding agent、自动化脚本和实验性工作流会频繁切换模型。</li>
<li class=""><strong>有什么新意</strong>：它试图把“多模型路由 + 免费资源利用 + token 节流 + 失败切换”合成一个默认中间层。对于大量 agent 工具来说，未来未必直接绑单一模型厂商，而是先走路由层。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-ogulcancelikherdr">5. <a href="https://github.com/ogulcancelik/herdr" target="_blank" rel="noopener noreferrer" class="">ogulcancelik/herdr</a><a href="https://xiebo.fun/blog/2026/7/5/#5-ogulcancelikherdr" class="hash-link" aria-label="5-ogulcancelikherdr的直接链接" title="5-ogulcancelikherdr的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个生活在终端里的 agent multiplexer，主题集中在 terminal multiplexer、workspace manager、agent orchestration、Claude Code、Codex 等。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 3.5k stars。越来越多开发者开始同时使用多个 coding agent，但现有命令行工作方式很容易混乱：上下文分散、终端拥挤、任务切换成本高。</li>
<li class=""><strong>有什么新意</strong>：它把 tmux/terminal multiplexer 的范式移植到 agent 时代。真正的新意不是“又一个 CLI”，而是把 agent 当成一组可调度的终端工作单元来管理。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-openaicodex-plugin-cc">6. <a href="https://github.com/openai/codex-plugin-cc" target="_blank" rel="noopener noreferrer" class="">openai/codex-plugin-cc</a><a href="https://xiebo.fun/blog/2026/7/5/#6-openaicodex-plugin-cc" class="hash-link" aria-label="6-openaicodex-plugin-cc的直接链接" title="6-openaicodex-plugin-cc的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：让 Claude Code 可以调用 Codex 做代码审查或任务委派的插件。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.0k stars。用户已经不再满足于单一供应商生态，反而希望不同 coding agent 之间可以互相借力。</li>
<li class=""><strong>有什么新意</strong>：它把“跨 agent 调用”变成明确产品形态。这个方向的长期意义很大：未来模型厂商竞争不只发生在模型能力本身，还发生在谁更容易被接进别人的工作流。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-topoteretescognee">7. <a href="https://github.com/topoteretes/cognee" target="_blank" rel="noopener noreferrer" class="">topoteretes/cognee</a><a href="https://xiebo.fun/blog/2026/7/5/#7-topoteretescognee" class="hash-link" aria-label="7-topoteretescognee的直接链接" title="7-topoteretescognee的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源 AI memory platform，强调为 agent 提供跨会话持久长期记忆，并以 self-hosted knowledge graph engine 为核心。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 3.4k stars。多轮、长期、跨项目的 agent 使用场景越来越多，用户很难接受 agent 每次都从零开始。</li>
<li class=""><strong>有什么新意</strong>：它把 memory 从小功能提升为独立平台层。相比简单的对话历史，它更接近“可自托管、可结构化、可复用”的长期知识底座。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-alibabapage-agent">8. <a href="https://github.com/alibaba/page-agent" target="_blank" rel="noopener noreferrer" class="">alibaba/page-agent</a><a href="https://xiebo.fun/blog/2026/7/5/#8-alibabapage-agent" class="hash-link" aria-label="8-alibabapage-agent的直接链接" title="8-alibabapage-agent的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 JavaScript in-page GUI agent，目标是通过自然语言直接控制网页界面。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.5k stars。很多真实工作不在 API 里，而在网页控制台、运营后台、SaaS 面板和内部系统里。</li>
<li class=""><strong>有什么新意</strong>：它不是单纯做浏览器自动化，而是把“页面状态理解 + GUI 操作”包装成 agent 能力。谁能把 agent 带进真实 GUI，谁就能拿到一大批目前还没被 API 化的工作流。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-browser-usevideo-use">9. <a href="https://github.com/browser-use/video-use" target="_blank" rel="noopener noreferrer" class="">browser-use/video-use</a><a href="https://xiebo.fun/blog/2026/7/5/#9-browser-usevideo-use" class="hash-link" aria-label="9-browser-usevideo-use的直接链接" title="9-browser-usevideo-use的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：让 coding agent 直接参与视频编辑的工具。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 4.2k stars。过去大家讨论 agent，多半停留在代码、文档和搜索；现在连视频编辑都开始被纳入 agent 工作流。</li>
<li class=""><strong>有什么新意</strong>：它把“内容制作”变成 agent 可执行任务，而不是只让模型帮写文案。对创作者和营销团队来说，这种跨入媒体生产的能力非常有想象空间。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-calesthioopenmontage">10. <a href="https://github.com/calesthio/OpenMontage" target="_blank" rel="noopener noreferrer" class="">calesthio/OpenMontage</a><a href="https://xiebo.fun/blog/2026/7/5/#10-calesthioopenmontage" class="hash-link" aria-label="10-calesthioopenmontage的直接链接" title="10-calesthioopenmontage的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源 agentic 视频生产系统，包含 12 条 pipeline、52 个工具、500+ agent skills，试图把 AI coding assistant 变成视频工作室。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 8.4k stars。视频生产从“单个模型做一段生成”转向完整流水线后，这类系统自然更容易引发关注。</li>
<li class=""><strong>有什么新意</strong>：它强调的是 pipeline orchestration，而不只是生成模型本身。脚本、配音、画面、镜头、后期、剪辑、导出，正在被重写为 agent workflow。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-xbtlinai-berkshire">11. <a href="https://github.com/xbtlin/ai-berkshire" target="_blank" rel="noopener noreferrer" class="">xbtlin/ai-berkshire</a><a href="https://xiebo.fun/blog/2026/7/5/#11-xbtlinai-berkshire" class="hash-link" aria-label="11-xbtlinai-berkshire的直接链接" title="11-xbtlinai-berkshire的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个基于 Claude Code / Codex 的价值投资研究框架，把巴菲特、芒格、段永平、李录等方法论与多 agent 并行研究结合起来。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 6.0k stars。AI agent 从工程场景向金融研究、信息整合和投资框架迁移，是很自然的扩展。</li>
<li class=""><strong>有什么新意</strong>：它把“领域方法论 + agent 流程”绑定在一起。真正值得注意的不是投资题材，而是知识型专业工作正在快速形成自己的 agent 模板。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-stablyaiorca">12. <a href="https://github.com/stablyai/orca" target="_blank" rel="noopener noreferrer" class="">stablyai/orca</a><a href="https://xiebo.fun/blog/2026/7/5/#12-stablyaiorca" class="hash-link" aria-label="12-stablyaiorca的直接链接" title="12-stablyaiorca的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向并行 agent fleet 的 ADE（Agent Development Environment），支持在桌面和移动端运行不同 coding agent。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 3.8k stars。用户开始需要的不只是一个 CLI，而是一整套管理 agent 队列、设备入口和订阅复用的工作台。</li>
<li class=""><strong>有什么新意</strong>：它说明 agent IDE / ADE 正在浮出水面。未来管理多 agent 的体验，可能会像今天管理多个 dev container、多个终端 pane、多个 CI job 一样常见。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/7/5/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周严格意义上的非 AI 项目偏少，因此这一节不强行凑数量，而是挑几个更能说明“底层需求仍然旺盛”的代表。它们也提醒我们：AI agent 再火，最终还是要运行在通信、身份、构建这些基础设施之上。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-simplex-chatsimplex-chat">1. <a href="https://github.com/simplex-chat/simplex-chat" target="_blank" rel="noopener noreferrer" class="">simplex-chat/simplex-chat</a><a href="https://xiebo.fun/blog/2026/7/5/#1-simplex-chatsimplex-chat" class="hash-link" aria-label="1-simplex-chatsimplex-chat的直接链接" title="1-simplex-chatsimplex-chat的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个主打“没有任何用户标识符”的隐私消息网络，覆盖 iOS、Android 和桌面端。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 4.6k stars。过去几年里，用户对隐私、去中心化沟通和抗追踪通信的关注并没有减弱，反而因为平台治理和数据采集压力变得更强。</li>
<li class=""><strong>有什么新意</strong>：它不是普通加密聊天，而是进一步质疑“账号标识”本身。对今天所有以身份、画像、行为追踪为基础的通信产品来说，这是很激进的路线。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-logto-iologto">2. <a href="https://github.com/logto-io/logto" target="_blank" rel="noopener noreferrer" class="">logto-io/logto</a><a href="https://xiebo.fun/blog/2026/7/5/#2-logto-iologto" class="hash-link" aria-label="2-logto-iologto的直接链接" title="2-logto-iologto的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个基于 OIDC 和 OAuth 2.1 的认证授权基础设施，覆盖多租户、SSO、RBAC 等常见身份需求。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.5k stars。无论是 SaaS 还是 AI 应用，只要开始面向团队和企业，身份系统都会立刻变成刚需。</li>
<li class=""><strong>有什么新意</strong>：它代表“现代 auth 基础设施的开源化”。越多团队尝试把 AI 接进产品，越会意识到权限模型、组织结构、多租户和访问控制不能靠临时逻辑解决。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-apachemaven">3. <a href="https://github.com/apache/maven" target="_blank" rel="noopener noreferrer" class="">apache/maven</a><a href="https://xiebo.fun/blog/2026/7/5/#3-apachemaven" class="hash-link" aria-label="3-apachemaven的直接链接" title="3-apachemaven的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Apache Maven 核心仓库，Java 生态最经典的构建与依赖管理底座之一。</li>
<li class=""><strong>为什么这周会热</strong>：虽然本周新增 star 不高（约 157），但它能进 weekly 榜本身就说明经典构建工具仍有可见关注度。</li>
<li class=""><strong>有什么新意</strong>：它的新意不在“新框架”，而在基础设施的持久性。所有人都在聊 agent 时，构建系统仍然是生产交付最不可能被跳过的一层。</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="补充观察本周非-ai-项目为什么显得更少">补充观察：本周非 AI 项目为什么显得更少<a href="https://xiebo.fun/blog/2026/7/5/#%E8%A1%A5%E5%85%85%E8%A7%82%E5%AF%9F%E6%9C%AC%E5%91%A8%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%BE%E5%BE%97%E6%9B%B4%E5%B0%91" class="hash-link" aria-label="补充观察：本周非 AI 项目为什么显得更少的直接链接" title="补充观察：本周非 AI 项目为什么显得更少的直接链接" translate="no">​</a></h4>
<ul>
<li class="">本周非 AI 项目数量确实偏少，没有必要为了“分类对称”去硬塞弱相关仓库。</li>
<li class="">从榜单结构看，AI 仍然是绝对主线，而非 AI 热点更偏通信、安全、身份、构建这类长期底层能力。</li>
<li class="">这恰恰说明一个现实：<strong>agent 的上层创新越快，大家越会重新重视底层基础设施是否可靠、可控、可长期维护。</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/7/5/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-进入编排台时代">1. Agent 进入“编排台时代”<a href="https://xiebo.fun/blog/2026/7/5/#1-agent-%E8%BF%9B%E5%85%A5%E7%BC%96%E6%8E%92%E5%8F%B0%E6%97%B6%E4%BB%A3" class="hash-link" aria-label="1. Agent 进入“编排台时代”的直接链接" title="1. Agent 进入“编排台时代”的直接链接" translate="no">​</a></h4>
<p>本周最密集的信号不是某个单点模型能力，而是 agent orchestration：agency-agents 讲角色分工，herdr 讲终端多工，orca 讲 agent development environment，codex-plugin-cc 讲跨 agent 调用。它们共同说明，下一阶段的竞争重点会从“单个 agent 的 IQ”转向“一个 agent 团队的操作系统”。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-记忆与代码理解仍是-coding-agent-的基础瓶颈">2. 记忆与代码理解仍是 coding agent 的基础瓶颈<a href="https://xiebo.fun/blog/2026/7/5/#2-%E8%AE%B0%E5%BF%86%E4%B8%8E%E4%BB%A3%E7%A0%81%E7%90%86%E8%A7%A3%E4%BB%8D%E6%98%AF-coding-agent-%E7%9A%84%E5%9F%BA%E7%A1%80%E7%93%B6%E9%A2%88" class="hash-link" aria-label="2. 记忆与代码理解仍是 coding agent 的基础瓶颈的直接链接" title="2. 记忆与代码理解仍是 coding agent 的基础瓶颈的直接链接" translate="no">​</a></h4>
<p>codebase-memory-mcp 和 cognee 的共同热度说明，大家已经接受一个事实：上下文窗口再大，也不等于长期记忆。要真正处理大型代码库或长周期任务，agent 需要索引、知识图谱、记忆平台和可查询状态层。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-ai-正在从文本工作流溢出到-gui-和视频生产">3. AI 正在从文本工作流溢出到 GUI 和视频生产<a href="https://xiebo.fun/blog/2026/7/5/#3-ai-%E6%AD%A3%E5%9C%A8%E4%BB%8E%E6%96%87%E6%9C%AC%E5%B7%A5%E4%BD%9C%E6%B5%81%EF%BF%BD%EF%BF%BD%E6%BA%A2%E5%87%BA%E5%88%B0-gui-%E5%92%8C%E8%A7%86%E9%A2%91%E7%94%9F%E4%BA%A7" class="hash-link" aria-label="3. AI 正在从文本工作流溢出到 GUI 和视频生产的直接链接" title="3. AI 正在从文本工作流溢出到 GUI 和视频生产的直接链接" translate="no">​</a></h4>
<p>page-agent、video-use、OpenMontage 是一条非常清晰的线：agent 不再只是在终端里改代码、在文档里写字，而是开始接管网页操作和多媒体生产。对企业来说，这意味着很多“没开放 API 的后台流程”与“重人力的内容流程”都会重新被自动化审视。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-成本与模型路由已经是产品层问题不只是-infra-细节">4. 成本与模型路由已经是产品层问题，不只是 infra 细节<a href="https://xiebo.fun/blog/2026/7/5/#4-%E6%88%90%E6%9C%AC%E4%B8%8E%E6%A8%A1%E5%9E%8B%E8%B7%AF%E7%94%B1%E5%B7%B2%E7%BB%8F%E6%98%AF%E4%BA%A7%E5%93%81%E5%B1%82%E9%97%AE%E9%A2%98%E4%B8%8D%E5%8F%AA%E6%98%AF-infra-%E7%BB%86%E8%8A%82" class="hash-link" aria-label="4. 成本与模型路由已经是产品层问题，不只是 infra 细节的直接链接" title="4. 成本与模型路由已经是产品层问题，不只是 infra 细节的直接链接" translate="no">​</a></h4>
<p>OmniRoute 的走红说明，开发者已经把模型选择、多提供商 fallback、免费额度利用、token 压缩当成一等需求。未来很多 AI 产品的护城河不只是谁接了最强模型，而是谁更会在不同场景里调度最合适、最便宜、最稳定的模型组合。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-ai-安全从原则讨论转向能不能直接测">5. AI 安全从“原则讨论”转向“能不能直接测”<a href="https://xiebo.fun/blog/2026/7/5/#5-ai-%E5%AE%89%E5%85%A8%E4%BB%8E%E5%8E%9F%E5%88%99%E8%AE%A8%E8%AE%BA%E8%BD%AC%E5%90%91%E8%83%BD%E4%B8%8D%E8%83%BD%E7%9B%B4%E6%8E%A5%E6%B5%8B" class="hash-link" aria-label="5. AI 安全从“原则讨论”转向“能不能直接测”的直接链接" title="5. AI 安全从“原则讨论”转向“能不能直接测”的直接链接" translate="no">​</a></h4>
<p>Strix 排在高位很说明问题。过去一段时间大家常说 prompt injection、越权、工具滥用，但真正让工程团队买单的，是有没有可操作的测试工具、审计流程和漏洞修复路径。AI 安全正在变成 DevSecOps 的一部分，而不是一块抽象道德标签。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-非-ai-热点更像底盘项目而不是新概念项目">6. 非 AI 热点更像“底盘项目”而不是“新概念项目”<a href="https://xiebo.fun/blog/2026/7/5/#6-%E9%9D%9E-ai-%E7%83%AD%E7%82%B9%E6%9B%B4%E5%83%8F%E5%BA%95%E7%9B%98%E9%A1%B9%E7%9B%AE%E8%80%8C%E4%B8%8D%E6%98%AF%E6%96%B0%E6%A6%82%E5%BF%B5%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="6. 非 AI 热点更像“底盘项目”而不是“新概念项目”的直接链接" title="6. 非 AI 热点更像“底盘项目”而不是“新概念项目”的直接链接" translate="no">​</a></h4>
<p>SimpleX、Logto、Maven 的共同点是：它们都很底层，且都不性感。这种榜单结构反而值得重视，因为它表明开发者并没有放弃基础设施，只是把注意力优先给了更靠近 agent 生产力的项目，而把底层能力视作默认必须存在的支撑层。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/7/5/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>跨 agent 协作开始显性化。</strong> Codex 能被 Claude Code 调用、多个 agent 能被编排进同一工作台，这说明生态边界在变松。</li>
<li class=""><strong>agent 工作台正在替代“单模型聊天框”。</strong> herdr 和 orca 代表的是多 pane、多角色、多终端、多订阅管理的工作方式。</li>
<li class=""><strong>视频生产成为 agent 新战场。</strong> OpenMontage 和 video-use 都在说明，AI 的自动化价值开始向内容工业扩散。</li>
<li class=""><strong>AI 安全更像实际攻防，而不是抽象守则。</strong> Strix 的上榜是很强的落地信号。</li>
<li class=""><strong>记忆层仍在升温。</strong> codebase-memory-mcp 与 cognee 说明“长期状态”问题还远没被解决。</li>
<li class=""><strong>非 AI 项目呈现出基础设施回潮特征。</strong> 隐私通信、认证授权、构建底座继续被看见，但它们更像稳定支柱，而不是短期热点噱头。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/7/5/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>如果说前几周的 Trending 还在回答“agent 能不能有技能、能不能联网、能不能压上下文”，这一周更像是在回答 <strong>“agent 真要进入生产之后，整套操作系统长什么样”</strong>。你会看到它需要记忆层、路由层、编排层、GUI 层、视频层、安全层，也会看到非 AI 基础设施依然牢牢站在底座位置。</p>
<p>我最想继续追踪的，是 <strong>“多 agent 编排 + 长期记忆 + GUI 控制 + 成本路由”</strong> 这条组合线。因为它们拼起来，才像一个真正可工作的 agent 系统：不是只会聊天，而是能在复杂环境里持续协作、记住上下文、接触真实界面、并在成本可控的前提下长期运行。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Agent 进入“记忆、上下文与执行边界”阶段（2026-06-21）]]></title>
            <link>https://xiebo.fun/blog/2026/6/21/</link>
            <guid>https://xiebo.fun/blog/2026/6/21/</guid>
            <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 继续围绕 AI agent 展开，但主题从单纯的技能分发进一步转向代码库记忆、上下文压缩、互联网触达、技能安全、沙箱执行和推理缓存；同时 IPTV、Iroh、Insomnia、Turso、Plane、Meshery、SWC 等非 AI 基础设施也显示出开发者对开放数据、网络、API、数据库和平台工程工具的长期需求。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）的关键词可以概括为：<strong>agent 终于开始正视“怎么记住项目、怎么少塞上下文、怎么安全执行、怎么接触互联网、怎么降低推理成本”这些工程问题</strong>。榜单头部的 <a href="https://github.com/DeusData/codebase-memory-mcp" target="_blank" rel="noopener noreferrer" class="">DeusData/codebase-memory-mcp</a>、<a href="https://github.com/chopratejas/headroom" target="_blank" rel="noopener noreferrer" class="">chopratejas/headroom</a>、<a href="https://github.com/Panniantong/Agent-Reach" target="_blank" rel="noopener noreferrer" class="">Panniantong/Agent-Reach</a>、<a href="https://github.com/NVIDIA/SkillSpector" target="_blank" rel="noopener noreferrer" class="">NVIDIA/SkillSpector</a>、<a href="https://github.com/withastro/flue" target="_blank" rel="noopener noreferrer" class="">withastro/flue</a>、<a href="https://github.com/LMCache/LMCache" target="_blank" rel="noopener noreferrer" class="">LMCache/LMCache</a> 分别站在代码记忆、上下文压缩、互联网输入、安全扫描、沙箱框架和 KV Cache 层这些位置上。</p>
<p>这和前几周的 skills 热潮是一条连续曲线。前几周更像是在问“agent 应该会什么技能”；这一周更像是在问“agent 真要进入我的代码库和机器，基础设施该怎么搭”。与此同时，非 AI 项目并没有消失：IPTV 频道集合、P2P 网络栈、API 客户端、嵌入式数据库、开源项目管理、云原生控制面、客服系统、编译器、编程教育平台仍然有稳定热度，说明开发者并不会只为 AI 下注，底层工具和开放替代品依旧有强需求。</p>
<blockquote>
<p>本文基于 GitHub Trending weekly 页面展示的仓库描述与本周新增 star，并结合 GitHub REST API 可访问的仓库元数据做归纳。Trending 只能说明“这一周被集中关注”，不能直接证明真实生产采用率；因此“为什么这周变热”会围绕项目定位、榜单相对位置和当前开发者需求做审慎判断。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/6/21/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>代码库记忆正在成为 coding agent 的核心能力。</strong> <a href="https://github.com/DeusData/codebase-memory-mcp" target="_blank" rel="noopener noreferrer" class="">DeusData/codebase-memory-mcp</a> 用 MCP server 把代码库索引成持久知识图谱，目标是让 agent 不必每次重新读全仓库。</li>
<li class=""><strong>上下文工程继续升温。</strong> <a href="https://github.com/chopratejas/headroom" target="_blank" rel="noopener noreferrer" class="">chopratejas/headroom</a> 本周新增约 15k stars，说明“压缩日志、工具输出、文件和 RAG chunks”已经成为 agent 成本控制与可靠性的基础层。</li>
<li class=""><strong>互联网访问、系统提示词、视频生产都在变成 agent 输入/输出链路。</strong> <a href="https://github.com/Panniantong/Agent-Reach" target="_blank" rel="noopener noreferrer" class="">Panniantong/Agent-Reach</a>、<a href="https://github.com/asgeirtj/system_prompts_leaks" target="_blank" rel="noopener noreferrer" class="">asgeirtj/system_prompts_leaks</a>、<a href="https://github.com/calesthio/OpenMontage" target="_blank" rel="noopener noreferrer" class="">calesthio/OpenMontage</a> 分别对应实时网络、多模型行为样本和 agentic media production。</li>
<li class=""><strong>安全与沙箱从“最好有”变成“必须有”。</strong> <a href="https://github.com/NVIDIA/SkillSpector" target="_blank" rel="noopener noreferrer" class="">NVIDIA/SkillSpector</a> 扫描 agent skills，<a href="https://github.com/withastro/flue" target="_blank" rel="noopener noreferrer" class="">withastro/flue</a> 做 sandbox agent framework，都是在给更能执行的 agent 加边界。</li>
<li class=""><strong>推理性能开始往 KV Cache 层下沉。</strong> <a href="https://github.com/LMCache/LMCache" target="_blank" rel="noopener noreferrer" class="">LMCache/LMCache</a> 说明 LLM 应用的优化不止 prompt 和模型选择，还包括缓存、复用和 serving 系统设计。</li>
<li class=""><strong>非 AI 基础设施依旧活跃。</strong> <a href="https://github.com/iptv-org/iptv" target="_blank" rel="noopener noreferrer" class="">iptv-org/iptv</a>、<a href="https://github.com/n0-computer/iroh" target="_blank" rel="noopener noreferrer" class="">n0-computer/iroh</a>、<a href="https://github.com/Kong/insomnia" target="_blank" rel="noopener noreferrer" class="">Kong/insomnia</a>、<a href="https://github.com/tursodatabase/turso" target="_blank" rel="noopener noreferrer" class="">tursodatabase/turso</a>、<a href="https://github.com/makeplane/plane" target="_blank" rel="noopener noreferrer" class="">makeplane/plane</a>、<a href="https://github.com/meshery/meshery" target="_blank" rel="noopener noreferrer" class="">meshery/meshery</a>、<a href="https://github.com/swc-project/swc" target="_blank" rel="noopener noreferrer" class="">swc-project/swc</a> 都说明开发者工具链的基础需求仍然很强。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/6/21/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-deusdatacodebase-memory-mcp">1. <a href="https://github.com/DeusData/codebase-memory-mcp" target="_blank" rel="noopener noreferrer" class="">DeusData/codebase-memory-mcp</a><a href="https://xiebo.fun/blog/2026/6/21/#1-deusdatacodebase-memory-mcp" class="hash-link" aria-label="1-deusdatacodebase-memory-mcp的直接链接" title="1-deusdatacodebase-memory-mcp的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个高性能代码智能 MCP server，可以把代码库索引成持久知识图谱，支持 158 种语言，强调毫秒级索引、亚毫秒查询、99% token 节省，并以单个静态二进制交付。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 5.4k stars。coding agent 的瓶颈越来越不是“会不会改代码”，而是“能不能理解一个真实仓库”。如果每次任务都靠重新 grep、读文件、塞上下文，成本高、速度慢、还容易漏掉结构关系。</li>
<li class=""><strong>有什么新意</strong>：它把代码库理解从一次性上下文变成长期记忆。MCP 形态也很关键：这意味着 Claude Code、Cursor、Codex、Aider、OpenCode 等不同 agent 可以通过统一工具协议使用同一套代码图谱。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-chopratejasheadroom">2. <a href="https://github.com/chopratejas/headroom" target="_blank" rel="noopener noreferrer" class="">chopratejas/headroom</a><a href="https://xiebo.fun/blog/2026/6/21/#2-chopratejasheadroom" class="hash-link" aria-label="2-chopratejasheadroom的直接链接" title="2-chopratejasheadroom的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：在工具输出、日志、文件和 RAG chunks 进入 LLM 前进行压缩，目标是减少 60%–95% token，同时保持回答质量；提供库、代理和 MCP server。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 15k stars，仍是整个榜单中最强的 AI 基础设施项目之一。真实 agent 任务里，最大浪费常常不是模型推理本身，而是把一堆冗余日志、重复文件片段和低价值检索结果塞进上下文。</li>
<li class=""><strong>有什么新意</strong>：它代表“context middleware”的方向：模型前面会有一层专门负责过滤、压缩、排序和预算控制的系统。未来 agent 栈里，压缩层可能像缓存层一样标准。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-panniantongagent-reach">3. <a href="https://github.com/Panniantong/Agent-Reach" target="_blank" rel="noopener noreferrer" class="">Panniantong/Agent-Reach</a><a href="https://xiebo.fun/blog/2026/6/21/#3-panniantongagent-reach" class="hash-link" aria-label="3-panniantongagent-reach的直接链接" title="3-panniantongagent-reach的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：给 AI agent 提供“看见互联网”的 CLI / 工具层，支持读取和搜索 Twitter/X、Reddit、YouTube、GitHub、Bilibili、小红书等平台，并强调零 API 费用。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 8.5k stars。agent 要做产品调研、市场研究、舆情分析、竞品监控或内容趋势判断，就不能只依赖静态网页搜索。</li>
<li class=""><strong>有什么新意</strong>：它把 social web 访问包装成 agent tool。真正难点不只是抓取，而是平台变化、登录态、速率限制、内容清洗、引用可信度和反爬稳定性。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-google-researchtimesfm">4. <a href="https://github.com/google-research/timesfm" target="_blank" rel="noopener noreferrer" class="">google-research/timesfm</a><a href="https://xiebo.fun/blog/2026/6/21/#4-google-researchtimesfm" class="hash-link" aria-label="4-google-researchtimesfm的直接链接" title="4-google-researchtimesfm的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Google Research 的时间序列基础模型，用于 time-series forecasting。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 3.7k stars。大模型热潮不只发生在文本、代码和图像里，时间序列预测同样有“预训练基础模型 + 下游任务适配”的需求。</li>
<li class=""><strong>有什么新意</strong>：它把 forecasting 从传统特征工程、任务专用模型，推进到 foundation model 思路。对运维、容量预测、金融、供应链、IoT 和业务指标预测都很有想象空间。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-nvidiaskillspector">5. <a href="https://github.com/NVIDIA/SkillSpector" target="_blank" rel="noopener noreferrer" class="">NVIDIA/SkillSpector</a><a href="https://xiebo.fun/blog/2026/6/21/#5-nvidiaskillspector" class="hash-link" aria-label="5-nvidiaskillspector的直接链接" title="5-nvidiaskillspector的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：NVIDIA 开源的 AI agent skills 安全扫描器，用于检测 skills 中的漏洞、恶意模式和安全风险。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 4.6k stars。skills 一旦可以被下载、安装和执行，就和 npm 包、浏览器扩展、CI action 一样进入供应链安全范畴。</li>
<li class=""><strong>有什么新意</strong>：它把 agent skills 当成可审计资产。过去大家关心 prompt 是否有效；现在更现实的问题是：这个 skill 是否会偷数据、越权执行 shell、诱导模型泄漏上下文、或者把危险指令藏在工具流程里。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-asgeirtjsystem_prompts_leaks">6. <a href="https://github.com/asgeirtj/system_prompts_leaks" target="_blank" rel="noopener noreferrer" class="">asgeirtj/system_prompts_leaks</a><a href="https://xiebo.fun/blog/2026/6/21/#6-asgeirtjsystem_prompts_leaks" class="hash-link" aria-label="6-asgeirtjsystem_prompts_leaks的直接链接" title="6-asgeirtjsystem_prompts_leaks的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：持续收集各类 AI 产品和模型的系统提示词泄漏，包括 Claude、ChatGPT、Codex、Gemini、Grok、Cursor、Copilot、Perplexity 等。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.9k stars。系统提示词已经成为 AI 产品设计、行为约束、安全策略和产品差异化的一部分，开发者自然会好奇不同产品到底如何设置边界。</li>
<li class=""><strong>有什么新意</strong>：它既是学习资料，也是风险提醒。提示词泄漏说明仅靠 system prompt 保护产品逻辑并不可靠；真正的安全边界仍要落在权限、工具隔离、服务端策略和审计上。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-calesthioopenmontage">7. <a href="https://github.com/calesthio/OpenMontage" target="_blank" rel="noopener noreferrer" class="">calesthio/OpenMontage</a><a href="https://xiebo.fun/blog/2026/6/21/#7-calesthioopenmontage" class="hash-link" aria-label="7-calesthioopenmontage的直接链接" title="7-calesthioopenmontage的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源 agentic 视频生产系统，描述中包含 12 条 pipeline、52 个工具、500+ agent skills，目标是把 AI coding assistant 变成视频生产工作室。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.3k stars。视频生成已经从“单次生成一个片段”走向“脚本、素材、配音、剪辑、字幕、后期、发布”的流水线问题。</li>
<li class=""><strong>有什么新意</strong>：它把 media production 看成 agent workflow，而不是单模型生成任务。对内容团队来说，真正省时间的不是某个生成模型，而是从选题到成片的自动化编排。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-withastroflue">8. <a href="https://github.com/withastro/flue" target="_blank" rel="noopener noreferrer" class="">withastro/flue</a><a href="https://xiebo.fun/blog/2026/6/21/#8-withastroflue" class="hash-link" aria-label="8-withastroflue的直接链接" title="8-withastroflue的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Astro 相关团队推出的 sandbox agent framework。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1k stars。随着 agent 开始改代码、运行命令、访问网络和操作文件，沙箱框架的重要性会迅速上升。</li>
<li class=""><strong>有什么新意</strong>：它关注 agent 执行边界。一个可靠的 agent framework 不只要会调用模型，还要能管理环境、权限、输入输出、隔离、失败恢复和可观测性。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-addyosmaniagent-skills">9. <a href="https://github.com/addyosmani/agent-skills" target="_blank" rel="noopener noreferrer" class="">addyosmani/agent-skills</a><a href="https://xiebo.fun/blog/2026/6/21/#9-addyosmaniagent-skills" class="hash-link" aria-label="9-addyosmaniagent-skills的直接链接" title="9-addyosmaniagent-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一组 production-grade engineering skills，面向 AI coding agents，帮助 agent 按真实工程标准执行任务。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 6.3k stars。coding agent 进入日常开发后，用户会更在意测试、重构、代码审查、调试和交付习惯，而不只是“能生成代码”。</li>
<li class=""><strong>有什么新意</strong>：它代表工程经验的可分发化。团队过去写 wiki、checklist、PR 模板和 runbook；现在这些经验开始被包装成 agent 可执行技能。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-lmcachelmcache">10. <a href="https://github.com/LMCache/LMCache" target="_blank" rel="noopener noreferrer" class="">LMCache/LMCache</a><a href="https://xiebo.fun/blog/2026/6/21/#10-lmcachelmcache" class="hash-link" aria-label="10-lmcachelmcache的直接链接" title="10-lmcachelmcache的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：LLM KV Cache 层，目标是加速推理和提升 serving 效率，支持 CUDA、ROCm、vLLM 等相关生态。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 713 stars。LLM 应用进入生产后，成本和延迟越来越重要，尤其是长上下文、多轮对话、RAG、agent 任务会产生大量可复用前缀和重复上下文。</li>
<li class=""><strong>有什么新意</strong>：它把优化从应用层下沉到推理系统层。Prompt 压缩、上下文管理、KV Cache、batching、路由和 serving 未来会共同决定 AI 应用的实际成本。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/6/21/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周非 AI 项目数量不少，而且主题很分散：开放数据、P2P 网络、API 客户端、嵌入式数据库、项目管理、云原生控制面、客服系统、编译器、教育平台。它们共同说明：即使 AI 仍是 Trending 主线，开发者每天实际要用的底层工具仍然稳定吸引关注。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-iptv-orgiptv">1. <a href="https://github.com/iptv-org/iptv" target="_blank" rel="noopener noreferrer" class="">iptv-org/iptv</a><a href="https://xiebo.fun/blog/2026/6/21/#1-iptv-orgiptv" class="hash-link" aria-label="1-iptv-orgiptv的直接链接" title="1-iptv-orgiptv的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：全球公开 IPTV 频道集合，提供可用的公开电视流列表。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 7.9k stars。它属于非常典型的“开放数据集合”项目：不是复杂技术栈，但长期满足明确需求。</li>
<li class=""><strong>有什么新意</strong>：它说明 GitHub Trending 不只奖励框架和 AI，也会奖励可直接使用、持续维护、覆盖面广的数据资源。开放列表、公开索引、社区维护数据集依然有强生命力。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-n0-computeriroh">2. <a href="https://github.com/n0-computer/iroh" target="_blank" rel="noopener noreferrer" class="">n0-computer/iroh</a><a href="https://xiebo.fun/blog/2026/6/21/#2-n0-computeriroh" class="hash-link" aria-label="2-n0-computeriroh的直接链接" title="2-n0-computeriroh的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Rust 编写的模块化网络栈，主张“IP 地址会坏掉，改用 dial keys”，涉及 P2P、QUIC、hole punching、multipath 等能力。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.6k stars。越来越多应用需要跨 NAT、跨网络、跨设备稳定连接，传统“暴露服务 + 固定地址”的方式并不总是适合。</li>
<li class=""><strong>有什么新意</strong>：它代表下一代应用网络层的需求：更易用的端到端连接、更好的 NAT 穿透、更强的设备身份抽象。对边缘设备、本地优先应用、协作软件和分布式系统都值得关注。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-konginsomnia">3. <a href="https://github.com/Kong/insomnia" target="_blank" rel="noopener noreferrer" class="">Kong/insomnia</a><a href="https://xiebo.fun/blog/2026/6/21/#3-konginsomnia" class="hash-link" aria-label="3-konginsomnia的直接链接" title="3-konginsomnia的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：开源跨平台 API 客户端，支持 GraphQL、REST、WebSockets、SSE、gRPC，并支持 Cloud、Local、Git 存储。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 657 stars。API 客户端是开发者日常刚需，尤其在 Postman 商业化和团队协作需求变化后，开源替代品会持续被关注。</li>
<li class=""><strong>有什么新意</strong>：它强调本地和 Git 存储，这对重视可审计、可版本化、可离线使用的团队很重要。API 调试工具正在从单人 GUI 变成团队工程资产。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-tursodatabaseturso">4. <a href="https://github.com/tursodatabase/turso" target="_blank" rel="noopener noreferrer" class="">tursodatabase/turso</a><a href="https://xiebo.fun/blog/2026/6/21/#4-tursodatabaseturso" class="hash-link" aria-label="4-tursodatabaseturso的直接链接" title="4-tursodatabaseturso的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个兼容 SQLite 的 in-process SQL database。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 968 stars。SQLite 生态在边缘计算、本地优先应用、嵌入式服务和轻量后端中持续升温。</li>
<li class=""><strong>有什么新意</strong>：它说明开发者对“简单、可嵌入、低运维”的数据库需求很强。不是所有项目都需要复杂分布式数据库，很多场景反而更适合把 SQL 能力嵌进进程里。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-makeplaneplane">5. <a href="https://github.com/makeplane/plane" target="_blank" rel="noopener noreferrer" class="">makeplane/plane</a><a href="https://xiebo.fun/blog/2026/6/21/#5-makeplaneplane" class="hash-link" aria-label="5-makeplaneplane的直接链接" title="5-makeplaneplane的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：开源 Jira、Linear、Monday、ClickUp 替代品，覆盖任务、sprint、文档、triage 等项目管理场景。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.4k stars。团队协作工具仍然是开源替代的重要方向，尤其当 SaaS 成本、数据归属和定制需求上升时。</li>
<li class=""><strong>有什么新意</strong>：它站在项目管理和开发协作之间。对一些团队来说，开源项目管理工具不仅是省钱，也是把流程、数据和自动化接入自己工程系统的入口。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-mesherymeshery">6. <a href="https://github.com/meshery/meshery" target="_blank" rel="noopener noreferrer" class="">meshery/meshery</a><a href="https://xiebo.fun/blog/2026/6/21/#6-mesherymeshery" class="hash-link" aria-label="6-mesherymeshery的直接链接" title="6-mesherymeshery的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：云原生管理平台，涉及 Kubernetes、service mesh、GitOps、平台工程、可视化和 control plane。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 898 stars。云原生系统越来越复杂，团队需要更高层的管理、可视化和策略入口。</li>
<li class=""><strong>有什么新意</strong>：它反映 platform engineering 的长期需求：不是每个团队都想直接面对一堆 YAML、CRD、Operator 和 policy。更好的控制面和可视化仍有空间。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-chatwootchatwoot">7. <a href="https://github.com/chatwoot/chatwoot" target="_blank" rel="noopener noreferrer" class="">chatwoot/chatwoot</a><a href="https://xiebo.fun/blog/2026/6/21/#7-chatwootchatwoot" class="hash-link" aria-label="7-chatwootchatwoot的直接链接" title="7-chatwootchatwoot的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：开源客服与全渠道沟通平台，可作为 Intercom、Zendesk、Salesforce Service Cloud 等的替代。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.2k stars。客户支持系统是典型高价值 SaaS 领域，开源替代品对中小团队和重视数据控制的组织很有吸引力。</li>
<li class=""><strong>有什么新意</strong>：它也可能受 AI customer support 热潮带动。即使项目本身不是纯 AI，客服系统会自然成为 AI agent、知识库问答和工单自动化的落地点。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-swc-projectswc">8. <a href="https://github.com/swc-project/swc" target="_blank" rel="noopener noreferrer" class="">swc-project/swc</a><a href="https://xiebo.fun/blog/2026/6/21/#8-swc-projectswc" class="hash-link" aria-label="8-swc-projectswc的直接链接" title="8-swc-projectswc的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Rust-based Web 平台，覆盖 JavaScript / TypeScript 编译、解析和相关工具链能力。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 538 stars。前端工具链仍在追求速度、可扩展性和更好的编译体验，Rust 实现的高性能工具长期受关注。</li>
<li class=""><strong>有什么新意</strong>：它说明“更快的基础工具”仍然是开发者体验的核心。AI 可以帮你写代码，但构建、编译、测试、打包的速度依然影响每天的工程反馈循环。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-freecodecampfreecodecamp">9. <a href="https://github.com/freeCodeCamp/freeCodeCamp" target="_blank" rel="noopener noreferrer" class="">freeCodeCamp/freeCodeCamp</a><a href="https://xiebo.fun/blog/2026/6/21/#9-freecodecampfreecodecamp" class="hash-link" aria-label="9-freecodecampfreecodecamp的直接链接" title="9-freecodecampfreecodecamp的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：freeCodeCamp.org 的开源代码库和课程体系，提供免费的数学、编程、计算机科学学习资源。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 3.3k stars。编程教育项目的长期热度说明学习入口仍然重要，尤其在 AI 改变开发方式后，更多人会重新思考该学什么、怎么学。</li>
<li class=""><strong>有什么新意</strong>：它的价值不在于某个新框架，而在于开放课程和社区。AI 能降低上手门槛，但系统化学习、练习项目和社区反馈仍不可替代。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/6/21/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-coding-agent-的竞争焦点从会改文件转向懂代码库">1. Coding agent 的竞争焦点从“会改文件”转向“懂代码库”<a href="https://xiebo.fun/blog/2026/6/21/#1-coding-agent-%E7%9A%84%E7%AB%9E%E4%BA%89%E7%84%A6%E7%82%B9%E4%BB%8E%E4%BC%9A%E6%94%B9%E6%96%87%E4%BB%B6%E8%BD%AC%E5%90%91%E6%87%82%E4%BB%A3%E7%A0%81%E5%BA%93" class="hash-link" aria-label="1. Coding agent 的竞争焦点从“会改文件”转向“懂代码库”的直接链接" title="1. Coding agent 的竞争焦点从“会改文件”转向“懂代码库”的直接链接" translate="no">​</a></h4>
<p>codebase-memory-mcp 的上榜很有代表性。一个真实仓库包含模块边界、调用关系、隐含约定、测试路径、历史包袱和局部命名习惯。agent 如果只靠一次性读取文件，很容易在小范围任务里表现不错，但一遇到跨模块修改就开始迷路。</p>
<p>持久代码图谱、语义索引、MCP 查询接口会成为 coding agent 的基础设施。未来更强的 coding agent 可能不是上下文窗口最大，而是能把项目知识长期维护起来，并在需要时精准取用。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-上下文预算正在变成系统设计问题而不是-prompt-技巧">2. 上下文预算正在变成系统设计问题，而不是 prompt 技巧<a href="https://xiebo.fun/blog/2026/6/21/#2-%E4%B8%8A%E4%B8%8B%E6%96%87%E9%A2%84%E7%AE%97%E6%AD%A3%E5%9C%A8%E5%8F%98%E6%88%90%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E9%97%AE%E9%A2%98%E8%80%8C%E4%B8%8D%E6%98%AF-prompt-%E6%8A%80%E5%B7%A7" class="hash-link" aria-label="2. 上下文预算正在变成系统设计问题，而不是 prompt 技巧的直接链接" title="2. 上下文预算正在变成系统设计问题，而不是 prompt 技巧的直接链接" translate="no">​</a></h4>
<p>Headroom、codebase-memory-mcp、LMCache 其实在处理同一件事：模型输入和推理资源都很贵，不能靠“全塞进去”解决问题。一个负责压缩工具输出，一个负责把代码库变成可查询记忆，一个负责推理侧 KV Cache 复用。</p>
<p>这意味着 AI 应用架构会越来越像传统后端系统：有缓存、有索引、有中间件、有预算控制、有冷热数据分层。prompt engineering 会继续存在，但它会被更系统化的 context engineering 包住。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-agent-越能执行越需要沙箱安全扫描和权限模型">3. Agent 越能执行，越需要沙箱、安全扫描和权限模型<a href="https://xiebo.fun/blog/2026/6/21/#3-agent-%E8%B6%8A%E8%83%BD%E6%89%A7%E8%A1%8C%E8%B6%8A%E9%9C%80%E8%A6%81%E6%B2%99%E7%AE%B1%E5%AE%89%E5%85%A8%E6%89%AB%E6%8F%8F%E5%92%8C%E6%9D%83%E9%99%90%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="3. Agent 越能执行，越需要沙箱、安全扫描和权限模型的直接链接" title="3. Agent 越能执行，越需要沙箱、安全扫描和权限模型的直接链接" translate="no">​</a></h4>
<p>SkillSpector 和 Flue 的共同信号是：agent 的风险不再停留在“说错话”，而是“做错事”。只要 agent 能安装 skill、执行 shell、读取文件、访问网络、调用 API，就必须有安全扫描、沙箱、权限边界、日志审计和回滚策略。</p>
<p>这也是 agent 从 demo 走向生产的必经阶段。越是企业环境，越不会接受一个不透明、不可控、不可审计的自动执行体。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-互联网输入层会成为趋势研究-agent-的护城河">4. 互联网输入层会成为趋势研究 agent 的护城河<a href="https://xiebo.fun/blog/2026/6/21/#4-%E4%BA%92%E8%81%94%E7%BD%91%E8%BE%93%E5%85%A5%E5%B1%82%E4%BC%9A%E6%88%90%E4%B8%BA%E8%B6%8B%E5%8A%BF%E7%A0%94%E7%A9%B6-agent-%E7%9A%84%E6%8A%A4%E5%9F%8E%E6%B2%B3" class="hash-link" aria-label="4. 互联网输入层会成为趋势研究 agent 的护城河的直接链接" title="4. 互联网输入层会成为趋势研究 agent 的护城河的直接链接" translate="no">​</a></h4>
<p>Agent-Reach 和 system_prompts_leaks 站在两个不同角度：前者让 agent 接触实时互联网，后者让开发者观察 AI 产品的内部提示词设计。两者都说明，静态训练知识已经不够，agent 需要持续接触最新外部信号。</p>
<p>但实时输入也带来一堆工程问题：平台限制、反爬、噪声、重复、引用可信度、法律合规、内容时效。未来真正有用的研究 agent，不是抓得最多，而是能把多源信号变成可信证据链。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-非-ai-基础设施仍然是开源生态的底盘">5. 非 AI 基础设施仍然是开源生态的底盘<a href="https://xiebo.fun/blog/2026/6/21/#5-%E9%9D%9E-ai-%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E4%BB%8D%E7%84%B6%E6%98%AF%E5%BC%80%E6%BA%90%E7%94%9F%E6%80%81%E7%9A%84%E5%BA%95%E7%9B%98" class="hash-link" aria-label="5. 非 AI 基础设施仍然是开源生态的底盘的直接链接" title="5. 非 AI 基础设施仍然是开源生态的底盘的直接链接" translate="no">​</a></h4>
<p>IPTV、Iroh、Insomnia、Turso、Plane、Meshery、SWC 这些项目提醒我们：AI 很热，但开发者依然需要网络、数据库、API、编译器、项目管理、云原生控制面这些基础工具。AI agent 本身也要建立在这些工具之上。</p>
<p>长期看，AI 不会替代基础设施需求，反而会放大它。因为 agent 要执行任务，就需要更稳定的本地环境、更清晰的 API、更快的构建系统、更好的数据库、更可控的平台工程入口。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/6/21/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>代码库记忆 MCP 化。</strong> codebase-memory-mcp 把代码知识图谱接到 MCP，说明 coding agent 的上下文不必总是一次性塞文本。</li>
<li class=""><strong>上下文压缩继续爆发。</strong> Headroom 连续高热，说明 token budget 已经成为开发者共同痛点。</li>
<li class=""><strong>Skills 安全仍在升温。</strong> SkillSpector 继续上榜，agent skill 生态正在靠近供应链安全问题。</li>
<li class=""><strong>沙箱 agent framework 出现。</strong> Flue 的定位很直接：agent 要运行在受控环境里。</li>
<li class=""><strong>KV Cache 层被更多开发者注意到。</strong> LMCache 表明 LLM 成本优化正在进入 serving 系统深处。</li>
<li class=""><strong>非 AI 项目分布更健康。</strong> 本周不是纯 AI 屠榜，网络、数据库、API、项目管理、云原生、编译器、教育都有代表项目。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/6/21/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>如果说前几周的 GitHub Trending 在强调 <strong>agent skills 的分发化</strong>，这一周更像是在补齐 <strong>agent 工程化落地的底座</strong>：代码库记忆、上下文压缩、实时互联网、安全扫描、沙箱执行、推理缓存。这些东西听起来没有“新模型发布”那么刺激，但它们决定 agent 能不能真正进入日常开发和生产环境。</p>
<p>我最想继续追踪的是 <strong>代码记忆 + 上下文压缩 + MCP 工具协议</strong> 这条线。它们共同指向一个更现实的 agent 形态：不是每次对话都从零开始，而是围绕项目、工具和历史状态持续积累；不是无脑扩大上下文，而是让模型读到更少但更关键的信息。真正好用的 agent，可能不是最会聊天的那个，而是最懂你项目、最省上下文、最能安全执行的那个。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Agent 技能市场、安全扫描与本地容器同时升温（2026-06-14）]]></title>
            <link>https://xiebo.fun/blog/2026/6/14/</link>
            <guid>https://xiebo.fun/blog/2026/6/14/</guid>
            <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 继续被 AI agent 生态主导，但焦点从“单个 agent 能不能干活”进一步转向 skills 分发、上下文压缩、互联网触达、安全治理和知识工作入口；同时 Apple container、OpenCV、Roboflow Supervision 等非纯 AI 基础设施也给出了本地运行、计算机视觉和开发者工具的新信号。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）的关键词可以概括为：<strong>agent 生态正在从“会调用工具”走向“会安装技能、会压缩上下文、会访问互联网、会被安全扫描、会进入产品界面”</strong>。榜单头部里既有 last30days-skill、pm-skills、agent-skills、taste-skill 这类 skills / 方法论资产，也有 Headroom、Agent-Reach、SkillSpector、CopilotKit、Goose 这类更接近 agent 运行时与产品化基础设施的项目。</p>
<p>另一个值得注意的信号是：非 AI 项目并没有完全消失，但它们的热度也常常被 AI 工作流重新解释。Apple 的 container 不是 LLM 项目，却回答了 Apple Silicon 上轻量 Linux 容器怎么跑的问题；MarkItDown、Tolaria、Open Notebook 处在知识输入、Markdown 知识库和 NotebookLM 替代品的交界处；OpenCV、Roboflow Supervision、NVIDIA Cosmos 则说明视觉与 Physical AI 的基础设施仍在被持续关注。</p>
<blockquote>
<p>本文基于 GitHub Trending weekly 页面展示的仓库描述与本周新增 star，并结合 GitHub REST API 可访问的仓库元数据做归纳。Trending 只能说明“这一周被集中关注”，不能直接证明真实生产采用率；因此“为什么这周变热”会围绕项目定位、榜单相对位置和当前开发者需求做审慎判断。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/6/14/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>Skills 正在成为 agent 生态的新包管理层。</strong> <a href="https://github.com/mvanhorn/last30days-skill" target="_blank" rel="noopener noreferrer" class="">mvanhorn/last30days-skill</a>、<a href="https://github.com/phuryn/pm-skills" target="_blank" rel="noopener noreferrer" class="">phuryn/pm-skills</a>、<a href="https://github.com/addyosmani/agent-skills" target="_blank" rel="noopener noreferrer" class="">addyosmani/agent-skills</a>、<a href="https://github.com/Leonxlnx/taste-skill" target="_blank" rel="noopener noreferrer" class="">Leonxlnx/taste-skill</a> 同时上榜，说明开发者想沉淀的不再只是 prompt，而是可安装、可复用、可组合的工作方法。</li>
<li class=""><strong>上下文预算仍是 agent 基础设施里的硬问题。</strong> <a href="https://github.com/chopratejas/headroom" target="_blank" rel="noopener noreferrer" class="">chopratejas/headroom</a> 继续高热，主打在工具输出、日志、文件和 RAG chunks 进入模型前先压缩，说明 token 成本与噪声控制已经从“优化项”变成“系统设计项”。</li>
<li class=""><strong>Agent 需要看见真实互联网，但访问层正在独立成工具。</strong> <a href="https://github.com/Panniantong/Agent-Reach" target="_blank" rel="noopener noreferrer" class="">Panniantong/Agent-Reach</a> 把 Twitter/X、Reddit、YouTube、GitHub、Bilibili、小红书等平台包装成 CLI / tool 能力，反映 agent 从静态知识库走向实时外部世界时的输入焦虑。</li>
<li class=""><strong>安全治理开始从原则走向扫描器。</strong> <a href="https://github.com/NVIDIA/SkillSpector" target="_blank" rel="noopener noreferrer" class="">NVIDIA/SkillSpector</a> 专门扫描 AI agent skills 的漏洞、恶意模式和风险，这说明 skills 一旦可分发，就必须像 npm 包、浏览器扩展一样进入供应链安全视角。</li>
<li class=""><strong>本地与端侧基础设施重新被看见。</strong> <a href="https://github.com/apple/container" target="_blank" rel="noopener noreferrer" class="">apple/container</a> 的高热提醒我们：即使 AI 是主线，开发者仍然需要更好用的本地运行时、隔离环境和平台原生工具。</li>
<li class=""><strong>视觉与 Physical AI 没有退场。</strong> <a href="https://github.com/opencv/opencv" target="_blank" rel="noopener noreferrer" class="">opencv/opencv</a>、<a href="https://github.com/roboflow/supervision" target="_blank" rel="noopener noreferrer" class="">roboflow/supervision</a>、<a href="https://github.com/NVIDIA/cosmos" target="_blank" rel="noopener noreferrer" class="">NVIDIA/cosmos</a>、<a href="https://github.com/huggingface/OpenEnv" target="_blank" rel="noopener noreferrer" class="">huggingface/OpenEnv</a> 共同指向一个方向：模型不只要读文本和代码，也要理解图像、视频、环境和机器人交互。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/6/14/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-mvanhornlast30days-skill">1. <a href="https://github.com/mvanhorn/last30days-skill" target="_blank" rel="noopener noreferrer" class="">mvanhorn/last30days-skill</a><a href="https://xiebo.fun/blog/2026/6/14/#1-mvanhornlast30days-skill" class="hash-link" aria-label="1-mvanhornlast30days-skill的直接链接" title="1-mvanhornlast30days-skill的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 AI agent 的 research skill，可以围绕任意主题搜索 Reddit、X、YouTube、Hacker News、Polymarket 和 Web，再综合成有依据的近期总结。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 12.6k stars。它击中的痛点很明确：大模型的常识和训练知识不等于最近 30 天的真实讨论，agent 如果要做市场研究、热点判断或竞品监控，需要稳定接入社交平台与实时网页。</li>
<li class=""><strong>有什么新意</strong>：它把“最近发生了什么”封装成可复用 skill，而不是每次让用户手写一串搜索指令。对 agent 来说，时间敏感型研究可能会成为标准能力：先抓取多源信号，再综合出可信结论。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-phurynpm-skills">2. <a href="https://github.com/phuryn/pm-skills" target="_blank" rel="noopener noreferrer" class="">phuryn/pm-skills</a><a href="https://xiebo.fun/blog/2026/6/14/#2-phurynpm-skills" class="hash-link" aria-label="2-phurynpm-skills的直接链接" title="2-phurynpm-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向产品经理的 agentic skills / commands / plugins 市场，覆盖 discovery、strategy、execution、launch、growth 等产品工作阶段。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 5.4k stars。过去 skills 生态更多围绕 coding agent；PM Skills 说明同样的分发形态正在进入产品管理、用户研究、路线图、发布和增长工作。</li>
<li class=""><strong>有什么新意</strong>：它把产品方法论拆成可安装资产。产品经理不是缺“让 AI 写一段文案”，而是需要把访谈、需求判断、优先级、发布检查和增长实验变成可重复流程。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-chopratejasheadroom">3. <a href="https://github.com/chopratejas/headroom" target="_blank" rel="noopener noreferrer" class="">chopratejas/headroom</a><a href="https://xiebo.fun/blog/2026/6/14/#3-chopratejasheadroom" class="hash-link" aria-label="3-chopratejasheadroom的直接链接" title="3-chopratejasheadroom的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：在工具输出、日志、文件内容和 RAG chunks 进入 LLM 前进行压缩，目标是在保持答案质量的同时减少 60%–95% token；形态包括库、代理和 MCP server。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 10.4k stars。真实 agent 任务里，日志、测试输出、检索结果和长文件经常把上下文窗口塞满，却只有一部分真正影响决策。Headroom 把这个问题直接产品化。</li>
<li class=""><strong>有什么新意</strong>：它不是单纯“截断文本”，而是把上下文瘦身放到 LLM 入口层。未来 agent 栈里很可能会默认存在一个 context middleware：先过滤、压缩、排序，再把信息交给模型。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-nvidiaskillspector">4. <a href="https://github.com/NVIDIA/SkillSpector" target="_blank" rel="noopener noreferrer" class="">NVIDIA/SkillSpector</a><a href="https://xiebo.fun/blog/2026/6/14/#4-nvidiaskillspector" class="hash-link" aria-label="4-nvidiaskillspector的直接链接" title="4-nvidiaskillspector的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：NVIDIA 开源的 AI agent skills 安全扫描器，用于检测 skills 中的漏洞、恶意模式和安全风险。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.8k stars。skills 一旦能从第三方安装，就会自然产生供应链问题：里面可能有越权命令、数据外传、prompt 注入、危险 shell 操作或隐藏依赖。</li>
<li class=""><strong>有什么新意</strong>：它把 agent skills 当成可审计软件资产。过去大家关心 prompt 是否有效；现在更现实的问题是：这个 skill 能不能被信任、能不能进企业环境、能不能在执行前被静态检查。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-addyosmaniagent-skills">5. <a href="https://github.com/addyosmani/agent-skills" target="_blank" rel="noopener noreferrer" class="">addyosmani/agent-skills</a><a href="https://xiebo.fun/blog/2026/6/14/#5-addyosmaniagent-skills" class="hash-link" aria-label="5-addyosmaniagent-skills的直接链接" title="5-addyosmaniagent-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一组 production-grade engineering skills，面向 AI coding agents，帮助 agent 执行更接近真实工程标准的开发任务。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 9.3k stars。coding agent 进入日常开发后，用户很快会发现“能改代码”和“按团队标准交付代码”不是一回事；工程 skills 正好补上测试、审查、重构、调试、交付习惯。</li>
<li class=""><strong>有什么新意</strong>：它代表工程经验的可分发化。团队过去会写 wiki、checklist、PR 模板和 runbook；现在这些经验开始被包装成 agent 可以直接执行的技能。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-panniantongagent-reach">6. <a href="https://github.com/Panniantong/Agent-Reach" target="_blank" rel="noopener noreferrer" class="">Panniantong/Agent-Reach</a><a href="https://xiebo.fun/blog/2026/6/14/#6-panniantongagent-reach" class="hash-link" aria-label="6-panniantongagent-reach的直接链接" title="6-panniantongagent-reach的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：给 AI agent 提供“看见互联网”的 CLI / 工具层，支持读取和搜索 Twitter/X、Reddit、YouTube、GitHub、Bilibili、小红书等平台，并强调零 API 费用。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 5.2k stars。agent 如果只依赖静态网页搜索，很难完成舆情、产品调研、创作者分析、社区反馈和短视频平台相关任务；多平台数据入口因此变得很有吸引力。</li>
<li class=""><strong>有什么新意</strong>：它把 social web 访问变成 agent 工具，而不是让模型“想象互联网上有什么”。这类项目的难点不只是抓取，还包括平台变化、登录态、速率限制、内容清洗和引用可信度。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-openaiplugins">7. <a href="https://github.com/openai/plugins" target="_blank" rel="noopener noreferrer" class="">openai/plugins</a><a href="https://xiebo.fun/blog/2026/6/14/#7-openaiplugins" class="hash-link" aria-label="7-openaiplugins的直接链接" title="7-openaiplugins的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：OpenAI Plugins 相关仓库，承载插件形态的资源与示例。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.3k stars。在 skills、plugins、MCP、tools 同时升温的背景下，开发者仍在回看“模型如何连接外部能力”的早期形态。</li>
<li class=""><strong>有什么新意</strong>：它的意义不在于某个具体功能，而在于插件这个抽象：把模型从聊天框连接到真实服务，同时定义权限、schema、安装和调用边界。今天的 MCP server、agent skill、tool registry，本质上都在回答类似问题。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-leonxlnxtaste-skill">8. <a href="https://github.com/Leonxlnx/taste-skill" target="_blank" rel="noopener noreferrer" class="">Leonxlnx/taste-skill</a><a href="https://xiebo.fun/blog/2026/6/14/#8-leonxlnxtaste-skill" class="hash-link" aria-label="8-leonxlnxtaste-skill的直接链接" title="8-leonxlnxtaste-skill的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个让 AI “更有品味”的 skill，目标是减少 boring、generic、slop 式输出，尤其面向设计、前端、vibe coding 和内容生成场景。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 8.1k stars。AI 生成内容已经从稀缺变成过剩，用户开始厌倦模板化表达、平庸设计和缺少判断力的“正确废话”。</li>
<li class=""><strong>有什么新意</strong>：它把审美与风格控制变成可执行规则。模型能力越强，越需要外层标准来决定什么不该生成、什么值得保留、什么才算有味道。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-lfnovoopen-notebook">9. <a href="https://github.com/lfnovo/open-notebook" target="_blank" rel="noopener noreferrer" class="">lfnovo/open-notebook</a><a href="https://xiebo.fun/blog/2026/6/14/#9-lfnovoopen-notebook" class="hash-link" aria-label="9-lfnovoopen-notebook的直接链接" title="9-lfnovoopen-notebook的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源的 NotebookLM 实现，强调比闭源产品有更多灵活性和功能，面向学习、笔记、资料整理和知识问答。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 3.6k stars。NotebookLM 式体验已经证明了“把资料变成可对话知识空间”的需求，但很多用户希望自托管、可扩展、可接入不同模型和工作流。</li>
<li class=""><strong>有什么新意</strong>：它把知识工作从单文件总结推进到 workspace。真正有价值的不是问一个 PDF，而是围绕一组资料持续提问、整理、生成、复盘，并保留可追溯来源。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-aaif-goosegoose">10. <a href="https://github.com/aaif-goose/goose" target="_blank" rel="noopener noreferrer" class="">aaif-goose/goose</a><a href="https://xiebo.fun/blog/2026/6/14/#10-aaif-goosegoose" class="hash-link" aria-label="10-aaif-goosegoose的直接链接" title="10-aaif-goosegoose的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源、可扩展的 AI agent，不止给代码建议，还能安装、执行、编辑、测试，并支持任意 LLM。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.4k stars。开发者对 agent 的期待已经从“给建议”转向“能在真实环境里完成任务”，包括改文件、跑命令、验证结果和接入工具协议。</li>
<li class=""><strong>有什么新意</strong>：Goose 的价值在于把 agent 做成可扩展运行时，而不是某个模型的前端。只要模型、工具协议和本地执行环境持续变化，开源 agent runtime 就会有长期吸引力。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-copilotkitcopilotkit">11. <a href="https://github.com/CopilotKit/CopilotKit" target="_blank" rel="noopener noreferrer" class="">CopilotKit/CopilotKit</a><a href="https://xiebo.fun/blog/2026/6/14/#11-copilotkitcopilotkit" class="hash-link" aria-label="11-copilotkitcopilotkit的直接链接" title="11-copilotkitcopilotkit的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：面向 Agents 与 Generative UI 的前端栈，支持 React、Angular、移动端、Slack 等，并推动 AG-UI Protocol。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.0k stars。越来越多 AI 应用不满足于一个聊天框，而是希望 agent 能嵌入真实产品界面，理解页面状态，触发 UI 操作，并与用户共同完成流程。</li>
<li class=""><strong>有什么新意</strong>：它把 agent 产品化的焦点放在前端交互层。Generative UI 的关键不是“模型生成一点 UI”，而是让 agent、应用状态和用户操作形成可控闭环。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-nvidiacosmos">12. <a href="https://github.com/NVIDIA/cosmos" target="_blank" rel="noopener noreferrer" class="">NVIDIA/cosmos</a><a href="https://xiebo.fun/blog/2026/6/14/#12-nvidiacosmos" class="hash-link" aria-label="12-nvidiacosmos的直接链接" title="12-nvidiacosmos的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：NVIDIA Cosmos 是面向 world models、数据集和工具的开放平台，用于构建机器人、自动驾驶、智能基础设施等 Physical AI 应用。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 554 stars。虽然新增 star 不如 agent skills 项目夸张，但它代表另一条重要主线：AI 不只是处理文本，也要理解物理世界、生成环境状态、支持机器人和自动系统训练。</li>
<li class=""><strong>有什么新意</strong>：Cosmos 把 world model 放在 Physical AI 开发平台的中心。相比聊天或代码 agent，物理 AI 更依赖仿真、视频、传感器数据和可评估环境，这会催生一套不同的基础设施。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-huggingfaceopenenv">13. <a href="https://github.com/huggingface/OpenEnv" target="_blank" rel="noopener noreferrer" class="">huggingface/OpenEnv</a><a href="https://xiebo.fun/blog/2026/6/14/#13-huggingfaceopenenv" class="hash-link" aria-label="13-huggingfaceopenenv的直接链接" title="13-huggingfaceopenenv的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Hugging Face 开源的环境接口库，面向带环境的 RL post-training。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 235 stars。随着 RL、agent training 和环境交互重新升温，开发者需要标准化接口来连接模型、任务环境、反馈和评估。</li>
<li class=""><strong>有什么新意</strong>：它关注的不是一次推理，而是模型如何在环境中训练和改进。对于未来的工具使用 agent、机器人和交互式任务，环境接口会像数据加载器一样基础。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/6/14/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周严格意义上的非 AI 项目仍然偏少；不少项目虽然不直接训练或调用大模型，却处在 AI workflow 的输入、知识管理、本地运行、视觉处理和开发者体验链路上。因此这一节不强行凑“纯非 AI”，而是把它们看作被 AI 时代放大的通用基础设施。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-applecontainer">1. <a href="https://github.com/apple/container" target="_blank" rel="noopener noreferrer" class="">apple/container</a><a href="https://xiebo.fun/blog/2026/6/14/#1-applecontainer" class="hash-link" aria-label="1-applecontainer的直接链接" title="1-applecontainer的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Apple 开源的 Mac 上 Linux container 创建与运行工具，使用轻量虚拟机，采用 Swift 编写，并针对 Apple Silicon 优化。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 9.2k stars。Mac，尤其是 Apple Silicon，已经是大量开发者和 AI 工具用户的主力环境；更原生、更轻量的 Linux 容器体验会直接影响本地开发、测试、隔离和自动化任务。</li>
<li class=""><strong>有什么新意</strong>：它把容器体验与 Apple 平台特性更紧密结合。对 agent 生态也有间接意义：未来本地 agent 执行代码、跑测试、隔离危险命令，都需要可靠的本地沙箱和容器层。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-microsoftmarkitdown">2. <a href="https://github.com/microsoft/markitdown" target="_blank" rel="noopener noreferrer" class="">microsoft/markitdown</a><a href="https://xiebo.fun/blog/2026/6/14/#2-microsoftmarkitdown" class="hash-link" aria-label="2-microsoftmarkitdown的直接链接" title="2-microsoftmarkitdown的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Microsoft 开源的 Python 工具，用于把文件和 Office 文档转换为 Markdown。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 6.6k stars。企业资料大量存在于 Word、PowerPoint、Excel、PDF、HTML 等格式里，而 RAG、总结、知识库和 agent 审阅都更偏好结构清晰的文本。</li>
<li class=""><strong>有什么新意</strong>：它提醒我们：AI 系统的效果常常受输入层限制。把文档稳定转换为 Markdown 看似朴素，却直接影响检索质量、引用质量和后续自动化的可审计性。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-refactoringhqtolaria">3. <a href="https://github.com/refactoringhq/tolaria" target="_blank" rel="noopener noreferrer" class="">refactoringhq/tolaria</a><a href="https://xiebo.fun/blog/2026/6/14/#3-refactoringhqtolaria" class="hash-link" aria-label="3-refactoringhqtolaria的直接链接" title="3-refactoringhqtolaria的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个用于管理 Markdown knowledge bases 的桌面应用。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 3.7k stars。随着开发者把知识、项目背景、agent skills、研究资料和个人笔记都沉淀到 Markdown，管理本地知识库的需求被重新放大。</li>
<li class=""><strong>有什么新意</strong>：它站在 Obsidian、Docusaurus、Docs-as-code 与 agent memory 的交叉处。Markdown 不只是写作格式，也越来越像个人和团队知识系统的低摩擦存储层。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-opencvopencv">4. <a href="https://github.com/opencv/opencv" target="_blank" rel="noopener noreferrer" class="">opencv/opencv</a><a href="https://xiebo.fun/blog/2026/6/14/#4-opencvopencv" class="hash-link" aria-label="4-opencvopencv的直接链接" title="4-opencvopencv的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：经典开源计算机视觉库，覆盖图像处理、传统视觉算法、深度学习接口和大量视觉工程能力。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.2k stars。视觉 AI 的前沿项目不断变化，但 OpenCV 仍是工程落地时绕不开的基础设施：摄像头、图像预处理、特征、标注、视频流和部署管线都需要可靠工具。</li>
<li class=""><strong>有什么新意</strong>：它的“新意”恰恰在于长期稳定。大模型时代并没有消灭传统视觉库，反而让视觉输入、数据清洗和前后处理更重要。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-roboflowsupervision">5. <a href="https://github.com/roboflow/supervision" target="_blank" rel="noopener noreferrer" class="">roboflow/supervision</a><a href="https://xiebo.fun/blog/2026/6/14/#5-roboflowsupervision" class="hash-link" aria-label="5-roboflowsupervision的直接链接" title="5-roboflowsupervision的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Roboflow 开源的可复用计算机视觉工具库，覆盖检测、分割、跟踪、标注、评估和视频处理等工作。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 4.0k stars。大量视觉应用不缺模型 checkpoint，而是缺把检测结果变成可用系统的工具：画框、过滤、追踪、评估、可视化和数据格式转换。</li>
<li class=""><strong>有什么新意</strong>：它把视觉工程里的“胶水代码”产品化。对 AI 应用来说，模型输出只是开始，真正落地需要围绕输出做后处理、监控和交互。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/6/14/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-skills-从-prompt-文件变成供应链资产">1. Skills 从 prompt 文件变成供应链资产<a href="https://xiebo.fun/blog/2026/6/14/#1-skills-%E4%BB%8E-prompt-%E6%96%87%E4%BB%B6%E5%8F%98%E6%88%90%E4%BE%9B%E5%BA%94%E9%93%BE%E8%B5%84%E4%BA%A7" class="hash-link" aria-label="1. Skills 从 prompt 文件变成供应链资产的直接链接" title="1. Skills 从 prompt 文件变成供应链资产的直接链接" translate="no">​</a></h4>
<p>本周最强的连续信号是 skills：last30days-skill、pm-skills、agent-skills、taste-skill、SkillSpector 同时出现，说明 skills 已经不只是“把提示词存成文件”。它正在接近一个软件包生态：有人生产技能、有人按职业场景整理技能、有人优化工程技能、有人改善审美输出，也有人开始扫描技能安全风险。</p>
<p>这意味着下一阶段的竞争不会只是“谁的 agent 更聪明”，而是“谁的 agent 能安全地安装、组合、更新和审计一组技能”。一旦技能可以跨用户传播，就会出现版本、依赖、权限、恶意代码、质量评级和组织内分发问题。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-agent-的上下文工程正在形成独立中间层">2. Agent 的上下文工程正在形成独立中间层<a href="https://xiebo.fun/blog/2026/6/14/#2-agent-%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B%E6%AD%A3%E5%9C%A8%E5%BD%A2%E6%88%90%E7%8B%AC%E7%AB%8B%E4%B8%AD%E9%97%B4%E5%B1%82" class="hash-link" aria-label="2. Agent 的上下文工程正在形成独立中间层的直接链接" title="2. Agent 的上下文工程正在形成独立中间层的直接链接" translate="no">​</a></h4>
<p>Headroom、MarkItDown、Tolaria、Open Notebook 都在不同位置处理同一个大问题：模型究竟该读什么、以什么格式读、读多少、如何保留。过去大家把上下文问题理解成“窗口不够大”，现在更成熟的看法是：上下文需要工程化。</p>
<p>文档先转 Markdown，知识库先整理，工具输出先压缩，长期资料先进入 notebook 或 memory，最后再交给模型。这条链路越清楚，agent 的成本、速度和可靠性越可控。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-实时互联网访问成为-agent-的关键输入但也带来可信度问题">3. 实时互联网访问成为 agent 的关键输入，但也带来可信度问题<a href="https://xiebo.fun/blog/2026/6/14/#3-%E5%AE%9E%E6%97%B6%E4%BA%92%E8%81%94%E7%BD%91%E8%AE%BF%E9%97%AE%E6%88%90%E4%B8%BA-agent-%E7%9A%84%E5%85%B3%E9%94%AE%E8%BE%93%E5%85%A5%E4%BD%86%E4%B9%9F%E5%B8%A6%E6%9D%A5%E5%8F%AF%E4%BF%A1%E5%BA%A6%E9%97%AE%E9%A2%98" class="hash-link" aria-label="3. 实时互联网访问成为 agent 的关键输入，但也带来可信度问题的直接链接" title="3. 实时互联网访问成为 agent 的关键输入，但也带来可信度问题的直接链接" translate="no">​</a></h4>
<p>last30days-skill 和 Agent-Reach 都说明，开发者希望 agent 能接触 Reddit、X、YouTube、HN、Bilibili、小红书等实时信号。这个方向非常实用：研究、产品、市场、舆情、趋势分析都离不开最近的讨论。</p>
<p>但它也把新问题带进系统：平台内容噪声高、抓取不稳定、引用难验证、登录态复杂、速率限制频繁。未来真正有价值的不是“能抓到”，而是能把多源内容变成可追溯、可去重、可评分的证据链。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-本地运行时与安全边界会成为-agent-落地的底座">4. 本地运行时与安全边界会成为 agent 落地的底座<a href="https://xiebo.fun/blog/2026/6/14/#4-%E6%9C%AC%E5%9C%B0%E8%BF%90%E8%A1%8C%E6%97%B6%E4%B8%8E%E5%AE%89%E5%85%A8%E8%BE%B9%E7%95%8C%E4%BC%9A%E6%88%90%E4%B8%BA-agent-%E8%90%BD%E5%9C%B0%E7%9A%84%E5%BA%95%E5%BA%A7" class="hash-link" aria-label="4. 本地运行时与安全边界会成为 agent 落地的底座的直接链接" title="4. 本地运行时与安全边界会成为 agent 落地的底座的直接链接" translate="no">​</a></h4>
<p>Apple container 和 SkillSpector 看似不同，一个是容器，一个是 skills 安全扫描；但它们都指向同一件事：agent 不能只在对话里存在，它要进入真实机器、执行真实命令、安装真实能力。只要开始执行，隔离与审计就不可选。</p>
<p>本地容器提供运行边界，skills scanner 提供分发前检查，未来还会需要权限模型、执行沙箱、日志追踪、策略引擎和回滚机制。Agent 越能干，越需要系统层制动器。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-ai-产品的界面正在从聊天框扩展到工作台notebook-和应用内-copilot">5. AI 产品的界面正在从聊天框扩展到工作台、Notebook 和应用内 Copilot<a href="https://xiebo.fun/blog/2026/6/14/#5-ai-%E4%BA%A7%E5%93%81%E7%9A%84%E7%95%8C%E9%9D%A2%E6%AD%A3%E5%9C%A8%E4%BB%8E%E8%81%8A%E5%A4%A9%E6%A1%86%E6%89%A9%E5%B1%95%E5%88%B0%E5%B7%A5%E4%BD%9C%E5%8F%B0notebook-%E5%92%8C%E5%BA%94%E7%94%A8%E5%86%85-copilot" class="hash-link" aria-label="5. AI 产品的界面正在从聊天框扩展到工作台、Notebook 和应用内 Copilot的直接链接" title="5. AI 产品的界面正在从聊天框扩展到工作台、Notebook 和应用内 Copilot的直接链接" translate="no">​</a></h4>
<p>Open Notebook、Tolaria、CopilotKit 代表三种入口：知识工作台、Markdown 知识库桌面应用、应用内 agent UI。它们共同说明，AI 的交互形态不会停留在聊天窗口。</p>
<p>用户需要在资料、界面、任务和 agent 之间来回切换：有时是问一组文档，有时是在应用页面里让 copilot 操作状态，有时是管理长期 Markdown 知识库。谁能把 agent 放进正确上下文，谁就更接近真实使用。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-视觉和-physical-ai-仍在稳步铺底层工具">6. 视觉和 Physical AI 仍在稳步铺底层工具<a href="https://xiebo.fun/blog/2026/6/14/#6-%E8%A7%86%E8%A7%89%E5%92%8C-physical-ai-%E4%BB%8D%E5%9C%A8%E7%A8%B3%E6%AD%A5%E9%93%BA%E5%BA%95%E5%B1%82%E5%B7%A5%E5%85%B7" class="hash-link" aria-label="6. 视觉和 Physical AI 仍在稳步铺底层工具的直接链接" title="6. 视觉和 Physical AI 仍在稳步铺底层工具的直接链接" translate="no">​</a></h4>
<p>OpenCV、Roboflow Supervision、NVIDIA Cosmos、OpenEnv 的热度没有 skills 叙事那么爆炸，但它们指向更长期的基础设施：让模型理解图像、视频、环境、机器人和交互反馈。文本 agent 的发展很快，但物理世界任务需要更多数据、仿真、评估和工程 glue code。</p>
<p>这类项目的价值通常不体现在一周内的爆点，而体现在生态长期依赖。未来机器人、自动驾驶、工业视觉和 embodied agent 的进展，会反复回到这些工具层。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/6/14/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>Skills 生态出现安全扫描器。</strong> SkillSpector 的上榜很关键：当大家开始分享 agent skills，安全问题就从抽象担忧变成具体工具需求。</li>
<li class=""><strong>产品经理也开始拥有专门 skills 市场。</strong> PM Skills 说明 agent skills 不再只是程序员玩具，知识工作岗位会逐步形成自己的技能包。</li>
<li class=""><strong>Apple 亲自下场做容器工具。</strong> apple/container 的热度说明本地开发体验仍是巨大入口，特别是在 Apple Silicon 成为 AI 开发常用终端之后。</li>
<li class=""><strong>Agent 的“看互联网”能力被单独包装。</strong> Agent-Reach 与 last30days-skill 都把多平台实时信息作为卖点，趋势研究和市场研究类 agent 会越来越依赖这种输入层。</li>
<li class=""><strong>Generative UI 正在成为 agent 产品化关键词。</strong> CopilotKit 的持续热度说明，agent 真正进入应用时，需要的不只是后端推理，而是前端状态、用户操作和模型动作之间的协议。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/6/14/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接�链接" title="结语的直接链接" translate="no">​</a></h2>
<p>本周榜单延续了过去几周的主线，但焦点更清楚了：<strong>agent 生态正在进入“可分发、可压缩、可联网、可审计、可嵌入产品”的阶段</strong>。模型本身仍重要，但开发者已经把更多注意力放在模型外层：skills 怎么装，工具输出怎么压，互联网怎么读，技能怎么审，UI 怎么接，本地执行怎么隔离。</p>
<p>如果要选一个本周最值得追踪的方向，我会选 <strong>agent skills 的供应链化</strong>。一旦 skills 成为主流分发单位，围绕它的 marketplace、scanner、版本管理、权限模型、组织内私有仓库和质量评分都会陆续出现。今天看起来像一堆 Markdown / shell / prompt 文件的东西，可能就是下一阶段 agent 生态的 npm。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Agent 生态进入“上下文、记忆、插件和治理”拼装期（2026-06-07）]]></title>
            <link>https://xiebo.fun/blog/2026/6/7/</link>
            <guid>https://xiebo.fun/blog/2026/6/7/</guid>
            <pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 继续由 AI 与 agent 生态主导：工具输出压缩、文档转 Markdown、长期记忆、skills / plugins、终端 coding agent、语音生成和安全治理同时升温，说明开发者已经不再只追逐模型能力，而是在搭建可复用、可控制、可集成的 agent 运行环境。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）的核心信号很清晰：<strong>AI agent 已经从“单个工具能不能干活”，进入“上下文、记忆、插件、skills、治理和多模态能力如何拼装成稳定系统”的阶段</strong>。榜单前列既有 Headroom 这种 token 压缩 / 上下文预算工具，也有 Supermemory、ECC、Harness、Compound Engineering Plugin、Claude Code、Hermes Agent 这类 agent 基础设施；同时 MarkItDown、LiteParse、Scrapling、Trivy 等通用工具也因为 AI workflow 的输入、解析、安全和爬取需求被重新拉进热点。</p>
<p>如果说过去几周的关键词是 coding agent、skills 和知识图谱，那么这一周的关键词更像是：<strong>把 agent 的周边系统补齐</strong>。模型调用只是执行层，真正影响生产可用性的，是上下文是否足够便宜、记忆是否可复用、插件是否能分发、文档是否能被解析、安全边界是否可控，以及语音 / 视频等新入口是否能接入真实工作流。</p>
<blockquote>
<p>本文基于 GitHub Trending weekly 页面展示的仓库描述、语言、总 star 与本周新增 star 做归纳；“为什么这周变热”结合榜单位置、项目定位与近期开发者需求判断。由于定时任务环境下的 GitHub REST API 补充信息不保证稳定，本文优先使用 Trending 页面可见信息，避免把不可验证的 README 细节写成确定事实。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/6/7/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>上下文预算成为 agent 基础设施里的显性问题。</strong> <a href="https://github.com/chopratejas/headroom" target="_blank" rel="noopener noreferrer" class="">chopratejas/headroom</a> 本周新增约 13.3k stars，主打在工具输出、日志、文件和 RAG chunks 进入 LLM 前先压缩；这说明开发者已经把 token 浪费视为系统瓶颈，而不是账单细节。</li>
<li class=""><strong>文档转换 / 解析继续是 AI workflow 的入口层。</strong> <a href="https://github.com/microsoft/markitdown" target="_blank" rel="noopener noreferrer" class="">microsoft/markitdown</a> 本周新增约 15.0k stars，<a href="https://github.com/run-llama/liteparse" target="_blank" rel="noopener noreferrer" class="">run-llama/liteparse</a> 也进入榜单。企业知识很少天然长成 LLM 喜欢的 Markdown，输入层工具因此持续升温。</li>
<li class=""><strong>Agent 生态的分发形态从 prompt 迁移到 plugins、skills、harness。</strong> Harness、ECC、Compound Engineering Plugin、Taste Skill、Stop Slop、OpenAI Plugins 等项目说明：开发者想沉淀的不再是一次性提示词，而是可安装、可版本化、可复用的工作方法。</li>
<li class=""><strong>记忆与长期上下文成为独立产品层。</strong> Supermemory 的热度代表一个重要方向：agent 不该每次对话都失忆，跨应用、跨任务的 memory API 正在成为 AI 应用栈的一层。</li>
<li class=""><strong>多模态入口继续扩张。</strong> MoneyPrinterTurbo、Open LLM VTuber、VoxCPM 分别对应短视频、实时语音角色和 TTS / voice cloning，说明 AI 应用正在从文本助手扩展到内容生产与语音交互。</li>
<li class=""><strong>非 AI 项目没有消失，而是被 AI 基础设施叙事重新解释。</strong> Trivy、Scrapling、LiteParse、MarkItDown 本质上是安全、爬取、解析、转换工具，但在 2026 年的语境里，它们都处在 agent / RAG / 自动化系统的关键路径上。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/6/7/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-chopratejasheadroom">1. <a href="https://github.com/chopratejas/headroom" target="_blank" rel="noopener noreferrer" class="">chopratejas/headroom</a><a href="https://xiebo.fun/blog/2026/6/7/#1-chopratejasheadroom" class="hash-link" aria-label="1-chopratejasheadroom的直接链接" title="1-chopratejasheadroom的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：在工具输出、日志、文件内容和 RAG chunks 进入 LLM 前进行压缩，目标是在保持答案质量的同时减少 60%–95% token；形态包括库、代理和 MCP server。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 13.3k stars，说明开发者已经从“怎么让 agent 多读一点”转向“怎么让 agent 少读废话”。真实工程任务里，测试日志、构建输出、长文件和检索结果经常吞掉上下文窗口，却只有一小部分对决策有用。</li>
<li class=""><strong>有什么新意</strong>：它把 token 压缩从 prompt 技巧变成中间件。相比简单截断，Headroom 关注的是在 LLM 入口处做系统性瘦身：同样的工具链、同样的模型，但进入模型的信息更短、更密、更可用。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-harry0703moneyprinterturbo">2. <a href="https://github.com/harry0703/MoneyPrinterTurbo" target="_blank" rel="noopener noreferrer" class="">harry0703/MoneyPrinterTurbo</a><a href="https://xiebo.fun/blog/2026/6/7/#2-harry0703moneyprinterturbo" class="hash-link" aria-label="2-harry0703moneyprinterturbo的直接链接" title="2-harry0703moneyprinterturbo的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：使用 AI 大模型一键生成高清短视频，面向脚本、素材、配音、字幕、剪辑等短视频流水线的自动化。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 9.2k stars。AI 视频的关注点正在从“模型能不能生成片段”转向“普通用户能不能批量产出能发布的内容”。短视频是最容易把 AI 生成能力转化为可见产出的场景之一。</li>
<li class=""><strong>有什么新意</strong>：它不是单一生成模型，而是端到端内容生产工具。这个方向的关键不只是画质，而是把选题、文案、声音、剪辑、字幕和导出串成低门槛流程。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-revfactoryharness">3. <a href="https://github.com/revfactory/harness" target="_blank" rel="noopener noreferrer" class="">revfactory/harness</a><a href="https://xiebo.fun/blog/2026/6/7/#3-revfactoryharness" class="hash-link" aria-label="3-revfactoryharness的直接链接" title="3-revfactoryharness的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 meta-skill，用来设计领域专用 agent 团队、定义 specialized agents，并生成它们使用的 skills。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.1k stars。单 agent 的能力边界越来越明显：复杂任务需要角色分工、技能沉淀、审查与执行分离。开发者正在寻找能把“多 agent 协作”结构化的方法。</li>
<li class=""><strong>有什么新意</strong>：它把 agent 组织方式本身变成可生成对象。与其手写一堆零散 prompt，不如先定义任务域、角色和 skills，再让系统生成一套团队运行框架。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-supermemoryaisupermemory">4. <a href="https://github.com/supermemoryai/supermemory" target="_blank" rel="noopener noreferrer" class="">supermemoryai/supermemory</a><a href="https://xiebo.fun/blog/2026/6/7/#4-supermemoryaisupermemory" class="hash-link" aria-label="4-supermemoryaisupermemory的直接链接" title="4-supermemoryaisupermemory的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 AI 时代的 memory engine 和应用，强调高速、可扩展，并提供 Memory API。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 3.0k stars。随着用户把 agent 用在长期项目、研究、写作、客服和个人工作流里，“每次都从零开始”已经不可接受。记忆层成为 AI 应用稳定性的关键。</li>
<li class=""><strong>有什么新意</strong>：它把 memory 从某个聊天产品的内置功能，拆成可被其他应用调用的基础设施。长期看，memory API 可能像搜索、向量库、身份系统一样，成为 agent 应用的标准依赖。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-affaan-mecc">5. <a href="https://github.com/affaan-m/ECC" target="_blank" rel="noopener noreferrer" class="">affaan-m/ECC</a><a href="https://xiebo.fun/blog/2026/6/7/#5-affaan-mecc" class="hash-link" aria-label="5-affaan-mecc的直接链接" title="5-affaan-mecc的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 agent harness 性能优化系统，覆盖 skills、instincts、memory、security 和 research-first development，面向 Claude Code、Codex、OpenCode、Cursor 等工具。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 10.4k stars。开发者越来越意识到：模型只是 agent 表现的一部分，外层 harness 如何组织上下文、记忆、约束、验证和安全策略，同样决定最终效果。</li>
<li class=""><strong>有什么新意</strong>：它强调 agent 的“运行习惯”可以被工程化。skills 负责步骤复用，memory 负责持续上下文，security 负责边界，research-first 负责先查证再行动；这些组合起来，比单次 prompt 更接近生产方法论。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-everyinccompound-engineering-plugin">6. <a href="https://github.com/EveryInc/compound-engineering-plugin" target="_blank" rel="noopener noreferrer" class="">EveryInc/compound-engineering-plugin</a><a href="https://xiebo.fun/blog/2026/6/7/#6-everyinccompound-engineering-plugin" class="hash-link" aria-label="6-everyinccompound-engineering-plugin的直接链接" title="6-everyinccompound-engineering-plugin的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Every Inc 开源的 Compound Engineering 插件，面向 Claude Code、Codex、Cursor 等工具。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.8k stars。AI coding 工具已经不缺“能聊天的编辑器”，真正稀缺的是把工程实践、团队规范、审查习惯和交付流程打包进工具的能力。</li>
<li class=""><strong>有什么新意</strong>：它代表工程方法论的插件化。过去团队会写开发手册、lint 规则和 checklist；现在这些实践开始被封装成 agent 可以直接加载的插件。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-open-llm-vtuberopen-llm-vtuber">7. <a href="https://github.com/Open-LLM-VTuber/Open-LLM-VTuber" target="_blank" rel="noopener noreferrer" class="">Open-LLM-VTuber/Open-LLM-VTuber</a><a href="https://xiebo.fun/blog/2026/6/7/#7-open-llm-vtuberopen-llm-vtuber" class="hash-link" aria-label="7-open-llm-vtuberopen-llm-vtuber的直接链接" title="7-open-llm-vtuberopen-llm-vtuber的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个本地跨平台的 LLM + 语音交互 + Live2D VTuber 项目，支持免手操作、语音打断和角色化交互。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.3k stars。语音和虚拟形象是 AI 从工具走向陪伴、直播、教育和客服场景的自然入口；本地运行与跨平台也降低了尝试门槛。</li>
<li class=""><strong>有什么新意</strong>：它把 LLM 对话、语音输入输出、打断处理和 Live2D 表现层放在一起。真正的语音角色不是“会说话的 chatbot”，而是需要低延迟、可中断、有状态、有形象的交互系统。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-can1357oh-my-pi">8. <a href="https://github.com/can1357/oh-my-pi" target="_blank" rel="noopener noreferrer" class="">can1357/oh-my-pi</a><a href="https://xiebo.fun/blog/2026/6/7/#8-can1357oh-my-pi" class="hash-link" aria-label="8-can1357oh-my-pi的直接链接" title="8-can1357oh-my-pi的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个运行在终端里的 AI coding agent，强调 hash-anchored edits、优化工具 harness、LSP、Python、browser、subagents 等能力。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.3k stars。终端 agent 已经进入精细化竞争：不只是能不能调用 shell，而是能不能可靠定位代码、正确编辑、接入语言服务、拆分子任务并验证结果。</li>
<li class=""><strong>有什么新意</strong>：hash-anchored edits 这类能力指向一个很具体的痛点：agent 修改文件时必须有稳定锚点，否则容易误替换、漏改或破坏相邻上下文。编辑原语正在成为 coding agent 的核心竞争力。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-leonxlnxtaste-skill">9. <a href="https://github.com/Leonxlnx/taste-skill" target="_blank" rel="noopener noreferrer" class="">Leonxlnx/taste-skill</a><a href="https://xiebo.fun/blog/2026/6/7/#9-leonxlnxtaste-skill" class="hash-link" aria-label="9-leonxlnxtaste-skill的直接链接" title="9-leonxlnxtaste-skill的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个让 AI 更有“品味”的 skill，目标是减少 boring、generic、slop 式输出。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 6.1k stars。AI 内容已经从稀缺变成过剩，用户开始厌倦模板化表达、空泛结构和没有判断力的“正确废话”。</li>
<li class=""><strong>有什么新意</strong>：它不是让模型懂更多知识，而是给模型加编辑标准。品味、取舍、具体性和语气控制，正在从人工经验变成 agent 可执行的规则资产。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-openaiplugins">10. <a href="https://github.com/openai/plugins" target="_blank" rel="noopener noreferrer" class="">openai/plugins</a><a href="https://xiebo.fun/blog/2026/6/7/#10-openaiplugins" class="hash-link" aria-label="10-openaiplugins的直接链接" title="10-openaiplugins的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：OpenAI Plugins 仓库，提供插件相关资源。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 360 stars。虽然热度绝对值不高，但在 plugins / skills / harness 同时上榜的背景下，它体现了开发者对“把外部能力接入模型”的持续关注。</li>
<li class=""><strong>有什么新意</strong>：插件的价值在于把模型从聊天框连接到真实工具。无论最后生态形态叫 plugin、tool、MCP server 还是 skill，本质都是能力分发与权限边界管理。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-hardikpandyastop-slop">11. <a href="https://github.com/hardikpandya/stop-slop" target="_blank" rel="noopener noreferrer" class="">hardikpandya/stop-slop</a><a href="https://xiebo.fun/blog/2026/6/7/#11-hardikpandyastop-slop" class="hash-link" aria-label="11-hardikpandyastop-slop的直接链接" title="11-hardikpandyastop-slop的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个用于移除 AI 写作痕迹的 skill 文件，帮助文本减少套话、空泛表达和明显机器味。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.7k stars。与 Taste Skill 类似，它击中了生产环境里的真实问题：AI 写得快，但很多输出不够具体、不像人、不像作者自己。</li>
<li class=""><strong>有什么新意</strong>：它把“去 AI 味”从人工润色变成可复用规则。随着 AI 内容进入博客、邮件、PR、招聘和营销材料，风格控制会越来越像质量控制，而不是审美偏好。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-anthropicsclaude-code">12. <a href="https://github.com/anthropics/claude-code" target="_blank" rel="noopener noreferrer" class="">anthropics/claude-code</a><a href="https://xiebo.fun/blog/2026/6/7/#12-anthropicsclaude-code" class="hash-link" aria-label="12-anthropicsclaude-code的直接链接" title="12-anthropicsclaude-code的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Anthropic 的终端 agentic coding tool，能理解代码库、执行例行任务、解释复杂代码并处理 git workflow。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.5k stars。Claude Code 已经是 coding agent 生态的代表性入口之一；它继续上榜说明终端原生、可执行、能直接操作仓库的 agent 仍是开发者最关注的 AI 应用形态。</li>
<li class=""><strong>有什么新意</strong>：它把自然语言、代码理解、工具执行和版本控制放进同一个开发循环。相比 IDE 侧边栏，终端 agent 更接近真实工程任务的执行环境。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-mukul975anthropic-cybersecurity-skills">13. <a href="https://github.com/mukul975/Anthropic-Cybersecurity-Skills" target="_blank" rel="noopener noreferrer" class="">mukul975/Anthropic-Cybersecurity-Skills</a><a href="https://xiebo.fun/blog/2026/6/7/#13-mukul975anthropic-cybersecurity-skills" class="hash-link" aria-label="13-mukul975anthropic-cybersecurity-skills的直接链接" title="13-mukul975anthropic-cybersecurity-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一套结构化网络安全 skills，覆盖 754 个安全技能，并映射到 MITRE ATT&amp;CK、NIST CSF 2.0、MITRE ATLAS、D3FEND、NIST AI RMF 等框架，支持多种 agent / coding 工具。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.2k stars。安全任务专业性强、误操作成本高、流程框架明确，因此特别适合被拆成可审计、可复用的 skills，而不是让模型自由发挥。</li>
<li class=""><strong>有什么新意</strong>：它把 skills 与安全行业已有框架绑定。这样做的价值不只是提示词更好，而是让 agent 输出更容易进入企业安全流程、合规语言和审计结构。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="14-openbmbvoxcpm">14. <a href="https://github.com/OpenBMB/VoxCPM" target="_blank" rel="noopener noreferrer" class="">OpenBMB/VoxCPM</a><a href="https://xiebo.fun/blog/2026/6/7/#14-openbmbvoxcpm" class="hash-link" aria-label="14-openbmbvoxcpm的直接链接" title="14-openbmbvoxcpm的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：VoxCPM2，一个面向多语言语音生成、创意声音设计和真实感克隆的 tokenizer-free TTS 项目。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 4.5k stars。语音生成正在从“能读文本”走向“能设计声音、克隆风格、支持多语言表达”。对于虚拟人、客服、教育、播客和内容生产，这是非常直接的能力。</li>
<li class=""><strong>有什么新意</strong>：tokenizer-free TTS 的表述说明语音生成正在探索不同于传统文本 token 管线的建模方式。更重要的是，它把“声音”作为可创作对象，而不只是文字朗读结果。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="15-nousresearchhermes-agent">15. <a href="https://github.com/NousResearch/hermes-agent" target="_blank" rel="noopener noreferrer" class="">NousResearch/hermes-agent</a><a href="https://xiebo.fun/blog/2026/6/7/#15-nousresearchhermes-agent" class="hash-link" aria-label="15-nousresearchhermes-agent的直接链接" title="15-nousresearchhermes-agent的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个会随着用户使用而成长的 agent 项目，强调长期记忆、skills、工具调用和可扩展工作流。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 11.4k stars。它处在多个热门叙事交叉点上：个人 agent、持久记忆、skills、自动化工具、定时任务和多工具编排。开发者正在寻找不只是“聊天”，而是能长期帮自己做事的系统。</li>
<li class=""><strong>有什么新意</strong>：它把 agent 的学习与复用能力放到产品中心。一次任务里发现的偏好、流程和工具经验，应该能沉淀下来影响下一次任务；这正是 agent 从一次性助手走向长期工作伙伴的关键。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="16-nesquenahermes-webui">16. <a href="https://github.com/nesquena/hermes-webui" target="_blank" rel="noopener noreferrer" class="">nesquena/hermes-webui</a><a href="https://xiebo.fun/blog/2026/6/7/#16-nesquenahermes-webui" class="hash-link" aria-label="16-nesquenahermes-webui的直接链接" title="16-nesquenahermes-webui的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Hermes Agent 的 WebUI，让用户可以通过网页或手机使用 Hermes Agent。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 4.4k stars。agent 如果只能在命令行里使用，入口仍然偏开发者；WebUI 和移动端入口能把同一套能力带到更广泛的日常场景。</li>
<li class=""><strong>有什么新意</strong>：它代表 agent 产品化的一步：底层能力可以保持工具化和可扩展，但用户入口需要更轻、更随手、更适合跨设备使用。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/6/7/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周严格意义上的非 AI 项目仍然不多；不少项目本身不是模型或 agent，却因为处在 AI 系统的数据入口、安全、爬取和解析链路上而获得关注。因此这一节不强行把它们说成“完全非 AI”，而是看作被 AI workflow 放大的通用基础设施。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-microsoftmarkitdown">1. <a href="https://github.com/microsoft/markitdown" target="_blank" rel="noopener noreferrer" class="">microsoft/markitdown</a><a href="https://xiebo.fun/blog/2026/6/7/#1-microsoftmarkitdown" class="hash-link" aria-label="1-microsoftmarkitdown的直接链接" title="1-microsoftmarkitdown的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Microsoft 开源的 Python 工具，用于把文件和 Office 文档转换为 Markdown。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 15.0k stars，是本周最强热度信号之一。企业资料大量存在于 Word、PowerPoint、Excel、PDF、HTML 等格式里，而 RAG、总结、知识库和 agent 审阅都更偏好结构清晰的文本。</li>
<li class=""><strong>有什么新意</strong>：它说明 AI 系统的上限常常取决于输入层。把文档稳定转换成 Markdown，看似朴素，却直接影响检索质量、引用质量和后续自动化的可审计性。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-run-llamaliteparse">2. <a href="https://github.com/run-llama/liteparse" target="_blank" rel="noopener noreferrer" class="">run-llama/liteparse</a><a href="https://xiebo.fun/blog/2026/6/7/#2-run-llamaliteparse" class="hash-link" aria-label="2-run-llamaliteparse的直接链接" title="2-run-llamaliteparse的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个快速、实用、开源的文档解析器。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.6k stars。LlamaIndex 生态本来就与 RAG、文档处理和知识工作密切相关；轻量解析器走热，说明开发者需要更快、更可控的 ingestion 工具。</li>
<li class=""><strong>有什么新意</strong>：相比把所有问题都交给大模型，文档解析强调前处理质量。解析做得好，后面的检索、总结和 agent 推理才有稳定输入。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-aquasecuritytrivy">3. <a href="https://github.com/aquasecurity/trivy" target="_blank" rel="noopener noreferrer" class="">aquasecurity/trivy</a><a href="https://xiebo.fun/blog/2026/6/7/#3-aquasecuritytrivy" class="hash-link" aria-label="3-aquasecuritytrivy的直接链接" title="3-aquasecuritytrivy的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：用于在容器、Kubernetes、代码仓库、云环境等场景中发现漏洞、错误配置、secret 和 SBOM 问题的安全扫描工具。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 711 stars。AI agent 能自动写代码、生成配置、调用工具之后，安全扫描的重要性只会增加：自动化越强，越需要自动化的检查与防线。</li>
<li class=""><strong>有什么新意</strong>：Trivy 的价值在于覆盖面广，能把供应链安全、配置安全和 secret 检测放进开发 / CI 流程。它不是 AI 项目，但很可能成为 agent 自动交付代码时的安全闸门。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-d4vinciscrapling">4. <a href="https://github.com/D4Vinci/Scrapling" target="_blank" rel="noopener noreferrer" class="">D4Vinci/Scrapling</a><a href="https://xiebo.fun/blog/2026/6/7/#4-d4vinciscrapling" class="hash-link" aria-label="4-d4vinciscrapling的直接链接" title="4-d4vinciscrapling的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个自适应 Web scraping 框架，覆盖从单次请求到大规模抓取的场景。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 6.0k stars。无论是市场监控、研究、数据采集还是 agent 浏览网页，可靠抓取都是基础能力；网页结构变化、反爬和动态内容仍然让传统爬虫很脆弱。</li>
<li class=""><strong>有什么新意</strong>：它强调 adaptive scraping，指向的是“网页不是稳定 API”的现实。对 AI agent 来说，可持续获取网页信息比一次性打开页面更重要。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/6/7/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-的核心瓶颈从模型智力转向上下文工程">1. Agent 的核心瓶颈从模型智力转向上下文工程<a href="https://xiebo.fun/blog/2026/6/7/#1-agent-%E7%9A%84%E6%A0%B8%E5%BF%83%E7%93%B6%E9%A2%88%E4%BB%8E%E6%A8%A1%E5%9E%8B%E6%99%BA%E5%8A%9B%E8%BD%AC%E5%90%91%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B" class="hash-link" aria-label="1. Agent 的核心瓶颈从模型智力转向上下文工程的直接链接" title="1. Agent 的核心瓶颈从模型智力转向上下文工程的直接链接" translate="no">​</a></h4>
<p>Headroom、MarkItDown、LiteParse、Supermemory 同时上榜，说明大家开始把“模型吃什么”看得和“模型有多强”一样重要。上下文太长、文档太乱、历史记忆丢失、检索结果噪声太高，都会让强模型表现得像弱工具。</p>
<p>未来 AI 应用栈里，很可能会出现更清晰的上下文层：文档转换、解析、压缩、记忆、索引、权限过滤和引用追踪都在模型调用之前完成。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-skills--plugins--harness-正在变成-agent-时代的包管理">2. Skills / plugins / harness 正在变成 agent 时代的包管理<a href="https://xiebo.fun/blog/2026/6/7/#2-skills--plugins--harness-%E6%AD%A3%E5%9C%A8%E5%8F%98%E6%88%90-agent-%E6%97%B6%E4%BB%A3%E7%9A%84%E5%8C%85%E7%AE%A1%E7%90%86" class="hash-link" aria-label="2. Skills / plugins / harness 正在变成 agent 时代的包管理的直接链接" title="2. Skills / plugins / harness 正在变成 agent 时代的包管理的直接链接" translate="no">​</a></h4>
<p>Harness、ECC、Compound Engineering Plugin、Taste Skill、Stop Slop、OpenAI Plugins、Cybersecurity Skills 指向同一个方向：把“怎么做事”打包成可复用资产。</p>
<p>这很像软件工程从复制代码片段走向包管理器的过程。早期大家分享 prompt；后来会分享 skills、plugins、policy、workflow、evaluation 和 agent team template。真正有价值的不是一次回答，而是一套能在不同任务里重复工作的行为规范。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-记忆层开始独立于聊天产品">3. 记忆层开始独立于聊天产品<a href="https://xiebo.fun/blog/2026/6/7/#3-%E8%AE%B0%E5%BF%86%E5%B1%82%E5%BC%80%E5%A7%8B%E7%8B%AC%E7%AB%8B%E4%BA%8E%E8%81%8A%E5%A4%A9%E4%BA%A7%E5%93%81" class="hash-link" aria-label="3. 记忆层开始独立于聊天��产品的直接链接" title="3. 记忆层开始独立于聊天产品的直接链接" translate="no">​</a></h4>
<p>Supermemory 和 Hermes Agent 的热度说明，memory 不再只是聊天应用里的“历史记录”。它正在成为 AI 应用可以调用的外部系统：记录用户偏好、项目事实、长期目标、组织知识和上次任务的结论。</p>
<p>这里的难点不是“存下来”，而是“何时写入、何时检索、何时遗忘、如何避免污染上下文”。谁能把 memory 做得可控、可审计、低噪声，谁就能显著提升 agent 的长期可用性。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-终端-agent-仍是最强开发者入口但-webui--语音--视频正在扩展边界">4. 终端 agent 仍是最强开发者入口，但 WebUI / 语音 / 视频正在扩展边界<a href="https://xiebo.fun/blog/2026/6/7/#4-%E7%BB%88%E7%AB%AF-agent-%E4%BB%8D%E6%98%AF%E6%9C%80%E5%BC%BA%E5%BC%80%E5%8F%91%E8%80%85%E5%85%A5%E5%8F%A3%E4%BD%86-webui--%E8%AF%AD%E9%9F%B3--%E8%A7%86%E9%A2%91%E6%AD%A3%E5%9C%A8%E6%89%A9%E5%B1%95%E8%BE%B9%E7%95%8C" class="hash-link" aria-label="4. 终端 agent 仍是最强开发者入口，但 WebUI / 语音 / 视频正在扩展边界的直接链接" title="4. 终端 agent 仍是最强开发者入口，但 WebUI / 语音 / 视频正在扩展边界的直接链接" translate="no">​</a></h4>
<p>Claude Code、oh-my-pi、Hermes Agent 代表终端和工程执行入口；Hermes WebUI、Open LLM VTuber、VoxCPM、MoneyPrinterTurbo 则把 agent 和生成能力带到网页、手机、语音角色与短视频内容生产。</p>
<p>这说明 AI 应用不会只有一种形态：开发者需要终端里的执行力，普通用户需要更低门槛的界面，内容场景需要多模态生产链。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-非-ai-基础设施被重新纳入-ai-系统设计">5. 非 AI 基础设施被重新纳入 AI 系统设计<a href="https://xiebo.fun/blog/2026/6/7/#5-%E9%9D%9E-ai-%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E8%A2%AB%E9%87%8D%E6%96%B0%E7%BA%B3%E5%85%A5-ai-%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1" class="hash-link" aria-label="5. 非 AI 基础设施被重新纳入 AI 系统设计的直接链接" title="5. 非 AI 基础设施被重新纳入 AI 系统设计的直接链接" translate="no">​</a></h4>
<p>Trivy、Scrapling、MarkItDown、LiteParse 这些项目提醒我们：AI 系统不是只由模型组成。它还需要安全扫描、网页采集、文件转换、文档解析、构建验证和权限控制。</p>
<p>随着 agent 自动化能力增强，传统基础设施的重要性反而会上升。因为 agent 做得越多，系统越需要可靠的输入、检查和边界。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/6/7/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>最强热度信号</strong>：MarkItDown 本周新增约 15.0k stars，Headroom 新增约 13.3k stars，说明输入层和上下文预算已经成为 AI 应用开发的核心战场。</li>
<li class=""><strong>最有结构性意义的变化</strong>：plugins、skills、harness 同时上榜，agent 生态正在形成自己的“能力分发层”。</li>
<li class=""><strong>最接近生产落地的问题</strong>：Supermemory、ECC、Cybersecurity Skills、Trivy 分别对应记忆、运行方法、安全技能和扫描闸门，说明开发者开始关心长期可用与风险控制。</li>
<li class=""><strong>最明显的多模态扩张</strong>：MoneyPrinterTurbo、Open LLM VTuber、VoxCPM 显示视频、虚拟角色和 TTS 正在成为 AI 应用的新入口。</li>
<li class=""><strong>最值得警惕的趋势</strong>：AI 工具越来越能自动执行，也越来越需要系统层约束；只靠 prompt 要求“谨慎一点”已经不够。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/6/7/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>这一周的 GitHub Trending 不像是在展示某个单点突破，而是在展示 AI agent 生态的拼装现场：有人负责压缩上下文，有人负责把文档变成 Markdown，有人负责记忆，有人负责插件和 skills，有人负责终端执行，有人负责语音和视频入口，也有人负责安全扫描与治理。</p>
<p>这其实是好信号。一个技术方向真正走向生产时，热点不会只集中在“更强模型”，而会扩散到输入、上下文、记忆、权限、工具、界面、安全和团队流程。AI agent 正在经历的，正是从 demo 能力到工程系统的过渡。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Agent 生态从“会做事”走向“会被治理”（2026-05-31）]]></title>
            <link>https://xiebo.fun/blog/2026/5/31/</link>
            <guid>https://xiebo.fun/blog/2026/5/31/</guid>
            <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 继续被 AI agent 生态占据：代码知识图谱、短视频生成、AI 工程教育、Claude 插件、agent skills、治理工具、语音平台和终端 agent harness 同时升温，说明开发者的注意力正在从单点模型能力转向可复用流程、上下文、质量、治理和分发体系。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）的主线不是“又出现了一个更强的模型”，而是：<strong>AI agent 生态正在从能不能完成任务，转向任务能不能被复用、被约束、被审计、被分发</strong>。榜单里既有 Understand-Anything、CodeGraph 这样的代码上下文层，也有 Claude 插件目录、知识工作插件、Taste / Stop Slop / Cybersecurity Skills 这类工作方法资产，还有 Microsoft Agent Governance Toolkit 这样的治理工具。</p>
<p>如果把过去几周连起来看，趋势很连续：先是 coding agent、浏览器自动化、持久记忆和 skills 变热；这一周则进一步出现了<strong>插件化、治理化、质量化、生产化</strong>的信号。开发者默认 agent 已经能写代码、读文件、调用工具，于是新的问题变成：它是否懂项目结构？是否有稳定品味？是否能遵守安全边界？是否能接入真实知识工作？是否能被团队规模化使用？</p>
<blockquote>
<p>本文基于 GitHub Trending weekly 页面及其展示的仓库描述、语言、总 star 与本周新增 star 做归纳。GitHub REST API 在本次定时任务中命中未认证限流，因此仓库 README / 元数据补充以 Trending 页面可见信息为主；“为什么这周变热”会结合项目定位、榜单相对位置和当前开发者需求做审慎判断。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/5/31/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>代码上下文仍是 coding agent 的核心战场。</strong> Understand-Anything 本周新增约 25.6k stars，CodeGraph 新增约 15.9k stars，两个项目都在解决同一个痛点：大模型不该每次都从零读仓库，而应该站在预构建的代码知识结构上工作。</li>
<li class=""><strong>Skills 和 plugins 从边缘技巧变成主流分发形态。</strong> Anthropic 的 knowledge-work-plugins、claude-plugins-official，以及 Taste Skill、Stop Slop、Cybersecurity Skills 同时上榜，说明“把能力封装成可安装的工作方法”正在成为 agent 生态的新包管理层。</li>
<li class=""><strong>Agent 质量问题开始被正面命名。</strong> Stop Slop 和 Taste Skill 的传播，不是因为它们技术复杂，而是因为开发者已经受够了 AI 输出里的套话、平庸审美和风格漂移。</li>
<li class=""><strong>治理、安全和边界感正在补课。</strong> Microsoft Agent Governance Toolkit 与 Cybersecurity Skills 上榜，说明团队开始关心 agent 的身份、权限、沙箱、策略执行和安全框架映射，而不只是 demo 效果。</li>
<li class=""><strong>非 AI 项目空间被挤压，但基础设施型工具仍有存在感。</strong> 本周严格非 AI 热门项目很少，MarkItDown 这类文档转换工具虽然常被 AI workflow 使用，但本质上仍是通用信息基础设施。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/5/31/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-lum1104understand-anything">1. <a href="https://github.com/Lum1104/Understand-Anything" target="_blank" rel="noopener noreferrer" class="">Lum1104/Understand-Anything</a><a href="https://xiebo.fun/blog/2026/5/31/#1-lum1104understand-anything" class="hash-link" aria-label="1-lum1104understand-anything的直接链接" title="1-lum1104understand-anything的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：把任意代码库转换成可探索、可搜索、可问答的交互式知识图谱，面向 Claude Code、Codex、Cursor、Copilot、Gemini CLI 等 coding assistant。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 25.6k stars，是榜单里最强的信号之一。开发者已经越来越清楚：coding agent 的瓶颈不只是模型智力，而是模型能否快速建立正确的项目心智模型。大型仓库里，盲目 grep、读文件和猜调用关系会消耗大量 token，也容易误解架构。</li>
<li class=""><strong>有什么新意</strong>：它把“理解代码”从聊天过程前移到知识图谱层。更重要的是，它强调 “Graphs that teach”，也就是图谱不只是漂亮可视化，而是要帮助人和 agent 一起理解系统。这让它更像 coding agent 的项目地图，而不是单纯的文档生成器。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-colbymchenrycodegraph">2. <a href="https://github.com/colbymchenry/codegraph" target="_blank" rel="noopener noreferrer" class="">colbymchenry/codegraph</a><a href="https://xiebo.fun/blog/2026/5/31/#2-colbymchenrycodegraph" class="hash-link" aria-label="2-colbymchenrycodegraph的直接链接" title="2-colbymchenrycodegraph的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个本地预索引的代码知识图谱，服务 Claude Code、Codex、Gemini、Cursor、OpenCode、AntiGravity、Kiro、Hermes Agent 等工具，主打减少 token、减少工具调用，并且 100% 本地运行。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 15.9k stars。过去几周它持续出现在 Trending 中，说明“agent 上下文层”不是短期噱头，而是 coding agent 用户反复遇到的真实成本问题：每次任务都让 agent 扫一遍仓库，既慢又贵，还容易遗漏关键约束。</li>
<li class=""><strong>有什么新意</strong>：相比单次 prompt 优化，CodeGraph 更接近 agent 的本地基础设施。它把代码结构、依赖关系和语义线索提前整理好，让 agent 在更小、更准确的信息空间里行动。这个方向未来很可能与持久记忆、测试反馈、代码审查工具合并成一层“项目操作系统”。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-harry0703moneyprinterturbo">3. <a href="https://github.com/harry0703/MoneyPrinterTurbo" target="_blank" rel="noopener noreferrer" class="">harry0703/MoneyPrinterTurbo</a><a href="https://xiebo.fun/blog/2026/5/31/#3-harry0703moneyprinterturbo" class="hash-link" aria-label="3-harry0703moneyprinterturbo的直��接链接" title="3-harry0703moneyprinterturbo的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个使用 AI 大模型一键生成高清短视频的工具，面向短视频自动化生产。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 13.9k stars。AI 视频生成的关注点正在从“模型能不能生成好看的片段”转向“普通用户能不能批量产出可发布内容”。MoneyPrinterTurbo 的名字和定位都很直接：降低短视频制作门槛，把脚本、素材、配音、字幕、剪辑等流程尽量自动化。</li>
<li class=""><strong>有什么新意</strong>：它代表内容生成工具的产品化方向。与研究型视频模型不同，这类项目更关心端到端工作流：用户给一个主题，系统尽快产出能发到平台上的视频。它的走热说明开源社区仍在寻找 AI 内容生产的“自动流水线”。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-rohitg00ai-engineering-from-scratch">4. <a href="https://github.com/rohitg00/ai-engineering-from-scratch" target="_blank" rel="noopener noreferrer" class="">rohitg00/ai-engineering-from-scratch</a><a href="https://xiebo.fun/blog/2026/5/31/#4-rohitg00ai-engineering-from-scratch" class="hash-link" aria-label="4-rohitg00ai-engineering-from-scratch的直接链接" title="4-rohitg00ai-engineering-from-scratch的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 AI engineering 学习与实践项目，口号是 “Learn it. Build it. Ship it for others.”，强调从理解技术到构建并交付真实系统。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 12.1k stars。AI 应用开发的门槛已经从“会调模型 API”升级到“能把不稳定模型能力包装成稳定产品体验”。开发者需要学习的不只是 RAG、agent、tool calling，还包括评估、部署、成本控制、数据流和用户反馈。</li>
<li class=""><strong>有什么新意</strong>：它把 AI 学习从 notebook 和课程笔记拉回工程交付。现在最稀缺的不是又一个概念解释，而是能把技术串成可上线产品的方法。这个项目的传播，反映了 AI engineering 正在成为独立于传统 ML 和传统后端开发的新工种。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-anthropicsknowledge-work-plugins">5. <a href="https://github.com/anthropics/knowledge-work-plugins" target="_blank" rel="noopener noreferrer" class="">anthropics/knowledge-work-plugins</a><a href="https://xiebo.fun/blog/2026/5/31/#5-anthropicsknowledge-work-plugins" class="hash-link" aria-label="5-anthropicsknowledge-work-plugins的直接链接" title="5-anthropicsknowledge-work-plugins的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Anthropic 开源的知识工作插件仓库，主要面向 Claude Cowork 场景，让知识工作者把常见任务封装成插件化能力。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 5.5k stars。过去 agent 生态强调“模型自己规划”，但真实知识工作往往有固定模板、工具链和组织约束。插件把这些流程显式化，让用户不必每次用 prompt 重新描述工作方式。</li>
<li class=""><strong>有什么新意</strong>：它的意义不只是 Anthropic 又开了一个仓库，而是展示了 Claude 生态如何把知识工作能力产品化。插件形态让组织可以分发自己的工作流：研究、分析、整理、报告、审阅，都可以从一次性对话变成可维护资产。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-mukul975anthropic-cybersecurity-skills">6. <a href="https://github.com/mukul975/Anthropic-Cybersecurity-Skills" target="_blank" rel="noopener noreferrer" class="">mukul975/Anthropic-Cybersecurity-Skills</a><a href="https://xiebo.fun/blog/2026/5/31/#6-mukul975anthropic-cybersecurity-skills" class="hash-link" aria-label="6-mukul975anthropic-cybersecurity-skills的直接链接" title="6-mukul975anthropic-cybersecurity-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一套结构化网络安全 skills，覆盖 754 个安全技能，并映射到 MITRE ATT&amp;CK、NIST CSF 2.0、MITRE ATLAS、D3FEND、NIST AI RMF 等框架，支持 Claude Code、Copilot、Codex CLI、Cursor、Gemini CLI 等平台。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 5.4k stars。安全是 agent 落地最需要流程约束的领域之一：任务有明确框架、强专业术语、合规边界和高误操作成本。把安全能力拆成标准化 skills，比让模型自由发挥更容易被团队接受。</li>
<li class=""><strong>有什么新意</strong>：它把 skills 与安全行业已有框架绑定，而不是只写 prompt 模板。这种映射让 agent 输出更容易进入企业安全流程：可以对齐 ATT&amp;CK 技术、NIST 控制项和风险管理语言，也更方便审计和复用。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-leonxlnxtaste-skill">7. <a href="https://github.com/Leonxlnx/taste-skill" target="_blank" rel="noopener noreferrer" class="">Leonxlnx/taste-skill</a><a href="https://xiebo.fun/blog/2026/5/31/#7-leonxlnxtaste-skill" class="hash-link" aria-label="7-leonxlnxtaste-skill的直接链接" title="7-leonxlnxtaste-skill的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个让 AI “更有品味”的 skill，目标是减少无聊、模板化、泛泛而谈的 slop 输出。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 10.2k stars。它的热度来自一个非常普遍的疲劳感：AI 生成内容越来越多，但很多内容读起来像同一个模板。开发者和写作者开始寻找能约束语气、结构、判断力和审美的轻量工具。</li>
<li class=""><strong>有什么新意</strong>：它不是增加模型能力，而是给模型加“编辑标准”。这说明 agent 使用者已经从“能输出就行”进入“输出要有判断、取舍和风格”的阶段。品味开始被工程化为 checklist、规则和可复用 skill。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-hardikpandyastop-slop">8. <a href="https://github.com/hardikpandya/stop-slop" target="_blank" rel="noopener noreferrer" class="">hardikpandya/stop-slop</a><a href="https://xiebo.fun/blog/2026/5/31/#8-hardikpandyastop-slop" class="hash-link" aria-label="8-hardikpandyastop-slop的直接链接" title="8-hardikpandyastop-slop的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个用于移除 AI 写作痕迹的 skill 文件，帮助生成文本减少套话、空泛表达和明显机器味。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 3.5k stars。与 Taste Skill 类似，它击中了用户对 AI 文风同质化的反感。无论是博客、邮件、产品文案还是 PR 描述，人们越来越不愿意发布一眼能看出是模板生成的内容。</li>
<li class=""><strong>有什么新意</strong>：它把“去 AI 味”变成 agent 可执行规则，而不是事后人工润色。这个方向会越来越重要：当 AI 内容泛滥，真正稀缺的是人味、具体性和可信判断。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-microsoftagent-governance-toolkit">9. <a href="https://github.com/microsoft/agent-governance-toolkit" target="_blank" rel="noopener noreferrer" class="">microsoft/agent-governance-toolkit</a><a href="https://xiebo.fun/blog/2026/5/31/#9-microsoftagent-governance-toolkit" class="hash-link" aria-label="9-microsoftagent-governance-toolkit的直接链接" title="9-microsoftagent-governance-toolkit的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Microsoft 开源的 AI Agent Governance Toolkit，覆盖策略执行、零信任身份、执行沙箱和可靠性工程，并声称覆盖 OWASP Agentic Top 10。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.6k stars。随着 agent 开始调用工具、访问数据、执行代码和操作外部系统，企业最关心的已经不是“能不能跑 demo”，而是“出错时谁负责、权限怎么控、日志怎么查、策略怎么落地”。</li>
<li class=""><strong>有什么新意</strong>：它把 agent 纳入安全治理框架。过去很多 agent 项目默认拥有过大的权限，依赖 prompt 约束行为；治理工具的思路是把身份、权限、沙箱、策略和审计放到系统层。这是 agent 从玩具走向生产的必经步骤。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-affaan-mecc">10. <a href="https://github.com/affaan-m/ECC" target="_blank" rel="noopener noreferrer" class="">affaan-m/ECC</a><a href="https://xiebo.fun/blog/2026/5/31/#10-affaan-mecc" class="hash-link" aria-label="10-affaan-mecc的直接链接" title="10-affaan-mecc的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 agent harness 性能优化系统，覆盖 skills、instincts、memory、security 和 research-first development，面向 Claude Code、Codex、OpenCode、Cursor 等工具。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 10.8k stars。开发者正在意识到：不同 coding agent 的模型差异固然重要，但真正影响稳定性的，是外层 harness 如何组织上下文、记忆、工具、约束和复盘。</li>
<li class=""><strong>有什么新意</strong>：它把 agent 的“工作习惯”系统化。skills 提供步骤，memory 保留长期上下文，security 约束行为，research-first 则避免模型直接猜。这个方向说明 agent 竞争已经从单一客户端延伸到运行方法论和执行环境。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-dograh-hqdograh">11. <a href="https://github.com/dograh-hq/dograh" target="_blank" rel="noopener noreferrer" class="">dograh-hq/dograh</a><a href="https://xiebo.fun/blog/2026/5/31/#11-dograh-hqdograh" class="hash-link" aria-label="11-dograh-hqdograh的直接链接" title="11-dograh-hqdograh的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源 voice AI 平台，可自托管，定位为 Vapi / Retell 的替代方案，支持 BYOK、speech-to-speech 或 LLM / STT / TTS 组合、可视化 workflow builder、MCP native 和电话能力。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 1.2k stars。语音 agent 的商业价值很清晰：客服、销售、预约、内部流程都需要低延迟、可控、可接电话的系统。但闭源 SaaS 往往有数据、成本和可定制性问题，开源自托管方案自然有吸引力。</li>
<li class=""><strong>有什么新意</strong>：它把语音、工作流、MCP 和 telephony 放在一起。语音 AI 不只是“说话的模型”，还需要连接业务工具、管理状态、处理打断和转人工。Dograh 的热度说明 voice agent 正在从 demo bot 走向可部署平台。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-can1357oh-my-pi">12. <a href="https://github.com/can1357/oh-my-pi" target="_blank" rel="noopener noreferrer" class="">can1357/oh-my-pi</a><a href="https://xiebo.fun/blog/2026/5/31/#12-can1357oh-my-pi" class="hash-link" aria-label="12-can1357oh-my-pi的直接链接" title="12-can1357oh-my-pi的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个终端 AI coding agent，强调 hash-anchored edits、优化的工具 harness、LSP、Python、browser、subagents 等能力。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 2.0k stars。coding agent 的前沿已经不只是“调用 shell + 改文件”，而是如何可靠编辑、如何验证上下文、如何拆分子任务、如何接入浏览器和语言服务。</li>
<li class=""><strong>有什么新意</strong>：hash-anchored edits 这类能力反映了一个很具体的问题：agent 修改文件时必须精确定位，否则容易误替换、漏改或破坏上下文。oh-my-pi 代表终端 agent 正在向更强的编辑原语和工具编排演进。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/5/31/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<p>本周严格意义上的非 AI 项目非常少，Trending weekly 几乎被 AI 与 agent 生态占据。因此这一节不强行凑数，只列出相对更偏通用基础设施、但又明显被 AI workflow 带动的项目。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-microsoftmarkitdown">1. <a href="https://github.com/microsoft/markitdown" target="_blank" rel="noopener noreferrer" class="">microsoft/markitdown</a><a href="https://xiebo.fun/blog/2026/5/31/#1-microsoftmarkitdown" class="hash-link" aria-label="1-microsoftmarkitdown的直接链接" title="1-microsoftmarkitdown的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Microsoft 开源的文档转换工具，可以把文件和 Office 文档转换为 Markdown。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 6.7k stars。它虽然不是 AI 模型或 agent，但正好位于 AI workflow 的入口：大量企业知识以 Word、PowerPoint、Excel、PDF、HTML 等格式存在，转成 Markdown 后更容易进入 RAG、总结、检索、审阅和知识库流程。</li>
<li class=""><strong>有什么新意</strong>：它体现了一个常被低估的事实：AI 系统的上限很大程度上取决于输入资料能否被稳定、可审计地结构化。MarkItDown 的价值在于把杂乱文档变成 LLM 友好的文本基础设施，而不是直接追逐模型能力。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-ogulcancelikherdr">2. <a href="https://github.com/ogulcancelik/herdr" target="_blank" rel="noopener noreferrer" class="">ogulcancelik/herdr</a><a href="https://xiebo.fun/blog/2026/5/31/#2-ogulcancelikherdr" class="hash-link" aria-label="2-ogulcancelikherdr的直接链接" title="2-ogulcancelikherdr的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个运行在终端里的 agent multiplexer，用于管理或切换多个 agent。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 923 stars。虽然它仍然服务 agent 场景，但重点更偏开发者工具基础设施：当 Claude Code、Codex、OpenCode、Cursor、Gemini CLI 等工具并存时，开发者需要一个更统一的终端入口。</li>
<li class=""><strong>有什么新意</strong>：它反映的是“多 agent 并存”带来的操作复杂度。未来开发者可能不会只用一个 agent，而是根据任务切换模型、工具和执行策略；multiplexer 会成为 agent 工作台的一种轻量形态。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-cursorplugins">3. <a href="https://github.com/cursor/plugins" target="_blank" rel="noopener noreferrer" class="">cursor/plugins</a><a href="https://xiebo.fun/blog/2026/5/31/#3-cursorplugins" class="hash-link" aria-label="3-cursorplugins的直接链接" title="3-cursorplugins的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Cursor 的插件规范和官方插件仓库。</li>
<li class=""><strong>为什么这周会热</strong>：本周新增约 738 stars。Cursor 已经是 AI IDE 生态里的关键入口，插件规范上榜说明开发者开始关注如何在 IDE 内部分发能力，而不只是等待编辑器厂商内置功能。</li>
<li class=""><strong>有什么新意</strong>：插件规范是生态扩张的基础设施。它让 AI IDE 从单一产品变成可扩展平台，也让团队有机会把内部工具、代码规范、工作流和知识库接入编辑器。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/5/31/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-的核心资产从-prompt-迁移到-skillspluginsharness">1. Agent 的核心资产从 prompt 迁移到 skills、plugins、harness<a href="https://xiebo.fun/blog/2026/5/31/#1-agent-%E7%9A%84%E6%A0%B8%E5%BF%83%E8%B5%84%E4%BA%A7%E4%BB%8E-prompt-%E8%BF%81%E7%A7%BB%E5%88%B0-skillspluginsharness" class="hash-link" aria-label="1. Agent 的核心资产从 prompt 迁移到 skills、plugins、harness的直接链接" title="1. Agent 的核心资产从 prompt 迁移到 skills、plugins、harness的直接链接" translate="no">​</a></h4>
<p>这周最明显的变化是：大家不再满足于“写一个好 prompt”。Taste Skill、Stop Slop、Cybersecurity Skills、Claude Plugins、knowledge-work-plugins、ECC、claude-code-harness 都在做同一件事：把一次性经验变成可安装、可复用、可版本化的 agent 资产。</p>
<p>这和传统软件生态很像。早期大家复制代码片段，后来有包管理器；早期大家分享 prompt，后来会有 skills、plugins、harness 和 policy。agent 生态正在形成自己的“依赖管理”。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-代码知识图谱正在成为-coding-agent-的上下文缓存">2. 代码知识图谱正在成为 coding agent 的上下文缓存<a href="https://xiebo.fun/blog/2026/5/31/#2-%E4%BB%A3%E7%A0%81%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1%E6%AD%A3%E5%9C%A8%E6%88%90%E4%B8%BA-coding-agent-%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87%E7%BC%93%E5%AD%98" class="hash-link" aria-label="2. 代码知识图谱正在成为 coding agent 的上下文缓存的直接链接" title="2. 代码知识图谱正在成为 coding agent 的上下文缓存的直接链接" translate="no">​</a></h4>
<p>Understand-Anything 和 CodeGraph 同时高热，说明开发者已经把上下文管理当成独立问题。更强模型当然有帮助，但大型代码库里的真实瓶颈往往是：哪些文件相关？调用链在哪里？历史约束是什么？测试入口在哪里？</p>
<p>知识图谱、索引、语义搜索、LSP、持久记忆可能会合流。未来 coding agent 的标准启动流程，可能不是“先让模型读 README”，而是“先加载项目索引、历史记忆和当前任务图谱”。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-ai-内容生成开始反噬自己的文风">3. AI 内容生成开始反噬自己的文风<a href="https://xiebo.fun/blog/2026/5/31/#3-ai-%E5%86%85%E5%AE%B9%E7%94%9F%E6%88%90%E5%BC%80%E5%A7%8B%E5%8F%8D%E5%99%AC%E8%87%AA%E5%B7%B1%E7%9A%84%E6%96%87%E9%A3%8E" class="hash-link" aria-label="3. AI 内容生成开始反噬自己的文风的直接链接" title="3. AI 内容生成开始反噬自己的文风的直接链接" translate="no">​</a></h4>
<p>Taste Skill 和 Stop Slop 的走热很有意思：它们不是让 AI 更会生成，而是让 AI 少一点 AI 味。这说明 AI 内容已经进入过度供给阶段。读者、开发者、招聘方和用户都对模板化表达更敏感。</p>
<p>未来高质量 AI 写作工具的竞争点，不会只是速度，而是具体性、取舍、经验密度、语气一致性和可追责的编辑标准。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-治理层开始追赶执行层">4. 治理层开始追赶执行层<a href="https://xiebo.fun/blog/2026/5/31/#4-%E6%B2%BB%E7%90%86%E5%B1%82%E5%BC%80%E5%A7%8B%E8%BF%BD%E8%B5%B6%E6%89%A7%E8%A1%8C%E5%B1%82" class="hash-link" aria-label="4. 治理层开始追赶执行层的直接链接" title="4. 治理层开始追赶执行层的直接链接" translate="no">​</a></h4>
<p>过去 agent 项目往往先展示自动执行能力：能改代码、能点网页、能调用 API。现在 Microsoft Agent Governance Toolkit 这样的项目出现，说明安全和治理开始追赶。尤其在企业里，agent 拥有工具权限后，本质上就接近一个自动化员工：要有身份、权限、日志、策略、沙箱和人工确认。</p>
<p>这也是 agent 从个人玩具走向组织工具的分水岭。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-本周非-ai几乎被吸进-ai-基础设施叙事">5. 本周“非 AI”几乎被吸进 AI 基础设施叙事<a href="https://xiebo.fun/blog/2026/5/31/#5-%E6%9C%AC%E5%91%A8%E9%9D%9E-ai%E5%87%A0%E4%B9%8E%E8%A2%AB%E5%90%B8%E8%BF%9B-ai-%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E5%8F%99%E4%BA%8B" class="hash-link" aria-label="5. 本周“非 AI”几乎被吸进 AI 基础设施叙事的直接链接" title="5. 本周“非 AI”几乎被吸进 AI 基础设施叙事的直接链接" translate="no">​</a></h4>
<p>MarkItDown 是最好的例子。它本身只是文档转 Markdown，但在 2026 年的语境里，文档转换天然服务 RAG、agent、知识库和自动总结。很多传统工具正在被重新解释为 AI pipeline 的一环。</p>
<p>因此，“AI 项目”和“非 AI 项目”的边界会越来越模糊：不是项目是否使用模型，而是它是否处在 AI workflow 的关键路径上。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/5/31/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>最强热度信号</strong>：Understand-Anything 本周新增约 25.6k stars，说明代码知识图谱正在成为开发者理解 agent 上下文问题的共同答案。</li>
<li class=""><strong>最有生态意味的信号</strong>：Anthropic 与 Cursor 相关插件仓库上榜，说明 AI 工具正在从产品功能竞争进入插件生态竞争。</li>
<li class=""><strong>最接地气的痛点</strong>：Taste Skill 和 Stop Slop 同时升温，说明“AI slop”已经成为真实生产问题，而不是社交媒体吐槽。</li>
<li class=""><strong>最企业化的信号</strong>：Microsoft Agent Governance Toolkit 把 agent 安全从 prompt 约束推进到身份、沙箱、策略和可靠性工程。</li>
<li class=""><strong>最容易被低估的基础设施</strong>：MarkItDown 证明文档清洗、格式转换、知识入口这些“脏活”仍然是 AI 应用落地的关键。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/5/31/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>本周的 GitHub Trending 像是给 agent 生态做了一次分层：底层是文档转换、代码图谱和工具 harness；中层是 skills、plugins、memory、quality rules；上层是短视频、语音、知识工作和安全场景；旁边还有治理和审计系统在补课。</p>
<p>这意味着 2026 年的 AI 开源热点正在从“模型能力展示”转向“工作系统建设”。真正有生命力的项目，往往不是宣称 agent 可以无所不能，而是认真回答这些具体问题：它读什么上下文？遵守什么规则？怎么复用经验？怎么接入工具？怎么防止胡来？怎么让团队放心使用？</p>
<p>如果说前一阶段的关键词是 agent，那么这一阶段的关键词可能是：<strong>agent operating system</strong>。不是一个单独软件，而是一整套围绕 agent 的上下文、插件、技能、治理和质量基础设施。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：Agent 开始争夺“项目上下文”和工作方法（2026-05-24）]]></title>
            <link>https://xiebo.fun/blog/2026/5/24/</link>
            <guid>https://xiebo.fun/blog/2026/5/24/</guid>
            <pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 几乎被 AI agent 工程化项目占满：代码知识图谱、个人 AI、学术写作 skills、持久记忆、隐身浏览器、视频生成 agent、12-factor 方法论，以及少量来自物理感知和端侧语音的基础设施信号。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）的主线非常清晰：<strong>AI agent 的竞争正在从“谁能生成代码”转向“谁更懂你的项目、谁能沉淀方法、谁能长期协作”</strong>。榜单头部同时出现代码知识图谱、个人 AI 工作台、学术研究 skills、持久记忆、agent 方法论、终端 coding agent 和浏览器自动化基础设施，说明开发者已经不满足于一次性的 prompt 效果，而是在寻找能接入日常工作流的“长期系统”。</p>
<p>和上周相比，这周 AI 项目的比例更高，而且更集中在一个方向：<strong>让 agent 拥有上下文、流程、记忆和可操作环境</strong>。CodeGraph 想让 agent 少扫文件、少烧 token；OpenHuman 想把个人记忆和工作空间放到本地；academic-research-skills、superpowers、scientific-agent-skills 把“怎么做事”沉淀成 skills；AgentMemory 继续强化跨会话记忆；CloakBrowser 则提醒大家：只要 agent 还要接触真实网页，浏览器仍然是它的身体。</p>
<blockquote>
<p>本文基于 GitHub Trending weekly 页面，以及可访问的仓库 README / GitHub 元数据做归纳。Trending 只展示热度结果，不解释传播路径，所以“为什么这周变热”会结合项目定位、榜单位置、近期活跃度和当前开发者需求做审慎判断。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/5/24/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>项目上下文成为 coding agent 的新战场。</strong> CodeGraph 和 Understand-Anything 都把代码库转成可检索、可解释的知识结构，目标不是替代模型，而是减少 agent 在大型项目里的盲搜和误读。</li>
<li class=""><strong>Skills 正在从 prompt 技巧变成工程资产。</strong> academic-research-skills、superpowers、scientific-agent-skills 同时上榜，说明开发者越来越重视可复用流程、检查清单和领域方法论。</li>
<li class=""><strong>个人 AI 的叙事回到“本地记忆 + 托管能力”的混合架构。</strong> OpenHuman 把本地 Memory Tree、Markdown vault、workspace config 与托管登录、模型路由、搜索代理、OAuth 集成组合起来，反映个人 AI 产品对隐私和便利性的折中。</li>
<li class=""><strong>Agent infra 继续补齐真实世界接口。</strong> AgentMemory 管长期记忆，CloakBrowser 管真实网页访问，oh-my-pi 管终端 agent 的编辑与工具 harness，12-factor-agents 管生产级原则。</li>
<li class=""><strong>非纯 AI 项目很少，但仍有基础设施信号。</strong> RuView 用 WiFi 做空间感知，Supertonic 做端侧 TTS，它们的共同点不是“聊天”，而是把 AI 或智能能力嵌到设备、环境和本地运行时。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/5/24/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-colbymchenrycodegraph">1. <a href="https://github.com/colbymchenry/codegraph" target="_blank" rel="noopener noreferrer" class="">colbymchenry/codegraph</a><a href="https://xiebo.fun/blog/2026/5/24/#1-colbymchenrycodegraph" class="hash-link" aria-label="1-colbymchenrycodegraph的直接链接" title="1-colbymchenrycodegraph的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 Claude Code、Codex、Cursor、OpenCode、Hermes Agent 等工具的本地代码知识图谱。项目主张预先索引代码库，让 agent 通过语义结构理解项目，从而减少 token 消耗和工具调用次数。</li>
<li class=""><strong>为什么这周会热</strong>：coding agent 使用频率越高，开发者越能感受到“每次从零扫仓库”的低效。CodeGraph 在 README 中强调约 35% 成本下降、约 70% 工具调用减少、100% 本地运行，正好击中大型代码库里的上下文成本问题。</li>
<li class=""><strong>有什么新意</strong>：它把“理解项目”从 prompt 阶段前移到索引阶段。过去 agent 通过 <code>grep</code>、<code>find</code>、读文件逐步拼上下文；CodeGraph 的思路是先把代码变成可查询的知识结构，再让 agent 在更小的信息空间里行动。这可能会成为 coding agent 标配的本地上下文层。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-tinyhumansaiopenhuman">2. <a href="https://github.com/tinyhumansai/openhuman" target="_blank" rel="noopener noreferrer" class="">tinyhumansai/openhuman</a><a href="https://xiebo.fun/blog/2026/5/24/#2-tinyhumansaiopenhuman" class="hash-link" aria-label="2-tinyhumansaiopenhuman的直接链接" title="2-tinyhumansaiopenhuman的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向个人的 AI super intelligence / personal AI 工作台，强调本地 Memory Tree、Obsidian-style Markdown vault、workspace 配置和本地运行状态，同时在默认体验中使用托管登录、模型路由、搜索代理和 Composio 集成。</li>
<li class=""><strong>为什么这周会热</strong>：个人 AI 的需求正在从“和一个模型聊天”转向“让 AI 持续理解我的资料、任务和工具”。OpenHuman 把本地数据所有权与托管服务便利性放在同一个产品里，对关心隐私但又不想手动拼装所有组件的用户很有吸引力。</li>
<li class=""><strong>有什么新意</strong>：它没有假装所有能力都必须纯本地，而是明确说明哪些状态在本地、哪些功能依赖托管服务。这种“本地记忆 + 云端集成”的现实主义，可能比单纯宣传 local-first 或 cloud-first 更接近个人 AI 产品的真实落地路径。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-imbad0202academic-research-skills">3. <a href="https://github.com/Imbad0202/academic-research-skills" target="_blank" rel="noopener noreferrer" class="">Imbad0202/academic-research-skills</a><a href="https://xiebo.fun/blog/2026/5/24/#3-imbad0202academic-research-skills" class="hash-link" aria-label="3-imbad0202academic-research-skills的直接链接" title="3-imbad0202academic-research-skills的直�接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一套面向 Claude Code 的学术研究 skills，覆盖 research、write、review、revise、finalize 等论文工作流，并提供多语言 README、插件安装方式和写作质量检查等能力。</li>
<li class=""><strong>为什么这周会热</strong>：学术写作是最典型的“AI 能帮很多忙、但不能替人负责”的场景。项目 README 中强调“AI is your copilot, not the pilot”，把 AI 定位为文献整理、引用格式、逻辑检查、风格校准的助手，而不是论文代写器，这种边界感更容易获得研究者信任。</li>
<li class=""><strong>有什么新意</strong>：它代表 skills 的领域化：不是泛泛地教 agent 写作，而是把学术研究拆成可执行阶段，并用 Socratic dialogue、style calibration、quality check 等流程约束输出。对 agent 生态来说，领域 skills 可能比通用 agent framework 更快进入实际工作。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-rohitg00agentmemory">4. <a href="https://github.com/rohitg00/agentmemory" target="_blank" rel="noopener noreferrer" class="">rohitg00/agentmemory</a><a href="https://xiebo.fun/blog/2026/5/24/#4-rohitg00agentmemory" class="hash-link" aria-label="4-rohitg00agentmemory的直接链接" title="4-rohitg00agentmemory的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：给 Claude Code、Cursor、Gemini CLI、Codex CLI、Hermes、OpenCode 等 coding agent 提供持久记忆的 MCP / 本地服务，主打基于真实 benchmark 的 agent memory。</li>
<li class=""><strong>为什么这周会热</strong>：随着开发者开始连续多天使用 coding agent，“每次都重新解释项目背景”变成明显浪费。上下文窗口再大也不是长期记忆；真正可用的 agent 需要能记住历史决策、项目约束和用户偏好。</li>
<li class=""><strong>有什么新意</strong>：AgentMemory 把记忆从聊天记录变成可评估的基础设施组件。它与 CodeGraph 的区别也值得注意：CodeGraph 更偏代码结构上下文，AgentMemory 更偏跨会话经验和决策上下文，两者合起来才像完整的 agent 工作记忆。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-cloakhqcloakbrowser">5. <a href="https://github.com/CloakHQ/CloakBrowser" target="_blank" rel="noopener noreferrer" class="">CloakHQ/CloakBrowser</a><a href="https://xiebo.fun/blog/2026/5/24/#5-cloakhqcloakbrowser" class="hash-link" aria-label="5-cloakhqcloakbrowser的直接链接" title="5-cloakhqcloakbrowser的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 stealth Chromium / Playwright drop-in replacement，通过源码级指纹补丁绕过常见 bot detection，覆盖 canvas、WebGL、audio、fonts、GPU、screen、WebRTC、network timing、automation signals 等检测面。</li>
<li class=""><strong>为什么这周会热</strong>：web agent 和浏览器自动化越多，真实网站越会加强 Cloudflare、reCAPTCHA、浏览器指纹等防护。普通 headless browser 很容易在任务开始前就被拦住，而 CloakBrowser 把问题推进到 Chromium 源码层。</li>
<li class=""><strong>有什么新意</strong>：它提醒开发者：agent 的“身体”也需要工程化。模型会规划、会读网页还不够；如果浏览器身份本身不被网站接受，agent 就无法进入真实互联网。浏览器反检测正在变成 web agent 基础设施的一部分。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-hkudsvimax">6. <a href="https://github.com/HKUDS/ViMax" target="_blank" rel="noopener noreferrer" class="">HKUDS/ViMax</a><a href="https://xiebo.fun/blog/2026/5/24/#6-hkudsvimax" class="hash-link" aria-label="6-hkudsvimax的直接链接" title="6-hkudsvimax的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 agentic video generation 项目，把 Director、Screenwriter、Producer 和 Video Generator 的角色合在一起，试图用多角色流程组织视频生成。</li>
<li class=""><strong>为什么这周会热</strong>：视频生成正在从单次 prompt 迈向可控生产流程。用户不只想要“生成一段视频”，还希望系统能理解脚本、镜头、叙事、风格和制作约束。ViMax 用 agentic workflow 包装视频生成，贴合了内容生产从模型能力到工作流产品化的趋势。</li>
<li class=""><strong>有什么新意</strong>：它的重点不是某一个视频模型，而是把视频创作拆成类似制作团队的角色协作。这个方向如果成立，未来视频生成工具的竞争点会从“单帧质量”扩展到“规划、分镜、迭代和生产管理”。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-humanlayer12-factor-agents">7. <a href="https://github.com/humanlayer/12-factor-agents" target="_blank" rel="noopener noreferrer" class="">humanlayer/12-factor-agents</a><a href="https://xiebo.fun/blog/2026/5/24/#7-humanlayer12-factor-agents" class="hash-link" aria-label="7-humanlayer12-factor-agents的直接链接" title="7-humanlayer12-factor-agents的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一套关于如何构建生产级 LLM-powered software 的原则，借用“12-factor app”的表达方式，总结 LLM 应用从 demo 走向真实用户时需要遵守的工程约束。</li>
<li class=""><strong>为什么这周会热</strong>：agent demo 已经太多，开发者真正缺的是“哪些做法可以交付给生产用户”。当 LLM 应用开始处理真实业务，状态管理、错误恢复、人工确认、可观测性、上下文边界、工具调用协议都会比单次效果更重要。</li>
<li class=""><strong>有什么新意</strong>：它把 agent 从 prompt engineering 拉回 software engineering。这个项目的价值不在代码量，而在方法论：让大家用构建可靠软件的方式构建 agent，而不是把所有复杂性压给模型。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-rohitg00ai-engineering-from-scratch">8. <a href="https://github.com/rohitg00/ai-engineering-from-scratch" target="_blank" rel="noopener noreferrer" class="">rohitg00/ai-engineering-from-scratch</a><a href="https://xiebo.fun/blog/2026/5/24/#8-rohitg00ai-engineering-from-scratch" class="hash-link" aria-label="8-rohitg00ai-engineering-from-scratch的直接链接" title="8-rohitg00ai-engineering-from-scratch的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 AI engineering 学习与实践项目，口号是 “Learn it. Build it. Ship it for others.”，重点从理解技术走向构建并交付给用户。</li>
<li class=""><strong>为什么这周会热</strong>：AI 应用开发正在从“会调用 API”转向“能把 AI 产品做成可用系统”。开发者需要的不只是模型概念，还包括数据、评估、工具调用、部署、成本、用户反馈等完整工程能力。</li>
<li class=""><strong>有什么新意</strong>：它的传播点在于 from scratch 与 ship。AI engineering 不是把 notebook 跑通，而是把不确定的模型能力封装进确定的软件体验。这个项目反映了 AI 工程教育正在从课程知识转向产品交付。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-datawhalechinaeasy-vibe">9. <a href="https://github.com/datawhalechina/easy-vibe" target="_blank" rel="noopener noreferrer" class="">datawhalechina/easy-vibe</a><a href="https://xiebo.fun/blog/2026/5/24/#9-datawhalechinaeasy-vibe" class="hash-link" aria-label="9-datawhalechinaeasy-vibe的直接链接" title="9-datawhalechinaeasy-vibe的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向初学者的 modern coding / vibe coding 课程，帮助新手一步步掌握 AI 辅助编程与现代开发流程。</li>
<li class=""><strong>为什么这周会热</strong>：vibe coding 已经从黑话变成大量新人进入编程的入口。对初学者来说，难点不是“模型能不能写代码”，而是如何提需求、读输出、调试、理解工程结构、避免把错误代码直接粘进项目。</li>
<li class=""><strong>有什么新意</strong>：它把 AI coding 作为第一门现代编程课的一部分，而不是高级开发者的效率外挂。这说明 AI 编程教育正在重构入门路径：学习者可能先学会与 agent 协作，再系统补齐语言、框架和工程知识。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-lum1104understand-anything">10. <a href="https://github.com/Lum1104/Understand-Anything" target="_blank" rel="noopener noreferrer" class="">Lum1104/Understand-Anything</a><a href="https://xiebo.fun/blog/2026/5/24/#10-lum1104understand-anything" class="hash-link" aria-label="10-lum1104understand-anything的直接链接" title="10-lum1104understand-anything的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：把任意代码转成可探索、可搜索、可问答的交互式知识图谱，支持 Claude Code、Codex、Cursor、Copilot、Gemini CLI 等工具。</li>
<li class=""><strong>为什么这周会热</strong>：它与 CodeGraph 同时上榜，说明“代码库可视化理解”正在成为 agent 时代的新刚需。开发者既希望自己能快速理解陌生项目，也希望 agent 能更少误判依赖关系和架构意图。</li>
<li class=""><strong>有什么新意</strong>：项目标语 “Graphs that teach &gt; graphs that impress” 很关键：知识图谱不只是炫酷可视化，而是教学和协作界面。未来代码图谱可能同时服务人和 agent，成为 onboarding、重构、审查和问答的共同底座。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-obrasuperpowers">11. <a href="https://github.com/obra/superpowers" target="_blank" rel="noopener noreferrer" class="">obra/superpowers</a><a href="https://xiebo.fun/blog/2026/5/24/#11-obrasuperpowers" class="hash-link" aria-label="11-obrasuperpowers的直接链接" title="11-obrasuperpowers的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 agentic skills framework 与软件开发方法论，目标是用可复用 skills 约束 agent 做真实工程任务。</li>
<li class=""><strong>为什么这周会热</strong>：开发者开始意识到，稳定使用 agent 的关键不是一个更长 prompt，而是一套能反复执行的工作方法。superpowers 把这些方法打包成 skills / methodology，契合了“让 agent 按流程做事”的需求。</li>
<li class=""><strong>有什么新意</strong>：它把 agent 能力组织成可安装、可演化的技能体系。相比一次性的 prompt 收藏，skills 更像团队工程规范：可以版本化、复用、审查，也可以随着项目经验持续迭代。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-can1357oh-my-pi">12. <a href="https://github.com/can1357/oh-my-pi" target="_blank" rel="noopener noreferrer" class="">can1357/oh-my-pi</a><a href="https://xiebo.fun/blog/2026/5/24/#12-can1357oh-my-pi" class="hash-link" aria-label="12-can1357oh-my-pi的直接链接" title="12-can1357oh-my-pi的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个终端 AI coding agent，强调 hash-anchored edits、优化的 tool harness、LSP、Python、browser、subagents 等能力。</li>
<li class=""><strong>为什么这周会热</strong>：终端 coding agent 的竞争正在从“能调用 shell 和编辑文件”升级到“编辑是否可靠、工具是否高效、能否并行分工、能否接入语言服务”。oh-my-pi 把这些工程细节直接放进卖点。</li>
<li class=""><strong>有什么新意</strong>：hash-anchored edits 这类设计说明 agent 编辑文件不能只靠模糊文本替换；要想在真实仓库里减少误改和冲突，编辑操作本身需要更强的定位与校验机制。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-k-dense-aiscientific-agent-skills">13. <a href="https://github.com/K-Dense-AI/scientific-agent-skills" target="_blank" rel="noopener noreferrer" class="">K-Dense-AI/scientific-agent-skills</a><a href="https://xiebo.fun/blog/2026/5/24/#13-k-dense-aiscientific-agent-skills" class="hash-link" aria-label="13-k-dense-aiscientific-agent-skills的直接链接" title="13-k-dense-aiscientific-agent-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一组面向研究、科学、工程、分析、金融和写作的 ready-to-use Agent Skills。</li>
<li class=""><strong>为什么这周会热</strong>：academic-research-skills 已经证明了领域 skills 的吸引力，scientific-agent-skills 进一步把范围扩展到更广的科学与工程任务。对于高专业度领域，agent 真正缺的往往不是语言能力，而是流程、边界和检查点。</li>
<li class=""><strong>有什么新意</strong>：它说明 skills 正在成为一种知识分发格式：把专家工作法变成 agent 可执行的文本资产。未来很多领域工具可能不是先做完整 SaaS，而是先发布一套高质量 skills。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai--泛基础设施热门项目">非 AI / 泛基础设施热门项目<a href="https://xiebo.fun/blog/2026/5/24/#%E9%9D%9E-ai--%E6%B3%9B%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI / 泛基础设施热门项目的直接链接" title="非 AI / 泛基础设施热门项目的直接链接" translate="no">​</a></h2>
<blockquote>
<p>本周严格意义上的非 AI 项目非常少，weekly 页面几乎被 AI agent、AI coding、AI workflow 项目占满。下面两个项目更像“AI 之外的基础设施信号”：一个偏物理世界感知，一个偏端侧语音运行时。它们不是通用聊天 agent，但都说明智能能力正在离开纯软件界面，进入设备、环境和本地计算。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-ruvnetruview">1. <a href="https://github.com/ruvnet/RuView" target="_blank" rel="noopener noreferrer" class="">ruvnet/RuView</a><a href="https://xiebo.fun/blog/2026/5/24/#1-ruvnetruview" class="hash-link" aria-label="1-ruvnetruview的直接链接" title="1-ruvnetruview的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：用普通 WiFi 信号做实时空间智能、生命体征监测和存在检测的 Rust 项目，目标是在没有摄像头和可穿戴设备的情况下感知房间状态，可与 Home Assistant、Matter Bridge 等智能家居生态结合。</li>
<li class=""><strong>为什么这周会热</strong>：它的想象力很强：不用摄像头，也能检测有人、运动、呼吸、心率、房间活动等信号。隐私友好的空间感知、智能家居、安防、养老看护、边缘设备都会关心这类能力。</li>
<li class=""><strong>有什么新意</strong>：RuView 的重要性在于把“看见世界”的接口从视觉扩展到 RF / CSI 信号。项目也明确标出 beta 阶段和精度限制，这反而让它更像一个值得跟踪的真实工程方向，而不是纯概念 demo。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-supertone-incsupertonic">2. <a href="https://github.com/supertone-inc/supertonic" target="_blank" rel="noopener noreferrer" class="">supertone-inc/supertonic</a><a href="https://xiebo.fun/blog/2026/5/24/#2-supertone-incsupertonic" class="hash-link" aria-label="2-supertone-incsupertonic的直接链接" title="2-supertone-incsupertonic的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 lightning-fast、on-device、multilingual TTS 项目，基于 ONNX 在本地设备上原生运行，主要语言为 Swift。</li>
<li class=""><strong>为什么这周会热</strong>：端侧语音是 AI 应用落地的关键拼图。用户对实时性、隐私、离线可用和成本都有要求，TTS 如果每次都依赖云端 API，会限制很多移动端、桌面端和嵌入式场景。</li>
<li class=""><strong>有什么新意</strong>：它代表 AI 能力本地化的另一个方向：不是更大的云模型，而是足够快、足够轻、能直接嵌入产品的模型运行时。对语音助手、可访问性、教育、游戏和创作者工具来说，端侧 TTS 的体验差异非常直接。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/5/24/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-的上下文层开始独立成产品">1. Agent 的上下文层开始独立成产品<a href="https://xiebo.fun/blog/2026/5/24/#1-agent-%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B1%82%E5%BC%80%E5%A7%8B%E7%8B%AC%E7%AB%8B%E6%88%90%E4%BA%A7%E5%93%81" class="hash-link" aria-label="1. Agent 的上下文层开始独立成产品的直接链接" title="1. Agent 的上下文层开始独立成产品的直接链接" translate="no">​</a></h3>
<p>本周最强的信号是 CodeGraph 和 Understand-Anything 同时冲上榜：开发者已经不满足于让 agent “临时读文件”，而是希望代码库本身可以被索引、可视化、问答和复用。</p>
<p>这意味着 coding agent 的技术栈可能会出现一层新的默认组件：<strong>本地项目上下文引擎</strong>。它介于 IDE、搜索工具和模型之间，负责把仓库结构、符号关系、依赖路径、文档和历史决策变成 agent 能稳定消费的信息。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-skills-成为-agent-时代的新知识封装格式">2. Skills 成为 agent 时代的新“知识封装格式”<a href="https://xiebo.fun/blog/2026/5/24/#2-skills-%E6%88%90%E4%B8%BA-agent-%E6%97%B6%E4%BB%A3%E7%9A%84%E6%96%B0%E7%9F%A5%E8%AF%86%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F" class="hash-link" aria-label="2. Skills 成为 agent 时代的新“知识封装格式”的直接链接" title="2. Skills 成为 agent 时代的新“知识封装格式”的直接链接" translate="no">​</a></h3>
<p>academic-research-skills、superpowers、scientific-agent-skills 同时上榜，不是巧合。Prompt 太轻，framework 太重；skills 处在中间：足够简单，可以复制到本地；足够结构化，可以被 agent 执行；足够具体，可以沉淀领域经验。</p>
<p>这也解释了为什么学术、科研、工程这类高专业度场景特别适合 skills。它们的价值不只在输出文字，而在流程：先做计划，再查证，再引用，再审稿，再修改，再最终确认。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-个人-ai走向混合架构而不是纯本地或纯云">3. “个人 AI”走向混合架构，而不是纯本地或纯云<a href="https://xiebo.fun/blog/2026/5/24/#3-%E4%B8%AA%E4%BA%BA-ai%E8%B5%B0%E5%90%91%E6%B7%B7%E5%90%88%E6%9E%B6%E6%9E%84%E8%80%8C%E4%B8%8D%E6%98%AF%E7%BA%AF%E6%9C%AC%E5%9C%B0%E6%88%96%E7%BA%AF%E4%BA%91" class="hash-link" aria-label="3. “个人 AI”走向混合架构，而不是纯本地或纯云的直接链接" title="3. “个人 AI”走向混合架构，而不是纯本地或纯云的直接链接" translate="no">​</a></h3>
<p>OpenHuman 的 README 明确区分本地 memory / vault / runtime state 与托管登录、模型路由、搜索代理、OAuth 集成。这种透明的混合架构很值得注意。</p>
<p>个人 AI 想要长期使用，必须处理两组矛盾：一边是隐私、可控、本地数据；另一边是搜索、模型、第三方服务集成和跨设备便利性。未来成功的个人 AI 产品，很可能不是极端 local-only 或 cloud-only，而是把边界讲清楚、把迁移和自定义做好。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-agent-工程从模型调用回到软件工程">4. Agent 工程从“模型调用”回到“软件工程”<a href="https://xiebo.fun/blog/2026/5/24/#4-agent-%E5%B7%A5%E7%A8%8B%E4%BB%8E%E6%A8%A1%E5%9E%8B%E8%B0%83%E7%94%A8%E5%9B%9E%E5%88%B0%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B" class="hash-link" aria-label="4. Agent 工程从“模型调用”回到“软件工程”的直接链接" title="4. Agent 工程从“模型调用”回到“软件工程”的直接链接" translate="no">​</a></h3>
<p>12-factor-agents、oh-my-pi、AgentMemory、CloakBrowser 都在讲同一件事：agent 要进入生产，必须有状态管理、可观测性、编辑可靠性、工具 harness、记忆、浏览器环境和人工边界。</p>
<p>这说明 2026 年的 agent 开发正在降温到更务实的层面。真正有价值的项目未必是最会营销的 demo，而是能把失败率、成本、上下文损耗、误编辑和环境阻塞一点点压下去的基础设施。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-ai-教育正在被-agent-重新组织">5. AI 教育正在被 agent 重新组织<a href="https://xiebo.fun/blog/2026/5/24/#5-ai-%E6%95%99%E8%82%B2%E6%AD%A3%E5%9C%A8%E8%A2%AB-agent-%E9%87%8D%E6%96%B0%E7%BB%84%E7%BB%87" class="hash-link" aria-label="5. AI 教育正在被 agent 重新组织的直接链接" title="5. AI 教育正在被 agent 重新组织的直接链接" translate="no">​</a></h3>
<p>ai-engineering-from-scratch 和 easy-vibe 代表两个入口：一个面向想把 AI 产品 ship 出去的工程师，一个面向从 AI coding 开始入门的新开发者。它们共同说明，AI 不只是开发工具，也开始改变“如何学习开发”。</p>
<p>过去编程教育先教语法、再教框架、最后教工程；现在很多人会先接触 agent，再反向学习需求拆解、调试、代码结构和软件工程。课程如果还只讲 API 调用，很快会显得过时。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/5/24/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ol>
<li class=""><strong>代码知识图谱成为 agent infra 的热门方向。</strong> CodeGraph 和 Understand-Anything 同时上榜，说明上下文压缩、语义索引和可视化理解正在变成 coding agent 的关键能力。</li>
<li class=""><strong>Skills 从个人技巧变成公共生态。</strong> 学术、科研、软件工程方法论都在以 skills 形式传播，未来团队可能会像维护 lint 规则一样维护 agent skills。</li>
<li class=""><strong>个人 AI 开始承认混合架构现实。</strong> OpenHuman 把本地记忆和托管集成讲清楚，比单纯宣传“全本地”或“全托管”更接近真实产品。</li>
<li class=""><strong>生产级 agent 的话题回到工程纪律。</strong> 12-factor-agents 的热度说明开发者已经在追问：LLM 应用怎样才算足够可靠，可以交给真实用户？</li>
<li class=""><strong>浏览器与终端仍是 agent 的关键身体。</strong> CloakBrowser 解决网页访问阻塞，oh-my-pi 强化终端编辑与工具 harness，这些都比单次回答质量更接近生产痛点。</li>
<li class=""><strong>智能能力继续向本地设备和物理环境扩散。</strong> RuView 和 Supertonic 分别代表 WiFi sensing 与端侧 TTS，说明 AI 热潮之外，环境感知和本地推理仍在快速演进。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/5/24/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>本周 GitHub Trending 的核心信号可以概括为一句话：<strong>agent 生态正在从“会做任务”转向“能长期理解一个人、一个项目、一套流程”</strong>。</p>
<p>这也是为什么代码图谱、持久记忆、skills、个人 AI、12-factor 方法论会在同一周集中出现。开发者已经知道模型能写代码、能生成文字、能调用工具；新的问题是：它是否知道项目结构？是否记得历史决策？是否按可靠流程执行？是否能被审查和纠错？是否能进入真实网页、终端、桌面和设备？</p>
<p>如果说 2025 年 agent 的关键词是“自动化”，那么 2026 年的关键词更像是“持续协作”。本周榜单给出的答案很明确：谁能掌握上下文、记忆、方法和运行环境，谁就更可能成为下一阶段 agent 工作流里的基础设施。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：AI Agent 进入“可操作环境”阶段（2026-05-17）]]></title>
            <link>https://xiebo.fun/blog/2026/5/17/</link>
            <guid>https://xiebo.fun/blog/2026/5/17/</guid>
            <pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending weekly 的焦点从单个 coding agent 转向可持续运行的 agent 基础设施：隐身浏览器、持久记忆、模型路由、GUI 操作、金融交易、React 质量守门，以及少数仍能凭硬核工具属性突围的非 AI 项目。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）最值得注意的变化是：<strong>AI 项目不再只是在展示“模型能做什么”，而是在补齐 agent 真正执行任务时需要的外部环境</strong>。浏览器要能穿过 bot detection，记忆要能跨会话保留，模型调用要能路由和降本，GUI agent 要能连接真实工具，前端代码要有自动质检，金融 agent 甚至开始讨论“交易平台原生化”。</p>
<p>相比前几周以 coding agent、skills、金融 workflow 为主的叙事，这一周更像是 agent 工程化的下半场：大家默认 agent 会写、会搜、会调用工具，于是新的竞争点变成了<strong>它能不能稳定接触真实世界、能不能记住历史、能不能低成本持续运行、能不能被质量系统约束</strong>。</p>
<blockquote>
<p>本文基于 GitHub Trending weekly 页面，以及对应仓库公开 README / GitHub 元数据做归纳。Trending 只展示热度结果，不解释传播路径，所以“为什么这周变热”会结合项目定位、榜单位置、近期活跃度和当前开发者需求做审慎判断。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/5/17/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>Agent 的“身体”正在变重要。</strong> CloakBrowser、UI-TARS Desktop、RuView 分别代表浏览器、桌面 GUI、无线感知这三类外部世界入口。agent 不只是生成文本，而是要看网页、点界面、感知环境。</li>
<li class=""><strong>Coding agent 的核心瓶颈开始从模型切到运行系统。</strong> AgentMemory 解决跨会话记忆，9Router 解决多模型路由与成本，React Doctor 解决 agent 写坏前端后的质量守门，skills 仓库则把经验沉淀成可复用流程。</li>
<li class=""><strong>金融仍是最容易把 agent 讲清楚的高价值垂直场景。</strong> Anthropic financial-services 和 AI-Trader 同时上榜，一个偏机构 workflow reference，一个偏 agent-native trading platform，说明金融场景仍在承接“多 agent + 可验证流程”的想象力。</li>
<li class=""><strong>内容自动化开始从“生成内容”转向“经营闭环”。</strong> AiToEarn 的热度不是因为又能写文案，而是把生成、分发、互动、变现打包成面向一人公司的营销系统。</li>
<li class=""><strong>非 AI 项目依然能靠基础设施属性突围。</strong> Bun、Hysteria、SuperSplat 都不是纯 AI 项目，但分别踩中 JS 工具链、抗审查代理、3D Gaussian Splatting 编辑器这类明确刚需。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/5/17/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-cloakhqcloakbrowser">1. <a href="https://github.com/CloakHQ/CloakBrowser" target="_blank" rel="noopener noreferrer" class="">CloakHQ/CloakBrowser</a><a href="https://xiebo.fun/blog/2026/5/17/#1-cloakhqcloakbrowser" class="hash-link" aria-label="1-cloakhqcloakbrowser的直接链接" title="1-cloakhqcloakbrowser的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个“隐身版 Chromium”，通过 C++ 源码级补丁修改 canvas、WebGL、audio、fonts、GPU、screen、WebRTC、network timing、automation signals 等指纹特征，定位为 Playwright / Puppeteer 的 drop-in replacement。</li>
<li class=""><strong>为什么这周会热</strong>：agent 和自动化脚本越多，真实网页越多地使用 bot detection、Cloudflare、reCAPTCHA、浏览器指纹检测来防护。普通 headless browser 很容易在第一步就失败，而 CloakBrowser 把问题从 JS 注入、配置伪装推进到 Chromium 源码层，正好击中 web agent、数据采集和浏览器自动化的痛点。</li>
<li class=""><strong>有什么新意</strong>：它代表 agent 工程的一个现实转向：如果 agent 要操作真实互联网，浏览器本身就是基础设施。过去开发者讨论“模型是否会规划”，现在还必须讨论“浏览器是否能被网站接受为正常用户”。这也是本周榜首很有信号意义的地方。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-yikartaitoearn">2. <a href="https://github.com/yikart/AiToEarn" target="_blank" rel="noopener noreferrer" class="">yikart/AiToEarn</a><a href="https://xiebo.fun/blog/2026/5/17/#2-yikartaitoearn" class="hash-link" aria-label="2-yikartaitoearn的直接链接" title="2-yikartaitoearn的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：面向 OPC（一人公司）、创作者、品牌和企业的 AI 内容营销智能体，覆盖内容生成、跨平台发布、互动和变现，支持抖音、小红书、快手、B 站、视频号、TikTok、YouTube、Facebook、Instagram、Threads、X、Pinterest、LinkedIn 等渠道。</li>
<li class=""><strong>为什么这周会热</strong>：AI 内容工具已经很多，单点生成的边际吸引力下降；真正有传播力的是“从内容到经营”的闭环。AiToEarn 把创作、分发、运营和变现放到同一个系统里，迎合了个人创作者和小团队对自动化增长工具的需求。</li>
<li class=""><strong>有什么新意</strong>：它的新意不在于“AI 会写内容”，而在于把内容营销流程 agent 化。对一人公司来说，瓶颈往往不是写一篇稿，而是持续选题、改写、多平台发布、跟进反馈、复用素材。这个项目反映了 AI agent 正在进入小型商业运营场景。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-rohitg00agentmemory">3. <a href="https://github.com/rohitg00/agentmemory" target="_blank" rel="noopener noreferrer" class="">rohitg00/agentmemory</a><a href="https://xiebo.fun/blog/2026/5/17/#3-rohitg00agentmemory" class="hash-link" aria-label="3-rohitg00agentmemory的直接链接" title="3-rohitg00agentmemory的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：给 Claude Code、Cursor、Gemini CLI、Codex CLI、Hermes、OpenCode 等 coding agent 提供持久记忆的 MCP / 本地服务，让 agent 能跨会话召回项目背景、历史决策和工作上下文。</li>
<li class=""><strong>为什么这周会热</strong>：coding agent 的使用频率越高，“每次重新解释一遍项目”就越浪费。开发者开始意识到：上下文窗口再大，也不是长期记忆；真正可用的 agent 需要在多天、多仓库、多任务之间保留可检索经验。</li>
<li class=""><strong>有什么新意</strong>：它把 memory 从模型能力变成 agent 基础设施。更重要的是，项目强调基于真实 benchmark 的 persistent memory，而不是单纯存聊天记录。这说明 agent 生态正在从“把上下文塞进 prompt”转向“把记忆作为可评估组件”。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-anthropicsfinancial-services">4. <a href="https://github.com/anthropics/financial-services" target="_blank" rel="noopener noreferrer" class="">anthropics/financial-services</a><a href="https://xiebo.fun/blog/2026/5/17/#4-anthropicsfinancial-services" class="hash-link" aria-label="4-anthropicsfinancial-services的直接链接" title="4-anthropicsfinancial-services的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Anthropic 面向金融服务场景开源的一组参考 agents、skills 和数据连接器，覆盖投行、股票研究、私募、财富管理等 workflow。同一套实现既可作为 Claude Cowork 插件使用，也可通过 Claude Managed Agents API 接入自有 workflow engine。</li>
<li class=""><strong>为什么这周会热</strong>：金融仍然是最容易证明 agent 价值的高密度场景：流程清晰、文档多、专业判断重、产出可审阅。Anthropic 亲自给出 reference agents，相当于把“金融机构如何用 Claude”从销售叙事变成可读、可改、可复用的开源样板。</li>
<li class=""><strong>有什么新意</strong>：它不是一个“让 AI 炒股”的 demo，而是强调人类签核、合规边界、数据连接器和 skills 复用。这个项目的价值在于展示 agent 如何进入强约束行业：输出研究材料、辅助分析流程，但不替代最终投资决策。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-bytedanceui-tars-desktop">5. <a href="https://github.com/bytedance/UI-TARS-desktop" target="_blank" rel="noopener noreferrer" class="">bytedance/UI-TARS-desktop</a><a href="https://xiebo.fun/blog/2026/5/17/#5-bytedanceui-tars-desktop" class="hash-link" aria-label="5-bytedanceui-tars-desktop的直接链接" title="5-bytedanceui-tars-desktop的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：字节开源的多模态 AI Agent 桌面栈，提供 CLI 和 Web UI，通过视觉模型与 MCP 工具连接真实桌面 / 浏览器 / 应用界面，目标是让 agent 以更接近人类的方式完成任务。</li>
<li class=""><strong>为什么这周会热</strong>：browser-use、computer-use、GUI agent 仍是 2026 年 agent 生态的核心方向。相比只调用 API 的 agent，GUI agent 能接触大量没有结构化接口的软件，因此天然有更广的自动化想象空间。</li>
<li class=""><strong>有什么新意</strong>：它把多模态模型、桌面操作和 MCP 工具链放在同一个 stack 里。这个方向的关键不是“模型能看图”，而是能否形成稳定的 observe-plan-act loop：看界面、理解状态、选择动作、验证结果。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-decolua9router">6. <a href="https://github.com/decolua/9router" target="_blank" rel="noopener noreferrer" class="">decolua/9router</a><a href="https://xiebo.fun/blog/2026/5/17/#6-decolua9router" class="hash-link" aria-label="6-decolua9router的直接链接" title="6-decolua9router的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 AI coding 工具的模型路由和 token saver，把 Claude Code、Cursor、Antigravity、Copilot、Codex、Gemini、OpenCode、Cline 等工具连接到 40+ providers / 100+ models，主打自动 fallback、免费 / 低价模型接入和 RTK token 节省。</li>
<li class=""><strong>为什么这周会热</strong>：agent 使用进入高频后，成本、限额、供应商稳定性会迅速变成日常问题。开发者不想为每个工具分别配置 provider，也不想因为某个模型限流就中断工作流。</li>
<li class=""><strong>有什么新意</strong>：9Router 把“模型访问层”产品化，类似 agent 时代的 API gateway。它反映出一个趋势：模型能力越来越像可替换资源，真正粘住用户的是路由、降本、fallback、兼容多工具的运行层。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-mattpocockskills">7. <a href="https://github.com/mattpocock/skills" target="_blank" rel="noopener noreferrer" class="">mattpocock/skills</a><a href="https://xiebo.fun/blog/2026/5/17/#7-mattpocockskills" class="hash-link" aria-label="7-mattpocockskills的直接链接" title="7-mattpocockskills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Matt Pocock 公开自己日常使用的一组 agent skills，强调“real engineering, not vibe coding”，通过小而可组合的流程帮助 agent 做真实工程任务，而不是把整个开发过程交给一个笨重框架。</li>
<li class=""><strong>为什么这周会热</strong>：Claude Code / Codex / Cursor 用户越来越多后，大家开始寻找可迁移的 agent 操作经验。相比宏大的 agent framework，skills 这种文本化、可编辑、可组合的工作流更容易被个人开发者马上复制。</li>
<li class=""><strong>有什么新意</strong>：它代表了 agent 使用方式的“手艺化”。真正有效的 agent 工程未必是最大的平台，而可能是一组经过实践打磨的任务约束、检查清单和工作习惯。skills 正在成为 prompt 之后的新知识载体。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-hmbowndeepseek-tui">8. <a href="https://github.com/Hmbown/DeepSeek-TUI" target="_blank" rel="noopener noreferrer" class="">Hmbown/DeepSeek-TUI</a><a href="https://xiebo.fun/blog/2026/5/17/#8-hmbowndeepseek-tui" class="hash-link" aria-label="8-hmbowndeepseek-tui的直接链接" title="8-hmbowndeepseek-tui的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个运行在终端里的 DeepSeek coding agent，支持 reasoning block streaming、本地 workspace 编辑、approval gates，以及按回合自动选择模型和思考强度。</li>
<li class=""><strong>为什么这周会热</strong>：coding agent CLI 的竞争不再只属于 Claude Code 和 Codex。DeepSeek 生态有成本和可用性优势，开发者自然会寻找更贴近 DeepSeek 模型特性的终端工作台。</li>
<li class=""><strong>有什么新意</strong>：它体现的是“模型专属开发者工具”的出现。不同模型在 reasoning、工具调用、上下文处理和成本结构上差异很大，围绕模型特性设计的 TUI 可能比通用 wrapper 更好用。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-hkudsai-trader">9. <a href="https://github.com/HKUDS/AI-Trader" target="_blank" rel="noopener noreferrer" class="">HKUDS/AI-Trader</a><a href="https://xiebo.fun/blog/2026/5/17/#9-hkudsai-trader" class="hash-link" aria-label="9-hkudsai-trader的直接链接" title="9-hkudsai-trader的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 agent-native trading platform，主张“AI agents need their own trading platform”，让不同 AI agent 能加入平台、交换交易想法、训练交易技能，并面向自动化交易工作流。</li>
<li class=""><strong>为什么这周会热</strong>：金融 agent 一直有强传播性，而 AI-Trader 把重点从“agent 生成研究报告”推进到“agent 进入交易平台”。这触碰到更激进的想象：如果 agent 是行动主体，它需要的不只是分析工具，而是自己的执行场。</li>
<li class=""><strong>有什么新意</strong>：它的概念新意在于 platform-native，而不是 notebook-native。无论真实交易落地需要多严格的风控和监管，这个项目都说明金融 agent 正在从研究辅助走向“平台化协作与执行”的叙事。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-millioncoreact-doctor">10. <a href="https://github.com/millionco/react-doctor" target="_blank" rel="noopener noreferrer" class="">millionco/react-doctor</a><a href="https://xiebo.fun/blog/2026/5/17/#10-millioncoreact-doctor" class="hash-link" aria-label="10-millioncoreact-doctor的直接链接" title="10-millioncoreact-doctor的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 React 代码健康检查工具，一条命令扫描 Next.js、Vite、React Native 等项目，输出 0 到 100 的 health score，并给出 state/effects、性能、架构、安全、可访问性等诊断建议。</li>
<li class=""><strong>为什么这周会热</strong>：项目标语“Your agent writes bad React. This catches it”非常准确。agent 写前端越来越快，但也更容易制造难以维护的状态逻辑、性能问题和架构债务。React Doctor 正好站在 agent 输出的下游做质量守门。</li>
<li class=""><strong>有什么新意</strong>：它说明 agent 生态不只需要生成器，也需要审计器、评分器和约束器。未来开发流程可能变成：agent 生成代码，doctor 类工具发现问题，再把诊断反馈给 agent 修复。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai-热门项目">非 AI 热门项目<a href="https://xiebo.fun/blog/2026/5/17/#%E9%9D%9E-ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI 热门项目的直接链接" title="非 AI 热门项目的直接链接" translate="no">​</a></h2>
<blockquote>
<p>本周非 AI 项目数量不多，但代表性很强：一个是 JS 工具链基础设施，一个是网络代理基础设施，一个是 3D 内容编辑器。它们共同说明：在 AI 叙事之外，只要足够快、足够刚需、足够贴近开发者生产力，仍然能冲上周榜。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-oven-shbun">1. <a href="https://github.com/oven-sh/bun" target="_blank" rel="noopener noreferrer" class="">oven-sh/bun</a><a href="https://xiebo.fun/blog/2026/5/17/#1-oven-shbun" class="hash-link" aria-label="1-oven-shbun的直接链接" title="1-oven-shbun的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一体化 JavaScript / TypeScript 工具链，集 runtime、bundler、test runner、script runner、package manager 于一身，使用 Zig 编写并基于 JavaScriptCore，目标是替代 Node.js 的高性能开发体验。</li>
<li class=""><strong>为什么这周会热</strong>：Bun 已经不是新项目，但持续保持热度说明 JS 生态仍然渴望“少装工具、启动更快、默认支持 TS/JSX、包管理更统一”的体验。随着全栈框架和 AI 生成代码增多，工具链启动速度和安装速度会被更频繁地放大。</li>
<li class=""><strong>有什么新意</strong>：Bun 的差异点是把多个工具合并进单个 executable，而不是在 npm、webpack/vite、jest/vitest、tsx 等工具之间继续叠层。它代表 JS 工具链从“拼装生态”向“一体化体验”的长期迁移。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-ruvnetruview">2. <a href="https://github.com/ruvnet/RuView" target="_blank" rel="noopener noreferrer" class="">ruvnet/RuView</a><a href="https://xiebo.fun/blog/2026/5/17/#2-ruvnetruview" class="hash-link" aria-label="2-ruvnetruview的直接链接" title="2-ruvnetruview的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：利用普通 WiFi 信号做实时空间智能、生命体征监测和存在检测的 Rust 项目，目标是在不使用摄像头的情况下获得环境感知能力，README 中也强调仍处于 beta、硬件和精度有明确限制。</li>
<li class=""><strong>为什么这周会热</strong>：它很容易激发想象力：不用摄像头，用 WiFi 做 presence / pose / vital sign sensing。隐私友好的空间感知、智能家居、安防、边缘设备都会关心这种能力。</li>
<li class=""><strong>有什么新意</strong>：相比摄像头视觉，WiFi 感知的优势是非视觉、低侵入、可覆盖遮挡场景；但项目也诚实标出精度和部署限制。这类项目说明“AI + 物理世界感知”正在从摄像头扩展到 RF / CSI 等更底层信号。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-apernethysteria">3. <a href="https://github.com/apernet/hysteria" target="_blank" rel="noopener noreferrer" class="">apernet/hysteria</a><a href="https://xiebo.fun/blog/2026/5/17/#3-apernethysteria" class="hash-link" aria-label="3-apernethysteria的直接链接" title="3-apernethysteria的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个基于 QUIC 等技术的高速、抗审查代理工具，提供 proxy / VPN / relay / TUN 等能力，强调可靠 UDP 和弱网环境下的吞吐表现。</li>
<li class=""><strong>为什么这周会热</strong>：代理工具的热度通常来自现实网络环境需求：跨地域访问、审查规避、弱网优化、稳定连接。Hysteria 长期积累用户，本周再上榜说明网络基础设施工具仍有稳定传播力。</li>
<li class=""><strong>有什么新意</strong>：它的新意在于用现代传输协议和拥塞控制思路解决传统代理在丢包、高延迟环境下的体验问题。和 AI 项目不同，它的价值非常直接：能不能连、快不快、稳不稳。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-playcanvassupersplat">4. <a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">playcanvas/supersplat</a><a href="https://xiebo.fun/blog/2026/5/17/#4-playcanvassupersplat" class="hash-link" aria-label="4-playcanvassupersplat的直接链接" title="4-playcanvassupersplat的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 3D Gaussian Splat Editor，用于查看、编辑和处理 3DGS 内容，背后结合 PlayCanvas / WebGL / WebGPU 等 Web 3D 技术。</li>
<li class=""><strong>为什么这周会热</strong>：Gaussian Splatting 仍是 3D 内容和空间计算领域的热门技术。随着采集、渲染和 Web 端展示能力成熟，开发者开始需要更好用的编辑器，而不是只停留在论文 demo 或命令行转换。</li>
<li class=""><strong>有什么新意</strong>：SuperSplat 把 3DGS 从研究资产推向创作工具。它的意义不是又一个 renderer，而是让 3D Gaussian Splat 进入可视化编辑、优化和发布流程。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/5/17/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-infra-的关键词从聪明变成可运行">1. Agent infra 的关键词从“聪明”变成“可运行”<a href="https://xiebo.fun/blog/2026/5/17/#1-agent-infra-%E7%9A%84%E5%85%B3%E9%94%AE%E8%AF%8D%E4%BB%8E%E8%81%AA%E6%98%8E%E5%8F%98%E6%88%90%E5%8F%AF%E8%BF%90%E8%A1%8C" class="hash-link" aria-label="1. Agent infra 的关键词从“聪明”变成“可运行”的直接链接" title="1. Agent infra 的关键词从“聪明”变成“可运行”的直接链接" translate="no">​</a></h3>
<p>本周榜单里最强的线索不是某个模型能力突破，而是 agent 运行环境的补齐：浏览器、记忆、模型路由、GUI、质量检查、行业 workflow。这说明开发者已经默认模型可以完成一部分任务，下一步要解决的是：<strong>它能不能在真实约束下持续完成任务</strong>。</p>
<p>CloakBrowser 解决“网页不让你进”，AgentMemory 解决“下次又忘了”，9Router 解决“模型贵 / 限流 / 不稳定”，React Doctor 解决“写出来的代码不可维护”。这些都不是 flashy demo，但都很接近生产痛点。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-coding-agent-正在催生一圈反向工具">2. Coding agent 正在催生一圈“反向工具”<a href="https://xiebo.fun/blog/2026/5/17/#2-coding-agent-%E6%AD%A3%E5%9C%A8%E5%82%AC%E7%94%9F%E4%B8%80%E5%9C%88%E5%8F%8D%E5%90%91%E5%B7%A5%E5%85%B7" class="hash-link" aria-label="2. Coding agent 正在��催生一圈“反向工具”的直接链接" title="2. Coding agent 正在催生一圈“反向工具”的直接链接" translate="no">​</a></h3>
<p>过去开发工具主要服务人类；现在很多工具开始显式服务 agent 或监督 agent：skills 教 agent 怎么做工程，React Doctor 抓 agent 写坏的 React，9Router 给 agent 提供模型访问层，AgentMemory 给 agent 提供长期记忆。</p>
<p>这意味着一个新市场正在出现：不是“替代开发者的工具”，而是“让开发者更好管理 agent 的工具”。谁能提供验证、约束、记忆、路由、审计，谁就可能成为 agent-native IDE 之外的关键基础设施。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-金融-agent-的分化更明显reference-workflow-vs-native-platform">3. 金融 agent 的分化更明显：reference workflow vs. native platform<a href="https://xiebo.fun/blog/2026/5/17/#3-%E9%87%91%E8%9E%8D-agent-%E7%9A%84%E5%88%86%E5%8C%96%E6%9B%B4%E6%98%8E%E6%98%BEreference-workflow-vs-native-platform" class="hash-link" aria-label="3. 金融 agent 的分化更明显：reference workflow vs. native platform的直接链接" title="3. 金融 agent 的分化更明显：reference workflow vs. native platform的直接链接" translate="no">​</a></h3>
<p>Anthropic financial-services 代表相对稳健的一端：参考流程、skills、数据连接器、人类签核、合规边界。AI-Trader 代表更激进的一端：把 agent 当作交易平台的原生参与者。</p>
<p>这两条线会长期并存。机构落地需要前者，因为它能解释、能审计、能控制边界；开源传播容易偏向后者，因为它更有想象空间。真正值得观察的是两者是否会在“可验证研究流程 + 受控执行环境”上汇合。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-非-ai-热门项目的共同点是确定性收益">4. 非 AI 热门项目的共同点是“确定性收益”<a href="https://xiebo.fun/blog/2026/5/17/#4-%E9%9D%9E-ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE%E7%9A%84%E5%85%B1%E5%90%8C%E7%82%B9%E6%98%AF%E7%A1%AE%E5%AE%9A%E6%80%A7%E6%94%B6%E7%9B%8A" class="hash-link" aria-label="4. 非 AI 热门项目的共同点是“确定性收益”的直接链接" title="4. 非 AI 热门项目的共同点是“确定性收益”的直接链接" translate="no">​</a></h3>
<p>Bun 更快、更一体化；Hysteria 在复杂网络环境下更稳；SuperSplat 让 3DGS 可编辑。这些项目的传播逻辑很朴素：安装后马上能解决一个明确问题。</p>
<p>这也是 AI 工具可以学习的地方。越往生产走，开发者越不买“未来会很强”的账，而更关心今天是否省时间、少出错、能接入现有流程。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/5/17/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ol>
<li class=""><strong>隐身浏览器成为 agent 基础设施。</strong> CloakBrowser 冲到前列说明 web agent 的瓶颈不只在规划和视觉，也在 bot detection 和真实浏览器指纹。</li>
<li class=""><strong>持久记忆开始从“功能”变成“产品”。</strong> AgentMemory 的热度说明跨会话记忆已经是 coding agent 重度用户的刚需。</li>
<li class=""><strong>模型路由层会越来越重要。</strong> 9Router 这类项目可能成为 agent 工具链里的默认中间层：统一 provider、降本、fallback、兼容多客户端。</li>
<li class=""><strong>Agent 输出需要独立质检。</strong> React Doctor 的定位非常清晰：agent 会写坏代码，所以必须有 agent-aware 的诊断工具。</li>
<li class=""><strong>内容自动化进入经营阶段。</strong> AiToEarn 把多平台发布和变现放进同一套系统，说明创作者工具正在从生成器变成运营 agent。</li>
<li class=""><strong>AI 与物理世界的接口更加多样。</strong> UI-TARS 走 GUI / desktop，RuView 走 WiFi sensing，说明“agent 看见世界”的方式不再只有网页和截图。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/5/17/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>本周 GitHub Trending 的核心信号可以概括为一句话：<strong>AI agent 生态正在从“模型会不会做”转向“系统能不能让它做完”</strong>。</p>
<p>未来几个月，真正值得跟踪的未必是又一个聊天入口，而是这些看起来更底层、更琐碎、但更接近生产问题的组件：浏览器、记忆、路由、质量检查、数据连接器、行业 workflow、物理世界接口。它们决定了 agent 能不能从 demo 走到可持续使用。</p>
<p>如果说 2025 年大家还在争论 agent 是不是 hype，那么 2026 年的开源榜单已经在回答另一个问题：<strong>当 agent 真的开始工作，我们还缺哪些基础设施？</strong> 本周的答案是：缺一个能进真实网站的浏览器，缺长期记忆，缺便宜稳定的模型路由，缺质量守门，缺行业流程，也缺更多面向真实世界的“手”和“眼睛”。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：AI 与非 AI 热门项目观察（2026-05-10）]]></title>
            <link>https://xiebo.fun/blog/2026/5/10/</link>
            <guid>https://xiebo.fun/blog/2026/5/10/</guid>
            <pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending 周榜继续围绕 agent 工程化展开，但焦点从“让 agent 会写代码”进一步扩展到金融工作流、团队编排、鲜活上下文和可交付后端。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）的主线很清楚：<strong>AI 热门项目正在从“coding agent 工具”升级为“可被行业、团队和生产系统接纳的 agent 基础设施”</strong>。如果说过去几周的关键词是 skills、CLAUDE.md、代码上下文和模型路由，那么这一周更像是这些能力开始分化到具体场景：金融分析、项目交付、后端资源、数据索引、浏览器访问、音乐与短视频生产。</p>
<p>非 AI 项目仍然不多，但榜单里出现了两个很有代表性的方向：一个是开源电子签名，另一个是 OSINT 用户名调查。它们说明在 AI 叙事之外，能直接替代 SaaS、能直接服务安全调查的工具，依然有稳定的开源传播力。</p>
<blockquote>
<p>本文主要基于 GitHub Trending weekly 页面，以及相关仓库公开 README / GitHub 元数据做归纳。Trending 页面只展示热度结果，不解释传播路径，所以“为什么这周变热”会结合项目定位、榜单位置、近期更新和当前开发者需求做审慎判断。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/5/10/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>金融成为本周 AI agent 最突出的垂直场景。</strong> Anthropic 的金融服务参考仓库、TradingAgents 和 Dexter 同时冲上周榜，说明“让 agent 进入高价值专业工作流”正在取代泛泛的聊天助手叙事。</li>
<li class=""><strong>Coding agent 的下一阶段是“管理工作”，不是“盯着模型写代码”。</strong> OpenAI Symphony、Ruflo、jcode 这类项目都在把 agent 从单会话工具变成可编排、可评估、可跨任务复用的执行系统。</li>
<li class=""><strong>上下文基础设施继续升温。</strong> CocoIndex 把“fresh context”作为核心卖点，说明开发者已经意识到：长周期 agent 的瓶颈不是一次检索，而是持续、增量、低延迟地把真实世界数据喂给模型。</li>
<li class=""><strong>Agentic coding 反过来催生后端平台。</strong> InsForge 的热度说明，当 coding agent 开始写完整应用时，它需要的不只是代码编辑器，还需要数据库、鉴权、存储、部署、日志和 AI 网关这些可操作资源。</li>
<li class=""><strong>非 AI 项目靠“可替代 SaaS / 可立即执行”出圈。</strong> DocuSeal 和 Maigret 的共同点是场景明确、安装后马上有价值：一个替代 DocuSign，一个把用户名 OSINT 规模化。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/5/10/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-anthropicsfinancial-services">1. <a href="https://github.com/anthropics/financial-services" target="_blank" rel="noopener noreferrer" class="">anthropics/financial-services</a><a href="https://xiebo.fun/blog/2026/5/10/#1-anthropicsfinancial-services" class="hash-link" aria-label="1-anthropicsfinancial-services的直接链接" title="1-anthropicsfinancial-services的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Anthropic 面向金融服务场景开源的一组参考 agents、skills 和数据连接器，覆盖投行、股票研究、私募、财富管理等工作流。README 里强调同一套 system prompt 和 skills 可以作为 Claude Cowork 插件使用，也可以通过 Claude Managed Agents API 部署到自有 workflow engine 里。</li>
<li class=""><strong>为什么这周会热</strong>：这是一个很强的信号：大模型公司不只是在展示通用模型能力，而是在把“行业工作流模板”直接做成开源参考实现。金融场景本身高价值、高流程化、强合规，天然适合展示 agent 如何辅助写模型、备忘录、研究笔记、对账等 analyst work product。</li>
<li class=""><strong>有什么新意</strong>：它的新意不是“AI 能分析金融”这个口号，而是把 agent、skills、slash commands、data connectors 和人工签核边界打包在一起。尤其是 README 明确强调不做投资建议、不执行交易、不批准风险，所有输出都进入 human sign-off，这比很多金融 AI demo 更接近真实机构落地方式。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-ruvnetruflo">2. <a href="https://github.com/ruvnet/ruflo" target="_blank" rel="noopener noreferrer" class="">ruvnet/ruflo</a><a href="https://xiebo.fun/blog/2026/5/10/#2-ruvnetruflo" class="hash-link" aria-label="2-ruvnetruflo的直接链接" title="2-ruvnetruflo的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 Claude Code 的 multi-agent orchestration 平台，主打 swarms、自学习记忆、联邦通信、企业安全和 Claude Code / Codex 集成。它试图给 Claude Code 加一个“神经系统”：agent 可以协作、记忆、路由任务，而不是只在单个会话里响应指令。</li>
<li class=""><strong>为什么这周会热</strong>：开发者已经接受 coding agent，但越来越不想手动监督每一步。Ruflo 把多个热门词放在同一条产品线上：Claude Code、MCP、skills、memory、swarm、federation、enterprise security，很容易击中当前 agent 工程化焦虑。</li>
<li class=""><strong>有什么新意</strong>：它代表的是“agent orchestration 平台化”。过去大家关注单个 agent 能不能完成任务，现在开始关心一组 agent 如何跨机器、跨团队、跨信任边界协作。无论具体实现成熟度如何，这种叙事本身说明 agent 正在从个人工具向组织基础设施移动。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-tauricresearchtradingagents">3. <a href="https://github.com/TauricResearch/TradingAgents" target="_blank" rel="noopener noreferrer" class="">TauricResearch/TradingAgents</a><a href="https://xiebo.fun/blog/2026/5/10/#3-tauricresearchtradingagents" class="hash-link" aria-label="3-tauricresearchtradingagents的直接链接" title="3-tauricresearchtradingagents的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个金融交易研究方向的多 agent LLM 框架，把基本面分析师、情绪分析师、技术分析师、交易员、风控团队等角色组织成协作流程，用来分析市场条件和形成交易研究结论。</li>
<li class=""><strong>为什么这周会热</strong>：它已经连续多周保持热度，说明金融 multi-agent 不只是短暂噱头。相比通用 agent demo，交易研究更容易展示多角色协作的合理性：不同 agent 分别处理新闻、财报、技术指标、风险讨论，天然适合流程化编排。</li>
<li class=""><strong>有什么新意</strong>：新意在于把 multi-agent 从“角色扮演聊天”推向高约束领域。金融研究需要可追踪的决策过程、时间一致性、风险复核和人工判断，TradingAgents 正好提供了一个观察垂直 multi-agent 系统的样本。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-viratttdexter">4. <a href="https://github.com/virattt/dexter" target="_blank" rel="noopener noreferrer" class="">virattt/dexter</a><a href="https://xiebo.fun/blog/2026/5/10/#4-viratttdexter" class="hash-link" aria-label="4-viratttdexter的直接链接" title="4-viratttdexter的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个自治金融研究 agent，README 里把自己描述成“Think Claude Code, but built specifically for financial research”。它会把复杂金融问题拆成研究计划，调用实时市场数据，检查自己的工作并迭代结果。</li>
<li class=""><strong>为什么这周会热</strong>：它踩中了两个同时升温的方向：一是 agentic research，二是金融数据工作流。相比“帮我搜索一下公司”的普通助手，Dexter 更强调 task planning、自我校验、实时财务数据和 runaway execution 防护，听起来更像一个可运行的研究流程。</li>
<li class=""><strong>有什么新意</strong>：它的差异点在于把 coding agent 的执行范式迁移到金融研究：规划、执行、验证、反思、继续执行。这说明 agent 产品形态正在从软件工程复制到知识密集型行业。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-openaisymphony">5. <a href="https://github.com/openai/symphony" target="_blank" rel="noopener noreferrer" class="">openai/symphony</a><a href="https://xiebo.fun/blog/2026/5/10/#5-openaisymphony" class="hash-link" aria-label="5-openaisymphony的直接链接" title="5-openaisymphony的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：OpenAI 开源的工程预览项目，用来把项目工作转成隔离的、自主的实现运行。README 示例里，Symphony 监听 Linear 看板，启动 agent 处理任务，并要求 agent 提供 CI 状态、PR review 反馈、复杂度分析、walkthrough videos 等 proof of work。</li>
<li class=""><strong>为什么这周会热</strong>：OpenAI 亲自把“manage work instead of supervising coding agents”写成项目定位，非常准确地命中了 coding agent 的下一阶段痛点：不是模型会不会写，而是团队如何放心地把一条工作项交出去。</li>
<li class=""><strong>有什么新意</strong>：它把 agent 管理从聊天界面拉到项目管理层。真正重要的不是 agent 说“我做完了”，而是它能否在隔离环境里交出可验证证据：测试、CI、PR、评审、复杂度说明。这是 agent 进入工程组织的关键门槛。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-cocoindex-iococoindex">6. <a href="https://github.com/cocoindex-io/cocoindex" target="_blank" rel="noopener noreferrer" class="">cocoindex-io/cocoindex</a><a href="https://xiebo.fun/blog/2026/5/10/#6-cocoindex-iococoindex" class="hash-link" aria-label="6-cocoindex-iococoindex的直接链接" title="6-cocoindex-iococoindex的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向长周期 agent 的增量索引和上下文引擎，可以把代码库、会议记录、邮箱、Slack、PDF、视频等数据变成持续更新的上下文，供 AI agents 和 LLM 应用使用。</li>
<li class=""><strong>为什么这周会热</strong>：agent 越长周期，越怕 stale context。传统 RAG 很多时候是批处理：索引一次，然后慢慢过期。CocoIndex 把重点放在 incremental、fresh、declarative 和 parallel by default，正好对应生产级 agent 的数据新鲜度问题。</li>
<li class=""><strong>有什么新意</strong>：它代表“上下文工程”从搜索功能升级为数据工程。未来 agent 的质量，很大程度取决于它拿到的数据是否及时、干净、结构化、可追踪；这类项目会成为 agent infra 的底层拼图。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-insforgeinsforge">7. <a href="https://github.com/InsForge/InsForge" target="_blank" rel="noopener noreferrer" class="">InsForge/InsForge</a><a href="https://xiebo.fun/blog/2026/5/10/#7-insforgeinsforge" class="hash-link" aria-label="7-insforgeinsforge的直接链接" title="7-insforgeinsforge的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 agentic coding 的开源后端平台，给 coding agent 提供数据库、鉴权、存储、compute、hosting 和 AI gateway。它通过 MCP Server 或 CLI + Skills 暴露能力，让 agent 像后端工程师一样查看状态、跑迁移、部署函数、配置资源和读日志。</li>
<li class=""><strong>为什么这周会热</strong>：当 coding agent 只写前端 demo 时，一个代码编辑器就够了；当它要交付完整应用时，就必须碰数据库、鉴权、对象存储、部署和运行时日志。InsForge 抓住的正是“agent 要真正 ship full-stack apps”这个新需求。</li>
<li class=""><strong>有什么新意</strong>：它不是又一个 BaaS，而是把后端平台重新包装成 agent 可操作环境。也就是说，产品接口不只面向人类开发者，还面向会调用 MCP / CLI 的 coding agent。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-1jehuangjcode">8. <a href="https://github.com/1jehuang/jcode" target="_blank" rel="noopener noreferrer" class="">1jehuang/jcode</a><a href="https://xiebo.fun/blog/2026/5/10/#8-1jehuangjcode" class="hash-link" aria-label="8-1jehuangjcode的直接链接" title="8-1jehuangjcode的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 Rust 编写的 coding agent harness，强调多会话工作流、可定制性和性能 / 资源效率。项目定位是提高 agent 使用的 skill ceiling，而不是只做一个简单聊天 CLI。</li>
<li class=""><strong>为什么这周会热</strong>：随着 coding agent 使用变频繁，工程师会开始关心启动速度、内存占用、多 session 管理和长期工作流，而不是只看模型输出质量。jcode 把这些更“工具工程”的问题拿出来做卖点，很符合重度用户需求。</li>
<li class=""><strong>有什么新意</strong>：它提示我们：coding agent CLI 本身也会进入“开发者工具竞争”。当模型能力逐渐商品化，谁能把本地体验、会话管理、性能、扩展能力做得更好，谁就更容易留住高频用户。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai-热门项目">非 AI 热门项目<a href="https://xiebo.fun/blog/2026/5/10/#%E9%9D%9E-ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI 热门项目的直接链接" title="非 AI 热门项目的直接链接" translate="no">​</a></h2>
<blockquote>
<p>本周非 AI 项目依然偏少，榜单注意力主要被 AI / agent 生态吸走。这里不硬凑数量，只选两个代表性强、和 AI 叙事相对独立的项目。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-docusealcodocuseal">1. <a href="https://github.com/docusealco/docuseal" target="_blank" rel="noopener noreferrer" class="">docusealco/docuseal</a><a href="https://xiebo.fun/blog/2026/5/10/#1-docusealcodocuseal" class="hash-link" aria-label="1-docusealcodocuseal的直接链接" title="1-docusealcodocuseal的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源 DocuSign 替代品，用于创建、填写和签署数字文档，支持 PDF 表单字段构建、多签署人、邮件通知、对象存储、签名验证、API、Webhook 和自托管部署。</li>
<li class=""><strong>为什么这周会热</strong>：电子签名是典型的高频商业 SaaS 场景，但很多团队对成本、数据控制和自托管有需求。DocuSeal 这种“开源替代成熟 SaaS”的定位非常清晰，用户一眼能判断是否有用。</li>
<li class=""><strong>有什么新意</strong>：它的新意不在底层密码学突破，而在于把一个传统企业流程做成可部署、可集成、可白标的开源产品。对中小团队和对合规 / 数据驻留敏感的组织来说，这类项目会长期有吸引力。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-soxojmaigret">2. <a href="https://github.com/soxoj/maigret" target="_blank" rel="noopener noreferrer" class="">soxoj/maigret</a><a href="https://xiebo.fun/blog/2026/5/10/#2-soxojmaigret" class="hash-link" aria-label="2-soxojmaigret的直接链接" title="2-soxojmaigret的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 OSINT 用户名调查工具，只凭用户名就能在 3000+ 网站上查找账号并收集公开资料，支持标签过滤、递归搜索、Web UI、Python 嵌入和多格式报告。</li>
<li class=""><strong>为什么这周会热</strong>：OSINT 和账号画像是安全研究、反欺诈、蓝队排查、社媒分析中的稳定需求。Maigret 的优势是覆盖面广、安装简单、无需 API key，<code>pip install maigret</code> 后就能直接跑。</li>
<li class=""><strong>有什么新意</strong>：它把“用户名搜索”从零散网站查询变成大规模、可报告、可嵌入的流程。非 AI 项目要在当前榜单里突围，往往就需要这种明确、强需求、低启动成本的工具密度。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/5/10/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-垂直化正在先从金融跑出来">1. Agent 垂直化正在先从金融跑出来<a href="https://xiebo.fun/blog/2026/5/10/#1-agent-%E5%9E%82%E7%9B%B4%E5%8C%96%E6%AD%A3%E5%9C%A8%E5%85%88%E4%BB%8E%E9%87%91%E8%9E%8D%E8%B7%91%E5%87%BA%E6%9D%A5" class="hash-link" aria-label="1. Agent 垂直化正在先从金融跑出来的直接链接" title="1. Agent 垂直化正在先从金融跑出来的直接链接" translate="no">​</a></h3>
<p>本周金融相关项目异常集中：Anthropic 的 financial-services、TradingAgents、Dexter 都在周榜前列。金融并不是唯一适合 agent 的行业，但它有几个特别适合开源传播的特点：工作流文档化程度高、数据接口多、专业角色清晰、输出物标准化、商业价值高。</p>
<p>这也意味着后续我们可能会看到更多“行业 agent starter kit”：法律、医疗、销售、采购、审计、投研、客服、供应链。真正有价值的不只是模型，而是把行业任务拆成 agent、skills、connectors、guardrails 和 human review 的组合。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-coding-agent-的竞争焦点转向可管理性">2. Coding agent 的竞争焦点转向“可管理性”<a href="https://xiebo.fun/blog/2026/5/10/#2-coding-agent-%E7%9A%84%E7%AB%9E%E4%BA%89%E7%84%A6%E7%82%B9%E8%BD%AC%E5%90%91%E5%8F%AF%E7%AE%A1%E7%90%86%E6%80%A7" class="hash-link" aria-label="2. Coding agent 的竞争焦点转向“可管理性”的直接链接" title="2. Coding agent 的竞争焦点转向“可管理性”的直接链接" translate="no">​</a></h3>
<p>OpenAI Symphony、Ruflo、jcode 都在不同层面回答同一个问题：当 agent 不再只是聊天窗口，而是能长时间执行任务时，人类该怎么管理它？</p>
<p>答案不再是“多给 prompt”，而是隔离执行环境、任务队列、proof of work、CI 验证、多会话状态、agent 编排、记忆和权限边界。这些听起来不如模型发布刺激，但它们才是 agent 进入真实工程团队的基础设施。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-fresh-context-会比更长上下文窗口更重要">3. Fresh context 会比更长上下文窗口更重要<a href="https://xiebo.fun/blog/2026/5/10/#3-fresh-context-%E4%BC%9A%E6%AF%94%E6%9B%B4%E9%95%BF%E4%B8%8A%E4%B8%8B%E6%96%87%E7%AA%97%E5%8F%A3%E6%9B%B4%E9%87%8D%E8%A6%81" class="hash-link" aria-label="3. Fresh context 会比更长上下文窗口更重要的直接链接" title="3. Fresh context 会比更长上下文窗口更重要的直接链接" translate="no">​</a></h3>
<p>CocoIndex 的热度说明，大家开始意识到：光有长上下文窗口不等于 agent 拿到正确上下文。如果代码、文档、会议记录、工单、Slack、PDF 都在变化，那么真正的问题是如何增量处理、持续更新、保持一致性。</p>
<p>这会把一部分 AI 应用开发重新拉回数据工程：变更捕获、索引、数据血缘、更新策略、错误恢复、并行处理、权限过滤，都可能成为 agent 质量的一部分。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-agentic-coding-正在重塑开发平台接口">4. Agentic coding 正在重塑开发平台接口<a href="https://xiebo.fun/blog/2026/5/10/#4-agentic-coding-%E6%AD%A3%E5%9C%A8%E9%87%8D%E5%A1%91%E5%BC%80%E5%8F%91%E5%B9%B3%E5%8F%B0%E6%8E%A5%E5%8F%A3" class="hash-link" aria-label="4. Agentic coding 正在重塑开发平台接口的直接链接" title="4. Agentic coding 正在重塑开发平台接口的直接链接" translate="no">​</a></h3>
<p>InsForge 很值得关注，因为它不是单纯给人用的后端平台，而是明确让 coding agent 通过 MCP / CLI 操作后端资源。过去平台 API 主要面向人写脚本；现在平台要考虑 agent 如何读上下文、执行变更、验证结果和调试日志。</p>
<p>如果这个趋势继续，数据库、云平台、监控、CI、支付、CMS、客服系统都会出现更“agent-native”的接口层。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-非-ai-项目的出圈路径更像开源替代--立即可用">5. 非 AI 项目的出圈路径更像“开源替代 + 立即可用”<a href="https://xiebo.fun/blog/2026/5/10/#5-%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E7%9A%84%E5%87%BA%E5%9C%88%E8%B7%AF%E5%BE%84%E6%9B%B4%E5%83%8F%E5%BC%80%E6%BA%90%E6%9B%BF%E4%BB%A3--%E7%AB%8B%E5%8D%B3%E5%8F%AF%E7%94%A8" class="hash-link" aria-label="5. 非 AI 项目的出圈路径更像“开源替代 + 立即可�用”的直接链接" title="5. 非 AI 项目的出圈路径更像“开源替代 + 立即可用”的直接链接" translate="no">​</a></h3>
<p>DocuSeal 和 Maigret 都不是靠 AI 叙事冲榜，但它们有共同优势：用户场景明确、价值直观、安装后马上能跑。一个替代昂贵 / 封闭的电子签名 SaaS，一个把 OSINT 调查规模化。</p>
<p>这提醒我们：即使 AI 项目占据榜单主线，开源社区依然奖励那些能把复杂流程压缩成清晰入口的工具。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/5/10/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>Anthropic 开源金融服务 agent 模板</strong>：这比普通 demo 更接近行业落地，把 agent、skills、connectors 和 human sign-off 放在同一套参考实现里。</li>
<li class=""><strong>OpenAI Symphony 把 agent 管理提升到工作管理层</strong>：重点不再是监督每一步，而是要求 agent 交出可验证 proof of work。</li>
<li class=""><strong>金融 research agent 扎堆上榜</strong>：TradingAgents 和 Dexter 说明 multi-agent / autonomous research 正在向高价值专业场景集中。</li>
<li class=""><strong>Fresh context 成为 agent infra 关键词</strong>：CocoIndex 代表从“做一次 RAG”转向“持续维护上下文”。</li>
<li class=""><strong>后端平台开始 agent-native 化</strong>：InsForge 说明 coding agent 需要可调用、可验证、可调试的真实后端资源。</li>
<li class=""><strong>非 AI 仍靠明确刚需突围</strong>：DocuSeal 和 Maigret 分别证明开源 SaaS 替代与安全工具箱依然有传播力。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/5/10/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>本周 GitHub Trending 给出的信号可以概括成一句话：<strong>agent 热点正在从“个人开发者工具”扩展成“行业工作流与组织基础设施”</strong>。金融 agent、工作编排、fresh context、agent-native backend、multi-session harness，这些方向看起来分散，但都在回答同一个问题：AI 如何从一次性演示进入可管理、可审计、可交付的真实系统。</p>
<p>非 AI 项目虽然仍处在弱势位置，但 DocuSeal 和 Maigret 也提醒我们，开源热度最终不是只奖励概念，而是奖励清晰场景与立即可用。接下来几周值得继续观察的是：agent 基础设施会不会继续垂直化，以及更多传统开发平台会不会开始为 agent 重新设计接口。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：AI 与非 AI 热门项目观察（2026-05-03）]]></title>
            <link>https://xiebo.fun/blog/2026/5/3/</link>
            <guid>https://xiebo.fun/blog/2026/5/3/</guid>
            <pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending 周榜继续围绕 coding agent 的“可控、可复用、可接入”展开，同时安全工具箱和 OSINT 项目在非 AI 侧保持存在感。]]></description>
            <content:encoded><![CDATA[<p>本周 GitHub Trending（weekly）的主题非常集中：<strong>AI 热点不再只是“做一个 agent”，而是在补 agent 真正进入日常工程后的短板</strong>——如何沉淀技能、如何约束行为、如何接入不同模型、如何理解代码库、如何把内容生产或金融决策做成流水线。</p>
<p>榜单同时也给出一个很有意思的反差：非 AI 项目数量不多，但能冲上来的往往是“工具密度极高”的安全 / OSINT 仓库。也就是说，AI 叙事虽然强势，但开发者对“马上能拿来解决问题的工具箱”依然有稳定需求。</p>
<blockquote>
<p>本文主要基于 GitHub Trending weekly 页面，以及相关仓库公开 README / 元数据做归纳。Trending 本身不解释传播来源，所以“为什么本周会热”会结合榜单位置、周增星、项目近期更新与当前开发者需求做审慎判断。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/5/3/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>Agent 的主战场从能力演示转向工程控制。</strong> 本周多个热门项目都在解决 coding agent 的行为约束、技能复用、模型接入和代码上下文问题。</li>
<li class=""><strong>“Claude Code 生态”仍是开源注意力中心。</strong> skills、CLAUDE.md、Anthropic API 兼容代理、MCP / 代码图谱等项目都围绕这一类工作流扩散。</li>
<li class=""><strong>AI 应用开始从通用助手走向垂直生产线。</strong> 金融多 agent、短视频自动生成、DeepSeek 协议适配都不是纯 demo，而是在把 LLM 嵌入具体业务链路。</li>
<li class=""><strong>非 AI 项目弱但不消失。</strong> 安全工具聚合与 OSINT 搜索仍能获得高热度，说明“高密度、低门槛、可立即运行”的工具型项目仍有强传播力。</li>
<li class=""><strong>本周最明显的新鲜点是：prompt / skill / graph / proxy 正在成为 agent 基础设施。</strong> 模型之外，大家更关心让模型在真实环境里少犯错、看得全、接得上、跑得稳。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/5/3/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-mattpocockskills">1. <a href="https://github.com/mattpocock/skills" target="_blank" rel="noopener noreferrer" class="">mattpocock/skills</a><a href="https://xiebo.fun/blog/2026/5/3/#1-mattpocockskills" class="hash-link" aria-label="1-mattpocockskills的直接链接" title="1-mattpocockskills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：Matt Pocock 把自己日常用于真实工程工作的 agent skills 开源出来，强调小、可组合、可改造，并通过 <code>npx skills@latest add mattpocock/skills</code> 这样的方式安装到不同 coding agent 工作流里。</li>
<li class=""><strong>为什么这周会热</strong>：它拿到非常夸张的周增星，说明开发者已经不满足于“让 agent 随便写代码”，而是需要一组可复用的工作方法来处理需求澄清、任务拆解、实现验证等实际工程问题。相比重型流程框架，skills 的传播成本低很多。</li>
<li class=""><strong>有什么新意</strong>：新意在于把高级工程经验做成“可安装的工作习惯”。它不是要求用户换一个 agent 平台，而是把 agent 行为拆成小技能，让 Claude Code、Codex 等工具都能受益。这种“经验包管理器化”可能会成为 coding agent 生态的新形态。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-forrestchangandrej-karpathy-skills">2. <a href="https://github.com/forrestchang/andrej-karpathy-skills" target="_blank" rel="noopener noreferrer" class="">forrestchang/andrej-karpathy-skills</a><a href="https://xiebo.fun/blog/2026/5/3/#2-forrestchangandrej-karpathy-skills" class="hash-link" aria-label="2-forrestchangandrej-karpathy-skills的直接链接" title="2-forrestchangandrej-karpathy-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个单文件 <code>CLAUDE.md</code>，把 Andrej Karpathy 对 LLM coding 常见失败模式的观察整理成 Claude Code 行为准则，重点包括先思考再编码、保持简单、外科手术式改动、目标驱动执行。</li>
<li class=""><strong>为什么这周会热</strong>：项目把一个高度共鸣的问题变成了极低门槛的解决方案：把文件放进仓库即可。LLM coding 的痛点不是大家不知道，而是很难持续约束模型；<code>CLAUDE.md</code> 这种仓库级规则文件刚好击中团队落地需求。</li>
<li class=""><strong>有什么新意</strong>：它的价值不在复杂技术，而在“约束接口”足够轻。相比再造 agent 框架，它更像是一层代码库里的行为宪法：减少擅自假设、过度抽象和无关修改。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-alishahryar1free-claude-code">3. <a href="https://github.com/Alishahryar1/free-claude-code" target="_blank" rel="noopener noreferrer" class="">Alishahryar1/free-claude-code</a><a href="https://xiebo.fun/blog/2026/5/3/#3-alishahryar1free-claude-code" class="hash-link" aria-label="3-alishahryar1free-claude-code的直接链接" title="3-alishahryar1free-claude-code的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 Anthropic Messages API 兼容代理，用来把 Claude Code、VS Code、JetBrains ACP 或聊天机器人客户端的请求路由到 NVIDIA NIM、OpenRouter、DeepSeek、LM Studio、llama.cpp、Ollama 等后端。</li>
<li class=""><strong>为什么这周会热</strong>：Claude Code 已经成为很多开发者的默认 coding agent，但成本、模型选择和本地化部署仍是门槛。这个项目抓住了“保留 Claude Code 客户端体验，同时切换不同模型后端”的需求，因此容易快速传播。</li>
<li class=""><strong>有什么新意</strong>：它体现的是 agent 客户端与模型后端的解耦趋势。用户想要的是稳定的工具入口、流式输出、tool use、模型选择器等体验，而不是被单一供应商绑定。不过这类代理也要注意各上游服务条款和密钥安全，不宜把“免费”简单理解成无风险。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-tauricresearchtradingagents">4. <a href="https://github.com/TauricResearch/TradingAgents" target="_blank" rel="noopener noreferrer" class="">TauricResearch/TradingAgents</a><a href="https://xiebo.fun/blog/2026/5/3/#4-tauricresearchtradingagents" class="hash-link" aria-label="4-tauricresearchtradingagents的直接链接" title="4-tauricresearchtradingagents的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向金融交易研究的多 agent LLM 框架，把基本面分析师、情绪分析师、技术分析师、交易员、风控团队等角色组织成协作流程，用于评估市场条件和形成交易决策。</li>
<li class=""><strong>为什么这周会热</strong>：项目近期版本继续加入 structured-output agents、LangGraph checkpoint resume、持久化决策日志、更多模型提供商、Docker 等工程能力。它不只是“LLM 炒股”的噱头，而是在把多 agent 金融研究流程做得更可复现。</li>
<li class=""><strong>有什么新意</strong>：新意在于把多 agent 从通用聊天编排推进到一个高约束领域：金融决策需要角色分工、可追踪日志、回测时间一致性和风控讨论。它很适合作为“垂直 multi-agent system”观察样本。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-cjackhwangds2api">5. <a href="https://github.com/CJackHwang/ds2api" target="_blank" rel="noopener noreferrer" class="">CJackHwang/ds2api</a><a href="https://xiebo.fun/blog/2026/5/3/#5-cjackhwangds2api" class="hash-link" aria-label="5-cjackhwangds2api的直接链接" title="5-cjackhwangds2api的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 Go 实现的 DeepSeek 兼容中间件，把 DeepSeek Web 对话能力转换成 OpenAI、Claude、Gemini 兼容 API，同时提供 WebUI 管理台、并发池、鉴权、流式桥接和工具调用适配等能力。</li>
<li class=""><strong>为什么这周会热</strong>：开发者对 DeepSeek 的需求仍然旺盛，但真实工作流往往围绕 OpenAI / Claude / Gemini 兼容接口构建。<code>ds2api</code> 提供了协议适配层，让现有客户端和 SDK 更容易复用 DeepSeek 生态能力。</li>
<li class=""><strong>有什么新意</strong>：它代表的是“模型协议转接层”的升温。模型越来越多，真正麻烦的是把不同 API surface 接到同一套应用里；这类中间件如果能处理好并发、鉴权、流式和 tool call，就会成为 AI 应用基础设施的一部分。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-abhigyanpatwarigitnexus">6. <a href="https://github.com/abhigyanpatwari/GitNexus" target="_blank" rel="noopener noreferrer" class="">abhigyanpatwari/GitNexus</a><a href="https://xiebo.fun/blog/2026/5/3/#6-abhigyanpatwarigitnexus" class="hash-link" aria-label="6-abhigyanpatwarigitnexus的直接链接" title="6-abhigyanpatwarigitnexus的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个零服务器代码智能引擎，可以把 GitHub 仓库或 ZIP 代码库索引成知识图谱，在浏览器里探索依赖、调用链、执行流，也能通过 CLI + MCP 给 Claude Code、Cursor、Codex 等 agent 提供更深的代码上下文。</li>
<li class=""><strong>为什么这周会热</strong>：coding agent 的核心瓶颈之一是“看不见全局”。README 里直接把自己定位为 agent context 的 nervous system，正好踩中当前开发者对代码库级理解、Graph RAG、MCP 接入的需求。</li>
<li class=""><strong>有什么新意</strong>：相比普通 README 生成或浅层代码问答，知识图谱更强调关系：依赖、调用链、模块簇、执行路径。对 agent 来说，这类结构化上下文比单纯塞更多文本更有价值。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-aidc-aipixelle-video">7. <a href="https://github.com/AIDC-AI/Pixelle-Video" target="_blank" rel="noopener noreferrer" class="">AIDC-AI/Pixelle-Video</a><a href="https://xiebo.fun/blog/2026/5/3/#7-aidc-aipixelle-video" class="hash-link" aria-label="7-aidc-aipixelle-video的直接链接" title="7-aidc-aipixelle-video的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 AI 全自动短视频引擎，输入主题后自动生成文案、配图 / 视频、语音解说、背景音乐，并合成成品视频，底层支持 ComfyUI、TTS、多种 LLM 和自定义工作流。</li>
<li class=""><strong>为什么这周会热</strong>：短视频是 AI 内容生产里最接近真实需求的场景之一。这个项目把“脚本—画面—语音—音乐—剪辑”串成流水线，降低了非专业用户试用门槛。</li>
<li class=""><strong>有什么新意</strong>：它不是单点文生视频模型，而是把多个 AI 能力编排成完整内容工厂。尤其是动作迁移、数字人口播、图生视频、模板化流程等模块，说明开源 AIGC 正从“生成素材”走向“生成成片”。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai-热门项目">非 AI 热门项目<a href="https://xiebo.fun/blog/2026/5/3/#%E9%9D%9E-ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI 热门项目的直接链接" title="非 AI 热门项目的直接链接" translate="no">​</a></h2>
<blockquote>
<p>本周非 AI 热门项目相对偏少，榜单注意力主要被 AI / agent 生态吸走。这里不硬凑数量，只挑真正有代表性的安全与 OSINT 工具。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-z4nzuhackingtool">1. <a href="https://github.com/Z4nzu/hackingtool" target="_blank" rel="noopener noreferrer" class="">Z4nzu/hackingtool</a><a href="https://xiebo.fun/blog/2026/5/3/#1-z4nzuhackingtool" class="hash-link" aria-label="1-z4nzuhackingtool的直接链接" title="1-z4nzuhackingtool的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向安全研究和渗透测试的 All-in-One 工具集合，覆盖信息收集、Web 攻击、密码攻击、逆向、安全扫描等多个类别。新版强调 Python 3.10+、185+ 工具、OS-aware 菜单、搜索、标签过滤、推荐、批量安装和 Docker。</li>
<li class=""><strong>为什么这周会热</strong>：安全工具箱型项目有天然传播优势：用户一眼能理解价值，安装后马上能试。新版 v2.0.0 的现代化菜单、搜索和批量安装，也让老项目重新具备传播点。</li>
<li class=""><strong>有什么新意</strong>：严格说它不是全新的安全研究范式，而是把工具聚合体验显著产品化。对入门者和 CTF / 实验室用户来说，“少找工具、多做实验”本身就是强需求。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-soxojmaigret">2. <a href="https://github.com/soxoj/maigret" target="_blank" rel="noopener noreferrer" class="">soxoj/maigret</a><a href="https://xiebo.fun/blog/2026/5/3/#2-soxojmaigret" class="hash-link" aria-label="2-soxojmaigret的直接链接" title="2-soxojmaigret的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 OSINT 用户名调查工具，仅凭用户名即可在 3000+ 网站上查找账号并收集公开资料，支持递归搜索、标签过滤、Tor / I2P、Web 界面和多格式报告。</li>
<li class=""><strong>为什么这周会热</strong>：开源情报和账号画像一直有稳定需求，尤其在安全研究、反欺诈、社媒分析和蓝队排查场景里。<code>maigret</code> 的优势是覆盖站点多、安装门槛低、报告输出直接可用。</li>
<li class=""><strong>有什么新意</strong>：它的新意在“规模化与可操作性”：不是只查几个常见社交网站，而是维护大规模站点数据库，并把搜索、解析、递归发现、报告生成串成完整流程。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/5/3/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-skills-正在成为-agent-时代的团队流程资产">1. Skills 正在成为 agent 时代的“团队流程资产”<a href="https://xiebo.fun/blog/2026/5/3/#1-skills-%E6%AD%A3%E5%9C%A8%E6%88%90%E4%B8%BA-agent-%E6%97%B6%E4%BB%A3%E7%9A%84%E5%9B%A2%E9%98%9F%E6%B5%81%E7%A8%8B%E8%B5%84%E4%BA%A7" class="hash-link" aria-label="1. Skills 正在成为 agent 时代的“团队流程资产”的直接链接" title="1. Skills 正在成为 agent 时代的“团队流程资产”的直接链接" translate="no">​</a></h3>
<p>本周两个最显眼的项目都和 skills / CLAUDE.md 相关。它们说明一个变化：过去大家把 prompt 当一次性技巧，现在开始把 prompt、流程、约束沉淀成仓库资产、团队资产，甚至可以安装、版本化、复用。</p>
<p>这对工程团队很关键。真正影响 agent 产出的往往不是单次回答，而是它是否持续遵守团队约定：先问清楚、少改无关代码、写测试、验证结果、不要过度抽象。这些经验如果不能落盘，每次对话都要重新教一遍。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-coding-agent-生态在做前端稳定后端可替换">2. Coding agent 生态在做“前端稳定、后端可替换”<a href="https://xiebo.fun/blog/2026/5/3/#2-coding-agent-%E7%94%9F%E6%80%81%E5%9C%A8%E5%81%9A%E5%89%8D%E7%AB%AF%E7%A8%B3%E5%AE%9A%E5%90%8E%E7%AB%AF%E5%8F%AF%E6%9B%BF%E6%8D%A2" class="hash-link" aria-label="2. Coding agent 生态在做“前端稳定、后端可替换”的直接链接" title="2. Coding agent 生态在做“前端稳定、后端可替换”的直接链接" translate="no">​</a></h3>
<p><code>free-claude-code</code> 和 <code>ds2api</code> 都在做协议适配：一个让 Claude Code 请求可路由到不同模型后端，一个把 DeepSeek 能力包装成主流 API 兼容接口。背后的共同逻辑是：应用和工具链希望绑定稳定协议，而不是绑定单一模型。</p>
<p>这意味着未来 AI 应用的基础设施会越来越像传统云服务：客户端、网关、鉴权、路由、兼容层、观测、并发控制都会变得重要。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-代码上下文正在从文本检索升级为结构理解">3. 代码上下文正在从“文本检索”升级为“结构理解”<a href="https://xiebo.fun/blog/2026/5/3/#3-%E4%BB%A3%E7%A0%81%E4%B8%8A%E4%B8%8B%E6%96%87%E6%AD%A3%E5%9C%A8%E4%BB%8E%E6%96%87%E6%9C%AC%E6%A3%80%E7%B4%A2%E5%8D%87%E7%BA%A7%E4%B8%BA%E7%BB%93%E6%9E%84%E7%90%86%E8%A7%A3" class="hash-link" aria-label="3. 代码上下文正在从“文本检索”升级为“结构理解”的直接链接" title="3. 代码上下文正在从“文本检索”升级为“结构理解”的直接链接" translate="no">​</a></h3>
<p><code>GitNexus</code> 的热度很能说明问题。coding agent 的失败，经常不是因为模型不会写某段代码，而是因为它不知道这段代码和系统其它部分的关系。知识图谱、调用链、依赖关系、模块聚类这类结构化上下文，可能比继续扩大 prompt 更实际。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-多-agent-仍然热但正在变垂直">4. 多 agent 仍然热，但正在变垂直<a href="https://xiebo.fun/blog/2026/5/3/#4-%E5%A4%9A-agent-%E4%BB%8D%E7%84%B6%E7%83%AD%E4%BD%86%E6%AD%A3%E5%9C%A8%E5%8F%98%E5%9E%82%E7%9B%B4" class="hash-link" aria-label="4. 多 agent 仍然热，但正在变垂直的直接链接" title="4. 多 agent 仍然热，但正在变垂直的直接链接" translate="no">​</a></h3>
<p><code>TradingAgents</code> 把多 agent 放进金融研究流程，<code>Pixelle-Video</code> 把多个 AI 能力编排成短视频生产线。这说明 multi-agent / workflow 的热点不再只是“多个角色聊天”，而是向具体领域里的可复用流程靠拢：谁负责分析、谁负责决策、谁负责生成、谁负责合成，都要被明确建模。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-非-ai-热点证明工具密度仍然有效">5. 非 AI 热点证明“工具密度”仍然有效<a href="https://xiebo.fun/blog/2026/5/3/#5-%E9%9D%9E-ai-%E7%83%AD%E7%82%B9%E8%AF%81%E6%98%8E%E5%B7%A5%E5%85%B7%E5%AF%86%E5%BA%A6%E4%BB%8D%E7%84%B6%E6%9C%89%E6%95%88" class="hash-link" aria-label="5. 非 AI 热点证明“工具密度”仍然有效的直接链接" title="5. 非 AI 热点证明“工具密度”仍然有效的直接链接" translate="no">​</a></h3>
<p><code>hackingtool</code> 和 <code>maigret</code> 都不是靠模型叙事冲榜，而是靠高工具密度、低启动成本和明确场景。AI 项目再热，开源社区仍然奖励那些能立刻解决具体问题的仓库。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/5/3/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><strong>可安装的 agent skills</strong>：从“我有一套提示词”升级成“我有一套可分发、可组合、可版本化的工程技能”。</li>
<li class=""><strong>CLAUDE.md 规则文件化</strong>：coding agent 的行为治理开始进入代码库本身，而不是只留在用户脑子里。</li>
<li class=""><strong>模型网关 / 协议适配层升温</strong>：不同模型后端与主流客户端之间需要中间件，AI 应用的集成复杂度正在上升。</li>
<li class=""><strong>Graph RAG for code 走向实用化</strong>：代码库理解不只是问答，而是要把依赖和调用关系显式建模。</li>
<li class=""><strong>AI 内容生产进入工作流阶段</strong>：短视频项目的重点不再是单张图或单段视频，而是端到端生产线。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/5/3/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>本周 GitHub Trending 给出的信号很清楚：<strong>AI 开源热点正在从“模型很强”转向“系统可用”</strong>。skills、CLAUDE.md、API proxy、Graph RAG、垂直多 agent、内容流水线，都是在回答同一个问题：怎么让 AI 真正进入开发者和创作者的日常工作，而不是停留在演示视频里。</p>
<p>非 AI 项目虽然数量少，但安全工具箱和 OSINT 工具仍然能冲榜，也提醒我们：开源热度最终仍然奖励实用性。谁能把复杂能力压缩成清晰入口、稳定流程和可立即运行的工具，谁就更容易被开发者记住。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[从 PR Review 到 ArgoCD 发布：一套更可追踪的 Gitea Actions CI/CD 设计]]></title>
            <link>https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops</link>
            <guid>https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops</guid>
            <pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[基于一套真实应用交付流程，拆解如何用 Gitea Actions、版本标签、镜像构建与 GitOps/ArgoCD 发布，搭出边界清晰、可审计、可回滚的 CI/CD 流程。]]></description>
            <content:encoded><![CDATA[<p>很多团队一开始做 CI/CD，目标都很朴素：代码合并后自动构建、自动发到测试环境、必要时再推到线上。</p>
<p>但流程一旦长起来，事情就会慢慢变味：PR 要检查，主干要打版本，测试环境要发，生产环境也要发，最后所有逻辑都堆进一堆 YAML 和脚本里。等到哪次线上出了问题，大家才发现，自己拥有的不是一条可靠的交付链路，而是一团只能靠翻日志排障的自动化拼接物。</p>
<p>我这次想整理的，不是“怎么把 Gitea Actions 配起来”，而是<strong>怎么把一套通用应用交付流程拆成几个边界清楚、彼此可追踪的环节</strong>：PR 阶段做 AI Review，主干阶段沉淀版本事实，开发环境做快速镜像验证，生产环境则通过 GitOps 交给 ArgoCD 接管发布。</p>
<p>本文基于一套真实应用 workflow 设计整理而成。原始场景里用的是多目录应用仓库，但这里我会尽量从<strong>通用应用工作流</strong>的角度来讲，而不是把重点放在仓库组织形式上。</p>
<p>为便于公开分享，文中的域名、镜像仓库、部署仓库、Token、Secret 名称、云账号信息都已脱敏；示例里的 <code>&lt;...&gt;</code> 占位符，表示在实际环境中需要替换成内部配置。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="先把问题拆开为什么-cicd-容易越做越乱">先把问题拆开：为什么 CI/CD 容易越做越乱<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E5%85%88%E6%8A%8A%E9%97%AE%E9%A2%98%E6%8B%86%E5%BC%80%E4%B8%BA%E4%BB%80%E4%B9%88-cicd-%E5%AE%B9%E6%98%93%E8%B6%8A%E5%81%9A%E8%B6%8A%E4%B9%B1" class="hash-link" aria-label="先把问题拆开：为什么 CI/CD 容易越做越乱的直接链接" title="先把问题拆开：为什么 CI/CD 容易越做越乱的直接链接" translate="no">​</a></h2>
<p>无论你的应用是单仓库单服务、前后端分离，还是多应用仓库，CI/CD 一旦走到线上交付阶段，通常都会遇到几个共性问题：</p>
<ul>
<li class="">测试环境和生产环境的发布语义完全不同，却常常被同一套脚本粗暴处理。</li>
<li class="">CI 既负责构建，又直接连 Kubernetes 集群做部署，权限边界不清晰。</li>
<li class="">回滚、审计、追溯都只能靠零散日志，而不是系统性记录。</li>
<li class="">当一个仓库承载多个可发布单元时，版本、构建和发布节奏很容易彼此牵连。</li>
</ul>
<p>所以这套设计的目标，不是“自动化越多越好”，而是把链路拆成几个清晰阶段：</p>
<ol>
<li class=""><strong>PR 阶段</strong>自动做 AI Review，提前发现代码质量和安全问题。</li>
<li class=""><strong>合并到 <code>main</code> 后</strong>，基于真实变更生成对应版本标签。</li>
<li class=""><strong><code>dev</code> 分支变更后</strong>，自动构建测试环境镜像，并更新 GitOps 部署仓库。</li>
<li class=""><strong>生产发布时</strong>，只允许从合法 release tag 构建生产镜像，并由 ArgoCD 根据部署仓库变更完成落地。</li>
</ol>
<p>用一句话概括就是：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">PR 阶段做质量反馈，main 阶段做版本事实，dev 阶段做快速验证，prod 阶段做可审计发布。</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="先看整体这套交付链路是怎么分层的">先看整体：这套交付链路是怎么分层的<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E5%85%88%E7%9C%8B%E6%95%B4%E4%BD%93%E8%BF%99%E5%A5%97%E4%BA%A4%E4%BB%98%E9%93%BE%E8%B7%AF%E6%98%AF%E6%80%8E%E4%B9%88%E5%88%86%E5%B1%82%E7%9A%84" class="hash-link" aria-label="先看整体：这套交付链路是怎么分层的的直接链接" title="先看整体：这套交付链路是怎么分层的的直接链接" translate="no">​</a></h2>
<p>整条链路我更愿意把它理解成四层。先看一张更适合博客阅读的 Mermaid 图：</p>
<!-- -->
<p>如果按职责边界来拆，它对应的是这样四层：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Code Review Layer -&gt; PR 反馈</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Versioning Layer  -&gt; 版本事实</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Build Layer       -&gt; 镜像产物</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">GitOps Layer      -&gt; 部署声明 + ArgoCD 落地</span><br></span></code></pre></div></div>
<p>这里最关键的一点是：<strong>CI 不直接操作 Kubernetes 集群，而是更新部署仓库中的 <code>kustomization.yaml</code>。</strong></p>
<p>也就是说，应用仓库只负责两件事：</p>
<ul>
<li class="">产出镜像</li>
<li class="">声明“我要部署哪个镜像 tag”</li>
</ul>
<p>真正把这个声明同步到集群里的，是 <strong>ArgoCD</strong>。它持续 watch GitOps 部署仓库，一旦看到期望状态发生变化，就把对应环境推进到新的镜像版本。</p>
<p>这类拆法的好处非常直接：</p>
<ul>
<li class="">构建记录、镜像 tag、部署仓库 commit 可以互相追踪。</li>
<li class="">CI 不需要长期持有集群高权限凭据。</li>
<li class="">回滚时不必重新构建，只需要把部署仓库里的镜像 tag 改回去。</li>
<li class="">环境差异集中在部署仓库和 Secret，而不是散落在 shell 脚本里。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第一层把-ai-review-放在-pr-入口而不是合并之后">第一层：把 AI Review 放在 PR 入口，而不是合并之后<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E7%AC%AC%E4%B8%80%E5%B1%82%E6%8A%8A-ai-review-%E6%94%BE%E5%9C%A8-pr-%E5%85%A5%E5%8F%A3%E8%80%8C%E4%B8%8D%E6%98%AF%E5%90%88%E5%B9%B6%E4%B9%8B%E5%90%8E" class="hash-link" aria-label="第一层：把 AI Review 放在 PR 入口，而不是合并之后的直接链接" title="第一层：把 AI Review 放在 PR 入口，而不是合并之后的直接链接" translate="no">​</a></h2>
<p>对应文件：<code>.gitea/workflows/ai-review.yml</code></p>
<p>这一层的职责很简单：<strong>在代码进入 <code>main</code> 之前，增加一层自动化质量反馈。</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="触发时机">触发时机<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E8%A7%A6%E5%8F%91%E6%97%B6%E6%9C%BA" class="hash-link" aria-label="触发时机的直接链接" title="触发时机的直接链接" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">pull_request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">opened</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> synchronize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> reopened</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<p>也就是说，下面三种情况会触发：</p>
<ul>
<li class="">新开 PR</li>
<li class="">PR 补充了新 commit</li>
<li class="">已关闭的 PR 被重新打开</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="核心思路">核心思路<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E6%A0%B8%E5%BF%83%E6%80%9D%E8%B7%AF" class="hash-link" aria-label="核心思路的直接链接" title="核心思路的直接链接" translate="no">​</a></h3>
<p>PR Review 不是在 runner 上临时拼依赖，而是直接跑一个固定版本的 PR-Agent Docker 镜像：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Run PR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">Agent</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">GITEA_TOKEN</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.PR_REVIEW_BOT_TOKEN </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">LLM_API_KEY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.LLM_API_KEY </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">GITEA_URL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> &lt;GITEA_BASE_URL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">PR_URL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> gitea.event.pull_request.html_url </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">RESPONSE_LANGUAGE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> zh</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">CN</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">PR_REVIEWER_REQUIRE_SECURITY_REVIEW</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">PR_REVIEWER_NUM_MAX_FINDINGS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"10"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">    set -euo pipefail</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    IMAGE="&lt;PR_AGENT_IMAGE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">&lt;PINNED_VERSION</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    docker pull "$IMAGE"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    docker run </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">rm \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">e CONFIG__GIT_PROVIDER="gitea" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">e GITEA__URL="$GITEA_URL" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">e GITEA__PERSONAL_ACCESS_TOKEN="</span><span class="token important">***"</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">e CONFIG__MODEL="&lt;LLM_MODEL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">e CONFIG__RESPONSE_LANGUAGE="$RESPONSE_LANGUAGE" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">e PR_REVIEWER__REQUIRE_SECURITY_REVIEW="$PR_REVIEWER_REQUIRE_SECURITY_REVIEW" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">e PR_REVIEWER__NUM_MAX_FINDINGS="$PR_REVIEWER_NUM_MAX_FINDINGS" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">e &lt;LLM_PROVIDER_KEY_ENV</span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">="$LLM_API_KEY" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      "$IMAGE" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">pr_url="$PR_URL" \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      review</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么这一层值得单独存在">为什么这一层值得单独存在<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B8%80%E5%B1%82%E5%80%BC%E5%BE%97%E5%8D%95%E7%8B%AC%E5%AD%98%E5%9C%A8" class="hash-link" aria-label="为什么这一层值得单独存在的直接链接" title="为什��么这一层值得单独存在的直接链接" translate="no">​</a></h3>
<p>我比较认同把 AI Review 放在 PR 阶段，而不是合并之后。这样它的定位是<strong>提前反馈</strong>，不是事后审计。</p>
<p>这层设计有几个很实用的细节：</p>
<ol>
<li class="">
<p><strong>镜像版本固定，而不是用 <code>latest</code></strong></p>
<ul>
<li class="">自动化流程最怕上游行为漂移。今天能跑，明天镜像更新后 review 风格变了，排查会很痛苦。</li>
</ul>
</li>
<li class="">
<p><strong>通过 Docker 运行，而不是在 runner 上现场装依赖</strong></p>
<ul>
<li class="">环境更稳定，也更容易迁移和复现。</li>
</ul>
</li>
<li class="">
<p><strong>限制 findings 数量</strong></p>
<ul>
<li class="">AI reviewer 太“热情”时很容易制造噪音。把问题数限制在一个合理范围，本质上是在逼它挑最重要的点讲。</li>
</ul>
</li>
<li class="">
<p><strong>强制安全审查维度</strong></p>
<ul>
<li class="">这让它不只是“代码风格意见机”，而是能在边界条件、潜在风险上补一刀。</li>
</ul>
</li>
</ol>
<p>这层的边界也很明确：它<strong>不负责构建、不负责版本、不负责部署</strong>，只负责在进入主干前尽量把明显问题拦下来。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第二层先识别变更再生成版本标签">第二层：先识别变更，再生成版本标签<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E7%AC%AC%E4%BA%8C%E5%B1%82%E5%85%88%E8%AF%86%E5%88%AB%E5%8F%98%E6%9B%B4%E5%86%8D%E7%94%9F%E6%88%90%E7%89%88%E6%9C%AC%E6%A0%87%E7%AD%BE" class="hash-link" aria-label="第二层：先识别变更，再生成版本标签的直接链接" title="第二层：先识别变更，再生成版本标签的直接链接" translate="no">​</a></h2>
<p>对应文件：<code>.gitea/workflows/auto-version-tags.yml</code></p>
<p>对很多应用团队来说，版本管理往往比 CI 本身更容易失控。表面上看，打 tag 只是一步 Git 操作；但真正难的是：<strong>什么变更值得发版、哪个可发布单元应该发版、版本号应该怎么演进。</strong></p>
<p>这套设计的做法是：<strong>先识别真实变更范围，再给对应可发布单元生成独立 tag。</strong> 在多应用仓库里，这通常体现为“每个 app 一条版本线”；在单应用仓库里，也可以退化成“主应用一条版本线”。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="触发时机-1">触发时机<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E8%A7%A6%E5%8F%91%E6%97%B6%E6%9C%BA-1" class="hash-link" aria-label="触发时机的直接链接" title="触发时机的直接链接" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> src/app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">a/</span><span class="token important">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> src/app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">b/</span><span class="token important">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> src/shared</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">lib/</span><span class="token important">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> .gitea/workflows/auto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">version</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">tags.yml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  workflow_dispatch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></span></code></pre></div></div>
<p>这里保留 <code>workflow_dispatch</code>，是为了在特殊情况下手工重跑，比如补 tag、修 tag、重新计算版本。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="matrix每个可发布�单元各算各的版本线">Matrix：每个可发布单元各算各的版本线<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#matrix%E6%AF%8F%E4%B8%AA%E5%8F%AF%E5%8F%91%E5%B8%83%E5%8D%95%E5%85%83%E5%90%84%E7%AE%97%E5%90%84%E7%9A%84%E7%89%88%E6%9C%AC%E7%BA%BF" class="hash-link" aria-label="Matrix：每个可发布单元各算各的版本线的直接链接" title="Matrix：每个可发布单元各算各的版本线的直接链接" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">strategy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">fail-fast</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">matrix</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">include</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">a</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">app_path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> src/app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">a</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">tag_prefix</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">a/v</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">b</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">app_path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> src/app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">b</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">tag_prefix</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">b/v</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> shared</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">lib</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">app_path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> src/shared</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">lib</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">tag_prefix</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> shared</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">lib/v</span><br></span></code></pre></div></div>
<p>这会生成类似这样的 tag：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">app-a/v1.2.3</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">app-b/v1.4.0</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">shared-lib/v0.8.9</span><br></span></code></pre></div></div>
<p>这里故意用更抽象的 <code>app-a / app-b / shared-lib</code> 举例，是为了突出设计本身，而不是某个具体业务目录。核心意思只有一个：<strong>仓库可以统一协作，但可发布单元不一定要共享同一条版本线。</strong></p>
<p>如果你只有一个主应用，这套思路同样适用，只是 matrix 可以简化成一个单元，tag 也可以变成更普通的 <code>v1.2.3</code>。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="核心逻辑不是看仓库变没变而是看这个-app-变没变">核心逻辑：不是看仓库变没变，而是看这个 app 变没变<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E6%A0%B8%E5%BF%83%E9%80%BB%E8%BE%91%E4%B8%8D%E6%98%AF%E7%9C%8B%E4%BB%93%E5%BA%93%E5%8F%98%E6%B2%A1%E5%8F%98%E8%80%8C%E6%98%AF%E7%9C%8B%E8%BF%99%E4%B8%AA-app-%E5%8F%98%E6%B2%A1%E5%8F%98" class="hash-link" aria-label="核心逻辑：不是看仓库变没变，而是看这个 app 变没变的直接链接" title="核心逻辑：不是看仓库变没变，而是看这个 app 变没变的直接链接" translate="no">​</a></h3>
<p>真正的关键点在这里：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> fetch </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--tags</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--force</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">last_tag</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">git</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> tag </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--list</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">${TAG_PREFIX}</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">*"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--sort</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">-v:refname </span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">|</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">head</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n1</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">||</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable boolean" style="color:rgb(189, 147, 249);font-style:italic">true</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${last_tag</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">:-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">commit_count</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">git</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> rev-list </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--count</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">${last_tag}</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">..HEAD"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> -- </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">${APP_PATH}</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">commit_count</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">git</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> rev-list </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--count</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> HEAD -- </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">${APP_PATH}</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${commit_count}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-eq</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"should_tag=false"</span><span class="token plain"> </span><span class="token operator">&gt;&gt;</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$GITHUB_OUTPUT</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exit</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><br></span></code></pre></div></div>
<p>这里的重点不是“自上次 tag 以来仓库有没有变化”，而是：</p>
<blockquote>
<p><strong>这个可发布单元自上次属于它的 tag 以来，有没有变化。</strong></p>
</blockquote>
<p>在示例里，这个“单元”是某个应用目录；换成单服务仓库时，也可以直接是整个项目本身。真正值得保留的，不是 Monorepo 形式，而是<strong>按真实交付边界计算版本</strong>这件事。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="semver-如何自动推断">SemVer 如何自动推断<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#semver-%E5%A6%82%E4%BD%95%E8%87%AA%E5%8A%A8%E6%8E%A8%E6%96%AD" class="hash-link" aria-label="SemVer 如何自动推断的直接链接" title="SemVer 如何自动推断的直接链接" translate="no">​</a></h3>
<p>版本升级类型沿用 Conventional Commits：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">bump_type</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"patch"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">printf</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'%s\n'</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${subjects}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-Eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'^[^[:space:]]+!:'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">bump_type</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"major"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">elif</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">printf</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'%s\n'</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${bodies}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-Eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'(^|[[:space:]])BREAKING CHANGE:'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">bump_type</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"major"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">elif</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">printf</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'%s\n'</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${subjects}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-Eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'^feat(\([^)]*\))?:'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">bump_type</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"minor"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><br></span></code></pre></div></div>
<p>对应规则就是：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">breaking change -&gt; major</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">feat             -&gt; minor</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">other changes    -&gt; patch</span><br></span></code></pre></div></div>
<p>好处是它不需要额外维护版本文件，而是直接把 Git 历史和 commit 规范变成版本事实来源。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么用-annotated-tag">为什么用 annotated tag<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E4%B8%BA%E4%BB%80%E4%B9%88%E7%94%A8-annotated-tag" class="hash-link" aria-label="为什么用 annotated tag的直接链接" title="为什么用 annotated tag的直接链接" translate="no">​</a></h3>
<p>如果决定发版，workflow 会创建 annotated tag，而不是 lightweight tag：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-a</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${NEW_TAG}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-m</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"release(</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${APP_NAME}</span><span class="token string" style="color:rgb(255, 121, 198)">): </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${NEW_TAG}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-m</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${tag_body}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> push origin </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${NEW_TAG}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></span></code></pre></div></div>
<p>tag body 里还会记录：</p>
<ul>
<li class="">bump type</li>
<li class="">changed commits count</li>
<li class="">commit sha</li>
<li class="">commit author</li>
<li class="">commit time</li>
</ul>
<p>这让 tag 不只是“一个名字”，而更像一条可审计的发布记录。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="并发控制">并发控制<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6" class="hash-link" aria-label="并发控制的直接链接" title="并发控制的直接链接" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">concurrency</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> auto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">version</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> matrix.app </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> gitea.ref_name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">cancel-in-progress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><br></span></code></pre></div></div>
<p>这里按 <code>app + branch</code> 建并发组，并且不取消正在执行的版本计算。这样做虽然保守，但能避免多个 push 之间互相打断，导致 tag 状态前后不一致。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第三层dev-环境要快但也要可追踪">第三层：Dev 环境要快，但也要可追踪<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E7%AC%AC%E4%B8%89%E5%B1%82dev-%E7%8E%AF%E5%A2%83%E8%A6%81%E5%BF%AB%E4%BD%86%E4%B9%9F%E8%A6%81%E5%8F%AF%E8%BF%BD%E8%B8%AA" class="hash-link" aria-label="第三层：Dev 环境要快，但也要可追踪的直接链接" title="第三层：Dev 环境要快，但也要可追踪的直接链接" translate="no">​</a></h2>
<p>对应文件：<code>.gitea/workflows/build-and-deploy-dev.yml</code></p>
<p>到了这一层，目标就从“质量反馈 / 版本事实”切换成了：</p>
<blockquote>
<p><strong>让测试环境始终对应某个具体 commit 的可追踪镜像。</strong></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="触发时机-2">触发时机<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E8%A7%A6%E5%8F%91%E6%97%B6%E6%9C%BA-2" class="hash-link" aria-label="触发时机的直接链接" title="触发时机的直接链接" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">dev</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> src/app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">a/</span><span class="token important">**</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  workflow_dispatch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></span></code></pre></div></div>
<p>这里用 <code>src/app-a/**</code> 作为示例，表示“当前要发布的目标应用路径”。如果你的仓库只有一个主应用，这里的路径过滤甚至可以简化到整个项目。重点不是目录名字，而是：<strong>只在真正影响目标交付单元时触发构建。</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="显式分支校验给-workflow-再加一道保险">显式分支校验：给 workflow 再加一道保险<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E6%98%BE%E5%BC%8F%E5%88%86%E6%94%AF%E6%A0%A1%E9%AA%8C%E7%BB%99-workflow-%E5%86%8D%E5%8A%A0%E4%B8%80%E9%81%93%E4%BF%9D%E9%99%A9" class="hash-link" aria-label="显式分支校验：给 workflow 再加一道保险的直接链接" title="显式分支校验：给 workflow 再加一道保险的直接链接" translate="no">​</a></h3>
<p>即便触发条件已经写死 <code>dev</code>，脚本里仍然会再做一次校验：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${CURRENT_BRANCH</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">:-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${EXPECTED_BRANCH}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"this workflow only runs on branch: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${EXPECTED_BRANCH}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exit</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><br></span></code></pre></div></div>
<p>这是一个很值得保留的小习惯。CI 的触发上下文、手动触发、未来配置漂移，都可能带来意外执行路径。脚本内部再校验一次，能让失败更明确，而不是默默跑偏。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dev-环境为什么用短-sha-做镜像-tag">Dev 环境为什么用短 SHA 做镜像 tag<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#dev-%E7%8E%AF%E5%A2%83%E4%B8%BA%E4%BB%80%E4%B9%88%E7%94%A8%E7%9F%AD-sha-%E5%81%9A%E9%95%9C%E5%83%8F-tag" class="hash-link" aria-label="Dev 环境为什么用短 SHA 做镜像 tag的直接链接" title="Dev 环境为什么用短 SHA 做镜像 tag的直接链接" translate="no">​</a></h3>
<p>metadata 解析后，Dev 镜像用短 commit SHA 作为 tag：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">commit_sha</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${GITEA_SHA</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">:-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-z</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$commit_sha</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">commit_sha</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">git</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> rev-parse HEAD</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">image_tag</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable builtin class-name" style="color:rgb(189, 147, 249);font-style:italic">printf</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">'%s'</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">$commit_sha</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">|</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">cut</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> -c1-7</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></span></code></pre></div></div>
<p>产物大概是这样：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;IMAGE_REPO&gt;:&lt;SHORT_SHA&gt;</span><br></span></code></pre></div></div>
<p>这对测试环境非常合适，因为它强调的是：</p>
<ul>
<li class="">当前环境到底跑的是哪次提交</li>
<li class="">问题出现时能快速定位回源码 commit</li>
<li class="">每个镜像版本都天然不可变</li>
</ul>
<p>换句话说，<strong>dev 的重点是追踪提交，不是强调语义化版本。</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="构建阶段如何处理环境变量">构建阶段如何处理环境变量<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E6%9E%84%E5%BB%BA%E9%98%B6%E6%AE%B5%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F" class="hash-link" aria-label="构建阶段如何处理环境变量的直接链接" title="构建阶段如何处理环境变量的直接链接" translate="no">​</a></h3>
<p>workflow 会把 Secret 写入目标应用构建所需的 <code>.env.production</code>，并在退出时清理：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">build_env_path</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"src/app-a/.env.production"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">trap</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'rm -f "$build_env_path"'</span><span class="token plain"> EXIT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">printf</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'%s\n'</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BUILD_ENV_FILE</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$build_env_path</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></span></code></pre></div></div>
<p>之后逐行校验 <code>.env</code> 格式，只检查 <code>key=value</code> 是否成立，不打印 Secret 内容：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> </span><span class="token assign-left variable environment constant" style="color:rgb(189, 147, 249);font-style:italic">IFS</span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">read</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-r</span><span class="token plain"> raw_line </span><span class="token operator">||</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$raw_line</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">do</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">line</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable builtin class-name" style="color:rgb(189, 147, 249);font-style:italic">printf</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">'%s'</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">$raw_line</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">|</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">sed</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-e</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">'s/^[[:space:]]*//'</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-e</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">'s/[[:space:]]*$//'</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-z</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$line</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">case</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$line</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain">#*</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">continue</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">esac</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">key</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${line</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">%%</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">=*}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">key</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable builtin class-name" style="color:rgb(189, 147, 249);font-style:italic">printf</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">'%s'</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">$key</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">|</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">tr</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">'[:space:]'</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-z</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$key</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$key</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$line</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"invalid env entry"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exit</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">done</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$build_env_path</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></span></code></pre></div></div>
<p>这不是绝对安全方案，但至少做到了两件重要的事：</p>
<ul>
<li class="">Secret 不会在日志里裸奔</li>
<li class="">临时文件不会长期残留在 runner 上</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="镜像构建完成后不直接部署而是改-gitops-仓库">镜像构建完成后，不直接部署，而是改 GitOps 仓库<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E9%95%9C%E5%83%8F%E6%9E%84%E5%BB%BA%E5%AE%8C%E6%88%90%E5%90%8E%E4%B8%8D%E7%9B%B4%E6%8E%A5%E9%83%A8%E7%BD%B2%E8%80%8C%E6%98%AF%E6%94%B9-gitops-%E4%BB%93%E5%BA%93" class="hash-link" aria-label="镜像构建完成后，不直接部署，而是改 GitOps 仓库的直接链接" title="镜像构建完成后，不直接部署，而是改 GitOps 仓库的直接链接" translate="no">​</a></h3>
<p>镜像 push 完毕之后，workflow 会 clone 部署仓库，更新 <code>kustomization.yaml</code> 里的镜像 tag：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> clone </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--depth</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--branch</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$DEPLOY_BRANCH</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"https://oauth2:***@&lt;GITEA_HOST&gt;/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${DEPLOY_REPO}</span><span class="token string" style="color:rgb(255, 121, 198)">.git"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$repo_dir</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$repo_dir</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${DEPLOY_DIR}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  kustomize edit </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">set</span><span class="token plain"> image </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${IMAGE_REPO}</span><span class="token string" style="color:rgb(255, 121, 198)">:</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${IMAGE_TAG}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>如果 <code>kustomization.yaml</code> 没变化，就跳过 commit：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">diff</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--quiet</span><span class="token plain"> -- </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${DEPLOY_DIR}</span><span class="token string" style="color:rgb(255, 121, 198)">/kustomization.yaml"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"deploy values tag already </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${IMAGE_TAG}</span><span class="token string" style="color:rgb(255, 121, 198)">, skip commit"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exit</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><br></span></code></pre></div></div>
<p>否则就提交部署声明：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${DEPLOY_DIR}</span><span class="token string" style="color:rgb(255, 121, 198)">/kustomization.yaml"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-m</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ci(dev): bump &lt;image-name&gt; test image tag to </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${IMAGE_TAG}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> push origin </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$DEPLOY_BRANCH</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></span></code></pre></div></div>
<p>到这里，应用仓库的工作其实已经结束了。真正把这个新 tag 同步到测试集群的，是 ArgoCD：</p>
<ol>
<li class="">ArgoCD watch 到部署仓库变化</li>
<li class="">发现目标环境的 <code>kustomization.yaml</code> 镜像 tag 更新</li>
<li class="">将期望状态同步到集群</li>
</ol>
<p>这就是 GitOps 的核心价值：<strong>CI 只改 Git 中的期望状态，不直接改集群当前状态。</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第四层prod-发布最重要的不是构建而是证明来源合法">第四层：Prod 发布最重要的不是构建，而是证明来源合法<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E7%AC%AC%E5%9B%9B%E5%B1%82prod-%E5%8F%91%E5%B8%83%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%84%E4%B8%8D%E6%98%AF%E6%9E%84%E5%BB%BA%E8%80%8C%E6%98%AF%E8%AF%81%E6%98%8E%E6%9D%A5%E6%BA%90%E5%90%88%E6%B3%95" class="hash-link" aria-label="第四层：Prod 发布最重要的不是构建，而是证明来源合法的直接链接" title="第四层：Prod 发布最重要的不是构建，而是证明来源合法的直接链接" translate="no">​</a></h2>
<p>对应文件：<code>.gitea/workflows/build-and-deploy-prod.yaml</code></p>
<p>生产发布最大的区别，不是“也构建镜像”，而是<strong>必须证明这次发布来自合法来源</strong>。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="触发时机-3">触发时机<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E8%A7%A6%E5%8F%91%E6%97%B6%E6%9C%BA-3" class="hash-link" aria-label="触发时机的直接链接" title="触发时机的直接链接" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">release</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">types</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">published</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  workflow_dispatch</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></span></code></pre></div></div>
<p>但是 release 事件并不是任何 tag 都放行，而是只接受某一类约定好的应用 release tag，例如：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> gitea.event_name </span><span class="token tag" style="color:rgb(255, 121, 198)">!=</span><span class="token plain"> 'release' </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> startsWith(gitea.ref</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> 'refs/tags/app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">a/v') </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="生产发布最关键的一步校验-release-来源">生产发布最关键的一步：校验 release 来源<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E7%94%9F%E4%BA%A7%E5%8F%91%E5%B8%83%E6%9C%80%E5%85%B3%E9%94%AE%E7%9A%84%E4%B8%80%E6%AD%A5%E6%A0%A1%E9%AA%8C-release-%E6%9D%A5%E6%BA%90" class="hash-link" aria-label="生产发布最关键的一步：校验 release 来源的直接链接" title="生产发布最关键的一步：校验 release 来源的直接链接" translate="no">​</a></h3>
<p>这一层做了两道检查。</p>
<p>第一道，tag 名本身必须合法：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${CURRENT_BRANCH</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">:-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">!=</span><span class="token plain"> app-a/v* </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"this workflow only handles app-a release tags"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exit</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><br></span></code></pre></div></div>
<p>第二道，release commit 必须属于 <code>main</code> 分支历史：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">release_commit</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token string variable function" style="color:rgb(80, 250, 123);font-style:italic">git</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> rev-parse </span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token string variable string variable" style="color:rgb(189, 147, 249);font-style:italic">${CURRENT_REF}</span><span class="token string variable string" style="color:rgb(255, 121, 198);font-style:italic">^{commit}"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable operator file-descriptor important" style="color:rgb(189, 147, 249);font-style:italic">2</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">&gt;</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">/dev/null </span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">||</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token string variable boolean" style="color:rgb(189, 147, 249);font-style:italic">true</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> fetch --no-tags </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--prune</span><span class="token plain"> origin </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${EXPECTED_BRANCH}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">main_ref</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"FETCH_HEAD"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token operator">!</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> merge-base --is-ancestor </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${release_commit}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${main_ref}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"release commit is not on branch: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${EXPECTED_BRANCH}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exit</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">fi</span><br></span></code></pre></div></div>
<p>这一步特别重要。它防止了几类常见事故：</p>
<ul>
<li class="">从临时分支直接打 tag 发生产</li>
<li class="">从未合并到主干的 commit 发布生产</li>
<li class="">因为手工操作失误，把错误 tag 推成 release</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么生产镜像不用短-sha而用-release-版本">为什么生产镜像不用短 SHA，而用 release 版本<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E4%B8%BA%E4%BB%80%E4%B9%88%E7%94%9F%E4%BA%A7%E9%95%9C%E5%83%8F%E4%B8%8D%E7%94%A8%E7%9F%AD-sha%E8%80%8C%E7%94%A8-release-%E7%89%88%E6%9C%AC" class="hash-link" aria-label="为什么生产镜像不用短 SHA，而用 release 版本的直接链接" title="为什么生产镜像不用短 SHA，而用 release 版本的直接链接" translate="no">​</a></h3>
<p>Dev 镜像用短 SHA，Prod 则从 release tag 派生版本号：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">release_tag</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${RELEASE_TAG}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">image_tag</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">${release_tag</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">#</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">app-a</span><span class="token string variable operator" style="color:rgb(189, 147, 249);font-style:italic">/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></span></code></pre></div></div>
<p>例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">app-a/v1.2.3 -&gt; &lt;IMAGE_REPO&gt;:v1.2.3</span><br></span></code></pre></div></div>
<p>这样做的好处非常直接：</p>
<ul>
<li class="">变更审计更自然</li>
<li class="">回滚版本更直观</li>
<li class="">业务发布记录和镜像版本可以对齐</li>
<li class="">部署仓库里一眼就能看出当前线上版本</li>
</ul>
<p>也就是说：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">dev  -&gt; commit-oriented</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">prod -&gt; release-oriented</span><br></span></code></pre></div></div>
<p>这是这套流程里我自己最喜欢的一个分层。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="生产环境的-gitops-终点依然是-argocd">生产环境的 GitOps 终点，依然是 ArgoCD<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E7%9A%84-gitops-%E7%BB%88%E7%82%B9%E4%BE%9D%E7%84%B6%E6%98%AF-argocd" class="hash-link" aria-label="生产环境的 GitOps 终点，依然是 ArgoCD的直接链接" title="生产环境的 GitOps 终点，依然是 ArgoCD的直接链接" translate="no">​</a></h3>
<p>生产 workflow 后半段和 dev 基本一致：写入构建环境、校验格式、登录 registry、构建并 push 镜像、更新部署仓库。</p>
<p>差别只是：</p>
<ul>
<li class="">使用生产环境变量</li>
<li class="">更新生产环境对应的 kustomize 目录</li>
<li class="">镜像 tag 换成 release 版本</li>
</ul>
<p>最终，生产环境也不是由 CI 直接下场改集群，而是由 <strong>ArgoCD</strong> 读取部署仓库中的变更并执行同步。</p>
<p>从边界角度看，这意味着：</p>
<ul>
<li class=""><strong>Gitea Actions</strong> 负责构建产物和更新期望状态</li>
<li class=""><strong>GitOps 仓库</strong> 负责保存环境声明</li>
<li class=""><strong>ArgoCD</strong> 负责把声明落到 Kubernetes 集群</li>
</ul>
<p>三者分工清晰，出了问题也更容易定位到底卡在哪一层。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dev-和-prod本质上是两种不同的发布语义">Dev 和 Prod，本质上是两种不同的发布语义<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#dev-%E5%92%8C-prod%E6%9C%AC%E8%B4%A8%E4%B8%8A%E6%98%AF%E4%B8%A4%E7%A7%8D%E4%B8%8D%E5%90%8C%E7%9A%84%E5%8F%91%E5%B8%83%E8%AF%AD%E4%B9%89" class="hash-link" aria-label="Dev 和 Prod，本质上是两种不同的发布语义的直接链接" title="Dev 和 Prod，本质上是两种不同的发布语义的直接链接" translate="no">​</a></h2>
<p>很多团队会把 dev / prod 仅仅理解成“两个环境变量文件”。但实际上，这两条链路背后的设计目标完全不同：</p>
<table><thead><tr><th>维度</th><th>Dev</th><th>Prod</th></tr></thead><tbody><tr><td>触发来源</td><td><code>dev</code> 分支 push</td><td><code>release published</code> 或手动触发</td></tr><tr><td>路径过滤</td><td><code>src/app-a/**</code></td><td>由 release tag 限定目标应用</td></tr><tr><td>合法性校验</td><td>当前分支必须是 <code>dev</code></td><td>release tag 必须是 <code>app-a/v*</code>，commit 必须在 <code>main</code> 历史内</td></tr><tr><td>镜像 tag</td><td>短 commit SHA</td><td>release 版本，如 <code>v1.2.3</code></td></tr><tr><td>环境变量</td><td><code>&lt;DEV_APP_ENV_FILE&gt;</code></td><td><code>&lt;PROD_APP_ENV_FILE&gt;</code></td></tr><tr><td>部署目录</td><td><code>&lt;DEV_KUSTOMIZE_DIR&gt;</code></td><td><code>&lt;PROD_KUSTOMIZE_DIR&gt;</code></td></tr><tr><td>发布语义</td><td>快速验证</td><td>正式发布、可审计、可回滚</td></tr></tbody></table>
<p>测试环境追求的是“快”和“可追踪到提交”；生产环境追求的是“稳”和“可证明来源”。把这两种语义硬塞进同一条流程里，往往就是后面复杂度失控的起点。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="这套设计最值得保留的-5-个点">这套设计最值得保留的 5 个点<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E8%BF%99%E5%A5%97%E8%AE%BE%E8%AE%A1%E6%9C%80%E5%80%BC%E5%BE%97%E4%BF%9D%E7%95%99%E7%9A%84-5-%E4%B8%AA%E7%82%B9" class="hash-link" aria-label="这套设计最值得保留的 5 个点的直接链接" title="这套设计最值得保留的 5 个点的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-按可发布单元独立版本化">1. 按可发布单元独立版本化<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#1-%E6%8C%89%E5%8F%AF%E5%8F%91%E5%B8%83%E5%8D%95%E5%85%83%E7%8B%AC%E7%AB%8B%E7%89%88%E6%9C%AC%E5%8C%96" class="hash-link" aria-label="1. 按可发布单元独立版本化的直接链接" title="1. 按可发布单元独立版本化的直接链接" translate="no">​</a></h3>
<p>通过 <code>app_path + tag_prefix</code> 的 matrix，这套流程可以让每个可发布单元拥有自己的版本线。放在多应用仓库里，它意味着不同应用互不绑死；放在单应用仓库里，它也可以简化成一条清晰的主版本线。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-dev-和-prod-使用不同-tag-语义">2. Dev 和 Prod 使用不同 tag 语义<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#2-dev-%E5%92%8C-prod-%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%90%8C-tag-%E8%AF%AD%E4%B9%89" class="hash-link" aria-label="2. Dev 和 Prod 使用不同 tag 语义的直接链接" title="2. Dev 和 Prod 使用不同 tag 语义的直接链接" translate="no">​</a></h3>
<p>dev 关心“我在跑哪次提交”，prod 关心“我在跑哪个发布版本”。短 SHA 和 release tag 分开，语义特别干净。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-gitops--argocd而不是-ci-直接连集群">3. GitOps + ArgoCD，而不是 CI 直接连集群<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#3-gitops--argocd%E8%80%8C%E4%B8%8D%E6%98%AF-ci-%E7%9B%B4%E6%8E%A5%E8%BF%9E%E9%9B%86%E7%BE%A4" class="hash-link" aria-label="3. GitOps + ArgoCD，而不是 CI 直接连集群的直接链接" title="3. GitOps + ArgoCD，而不是 CI 直接连集群的直接链接" translate="no">​</a></h3>
<p>这是权限和可追踪性上的巨大提升。CI 改 Git，ArgoCD 改集群，职责边界天然更稳。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-生产发布做来源校验">4. 生产发布做来源校验<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#4-%E7%94%9F%E4%BA%A7%E5%8F%91%E5%B8%83%E5%81%9A%E6%9D%A5%E6%BA%90%E6%A0%A1%E9%AA%8C" class="hash-link" aria-label="4. 生产发布做来源校验的直接链接" title="4. 生产发布做来源校验的直接链接" translate="no">​</a></h3>
<p>不只是检查 tag 名，还检查 release commit 是否属于 <code>main</code> 历史，这一步非常像“生产闸门”。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-secret-泄漏控制做到了最低限度的工程自觉">5. Secret 泄漏控制做到了最低限度的工程自觉<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#5-secret-%E6%B3%84%E6%BC%8F%E6%8E%A7%E5%88%B6%E5%81%9A%E5%88%B0%E4%BA%86%E6%9C%80%E4%BD%8E%E9%99%90%E5%BA%A6%E7%9A%84%E5%B7%A5%E7%A8%8B%E8%87%AA%E8%A7%89" class="hash-link" aria-label="5. Secret 泄漏控制做到了最低限度的工程自觉的直接链接" title="5. Secret 泄漏控制做到了最低限度的工程自觉的直接链接" translate="no">​</a></h3>
<p>构建 env 来自 Secret，写入临时文件，校验时不打印 value，退出时清理文件。虽然不算终点方案，但至少已经避免了最常见的日志泄漏问题。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="如果继续往前走这-5-个地方最值得改">如果继续往前走，这 5 个地方最值得改<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E5%A6%82%E6%9E%9C%E7%BB%A7%E7%BB%AD%E5%BE%80%E5%89%8D%E8%B5%B0%E8%BF%99-5-%E4%B8%AA%E5%9C%B0%E6%96%B9%E6%9C%80%E5%80%BC%E5%BE%97%E6%94%B9" class="hash-link" aria-label="如果继续往前走，这 5 个地方最值得改的直接链接" title="如果继续往前走，这 5 个地方最值得改的直接链接" translate="no">​</a></h2>
<p>这套设计已经能跑得很稳了，但如果继续打磨，我觉得还有几件事特别值得做。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-把-dev--prod-共用逻辑抽成脚本">1. 把 dev / prod 共用逻辑抽成脚本<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#1-%E6%8A%8A-dev--prod-%E5%85%B1%E7%94%A8%E9%80%BB%E8%BE%91%E6%8A%BD%E6%88%90%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="1. 把 dev / prod 共用逻辑抽成脚本的直接链接" title="1. 把 dev / prod 共用逻辑抽成脚本的直接链接" translate="no">​</a></h3>
<p>比如拆成：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">scripts/ci/resolve-image-metadata.sh</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">scripts/ci/write-build-env.sh</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">scripts/ci/build-and-push-image.sh</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">scripts/ci/update-kustomize-image.sh</span><br></span></code></pre></div></div>
<p>这样 workflow 只负责声明“何时触发”和“注入哪些变量”，复杂逻辑则放进可本地测试的脚本里。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-给构建和部署-workflow-也补上-concurrency">2. 给构建和部署 workflow 也补上 concurrency<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#2-%E7%BB%99%E6%9E%84%E5%BB%BA%E5%92%8C%E9%83%A8%E7%BD%B2-workflow-%E4%B9%9F%E8%A1%A5%E4%B8%8A-concurrency" class="hash-link" aria-label="2. 给构建和部署 workflow 也补上 concurrency的直接链接" title="2. 给构建和部署 workflow 也补上 concurrency的直接链接" translate="no">​</a></h3>
<p>版本 workflow 已经有并发控制，但 dev/prod 部署更新如果同时改同一个 <code>kustomization.yaml</code>，依然可能 push 冲突。可以考虑：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">concurrency</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> deploy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">dev</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">cancel-in-progress</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-在生产发布里记录镜像-digest">3. 在生产发布里记录镜像 digest<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#3-%E5%9C%A8%E7%94%9F%E4%BA%A7%E5%8F%91%E5%B8%83%E9%87%8C%E8%AE%B0%E5%BD%95%E9%95%9C%E5%83%8F-digest" class="hash-link" aria-label="3. 在生产发布里记录镜像 digest的直接链接" title="3. 在生产发布里记录镜像 digest的直接链接" translate="no">​</a></h3>
<p>现在部署仓库里记录的是 tag。进一步增强供应链可追踪性的话，可以在 release note 或部署记录里同时写入 digest：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;IMAGE_REPO&gt;:v1.2.3@sha256:&lt;digest&gt;</span><br></span></code></pre></div></div>
<p>tag 适合人读，digest 适合机器确认不可变产物。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-把-env-校验从格式升级成必需-key-校验">4. 把 env 校验从格式升级成必需 key 校验<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#4-%E6%8A%8A-env-%E6%A0%A1%E9%AA%8C%E4%BB%8E%E6%A0%BC%E5%BC%8F%E5%8D%87%E7%BA%A7%E6%88%90%E5%BF%85%E9%9C%80-key-%E6%A0%A1%E9%AA%8C" class="hash-link" aria-label="4. 把 env 校验从格式升级成必需 key 校验的直接链接" title="4. 把 env 校验从格式升级成必需 key 校验的直接链接" translate="no">​</a></h3>
<p>当前只校验 <code>key=value</code> 格式是对的，但还可以进一步维护必需 key 列表，在构建前更早发现配置缺失。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-给手动触发生产-workflow-增加显式输入">5. 给手动触发生产 workflow 增加显式输入<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#5-%E7%BB%99%E6%89%8B%E5%8A%A8%E8%A7%A6%E5%8F%91%E7%94%9F%E4%BA%A7-workflow-%E5%A2%9E%E5%8A%A0%E6%98%BE%E5%BC%8F%E8%BE%93%E5%85%A5" class="hash-link" aria-label="5. 给手动触发生产 workflow 增加显式输入的直接链接" title="5. 给手动触发生产 workflow 增加显式输入的直接链接" translate="no">​</a></h3>
<p>例如要求手工输入 <code>app-a/v1.2.3</code> 这类 release tag，而不是完全依赖当前上下文。这样误操作空间会更小。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结好的-cicd不是更长的流水线而是更清楚的边界">总结：好的 CI/CD，不是更长的流水线，而是更清楚的边界<a href="https://xiebo.fun/blog/2026/4/26/gitea-actions-gitops#%E6%80%BB%E7%BB%93%E5%A5%BD%E7%9A%84-cicd%E4%B8%8D%E6%98%AF%E6%9B%B4%E9%95%BF%E7%9A%84%E6%B5%81%E6%B0%B4%E7%BA%BF%E8%80%8C%E6%98%AF%E6%9B%B4%E6%B8%85%E6%A5%9A%E7%9A%84%E8%BE%B9%E7%95%8C" class="hash-link" aria-label="总结：好的 CI/CD，不是更长的流水线，而是更清楚的边界的直接链接" title="总结：好的 CI/CD，不是更长的流水线，而是更清楚的边界的直接链接" translate="no">​</a></h2>
<p>如果只用一句话概括这套设计，我会这样说：</p>
<blockquote>
<p><strong>它不是把所有事情塞进一条巨型 pipeline，而是把代码质量、版本事实、构建产物和部署声明拆成了相互独立但又彼此可追踪的环节。</strong></p>
</blockquote>
<p>四个 workflow 分别负责不同层次的职责：</p>
<ul>
<li class=""><code>ai-review</code> 负责 PR 反馈</li>
<li class=""><code>auto-version-tags</code> 负责应用级版本</li>
<li class=""><code>build-dev-image</code> 负责测试环境镜像与部署声明更新</li>
<li class=""><code>build-and-deploy-prod-image</code> 负责生产 release 镜像与部署声明更新</li>
</ul>
<p>而在部署侧，<strong>ArgoCD</strong> 把 GitOps 仓库里的期望状态真正同步到 Kubernetes 集群中，补上了“从声明到落地”的最后一环。</p>
<p>这套拆法对通用应用交付都成立：如果你是单应用，它能帮你把质量、版本、构建、部署边界拆干净；如果你是多应用仓库，它又能进一步承接独立版本和独立发布节奏。更重要的是，构建产物、版本标签、部署记录都留在了可追踪系统里：镜像仓库记录产物，Git tag 记录版本，部署仓库记录环境状态，ArgoCD 记录同步结果。</p>
<p>一旦线上出问题，你就能从环境里的镜像 tag，一路追到部署仓库 commit、release tag、主干 commit、PR 和 Review 记录。</p>
<p>这大概就是我理解里一套 CI/CD 设计最有安全感的地方：<strong>不是保证永远不出错，而是让每一次变化都有来源、有记录、能回滚。</strong></p>]]></content:encoded>
            <category>Gitea</category>
            <category>ArgoCD</category>
            <category>GitOps</category>
            <category>CI/CD</category>
            <category>DevOps</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：AI 与非 AI 热门项目观察（2026-04-26）]]></title>
            <link>https://xiebo.fun/blog/2026/4/26/</link>
            <guid>https://xiebo.fun/blog/2026/4/26/</guid>
            <pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending 周榜继续被 AI Agent 基础设施占据，最热方向已经从“模型能力展示”转向“记忆、上下文、协作与治理”。]]></description>
            <content:encoded><![CDATA[<p>这周的 GitHub Trending（weekly）延续了最近几周非常明显的一个趋势：<strong>AI 相关项目不仅数量上压制全场，叙事上也从“更强模型”转向“更可靠的 agent 系统”</strong>。如果说前一阶段大家还在比谁能做出更惊艳的 demo，那这周最热的项目几乎都在回答另一个更现实的问题：<strong>怎么让 agent 更少犯错、记得更多、协作更顺、接入真实工作流。</strong></p>
<p>本文主要基于 GitHub Trending weekly 榜单，以及相关仓库公开描述 / README 做归纳。Trending 页面本身不直接解释传播来源，所以“为什么本周会热”这部分，以下会尽量基于项目定位、榜单位置、星标增速与当前开源叙事做审慎判断，而不是把所有热度都简单归因到单一事件。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/4/26/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先说结论：</p>
<ul>
<li class=""><strong>AI Agent 工程化已经彻底成为主线。</strong> 最热的项目不再只是 agent 本体，而是围绕行为约束、长期记忆、代码检索、任务协作和多 agent 编排的整套基础设施。</li>
<li class=""><strong>“把经验做成可复用资产”是本周最强叙事。</strong> 无论是 skills、memory，还是把整个代码库转成 agent 上下文，本质上都在解决一个问题：不要让 agent 每次都从零开始。</li>
<li class=""><strong>平台化趋势比单点能力更强。</strong> 像 managed agents、multi-agent workflow 这样的项目热度很高，说明用户开始把 agent 当“团队资源”而不是单个聊天窗口。</li>
<li class=""><strong>非 AI 项目存在感明显偏弱。</strong> 本周榜单并不是完全没有非 AI 项目，但热度中心高度集中在 AI 生态，因此这里不会硬凑太多非 AI 仓库，只挑真正有代表性的看。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/4/26/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-forrestchangandrej-karpathy-skills">1. <a href="https://github.com/forrestchang/andrej-karpathy-skills" target="_blank" rel="noopener noreferrer" class="">forrestchang/andrej-karpathy-skills</a><a href="https://xiebo.fun/blog/2026/4/26/#1-forrestchangandrej-karpathy-skills" class="hash-link" aria-label="1-forrestchangandrej-karpathy-skills的直接链接" title="1-forrestchangandrej-karpathy-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：这是一个围绕 Claude Code 行为约束整理出来的单文件 <code>CLAUDE.md</code> 指南，核心目标是减少大模型写代码时常见的问题，比如擅自假设、过度抽象、误改无关内容、遇到不确定性不主动暴露。</li>
<li class=""><strong>为什么这周会热</strong>：一方面，项目直接承接了 Andrej Karpathy 对 LLM coding pitfalls 的讨论，自带传播入口；另一方面，它把“prompt 工程”进一步压缩成一个几乎零门槛复制的仓库规则文件，特别符合开发者最近对“如何把 coding agent 驯服好”的真实需求。</li>
<li class=""><strong>有什么新意</strong>：新意不在于再造一个 agent 框架，而在于把“行为校正”做成最轻的交付物。相比重新训练模型或重新发明 orchestration，这种规则文件化方式更便宜、更容易落地，也更适合在团队里快速扩散。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-nousresearchhermes-agent">2. <a href="https://github.com/NousResearch/hermes-agent" target="_blank" rel="noopener noreferrer" class="">NousResearch/hermes-agent</a><a href="https://xiebo.fun/blog/2026/4/26/#2-nousresearchhermes-agent" class="hash-link" aria-label="2-nousresearchhermes-agent的直接链接" title="2-nousresearchhermes-agent的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个强调自我改进闭环的通用 AI Agent。README 的核心卖点非常明确：它不仅会调用工具，还会从经验里生成技能、持久化知识、检索过往对话，并逐步形成对用户和任务环境的长期理解。</li>
<li class=""><strong>为什么这周会热</strong>：本周它拿到了非常高的周增星，说明“会成长的 agent”这个叙事很吃市场情绪。开发者现在最头疼的不是 agent 偶尔能不能做成事，而是它能不能在长期使用中变得更稳定、更省重复说明成本。</li>
<li class=""><strong>有什么新意</strong>：很多 agent 项目还停留在“我接了很多工具”，Hermes Agent 更强调完整的学习回路：执行 → 总结 → 形成技能 → 下次复用。这个方向更接近产品化，而不是一次性演示。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-multica-aimultica">3. <a href="https://github.com/multica-ai/multica" target="_blank" rel="noopener noreferrer" class="">multica-ai/multica</a><a href="https://xiebo.fun/blog/2026/4/26/#3-multica-aimultica" class="hash-link" aria-label="3-multica-aimultica的直接链接" title="3-multica-aimultica的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源的 managed agents 平台，把 coding agents 当成团队成员来管理：分配任务、跟踪进度、复用技能，而不是只和单个 agent 对话。</li>
<li class=""><strong>为什么这周会热</strong>：它踩中了一个很强的新情绪：团队不再满足于“我能不能叫一个 agent 干活”，而是开始思考“我能不能像管理同事一样管理一组 agent 产能”。这种叙事非常适合在开源社区和社交媒体传播。</li>
<li class=""><strong>有什么新意</strong>：<code>Your next 10 hires won't be human</code> 这种表达虽然有营销色彩，但它确实把多 agent 协作从技术概念翻译成了组织管理语言。相比很多偏研究味的 multi-agent 项目，Multica 更像是在定义一个工作台产品。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-zilliztechclaude-context">4. <a href="https://github.com/zilliztech/claude-context" target="_blank" rel="noopener noreferrer" class="">zilliztech/claude-context</a><a href="https://xiebo.fun/blog/2026/4/26/#4-zilliztechclaude-context" class="hash-link" aria-label="4-zilliztechclaude-context的直接链接" title="4-zilliztechclaude-context的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向 Claude Code 的 code search MCP，目标是把整个代码库都变成 coding agent 可用的上下文，而不是只依赖当前对话窗口里塞进去的片段。</li>
<li class=""><strong>为什么这周会热</strong>：随着 coding agent 使用频率变高，“上下文不够”已经成为最普遍的瓶颈之一。<code>claude-context</code> 把代码搜索、语义检索和 MCP 入口结合起来，正好对准了这个痛点。</li>
<li class=""><strong>有什么新意</strong>：它不是泛泛而谈“RAG for code”，而是非常贴近当前 agent 工作流：直接让 Claude Code 拿到更大范围、更结构化的代码上下文。这类项目的价值，不在模型更聪明，而在于减少模型“看不见代码全局”导致的错误决策。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-openaiopenai-agents-python">5. <a href="https://github.com/openai/openai-agents-python" target="_blank" rel="noopener noreferrer" class="">openai/openai-agents-python</a><a href="https://xiebo.fun/blog/2026/4/26/#5-openaiopenai-agents-python" class="hash-link" aria-label="5-openaiopenai-agents-python的直接链接" title="5-openaiopenai-agents-python的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个轻量但相对完整的 multi-agent workflow 框架，帮助开发者用 Python 组织 agent 间的协作和任务流。</li>
<li class=""><strong>为什么这周会热</strong>：随着 agent 应用从单轮问答升级到多步骤执行，大家越来越需要一个官方、轻量、好接入的编排层。OpenAI 自己推出并持续维护的框架，天然会吸引大量观望者和生态跟随者。</li>
<li class=""><strong>有什么新意</strong>：它的新意不是“第一次有人做 agent framework”，而是把多 agent 工作流进一步标准化、低门槛化。对很多团队来说，这比追求最复杂的研究型编排更有吸引力。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai-热门项目">非 AI 热门项目<a href="https://xiebo.fun/blog/2026/4/26/#%E9%9D%9E-ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI 热门项目的直接链接" title="非 AI 热门项目的直接链接" translate="no">​</a></h2>
<blockquote>
<p>本周非 AI 项目明显偏弱，榜单的注意力几乎都被 AI Agent 生态吸走了。这里不硬凑数量，只选两个相对有代表性的项目。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-tractorjuicearc-kit">1. <a href="https://github.com/tractorjuice/arc-kit" target="_blank" rel="noopener noreferrer" class="">tractorjuice/arc-kit</a><a href="https://xiebo.fun/blog/2026/4/26/#1-tractorjuicearc-kit" class="hash-link" aria-label="1-tractorjuicearc-kit的直接链接" title="1-tractorjuicearc-kit的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个企业架构治理与供应商采购工具包，试图把原本分散在文档、评审会和流程表格里的架构治理工作，组织成更系统化的工作流。</li>
<li class=""><strong>为什么这周会热</strong>：企业架构和采购治理通常不属于大众开源热点，但 ArcKit 把它包装成了一个可复制的 toolkit，又强调 structured governance 与 AI-assisted workflow，这种“传统企业流程工具化”的做法容易获得特定圈层共鸣。</li>
<li class=""><strong>有什么新意</strong>：新意在于它不是单篇方法论文章，也不是单点模板，而是把治理、评审、采购这些偏重流程的事务，尽量产品化成一个仓库可复用资产。这很像把咨询公司的隐性知识开源化。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-z4nzuhackingtool">2. <a href="https://github.com/Z4nzu/hackingtool" target="_blank" rel="noopener noreferrer" class="">Z4nzu/hackingtool</a><a href="https://xiebo.fun/blog/2026/4/26/#2-z4nzuhackingtool" class="hash-link" aria-label="2-z4nzuhackingtool的直接链接" title="2-z4nzuhackingtool的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向安全研究和渗透测试场景的 All-in-One 工具集合，README 里直接强调覆盖多类别工具与统一入口。</li>
<li class=""><strong>为什么这周会热</strong>：这类项目往往在新用户和实战导向用户里传播很快，因为它降低了安全工具链的上手成本：不用自己从零拼装，先有一个大而全的入口就能开始试。</li>
<li class=""><strong>有什么新意</strong>：严格说它不是“技术路线特别新”的项目，更像是一个需求强、传播力强的工具聚合体。它能重新回到周榜前排，反而说明<strong>在 AI 叙事之外，开发者对高密度工具箱型项目依然有稳定需求</strong>。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/4/26/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-的竞争点已经从会不会做转向稳不稳定做">1. Agent 的竞争点已经从“会不会做”转向“稳不稳定做”<a href="https://xiebo.fun/blog/2026/4/26/#1-agent-%E7%9A%84%E7%AB%9E%E4%BA%89%E7%82%B9%E5%B7%B2%E7%BB%8F%E4%BB%8E%E4%BC%9A%E4%B8%8D%E4%BC%9A%E5%81%9A%E8%BD%AC%E5%90%91%E7%A8%B3%E4%B8%8D%E7%A8%B3%E5%AE%9A%E5%81%9A" class="hash-link" aria-label="1. Agent 的竞争点已经从“会不会做”转向“稳不稳定做”的直接链接" title="1. Agent 的竞争点已经从“会不会做”转向“稳不稳定做”的直接链接" translate="no">​</a></h3>
<p>本周最热的项目里，真正最有代表性的不是某个模型参数规模，也不是某个 benchmark 数字，而是：</p>
<ul>
<li class="">如何减少错误假设</li>
<li class="">如何把经验沉淀成 skills / memory</li>
<li class="">如何把整个代码库转成有效上下文</li>
<li class="">如何管理多个 agents 的分工与进度</li>
<li class="">如何让 agent 更像长期可用的系统，而不是一次性脚本</li>
</ul>
<p>这说明开源社区正在迅速从“炫 demo”阶段走向“拼可靠性”阶段。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-skillsmemorycontext-正在变成新三件套">2. Skills、Memory、Context 正在变成新三件套<a href="https://xiebo.fun/blog/2026/4/26/#2-skillsmemorycontext-%E6%AD%A3%E5%9C%A8%E5%8F%98%E6%88%90%E6%96%B0%E4%B8%89%E4%BB%B6%E5%A5%97" class="hash-link" aria-label="2. Skills、Memory、Context 正在变成新三件套的直接链接" title="2. Skills、Memory、Context 正在变成新三件套的直接链接" translate="no">​</a></h3>
<p>从 <code>andrej-karpathy-skills</code>、<code>hermes-agent</code>、<code>claude-context</code> 这些项目一起走热，可以看出一个非常清晰的共识：<strong>大模型能力已经不是最稀缺的，稀缺的是稳定、可复用、可累积的工作方式。</strong></p>
<p>接下来，越来越多仓库里很可能会出现类似这些“约束文件、记忆层、上下文层”的基础组件，就像过去大家习惯把 <code>Dockerfile</code>、CI 配置、lint 规则放进仓库一样。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-agent-正在从个人助手升级成团队生产力层">3. Agent 正在从“个人助手”升级成“团队生产力层”<a href="https://xiebo.fun/blog/2026/4/26/#3-agent-%E6%AD%A3%E5%9C%A8%E4%BB%8E%E4%B8%AA%E4%BA%BA%E5%8A%A9%E6%89%8B%E5%8D%87%E7%BA%A7%E6%88%90%E5%9B%A2%E9%98%9F%E7%94%9F%E4%BA%A7%E5%8A%9B%E5%B1%82" class="hash-link" aria-label="3. Agent 正在从“个人助手”升级成“团队生产力层”的直接链接" title="3. Agent 正在从“个人助手”升级成“团队生产力层”的直接链接" translate="no">​</a></h3>
<p><code>multica</code> 和 <code>openai-agents-python</code> 的热度都说明了一件事：市场已经开始默认一个前提——agent 不只是陪你聊天，而是要能分工、协作、追踪状态、被纳入组织流程。</p>
<p>这意味着下一阶段真正有价值的项目，不一定是“最像人聊天”的那个，而更可能是<strong>最像团队基础设施</strong>的那个。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-非-ai-项目的出圈路径越来越像把旧问题产品化">4. 非 AI 项目的出圈路径，越来越像“把旧问题产品化”<a href="https://xiebo.fun/blog/2026/4/26/#4-%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E7%9A%84%E5%87%BA%E5%9C%88%E8%B7%AF%E5%BE%84%E8%B6%8A%E6%9D%A5%E8%B6%8A%E5%83%8F%E6%8A%8A%E6%97%A7%E9%97%AE%E9%A2%98%E4%BA%A7%E5%93%81%E5%8C%96" class="hash-link" aria-label="4. 非 AI 项目的出圈路径，越来越像“把旧问题产品化”的直接链接" title="4. 非 AI 项目的出圈路径，越来越像“把旧问题产品化”的直接链接" translate="no">​</a></h3>
<p>本周还能冲上来的非 AI 项目，并不是因为它们突然沾上了最前沿研究，而是因为它们把原本分散、复杂、门槛高的流程做成了可复制的仓库资产。无论是 ArcKit 这种治理工具包，还是 HackingTool 这种安全工具集合，本质上都是<strong>把已有需求重新产品化</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/4/26/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<p>如果只记住几件事，我会选这几条：</p>
<ol>
<li class=""><strong>AI coding 的最热方向已经不是“再来一个更强模型”，而是“怎么把现有模型驯化成更可靠的同事”。</strong></li>
<li class=""><strong>行为约束文件化正在成为低成本高回报的实践</strong>，<code>andrej-karpathy-skills</code> 的爆发就是最直接的例子。</li>
<li class=""><strong>长期记忆与技能复用，已经从增强项变成 agent 产品的核心卖点。</strong></li>
<li class=""><strong>代码上下文基础设施正在补齐 coding agent 的短板</strong>，<code>claude-context</code> 这类项目很可能继续长尾走强。</li>
<li class=""><strong>managed agents / multi-agent workflow 的热度说明组织级使用场景正在加速形成。</strong></li>
<li class=""><strong>非 AI 榜单空间继续被压缩</strong>，这不是坏事，反而更清楚地暴露了当前 GitHub 热点几乎完全围绕 AI 工程化在运转。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/4/26/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>这周的 Trending 给人的最大感受是：<strong>AI 开源的主战场已经不再是“能力展示”，而是“生产可用性”。</strong> 大家关心的不是 agent 偶尔能不能写出一段漂亮代码，而是它能不能记住上下文、遵守边界、和别的 agent 协作、逐步变得更省心。</p>
<p>从这个角度看，本周最热的项目虽然分布在 skills、memory、context、workflow 和 managed platform 等不同方向，但它们都在回答同一个问题：<strong>怎么把 AI 从好玩的演示，推进成可复用的工程系统。</strong> 这很可能会继续定义接下来几周甚至几个月的 GitHub 热点结构。</p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[GitHub Trending 周报：AI 与非 AI 热门项目观察（2026-04-19）]]></title>
            <link>https://xiebo.fun/blog/2026/4/19/</link>
            <guid>https://xiebo.fun/blog/2026/4/19/</guid>
            <pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本周 GitHub Trending 周榜几乎被 AI Agent、记忆系统与垂直模型占据，非 AI 项目更多是在承接 AI 时代的新工作流。]]></description>
            <content:encoded><![CDATA[<p>这周的 GitHub Trending（weekly）有一个非常鲜明的特征：榜单头部几乎被 AI Agent 相关项目包场，尤其是 coding agent、agent 记忆、agent 管理平台、以及把特定领域知识做成模型或工作流的项目。非 AI 项目并没有完全消失，但热度更多来自“给 AI 时代做基础设施”或者“把老工作流变成更自动化、更脚本化的接口”。</p>
<p>本文主要基于 GitHub Trending 周榜页面，以及相关仓库 README / 项目描述做归纳。由于 Trending 只展示结果，不直接给出流量来源或传播路径，因此“为什么本周会热”这部分会尽量基于项目定位、最近更新和榜单上下文做审慎判断，不做无依据猜测。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周总览">本周总览<a href="https://xiebo.fun/blog/2026/4/19/#%E6%9C%AC%E5%91%A8%E6%80%BB%E8%A7%88" class="hash-link" aria-label="本周总览的直接链接" title="本周总览的直接链接" translate="no">​</a></h2>
<p>先看结论：</p>
<ul>
<li class=""><strong>AI Agent 已经从“能不能做事”转向“怎样更稳定地做事”</strong>。这周最热的几个项目，不是在拼聊天效果，而是在拼约束、记忆、任务分解、可重复性和团队协作。</li>
<li class=""><strong>“把经验沉淀为技能/规则”成为热门产品形态</strong>。<code>andrej-karpathy-skills</code>、<code>agent-skills</code>、<code>claude-mem</code> 这类项目，本质上都在解决同一个问题：怎么让 agent 不要每次都从零开始犯同样的错。</li>
<li class=""><strong>垂直模型继续冒头</strong>。<code>Kronos</code> 这样的金融市场基础模型，说明 AI 热点不再只属于通用模型，而是开始向金融、语音等高价值垂直场景渗透。</li>
<li class=""><strong>非 AI 项目存在感被明显压缩</strong>。本周能进入前列的非 AI 项目不多，更多是像 <code>wacli</code> 这种把原本封闭的沟通工具转成 CLI 能力，或者 <code>markitdown</code> 这种把文档处理标准化的基础工具。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-热门项目">AI 热门项目<a href="https://xiebo.fun/blog/2026/4/19/#ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="AI 热门项目的直接链接" title="AI 热门项目的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-multica-aiandrej-karpathy-skills">1. multica-ai/andrej-karpathy-skills<a href="https://xiebo.fun/blog/2026/4/19/#1-multica-aiandrej-karpathy-skills" class="hash-link" aria-label="1. multica-ai/andrej-karpathy-skills的直接链接" title="1. multica-ai/andrej-karpathy-skills的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：这是一个围绕 Claude Code 使用方式整理出来的 <code>CLAUDE.md</code> 指南文件，核心目标是减少大模型写代码时常见的坏习惯，比如擅自假设、过度抽象、误改无关代码、不会暴露不确定性。</li>
<li class=""><strong>为什么本周会热</strong>：一方面，这个项目的命名直接借到了 Andrej Karpathy 对 LLM coding pitfalls 的观察，传播性很强；另一方面，它把“prompt 工程”进一步收敛成了一个可直接落地到仓库里的规则文件，门槛极低、复制成本几乎为零。</li>
<li class=""><strong>和同类项目相比的新鲜点</strong>：它不是再造一个 agent 框架，而是把“如何约束 agent”压缩成最轻量的交付物。这比重新训练模型、重新写 orchestration 更符合当前开发者的真实需求：<strong>先把 agent 的行为校正好</strong>。</li>
<li class=""><strong>反映出的趋势</strong>：AI coding 的竞争点，正在从“模型智商”转向“工程约束”。谁能把 agent 的行为边界描述得更清楚，谁就更容易得到稳定产出。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-nousresearchhermes-agent">2. NousResearch/hermes-agent<a href="https://xiebo.fun/blog/2026/4/19/#2-nousresearchhermes-agent" class="hash-link" aria-label="2. NousResearch/hermes-agent的直接链接" title="2. NousResearch/hermes-agent的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个强调自我改进能力的通用 AI Agent。它把技能沉淀、记忆、跨会话检索、计划执行、定时任务和多平台接入放进了同一个系统里。</li>
<li class=""><strong>为什么本周会热</strong>：这类项目踩中了现在 agent 用户最现实的痛点：不是一次性 demo，而是要<strong>长期可用</strong>。从 README 看，Hermes Agent 的卖点不是“回答更聪明”，而是“能持续记住、复用、改进过去的经验”，这恰好对应了近期大家对 agent 可靠性的关注点。</li>
<li class=""><strong>和同类项目相比的新鲜点</strong>：很多 agent 框架强调工具调用或多代理编排，Hermes Agent 更强调一个闭环：做事 → 总结 → 形成技能 → 下次复用。这个“自我积累”思路，比单纯增加更多工具更像产品化路线。</li>
<li class=""><strong>反映出的趋势</strong>：Agent 平台正在从“会调工具”升级为“会成长的执行系统”。长期记忆和技能沉淀，可能会成为下一阶段 agent 产品的标准件。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-shiyu-coderkronos">3. shiyu-coder/Kronos<a href="https://xiebo.fun/blog/2026/4/19/#3-shiyu-coderkronos" class="hash-link" aria-label="3. shiyu-coder/Kronos的直接链接" title="3. shiyu-coder/Kronos的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个面向金融市场语言的基础模型，项目描述直接定位为“金融市场语言的 foundation model”。</li>
<li class=""><strong>为什么本周会热</strong>：AI 社区现在对垂直领域模型的兴趣在上升，而金融是最典型的高价值、高噪声、高时序依赖场景。<code>Kronos</code> 的传播点很明确：它不是泛用 LLM，而是试图把市场数据、金融时序和领域语义当成单独一种“语言”来建模。</li>
<li class=""><strong>和同类项目相比的新鲜点</strong>：新鲜点不只是“金融 + AI”，而是它把金融市场问题从传统量化建模，转成 foundation model 叙事。这种包装方式让它同时吸引了量化、时序预测和大模型三类受众。</li>
<li class=""><strong>反映出的趋势</strong>：2026 年的 AI 开源热度，越来越多会落到“通用模型之外的高价值垂直模型”。金融、医疗、语音、工业等场景，都会继续出现这种“专门语境专门建模”的项目。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-multica-aimultica">4. multica-ai/multica<a href="https://xiebo.fun/blog/2026/4/19/#4-multica-aimultica" class="hash-link" aria-label="4. multica-ai/multica的直接链接" title="4. multica-ai/multica的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个开源的 managed agents 平台，目标不是单个 agent 能做什么，而是把多个 coding agents 当成团队成员一样去分配任务、跟踪进度、沉淀技能。</li>
<li class=""><strong>为什么本周会热</strong>：这类平台正好踩在一个新的市场情绪上：开发者已经不满足于“和 agent 对话”，而是开始希望像管理实习生或外包团队一样去管理 agent 产能。<code>Multica</code> 的 slogan“Your next 10 hires won't be human”本身就很适合社交媒体传播。</li>
<li class=""><strong>和同类项目相比的新鲜点</strong>：它把“agent 协作”从技术概念翻译成了非常熟悉的管理语言：任务分派、状态同步、阻塞反馈、技能复用。这比很多学术味较重的 multi-agent 项目更容易被工程团队理解。</li>
<li class=""><strong>反映出的趋势</strong>：Agent 产品正在从个人助手向团队生产力系统演进。未来热度高的项目，可能不再只是“最强 agent”，而是“最好管理一群 agent 的平台”。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-thedotmackclaude-mem">5. thedotmack/claude-mem<a href="https://xiebo.fun/blog/2026/4/19/#5-thedotmackclaude-mem" class="hash-link" aria-label="5. thedotmack/claude-mem的直接链接" title="5. thedotmack/claude-mem的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个 Claude Code 插件，用来记录 coding session 中发生的事情，用 AI 压缩成可复用记忆，并在后续会话中回注相关上下文。</li>
<li class=""><strong>为什么本周会热</strong>：开发者已经充分体验过“agent 每次重开就失忆”的低效感。<code>claude-mem</code> 解决的是非常刚需、非常具体的问题：<strong>让上下文不只靠 token 窗口，而能被提炼成长期记忆</strong>。</li>
<li class=""><strong>和同类项目相比的新鲜点</strong>：它不是一个通用 memory 概念 demo，而是直接绑定到 Claude Code 的真实使用路径里，强调自动捕获、压缩和回注。这种“贴着高频工作流做”的方式，比泛化 memory layer 更容易起量。</li>
<li class=""><strong>反映出的趋势</strong>：Agent memory 正从“可选增强项”变成“核心基础设施”。接下来谁能把记忆做得更自动、更低打扰、更可解释，谁就更容易获得用户留存。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-openbmbvoxcpm">6. OpenBMB/VoxCPM<a href="https://xiebo.fun/blog/2026/4/19/#6-openbmbvoxcpm" class="hash-link" aria-label="6. OpenBMB/VoxCPM的直接链接" title="6. OpenBMB/VoxCPM的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个强调 tokenizer-free、多语言语音生成、声音克隆和创意语音设计的 TTS 项目。</li>
<li class=""><strong>为什么本周会热</strong>：语音方向最近重新升温，一是因为多模态交互越来越重要，二是本地可跑、可控声音克隆的需求变强。<code>VoxCPM</code> 把多语言、拟真和创意控制放在一起，自然更容易吸引关注。</li>
<li class=""><strong>和同类项目相比的新鲜点</strong>：它把“tokenizer-free”作为一个显性卖点抛出来，说明语音模型不再只拼结果音色，而是在拼建模范式和控制能力。</li>
<li class=""><strong>反映出的趋势</strong>：多模态热度没有降温，只是从图像进一步扩散到语音。开源语音项目会继续往“更像产品而不是研究 demo”的方向走。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非-ai-热门项目">非 AI 热门项目<a href="https://xiebo.fun/blog/2026/4/19/#%E9%9D%9E-ai-%E7%83%AD%E9%97%A8%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="非 AI 热门项目的直接链接" title="非 AI 热门项目的直接链接" translate="no">​</a></h2>
<blockquote>
<p>本周非 AI 项目明显偏少，说明 weekly 榜单的关注度高度集中在 AI 相关方向。这里挑两个更有代表性的项目来看，不硬凑数量。</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-microsoftmarkitdown">1. microsoft/markitdown<a href="https://xiebo.fun/blog/2026/4/19/#1-microsoftmarkitdown" class="hash-link" aria-label="1. microsoft/markitdown的直接链接" title="1. microsoft/markitdown的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个把 PDF、Office 文档、图片、音频等输入统一转换成 Markdown 的 Python 工具。</li>
<li class=""><strong>为什么本周会热</strong>：虽然它经常出现在 LLM 工作流里，但它的本体其实是一个文档处理基础工具。最近它增加了 MCP server 方向的集成叙事，也更符合当前“把一切数据都接到 agent / LLM 上”的生态需求，因此热度被进一步抬升。</li>
<li class=""><strong>和同类项目相比的新鲜点</strong>：它强调输出是<strong>结构尽量完整的 Markdown</strong>，这比单纯抽文本更适合下游检索、摘要、RAG 和 agent 消费。说白了，它不是在做“格式转换”，而是在做“面向模型消费的数据标准化”。</li>
<li class=""><strong>反映出的趋势</strong>：哪怕不是 AI 模型本身，只要能把现实世界的数据变得更适合模型处理，也会被 AI 浪潮带热。未来很多基础工具都会获得“被 AI 重新定义”的第二波增长。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-steipetewacli">2. steipete/wacli<a href="https://xiebo.fun/blog/2026/4/19/#2-steipetewacli" class="hash-link" aria-label="2. steipete/wacli的直接链接" title="2. steipete/wacli的直接链接" translate="no">​</a></h3>
<ul>
<li class=""><strong>它是做什么的</strong>：一个基于 WhatsApp Web 协议能力构建的 CLI，支持消息同步、离线搜索、发送消息、联系人和群组管理。</li>
<li class=""><strong>为什么本周会热</strong>：即时通讯工具一直是高频入口，但真正可脚本化、可离线搜索、可自动化的接口却不多。<code>wacli</code> 把一个典型消费级应用变成了开发者可编排的命令行能力，这对个人自动化和 bot 场景都很有吸引力。</li>
<li class=""><strong>和同类项目相比的新鲜点</strong>：它不是只做收发，而是把“本地同步 + 搜索 + 发送 + 管理”串成一个完整工作流。这个思路很像邮件时代的 CLI 工具链，只不过现在对象变成了 WhatsApp。</li>
<li class=""><strong>反映出的趋势</strong>：非 AI 项目里，真正容易爆的方向仍然是“把封闭产品开放成脚本接口”。开发者依然愿意为自动化和可控性买单。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术趋势分析">技术趋势分析<a href="https://xiebo.fun/blog/2026/4/19/#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF%E5%88%86%E6%9E%90" class="hash-link" aria-label="技术趋势分析的直接链接" title="技术趋势分析的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-agent-工程化正在替代-agent-炫技">1. Agent 工程化正在替代 Agent 炫技<a href="https://xiebo.fun/blog/2026/4/19/#1-agent-%E5%B7%A5%E7%A8%8B%E5%8C%96%E6%AD%A3%E5%9C%A8%E6%9B%BF%E4%BB%A3-agent-%E7%82%AB%E6%8A%80" class="hash-link" aria-label="1. Agent 工程化正在替代 Agent 炫技的直接链接" title="1. Agent 工程化正在替代 Agent 炫技的直接链接" translate="no">​</a></h3>
<p>从这周榜单看，最热的不是“某个 agent 在 benchmark 上又赢了”，而是：</p>
<ul>
<li class="">如何让 agent 少犯错</li>
<li class="">如何沉淀规则和经验</li>
<li class="">如何在团队里管理 agent</li>
<li class="">如何给 agent 提供长期记忆</li>
<li class="">如何让结果更可重复</li>
</ul>
<p>这说明市场开始从“看 demo”转向“看生产力”。这对开源生态是个好事，因为工程化问题更适合通过开源快速试错和传播。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-记忆技能约束正在成为新的三件套">2. 记忆、技能、约束正在成为新的三件套<a href="https://xiebo.fun/blog/2026/4/19/#2-%E8%AE%B0%E5%BF%86%E6%8A%80%E8%83%BD%E7%BA%A6%E6%9D%9F%E6%AD%A3%E5%9C%A8%E6%88%90%E4%B8%BA%E6%96%B0%E7%9A%84%E4%B8%89%E4%BB%B6%E5%A5%97" class="hash-link" aria-label="2. 记忆、技能、约束正在成为新的三件套的直接链接" title="2. 记忆、技能、约束正在成为新的三件套的直接链接" translate="no">​</a></h3>
<p><code>andrej-karpathy-skills</code>、<code>claude-mem</code>、<code>agent-skills</code> 这类项目之所以能一起上榜，不是偶然。它们共同反映出一个现实：<strong>大模型不缺能力展示，缺的是稳定工作方式</strong>。接下来，skills、memory、policy file 很可能会像 <code>.gitignore</code>、<code>Dockerfile</code> 一样，成为仓库里的常见基础文件。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-垂直领域模型会持续抢占注意力">3. 垂直领域模型会持续抢占注意力<a href="https://xiebo.fun/blog/2026/4/19/#3-%E5%9E%82%E7%9B%B4%E9%A2%86%E5%9F%9F%E6%A8%A1%E5%9E%8B%E4%BC%9A%E6%8C%81%E7%BB%AD%E6%8A%A2%E5%8D%A0%E6%B3%A8%E6%84%8F%E5%8A%9B" class="hash-link" aria-label="3. 垂直领域模型会持续抢占注意力的直接链接" title="3. 垂直领域模型会持续抢占注意力的直接链接" translate="no">​</a></h3>
<p><code>Kronos</code> 说明市场已经不满足于“再来一个通用大模型”。只要某个垂直领域具备明确商业价值、复杂数据结构和高专家门槛，就很适合出现“领域 foundation model”的叙事。金融只是开始，后面大概率还会看到更多针对代码、语音、机器人、制造业的数据原生模型。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-非-ai-项目正在被-ai-生态重新估值">4. 非 AI 项目正在被 AI 生态重新估值<a href="https://xiebo.fun/blog/2026/4/19/#4-%E9%9D%9E-ai-%E9%A1%B9%E7%9B%AE%E6%AD%A3%E5%9C%A8%E8%A2%AB-ai-%E7%94%9F%E6%80%81%E9%87%8D%E6%96%B0%E4%BC%B0%E5%80%BC" class="hash-link" aria-label="4. 非 AI 项目正在被 AI 生态重新估�值的直接链接" title="4. 非 AI 项目正在被 AI 生态重新估值的直接链接" translate="no">​</a></h3>
<p><code>markitdown</code> 就是个很典型的例子。它原本可以被看作普通文档转换工具，但在 LLM / MCP / agent 生态里，它又变成了“模型输入标准化层”。这类项目的热度不是因为它们突然变聪明了，而是因为 AI 时代重新抬高了基础设施的价值。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="本周最值得关注的新鲜点">本周最值得关注的新鲜点<a href="https://xiebo.fun/blog/2026/4/19/#%E6%9C%AC%E5%91%A8%E6%9C%80%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E7%9A%84%E6%96%B0%E9%B2%9C%E7%82%B9" class="hash-link" aria-label="本周最值得关注的新鲜点的直接链接" title="本周最值得关注的新鲜点的直接链接" translate="no">​</a></h2>
<p>如果只挑几个最值得记住的新鲜点，我会选这几个：</p>
<ol>
<li class=""><strong>“规则文件化”正在成为 AI coding 的低成本最佳实践</strong>：<code>andrej-karpathy-skills</code> 的火，说明大家已经接受“先约束 agent，再放大 agent”。</li>
<li class=""><strong>Agent 平台开始讲“组织管理”而不是“单体能力”</strong>：<code>multica</code> 的热度很说明问题，未来 agent 很可能以团队形态被消费。</li>
<li class=""><strong>长期记忆从概念走向插件化产品</strong>：<code>claude-mem</code> 把 memory 做成了真正贴近开发工作流的能力，不再只是 RAG 的变体。</li>
<li class=""><strong>垂直 foundation model 的叙事已经跑通</strong>：<code>Kronos</code> 这类项目说明，只要场景足够具体，市场愿意为“领域专用模型”买关注。</li>
<li class=""><strong>本周榜单的非 AI 空间被明显压缩</strong>：这本身也是一个信号——GitHub 热点仍然处在 AI 基础设施和 agent 平台的超级周期里。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结语">结语<a href="https://xiebo.fun/blog/2026/4/19/#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接" translate="no">​</a></h2>
<p>这周的 Trending 很像一个缩影：AI 开源的重心已经从“模型能不能做事”转向“系统能不能稳定交付”。热门项目最集中的方向，不是更会聊天，而是更会记忆、更会约束、更会协作、更适合进入真实工作流。</p>
<p>如果说去年的关键词是“人人都在接入大模型”，那今年更像是“人人都在试着把 agent 变成靠谱同事”。从这个角度看，这周最热的项目虽然分散在 skills、memory、platform、vertical model、voice 等不同赛道，但本质上回答的是同一个问题：<strong>怎么把 AI 从演示品变成生产工具。</strong></p>]]></content:encoded>
            <category>GitHub</category>
            <category>Trending</category>
            <category>AI</category>
            <category>开源周报</category>
        </item>
        <item>
            <title><![CDATA[Karpenter 弹性伸缩实践]]></title>
            <link>https://xiebo.fun/blog/2026/4/18/</link>
            <guid>https://xiebo.fun/blog/2026/4/18/</guid>
            <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[在 EKS 上用 Karpenter 替换 Cluster Autoscaler 的一些实践与踩坑。]]></description>
            <content:encoded><![CDATA[<p>在 EKS 上替掉 Cluster Autoscaler，换成 Karpenter 做节点弹性伸缩。这里记录一下最小可用配置和踩过的坑。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么换-karpenter">为什么换 Karpenter<a href="https://xiebo.fun/blog/2026/4/18/#%E4%B8%BA%E4%BB%80%E4%B9%88%E6%8D%A2-karpenter" class="hash-link" aria-label="为什么换 Karpenter的直接链接" title="为什么换 Karpenter的直接链接" translate="no">​</a></h2>
<p>Cluster Autoscaler 要预先定义 ASG、实例规格一旦改动就得重建，扩容也慢。Karpenter 直接和 EC2 对话，Pending 出现后几十秒内就能把节点拉起来，而且可以按 Pod 的实际需求选实例规格，不用维护一堆 ASG。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总体思路">总体思路<a href="https://xiebo.fun/blog/2026/4/18/#%E6%80%BB%E4%BD%93%E6%80%9D%E8%B7%AF" class="hash-link" aria-label="总体思路的直接链接" title="总体思路的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="karpenter" src="https://xiebo.fun/assets/images/karpenter-0dad69050399ede42db06a6644038baf.png" width="1794" height="1747" class="img_ev3q"></p>
<ul>
<li class=""><strong>IAM</strong>：用官方 CloudFormation 模板把 <code>KarpenterNodeRole</code> 和 <code>KarpenterControllerPolicy</code> 建好</li>
<li class=""><strong>中断事件</strong>：配 SQS + EventBridge，接收 Spot 中断、健康事件、实例状态变化</li>
<li class=""><strong>NodeClass</strong>：统一定义 AMI、EBS、子网、安全组发现方式</li>
<li class=""><strong>NodePool</strong>：两个池子，主池偏好 AMD（便宜），次池兜底</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="iam--中断队列">IAM &amp; 中断队列<a href="https://xiebo.fun/blog/2026/4/18/#iam--%E4%B8%AD%E6%96%AD%E9%98%9F%E5%88%97" class="hash-link" aria-label="IAM &amp; 中断队列的直接链接" title="IAM &amp; 中断队列的直接链接" translate="no">​</a></h2>
<p>直接用官方的 CFN 模板部署，关键资源：</p>
<ul>
<li class=""><code>KarpenterNodeRole-&lt;cluster&gt;</code>：节点 EC2 role，挂 <code>AmazonEKS_CNI_Policy</code> / <code>AmazonEKSWorkerNodePolicy</code> / <code>AmazonEC2ContainerRegistryPullOnly</code> / <code>AmazonSSMManagedInstanceCore</code></li>
<li class=""><code>KarpenterControllerPolicy-&lt;cluster&gt;</code>：控制器用的策略，限制 <code>RunInstances</code> / <code>CreateFleet</code> 等动作必须带 <code>kubernetes.io/cluster/&lt;cluster&gt;=owned</code> 标签，避免越权</li>
<li class=""><code>KarpenterInterruptionQueue</code>：SQS 队列，接 4 条 EventBridge 规则<!-- -->
<ul>
<li class=""><code>aws.health</code> - AWS Health Event</li>
<li class=""><code>aws.ec2</code> - EC2 Spot Instance Interruption Warning</li>
<li class=""><code>aws.ec2</code> - EC2 Instance Rebalance Recommendation</li>
<li class=""><code>aws.ec2</code> - EC2 Instance State-change Notification</li>
</ul>
</li>
</ul>
<blockquote>
<p>子网和安全组别忘了打标签 <code>karpenter.sh/discovery: &lt;cluster-name&gt;</code>，Karpenter 就是靠这个发现网络资源的。</p>
</blockquote>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>CloudFormation 模板 karpenter-cfn.yaml（展开查看）</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">karpenter-cfn.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">AWSTemplateFormatVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2010-09-09"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">Description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Resources used by https</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//github.com/aws/karpenter</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">Parameters</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">ClusterName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> String</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EKS cluster name"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">Resources</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">KarpenterNodeRole</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AWS::IAM::Role"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">RoleName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Sub</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"KarpenterNodeRole-${ClusterName}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">Path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> /</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">AssumeRolePolicyDocument</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">Version</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2012-10-17"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">Statement</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">Effect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Allow</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Principal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">Service</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Sub</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ec2.${AWS::URLSuffix}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"sts:AssumeRole"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">ManagedPolicyArns</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Sub</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"arn:${AWS::Partition}:iam::aws:policy/AmazonEKS_CNI_Policy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Sub</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"arn:${AWS::Partition}:iam::aws:policy/AmazonEKSWorkerNodePolicy"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Sub</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"arn:${AWS::Partition}:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Sub</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"arn:${AWS::Partition}:iam::aws:policy/AmazonSSMManagedInstanceCore"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">KarpenterControllerPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">IAM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">ManagedPolicy</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">ManagedPolicyName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Sub</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"KarpenterControllerPolicy-${ClusterName}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">PolicyDocument</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Sub</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">        {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          "Version": "2012-10-17",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          "Statement": [</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowScopedEC2InstanceAccessActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": [</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}::image/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}::snapshot/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:security-group/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:subnet/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:capacity-reservation/*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              ],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": ["ec2:RunInstances", "ec2:CreateFleet"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowScopedEC2LaunchTemplateAccessActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "arn:${AWS::Partition}:ec2:${AWS::Region}:*:launch-template/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": ["ec2:RunInstances", "ec2:CreateFleet"],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/kubernetes.io/cluster/${ClusterName}": "owned"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringLike": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/karpenter.sh/nodepool": "*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowScopedEC2InstanceActionsWithTags",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": [</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:fleet/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:instance/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:volume/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:network-interface/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:launch-template/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:spot-instances-request/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:capacity-reservation/*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              ],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": ["ec2:RunInstances", "ec2:CreateFleet", "ec2:CreateLaunchTemplate"],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/kubernetes.io/cluster/${ClusterName}": "owned",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/eks:eks-cluster-name": "${ClusterName}"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringLike": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/karpenter.sh/nodepool": "*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowScopedResourceCreationTagging",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": [</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:fleet/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:instance/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:volume/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:network-interface/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:launch-template/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:spot-instances-request/*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              ],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": "ec2:CreateTags",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/kubernetes.io/cluster/${ClusterName}": "owned",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/eks:eks-cluster-name": "${ClusterName}",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "ec2:CreateAction": ["RunInstances", "CreateFleet", "CreateLaunchTemplate"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringLike": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/karpenter.sh/nodepool": "*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowScopedResourceTagging",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "arn:${AWS::Partition}:ec2:${AWS::Region}:*:instance/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": "ec2:CreateTags",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/kubernetes.io/cluster/${ClusterName}": "owned"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringLike": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/karpenter.sh/nodepool": "*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEqualsIfExists": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/eks:eks-cluster-name": "${ClusterName}"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ForAllValues:StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:TagKeys": ["eks:eks-cluster-name", "karpenter.sh/nodeclaim", "Name"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowScopedDeletion",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": [</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:instance/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "arn:${AWS::Partition}:ec2:${AWS::Region}:*:launch-template/*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              ],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": ["ec2:TerminateInstances", "ec2:DeleteLaunchTemplate"],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/kubernetes.io/cluster/${ClusterName}": "owned"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringLike": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/karpenter.sh/nodepool": "*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowRegionalReadActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": [</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ec2:DescribeCapacityReservations",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ec2:DescribeImages",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ec2:DescribeInstances",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ec2:DescribeInstanceTypeOfferings",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ec2:DescribeInstanceTypes",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ec2:DescribeLaunchTemplates",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ec2:DescribeSecurityGroups",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ec2:DescribeSpotPriceHistory",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "ec2:DescribeSubnets"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              ],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestedRegion": "${AWS::Region}"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowSSMReadActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "arn:${AWS::Partition}:ssm:${AWS::Region}::parameter/aws/service/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": "ssm:GetParameter"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowPricingReadActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": "pricing:GetProducts"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowInterruptionQueueActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "${KarpenterInterruptionQueue.Arn}",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": ["sqs:DeleteMessage", "sqs:GetQueueUrl", "sqs:ReceiveMessage"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowPassingInstanceRole",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "${KarpenterNodeRole.Arn}",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": "iam:PassRole",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "iam:PassedToService": ["ec2.amazonaws.com", "ec2.amazonaws.com.cn"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowScopedInstanceProfileCreationActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "arn:${AWS::Partition}:iam::${AWS::AccountId}:instance-profile/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": ["iam:CreateInstanceProfile"],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/kubernetes.io/cluster/${ClusterName}": "owned",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/eks:eks-cluster-name": "${ClusterName}",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/topology.kubernetes.io/region": "${AWS::Region}"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringLike": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/karpenter.k8s.aws/ec2nodeclass": "*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowScopedInstanceProfileTagActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "arn:${AWS::Partition}:iam::${AWS::AccountId}:instance-profile/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": ["iam:TagInstanceProfile"],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/kubernetes.io/cluster/${ClusterName}": "owned",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/topology.kubernetes.io/region": "${AWS::Region}",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/kubernetes.io/cluster/${ClusterName}": "owned",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/eks:eks-cluster-name": "${ClusterName}",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/topology.kubernetes.io/region": "${AWS::Region}"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringLike": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/karpenter.k8s.aws/ec2nodeclass": "*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:RequestTag/karpenter.k8s.aws/ec2nodeclass": "*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowScopedInstanceProfileActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "arn:${AWS::Partition}:iam::${AWS::AccountId}:instance-profile/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": [</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "iam:AddRoleToInstanceProfile",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "iam:RemoveRoleFromInstanceProfile",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "iam:DeleteInstanceProfile"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              ],</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Condition": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringEquals": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/kubernetes.io/cluster/${ClusterName}": "owned",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/topology.kubernetes.io/region": "${AWS::Region}"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                "StringLike": {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                  "aws:ResourceTag/karpenter.k8s.aws/ec2nodeclass": "*"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">                }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowInstanceProfileReadActions",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "arn:${AWS::Partition}:iam::${AWS::AccountId}:instance-profile/*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": "iam:GetInstanceProfile"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowUnscopedInstanceProfileListAction",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "*",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": "iam:ListInstanceProfiles"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            },</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Sid": "AllowAPIServerEndpointDiscovery",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Effect": "Allow",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Resource": "arn:${AWS::Partition}:eks:${AWS::Region}:${AWS::AccountId}:cluster/${ClusterName}",</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">              "Action": "eks:DescribeCluster"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">            }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          ]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">        }</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">KarpenterInterruptionQueue</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">SQS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">Queue</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">QueueName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Sub</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"${ClusterName}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">MessageRetentionPeriod</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">300</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">SqsManagedSseEnabled</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">KarpenterInterruptionQueuePolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> AWS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">SQS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">QueuePolicy</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">Queues</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!Ref</span><span class="token plain"> KarpenterInterruptionQueue</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">PolicyDocument</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">Id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> EC2InterruptionPolicy</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">Statement</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">Effect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Allow</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Principal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">Service</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> events.amazonaws.com</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> sqs.amazonaws.com</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> sqs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">SendMessage</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Resource</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!GetAtt</span><span class="token plain"> KarpenterInterruptionQueue.Arn</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">Sid</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> DenyHTTP</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Effect</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Deny</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> sqs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">*</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Resource</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!GetAtt</span><span class="token plain"> KarpenterInterruptionQueue.Arn</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Condition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">Bool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token key atrule">aws:SecureTransport</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">Principal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">ScheduledChangeRule</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'AWS::Events::Rule'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">EventPattern</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">aws.health</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">detail-type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">AWS Health Event</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">Targets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">Id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> KarpenterInterruptionQueueTarget</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">Arn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!GetAtt</span><span class="token plain"> KarpenterInterruptionQueue.Arn</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">SpotInterruptionRule</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'AWS::Events::Rule'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">EventPattern</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">aws.ec2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">detail-type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">EC2 Spot Instance Interruption Warning</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">Targets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">Id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> KarpenterInterruptionQueueTarget</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">Arn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!GetAtt</span><span class="token plain"> KarpenterInterruptionQueue.Arn</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">RebalanceRule</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'AWS::Events::Rule'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">EventPattern</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">aws.ec2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">detail-type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">EC2 Instance Rebalance Recommendation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">Targets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">Id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> KarpenterInterruptionQueueTarget</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">Arn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!GetAtt</span><span class="token plain"> KarpenterInterruptionQueue.Arn</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">InstanceStateChangeRule</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'AWS::Events::Rule'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">Properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">EventPattern</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">source</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">aws.ec2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">detail-type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">EC2 Instance State</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">change Notification</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">Targets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">Id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> KarpenterInterruptionQueueTarget</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">Arn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token tag" style="color:rgb(255, 121, 198)">!GetAtt</span><span class="token plain"> KarpenterInterruptionQueue.Arn</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ec2nodeclass">EC2NodeClass<a href="https://xiebo.fun/blog/2026/4/18/#ec2nodeclass" class="hash-link" aria-label="EC2NodeClass的直接链接" title="EC2NodeClass的直接链接" translate="no">​</a></h2>
<p>几个要点：</p>
<ul>
<li class=""><strong>AMI 锁版本</strong>：<code>al2023@v20260304</code> 显式固定版本号，避免新 AMI 发布时自动滚升级触发意外</li>
<li class=""><strong>EBS 加密</strong> + gp3 50G，按需再调</li>
<li class=""><strong>子网/安全组</strong>靠 tag 发现，多 AZ 自然覆盖</li>
</ul>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>ec2-node-class-default.yaml（展开查看）</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">ec2-node-class-default.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws/v1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> EC2NodeClass</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"KarpenterNodeRole-&lt;cluster-name&gt;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">amiSelectorTerms</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">alias</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"al2023@v20260304"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">blockDeviceMappings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">deviceName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> /dev/xvda</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">ebs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">volumeSize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 50Gi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">volumeType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> gp3</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">encrypted</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">deleteOnTermination</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">subnetSelectorTerms</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">karpenter.sh/discovery</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;cluster-name&gt;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">securityGroupSelectorTerms</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">karpenter.sh/discovery</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;cluster-name&gt;"</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nodepool主池--兜底池">NodePool：主池 + 兜底池<a href="https://xiebo.fun/blog/2026/4/18/#nodepool%E4%B8%BB%E6%B1%A0--%E5%85%9C%E5%BA%95%E6%B1%A0" class="hash-link" aria-label="NodePool：主池 + 兜底池的直接链接" title="NodePool：主池 + 兜底池的直接��链接" translate="no">​</a></h2>
<p>两个池子，用 <code>weight</code> 控制优先级。主池 weight=100 偏好 AMD；兜底池 weight=10，不锁 CPU 厂商。</p>
<p>为什么这么分？</p>
<ul>
<li class=""><strong>AMD 优先</strong>：c/m 系列的 AMD 实例（c6a、m6a 等）比 Intel 版本便宜约 10%，性能差距可忽略</li>
<li class=""><strong>兜底池</strong>：AMD 某些区域会抢不到容量，兜底池放开 CPU 厂商限制</li>
<li class=""><strong>CPU 范围锁 8~64 核</strong>：太小的节点碎片多，太大的节点故障爆炸半径大</li>
<li class=""><strong>只用 c / m 系列</strong>：不要 t 系列（突发性能不稳定）、不要 r / x 系列（内存太多浪费）</li>
<li class=""><strong>仅第 6、7 代</strong>：老代际性价比差</li>
<li class=""><strong><code>expireAfter: 720h</code></strong>：30 天强制重建，保证节点定期滚更新</li>
<li class=""><strong><code>consolidateAfter: 10m</code></strong>：利用率低的节点 10 分钟后被合并，避免频繁抖动</li>
</ul>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>node-pool-default-amd.yaml（展开查看）</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">node-pool-default-amd.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.sh/v1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> NodePool</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">amd</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">weight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">nodepool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">amd</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">capacity-profile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> elastic</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">cpu-preference</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> amd</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">requirements</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> kubernetes.io/arch</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"amd64"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> kubernetes.io/os</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"linux"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.sh/capacity</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">type</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"on-demand"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws/instance</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">category</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"c"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws/instance</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">cpu</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"8"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"16"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"32"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"64"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws/instance</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">cpu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">manufacturer</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"amd"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws/instance</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">generation</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"6"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"7"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">nodeClassRef</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> EC2NodeClass</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">expireAfter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 720h</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">limits</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">cpu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">800</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">disruption</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">consolidationPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> WhenEmptyOrUnderutilized</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">consolidateAfter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 10m</span><br></span></code></pre></div></div></div></div></details>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>node-pool-default-fallback.yaml（展开查看）</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">node-pool-default-fallback.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.sh/v1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> NodePool</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">fallback</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">weight</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">nodepool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">fallback</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">capacity-profile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> elastic</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">cpu-preference</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> generic</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">requirements</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> kubernetes.io/arch</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"amd64"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> kubernetes.io/os</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"linux"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.sh/capacity</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">type</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"on-demand"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws/instance</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">category</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"c"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws/instance</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">cpu</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"8"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"16"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"32"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"64"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws/instance</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">generation</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">operator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> In</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">values</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"6"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"7"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">nodeClassRef</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> karpenter.k8s.aws</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> EC2NodeClass</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">expireAfter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 720h</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">limits</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">cpu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">200</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">disruption</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">consolidationPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> WhenEmptyOrUnderutilized</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">consolidateAfter</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 10m</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="用-kustomize-组织">用 Kustomize 组织<a href="https://xiebo.fun/blog/2026/4/18/#%E7%94%A8-kustomize-%E7%BB%84%E7%BB%87" class="hash-link" aria-label="用 Kustomize 组织的直接链接" title="用 Kustomize 组织的直接链接" translate="no">​</a></h2>
<p>一键 <code>kubectl apply -k .</code> 下发：</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>kustomization.yaml（展开查看）</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">kustomization.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> kustomize.config.k8s.io/v1beta1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Kustomization</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">resources</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> node</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">pool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">amd.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> node</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">pool</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">default</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">fallback.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ec2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">node</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">class</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">default.yaml</span><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="验证弹性伸缩">验证弹性伸缩<a href="https://xiebo.fun/blog/2026/4/18/#%E9%AA%8C%E8%AF%81%E5%BC%B9%E6%80%A7%E4%BC%B8%E7%BC%A9" class="hash-link" aria-label="验证弹性伸缩的直接链接" title="验证弹性伸缩的直接链接" translate="no">​</a></h2>
<p>用一个能撑起节点的 Deployment 验证。<code>pause</code> 容器不跑任何逻辑，只申请资源：</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>test.yaml（展开查看）</summary><div><div class="collapsibleContent_i85q"><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">test.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">apiVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> apps/v1</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">kind</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Deployment</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> test</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">karpenter</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">namespace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">replicas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">selector</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">matchLabels</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> inflate</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">template</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">metadata</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">labels</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">app</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> inflate</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">spec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">terminationGracePeriodSeconds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">containers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> inflate</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> public.ecr.aws/eks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">distro/kubernetes/pause</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">3.7</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">resources</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token key atrule">requests</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">cpu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token key atrule">memory</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"4Gi"</span><br></span></code></pre></div></div></div></div></details>
<p>扩容过程看日志：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl logs </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> kube-system </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-l</span><span class="token plain"> app.kubernetes.io/name</span><span class="token operator">=</span><span class="token plain">karpenter </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><br></span></code></pre></div></div>
<p>看到 <code>Created nodeclaim</code> → <code>Registered node</code> → Pod 调度，整个过程通常 40~60 秒。</p>
<p>扩完再缩：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl scale deployment test-karpenter </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--replicas</span><span class="token operator">=</span><span class="token number">0</span><br></span></code></pre></div></div>
<p>10 分钟左右（<code>consolidateAfter</code>）节点被合并释放。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="踩过的坑">踩过的坑<a href="https://xiebo.fun/blog/2026/4/18/#%E8%B8%A9%E8%BF%87%E7%9A%84%E5%9D%91" class="hash-link" aria-label="踩过的坑的直接链接" title="踩过的坑的直接链接" translate="no">​</a></h2>
<p><strong>1. 子网/安全组没打标签</strong></p>
<p>Karpenter Pending 半天不动，日志报找不到子网。<code>kubectl describe ec2nodeclass default</code> 里 status 里子网列表是空的，补上 <code>karpenter.sh/discovery</code> tag 立刻恢复。</p>
<p><strong>2. AMI alias 不写版本号</strong></p>
<p>最开始写 <code>alias: al2023@latest</code>，节点 <code>expireAfter</code> 到期自动用新 AMI 重建，结果新 AMI 跟某个 DaemonSet 冲突，一波节点挂了。改成固定版本号后只在可控窗口手动升级。</p>
<p><strong>3. NodePool CPU limits 设太低</strong></p>
<p>业务突然起量时，NodePool 达到 <code>limits.cpu</code> 上限就不再扩。主池撞墙后靠兜底池顶上，所以两个池子的 limits 要结合业务峰值评估。</p>
<p><strong>4. Spot 中断没接 SQS</strong></p>
<p>早期没配中断队列，Spot 实例被回收时节点上 Pod 直接被 kill，没有优雅驱逐。配上 SQS + EventBridge 后，Karpenter 收到中断 2 分钟预警就开始预扩节点 + cordon 旧节点 + 迁移 Pod。</p>
<p><strong>5. t 系列 burstable 实例别选</strong></p>
<p>一开始贪便宜把 t 系列加进 requirements，结果跑 CI 任务 CPU credit 打完后节点直接假死。换成 c/m 系列稳定得多。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="回滚">回滚<a href="https://xiebo.fun/blog/2026/4/18/#%E5%9B%9E%E6%BB%9A" class="hash-link" aria-label="回滚的直接链接" title="回滚的直接链接" translate="no">​</a></h2>
<p>如果 Karpenter 出问题要回到 CA：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># 1. 先把 NodePool 删掉，阻止新节点被创建</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl delete nodepool </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--all</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 2. 等 Karpenter 管理的节点上 Pod 迁移或驱逐</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 可以人工 cordon + drain 加速</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 3. 卸载 Karpenter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">helm uninstall karpenter </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> kube-system</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># 4. 恢复 CA 配置</span><br></span></code></pre></div></div>
<p>CFN 栈和 IAM role 可以保留，不影响其他东西。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="参考">参考<a href="https://xiebo.fun/blog/2026/4/18/#%E5%8F%82%E8%80%83" class="hash-link" aria-label="参考的直接链接" title="参考的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://karpenter.sh/" target="_blank" rel="noopener noreferrer" class="">Karpenter 官方文档</a></li>
<li class=""><a href="https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/" target="_blank" rel="noopener noreferrer" class="">Karpenter getting started on EKS</a></li>
<li class=""><a href="https://karpenter.sh/docs/concepts/disruption/" target="_blank" rel="noopener noreferrer" class="">NodePool disruption 策略</a></li>
</ul>]]></content:encoded>
            <category>Kubernetes</category>
            <category>EKS</category>
            <category>Karpenter</category>
            <category>弹性伸缩</category>
        </item>
        <item>
            <title><![CDATA[Keycloak构建]]></title>
            <link>https://xiebo.fun/blog/2026/1/10/</link>
            <guid>https://xiebo.fun/blog/2026/1/10/</guid>
            <pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[none]]></description>
            <content:encoded><![CDATA[<p>使用<a href="https://www.keycloak.org/documentation" target="_blank" rel="noopener noreferrer" class="">keycloak</a>实现统一认证</p>
<p>默认文档使用docker命令拉起开发者模式，不适合生产部署</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-p</span><span class="token plain"> </span><span class="token number">127.0</span><span class="token plain">.0.1:8080:8080 </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-e</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">KC_BOOTSTRAP_ADMIN_USERNAME</span><span class="token operator">=</span><span class="token plain">admin </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-e</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">KC_BOOTSTRAP_ADMIN_PASSWORD</span><span class="token operator">=</span><span class="token plain">admin quay.io/keycloak/keycloak:26.5.0 start-dev</span><br></span></code></pre></div></div>
<p>生产需要额外编译配置，这里使用docker-compose部署</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="目录结构">目录结构<a href="https://xiebo.fun/blog/2026/1/10/#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84" class="hash-link" aria-label="目录结构的直接链接" title="目录结构的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">root@linuxlab01:/data/keycloak</span><span class="token comment" style="color:rgb(98, 114, 164)"># ll -a</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">total </span><span class="token number">24</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">drwxr-xr-x  </span><span class="token number">3</span><span class="token plain"> root root </span><span class="token number">4096</span><span class="token plain"> Jan  </span><span class="token number">5</span><span class="token plain"> 08:21 ./</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">drwxr-xr-x </span><span class="token number">16</span><span class="token plain"> root root </span><span class="token number">4096</span><span class="token plain"> Jan  </span><span class="token number">3</span><span class="token plain"> 09:56 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">drwx------ </span><span class="token number">19</span><span class="token plain">  </span><span class="token number">999</span><span class="token plain"> root </span><span class="token number">4096</span><span class="token plain"> Jan  </span><span class="token number">5</span><span class="token plain"> </span><span class="token number">17</span><span class="token plain">:32 data/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">-rw-r--r--  </span><span class="token number">1</span><span class="token plain"> root root </span><span class="token number">1130</span><span class="token plain"> Jan  </span><span class="token number">5</span><span class="token plain"> 08:27 docker-compose.yml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">-rw-r--r--  </span><span class="token number">1</span><span class="token plain"> root root  </span><span class="token number">522</span><span class="token plain"> Jan  </span><span class="token number">5</span><span class="token plain"> 08:20 Dockerfile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">-rw-r--r--  </span><span class="token number">1</span><span class="token plain"> root root   </span><span class="token number">73</span><span class="token plain"> Jan  </span><span class="token number">5</span><span class="token plain"> 08:20 .env</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="环境变量">环境变量<a href="https://xiebo.fun/blog/2026/1/10/#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F" class="hash-link" aria-label="环境变量的直接链接" title="环境变量的直接链接" translate="no">​</a></h3>
<div class="language-env codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">.env</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-env codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">DB_PASSWORD=your_secure_db_password</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ADMIN_USER=admin</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ADMIN_PASSWORD=admin</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="镜像构建">镜像构建<a href="https://xiebo.fun/blog/2026/1/10/#%E9%95%9C%E5%83%8F%E6%9E%84%E5%BB%BA" class="hash-link" aria-label="镜像构建的直接链接" title="镜像构建的直接链接" translate="no">​</a></h3>
<div class="language-docker codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">Dockerfile</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-docker codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Stage 1: 编译源码</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">FROM quay.io/keycloak/keycloak:latest AS builder</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># 提供指标采集</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ENV KC_HEALTH_ENABLED=true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ENV KC_METRICS_ENABLED=true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># 选择数据库类型</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ENV KC_DB=postgres</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">WORKDIR /opt/keycloak</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># 编译</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">RUN /opt/keycloak/bin/kc.sh build</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Stage 2: 构建生产环境镜像</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">FROM quay.io/keycloak/keycloak:latest</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">COPY --from=builder /opt/keycloak/ /opt/keycloak/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># 指定启动入口</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker-compose配置">docker-compose配置<a href="https://xiebo.fun/blog/2026/1/10/#docker-compose%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="docker-compose配置的直接链接" title="docker-compose配置的直接链接" translate="no">​</a></h3>
<div class="language-yml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">docker-compose.yml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">#可选，建议数据库分离部署</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">keycloak_db</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> postgres</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token number">17</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ./data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">/var/lib/postgresql/data</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">POSTGRES_DB</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> keycloak</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">POSTGRES_USER</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> keycloak</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">POSTGRES_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">DB_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">healthcheck</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">test</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"CMD-SHELL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pg_isready -U keycloak"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">interval</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 10s</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">retries</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token number">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> keycloak_net</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">keycloak</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">build</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> .</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> keycloak</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> start </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">optimized</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">KC_DB</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> postgres</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">	  </span><span class="token comment" style="color:rgb(98, 114, 164)">#数据库配置，根据实际修改</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">KC_DB_URL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> jdbc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">postgresql</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">//keycloak_db</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">5432/keycloak</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">KC_DB_USERNAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> keycloak</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">KC_DB_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">DB_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">#指定访问的域名或IP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">KC_HOSTNAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> auth.example.com</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)">#允许使用http</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">KC_HTTP_ENABLED</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">KC_PROXY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> edge</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">KC_BOOTSTRAP_ADMIN_USERNAME</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">ADMIN_USER</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">KC_BOOTSTRAP_ADMIN_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">ADMIN_PASSWORD</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">depends_on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">keycloak_db</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">condition</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> service_healthy</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"8080:8080"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> keycloak_net</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">restart</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> always</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">networks</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">keycloak_net</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">driver</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> bridge</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  postgres_data</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></span></code></pre></div></div>]]></content:encoded>
            <category>统一认证</category>
        </item>
    </channel>
</rss>