<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<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>UnderControl Blog</title>
        <link>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog</link>
        <description>UnderControl Blog</description>
        <lastBuildDate>Sun, 05 Apr 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-Hans</language>
        <item>
            <title><![CDATA[用 ud CLI 在终端中管理任务]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/cli-tool</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/cli-tool</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[UnDercontrol 的 kubectl 风格 CLI 如何将任务管理带入你的终端工作流——支持查询语法、TUI 界面和 AI 智能体集成。]]></description>
            <content:encoded><![CDATA[<p>如果你大部分时间都在终端里工作，那么每次记录任务或查看待办事项都要切换到浏览器标签页，这种上下文切换完全没有必要。<code>ud</code> CLI 正是为了消除这种干扰而生。它将 UnDercontrol 的全部功能——任务增删改查、笔记、查询、看板——带入你的 shell 环境，并采用你已经熟悉的命令结构。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="kubectl-风格的命令因为它好用">kubectl 风格的命令，因为它好用<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/cli-tool#kubectl-%E9%A3%8E%E6%A0%BC%E7%9A%84%E5%91%BD%E4%BB%A4%E5%9B%A0%E4%B8%BA%E5%AE%83%E5%A5%BD%E7%94%A8" class="hash-link" aria-label="kubectl 风格的命令，因为它好用的直接链接" title="kubectl 风格的命令，因为它好用的直接链接">​</a></h2>
<p>CLI 使用与 <code>kubectl</code> 相同的动词-资源模式，这种模式让无数工程师觉得上手自然。你可以 get、describe、apply 和 delete 资源，无需建立新的心智模型。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 列出所有任务</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud get task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 查看任务完整详情（支持短 ID 前缀）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud describe task 3de9f82b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 从 markdown 文件创建或更新任务</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud apply -f task.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 删除任务</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud delete task abc123</span><br></span></code></pre></div></div>
<p><code>apply</code> 命令值得重点介绍。你的任务就是一个带有 YAML frontmatter 的 markdown 文件。如果文件中有 <code>id</code> 字段，则更新已有任务；没有 <code>id</code>，则新建任务。这使得批量更新、脚本化工作流以及版本控制的任务定义变得简单直接。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">echo '---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">title: Write release notes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">status: in-progress</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tags:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">deadline: 2026-04-10</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Draft the changelog and update the docs site.' | ud apply -f -</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/cli-tool/task-list.png" alt="Task list view — what the ud CLI manages from your terminal" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="真正能过滤的查询语法">真正能过滤的查询语法<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/cli-tool#%E7%9C%9F%E6%AD%A3%E8%83%BD%E8%BF%87%E6%BB%A4%E7%9A%84%E6%9F%A5%E8%AF%A2%E8%AF%AD%E6%B3%95" class="hash-link" aria-label="真正能过滤的查询语法的直接链接" title="真正能过滤的查询语法的直接链接">​</a></h2>
<p><code>ud task query</code> 提供了一种类 SQL 的过滤语言，用于查询你的任务。当任务数量多到"翻列表"不再是可行策略时，它就派上用场了。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 本周截止的任务</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "deadline BETWEEN 'today' AND '+7d'"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 标记为 urgent 的进行中任务</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "(status = 'todo' OR status = 'in-progress') AND tags = 'urgent'"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 标题搜索</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "title ILIKE '%api%'"</span><br></span></code></pre></div></div>
<p>如果你不想考虑语法，<code>ud task nlquery</code> 支持直接输入自然语言，并通过 AI 将其转译为查询：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task nlquery "show me overdue tasks"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task nlquery "tasks tagged with work that are not done"</span><br></span></code></pre></div></div>
<p>两个命令都支持 <code>--sort</code>、<code>--order</code> 和 <code>--limit</code> 参数，便于分页和排序，可以干净地组合进脚本或 shell 别名中。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="用笔记记录进度">用笔记记录进度<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/cli-tool#%E7%94%A8%E7%AC%94%E8%AE%B0%E8%AE%B0%E5%BD%95%E8%BF%9B%E5%BA%A6" class="hash-link" aria-label="用笔记记录进度的直接链接" title="用笔记记录进度的直接链接">​</a></h2>
<p>每个任务都支持笔记——简短的自由格式条目，充当持续更新的进度日志。这对于记录你实际做了什么很有用，而不只是最终状态。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task note add 3de9f82b "Finished the backend changes, opening PR now"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task note ls 3de9f82b</span><br></span></code></pre></div></div>
<p>笔记也让 CLI 天然适合 AI 智能体工作流。智能体可以从计划文件创建任务，在每个步骤追加进度笔记，最后标记任务完成——全程无需打开浏览器。团队的其他成员可以在 UnDercontrol Web 界面或桌面应用中看到完整的历史记录。这种交接方式轻量、实用，真正跑得通。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="需要可视化时用交互式-tui">需要可视化时，用交互式 TUI<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/cli-tool#%E9%9C%80%E8%A6%81%E5%8F%AF%E8%A7%86%E5%8C%96%E6%97%B6%E7%94%A8%E4%BA%A4%E4%BA%92%E5%BC%8F-tui" class="hash-link" aria-label="需要可视化时，用交互式 TUI的直接链接" title="需要可视化时，用交互式 TUI的直接链接">​</a></h2>
<p>不带任何参数运行 <code>ud</code>，会打开终端 UI——一个支持键盘操作的看板式界面，带有 vim 风格的按键绑定。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/cli-tool/workspace-terminal.png" alt="Built-in terminal with ud CLI commands" class="img_ev3q"></p>
<table><thead><tr><th>按键</th><th>操作</th></tr></thead><tbody><tr><td><code>j</code> / <code>k</code></td><td>在任务间移动</td></tr><tr><td><code>Enter</code></td><td>打开任务详情</td></tr><tr><td><code>i</code></td><td>新建任务</td></tr><tr><td><code>x</code></td><td>切换状态</td></tr><tr><td><code>/</code></td><td>搜索</td></tr><tr><td><code>f</code></td><td>文件选择器（模糊搜索本地文件以创建任务）</td></tr></tbody></table>
<p>文件选择器是个亮点。按 <code>f</code>，在当前目录中模糊搜索 markdown 文件，它就会变成一个任务——第一行作为标题，其余内容作为描述。如果你习惯在项目仓库中用 markdown 记笔记，并想把它们纳入任务追踪，这个功能非常实用。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="多上下文支持多个服务器">多上下文支持多个服务器<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/cli-tool#%E5%A4%9A%E4%B8%8A%E4%B8%8B%E6%96%87%E6%94%AF%E6%8C%81%E5%A4%9A%E4%B8%AA%E6%9C%8D%E5%8A%A1%E5%99%A8" class="hash-link" aria-label="多上下文支持多个服务器的直接链接" title="多上下文支持多个服务器的直接链接">​</a></h2>
<p>如果你在多个环境中自托管 UnDercontrol——个人、工作、测试实例——上下文系统的处理方式与 <code>kubectl</code> 完全相同。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud config set-context work --api-url https://ud.company.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud login --context work</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 单次命令使用不同上下文</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UD_CONTEXT=personal ud get task</span><br></span></code></pre></div></div>
<p>配置文件位于 <code>~/.config/ud/config.yaml</code>。你也可以完全通过环境变量（<code>UD_API_URL</code>、<code>UD_API_KEY</code>、<code>UD_TOKEN</code>）驱动 CLI，无需修改配置文件，在 CI 流水线中同样可用。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="快速开始">快速开始<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/cli-tool#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B" class="hash-link" aria-label="快速开始的直接链接" title="快速开始的直接链接">​</a></h2>
<p>通过 npm、Homebrew 或一行 curl 命令安装：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install -g @oatnil/ud</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 或</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">brew install oatnil-top/ud/ud</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 或</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">curl -fsSL https://get.oatnil.com/ud | bash</span><br></span></code></pre></div></div>
<p>然后指向你的 UnDercontrol 实例：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud login</span><br></span></code></pre></div></div>
<p>完整的命令参考——包括文件附件、多上下文认证和高级查询语法——请查阅 <a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/cli">CLI Reference</a> 文档。如果你还没有运行 UnDercontrol，<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/self-deployment">自托管指南</a> 介绍了如何在几分钟内用 Docker 启动一个服务器。</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[使用 CLI Context 管理多个账户]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[了解 UnDercontrol 仿 kubectl 风格的 context 系统如何让你在命令行中自由切换多个账户和自托管实例。]]></description>
            <content:encoded><![CDATA[<p>如果你同时运行多个 UnDercontrol 实例——比如一个个人服务器和一个工作服务器——你大概已经体会过在不同 API 端点和凭据之间反复切换的麻烦。<code>ud</code> CLI 内置了一套仿照 <code>kubectl</code> 设计的 context 系统，切换账户只需一条命令。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="什么是-context">什么是 Context<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts#%E4%BB%80%E4%B9%88%E6%98%AF-context" class="hash-link" aria-label="什么是 Context的直接链接" title="什么是 Context的直接链接">​</a></h2>
<p><code>ud</code> 中的 context 是一个具名配置，包含：API 端点、凭据（交互式登录的会话 token 或静态 API key），以及显示用户名。Context 存储在本地的 <code>~/.config/ud/config.yaml</code> 中，不会被发送到任何地方。</p>
<p>一个典型的 context 列表：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ ud config get-contexts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CURRENT  NAME      API URL                           USER</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">*        personal  https://ud.home.example.com       me@example.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         work      https://ud.corp.example.com       me@corp.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">         local     http://localhost:4000              admin@oatnil.com</span><br></span></code></pre></div></div>
<p>星号标记当前激活的 context。你执行的每一条 <code>ud</code> 命令都会使用该 context，除非主动覆盖。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="创建你的第一个-context">创建你的第一个 Context<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts#%E5%88%9B%E5%BB%BA%E4%BD%A0%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA-context" class="hash-link" aria-label="创建你的第一个 Context的直接链接" title="创建你的第一个 Context的直接链接">​</a></h2>
<p>最快的方式是通过登录创建，<code>-n</code> 参数一步完成命名：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 登录并创建具名 context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud login --api-url https://ud.home.example.com -n personal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 再添加一个工作用的</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud login --api-url https://ud.corp.example.com -n work</span><br></span></code></pre></div></div>
<p>系统会提示输入用户名和密码，完成认证后将 token 保存到对应 context。如果需要为 CI/CD 或无界面环境配置 context，使用 <code>config set-context</code> 配合 API key：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud config set-context ci --api-url https://ud.corp.example.com --api-key ak_xxxxx</span><br></span></code></pre></div></div>
<p>在 UnDercontrol Web 界面的 Settings 中生成 API key，运行时无需浏览器交互。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="切换-context">切换 Context<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts#%E5%88%87%E6%8D%A2-context" class="hash-link" aria-label="切换 Context的直接链接" title="切换 Context的直接链接">​</a></h2>
<p>切换当前 context：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud config use-context work</span><br></span></code></pre></div></div>
<p>就这样。接下来执行的 <code>ud get task</code> 或 <code>ud describe task</code> 都会访问工作服务器。切回来同样简单：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud config use-context personal</span><br></span></code></pre></div></div>
<p>在 TUI 中，命令模式下输入 <code>:ctx</code> 可打开交互式 context 选择器——方向键导航，Enter 确认。和 <code>kubectx</code> 一样的操作习惯。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="临时覆盖">临时覆盖<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts#%E4%B8%B4%E6%97%B6%E8%A6%86%E7%9B%96" class="hash-link" aria-label="临时覆盖的直接链接" title="临时覆盖的直接链接">​</a></h2>
<p>有时只想为某一条命令指定实例，而不想永久切换。<code>--context</code> 参数和环境变量可以做到：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 为单条命令使用指定 context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud --context work get task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 或通过环境变量</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UD_CONTEXT=work ud get task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 直接指向任意端点，无需预先创建 context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UD_API_URL=http://localhost:4000 UD_API_KEY=dev-key ud get task</span><br></span></code></pre></div></div>
<p>优先级顺序：<code>--context</code> 参数 &gt; <code>UD_CONTEXT</code> 环境变量 &gt; 配置文件中的 <code>current-context</code>。这使得脚本可以明确指定目标实例，不依赖机器上当前激活的 context。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="各-context-独立认证">各 Context 独立认证<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts#%E5%90%84-context-%E7%8B%AC%E7%AB%8B%E8%AE%A4%E8%AF%81" class="hash-link" aria-label="各 Context 独立认证的直接链接" title="各 Context 独立认证的直接链接">​</a></h2>
<p>每个 context 维护独立的认证状态，互不影响。工作 context 的 token 过期了，只需重新登录该 context：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud login --context work</span><br></span></code></pre></div></div>
<p>个人和本地 context 完全不受影响。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="查看配置">查看配置<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts#%E6%9F%A5%E7%9C%8B%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="查看配置的直接链接" title="查看配置的直接链接">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 显示当前激活的 context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config current-context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 列出所有 context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config get-contexts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 查看完整配置（token 会被脱敏）</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config view</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="管理-context">管理 Context<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts#%E7%AE%A1%E7%90%86-context" class="hash-link" aria-label="管理 Context的直接链接" title="管理 Context的直接链接">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># 重命名 context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config rename-context old-name new-name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># 删除不再需要的 context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud config delete-context staging</span><br></span></code></pre></div></div>
<p>如果删除了当前激活的 context，<code>ud</code> 会自动切换到第一个可用的 context。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="对自托管用户的意义">对自托管用户的意义<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts#%E5%AF%B9%E8%87%AA%E6%89%98%E7%AE%A1%E7%94%A8%E6%88%B7%E7%9A%84%E6%84%8F%E4%B9%89" class="hash-link" aria-label="对自托管用户的意义的直接链接" title="对自托管用户的意义的直接链接">​</a></h2>
<p>UnDercontrol 的核心理念是：你的数据属于你自己。自托管是第一优先级的使用方式。context 系统正是这一理念的体现——它假设你可能同时运行多个实例，希望无缝切换，并在不牺牲安全性的前提下实现自动化。</p>
<p>无论你是管理个人实例、家庭服务器和工作部署，还是在本地开发和生产环境之间并行工作，context 都能提供清晰的心智模型和统一的 CLI 操作界面。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="开始使用">开始使用<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/multi-account-cli-contexts#%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8" class="hash-link" aria-label="开始使用的直接链接" title="开始使用的直接链接">​</a></h2>
<p>通过 Homebrew 安装 <code>ud</code> CLI（<code>brew install oatnil/ud/ud</code>）或从发布页面下载二进制文件。创建你的第一个 context：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud login --api-url https://your-instance.example.com -n myserver</span><br></span></code></pre></div></div>
<p>完整文档：<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/cli-auth-context">CLI 认证与 Context</a>。</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[高级用户查询与已保存筛选器——UnDercontrol 进阶指南]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/query-syntax</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/query-syntax</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[学习如何使用 UnDercontrol 的类 SQL 查询语法、自然语言搜索和已保存查询，像高级用户一样精准筛选任务。]]></description>
            <content:encoded><![CDATA[<p>当 UnDercontrol 里的任务积累到一定数量，"滚动浏览"这种方式就会开始失效。你清楚地知道自己在找什么——已逾期的项目、所有标记了 <code>work</code> 且仍在进行中的任务、还没有截止日期的待办——但仅靠状态筛选，很难快速定位到它们。</p>
<p>本文介绍 UnDercontrol 内置的查询系统：一套类 SQL 语法，可在 Web 界面、CLI、自定义视图、看板以及已保存查询中统一使用。一旦上手，你会发现自己几乎每天都在用它。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="查询语法">查询语法<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/query-syntax#%E6%9F%A5%E8%AF%A2%E8%AF%AD%E6%B3%95" class="hash-link" aria-label="查询语法的直接链接" title="查询语法的直接链接">​</a></h2>
<p>这套语法在设计上与 SQL WHERE 子句非常接近。如果你写过数据库查询，会立刻感到熟悉；如果没有，基础部分大约五分钟就能掌握。</p>
<p>一个简单的查询如下：</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'todo'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> deadline </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'today'</span><br></span></code></pre></div></div>
<p>这会找出所有状态为待办、且截止日期在今天或更早的任务——也就是已逾期的待办项。</p>
<p>你可以在此基础上加入标签、文本搜索、日期范围和自定义字段：</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">deadline </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'today'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">OR</span><span class="token plain"> tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'urgent'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'done'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'archived'</span><br></span></code></pre></div></div>
<p>这是一个可靠的"当前需要处理"查询。将它保存为已保存查询（下文详述），就有了一个一键直达的紧急任务列表。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/query-syntax/task-query.png" alt="Task search with query syntax filtering" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="日期时间表达式">日期时间表达式<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/query-syntax#%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E8%A1%A8%E8%BE%BE%E5%BC%8F" class="hash-link" aria-label="日期时间表达式的直接链接" title="日期时间表达式的直接链接">​</a></h2>
<p>语法中较为实用的一部分是相对日期支持。你不需要写死具体日期，而是使用 <code>'-7d'</code>、<code>'+1w'</code> 或直接写 <code>'today'</code> 这样的表达式。</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- 过去一周内创建的任务</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">created_at </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'-7d'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- 未来一个月内到期</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">deadline </span><span class="token operator" style="color:#393A34">BETWEEN</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'today'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'+1m'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- 今天有更新</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">updated_at </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'today'</span><br></span></code></pre></div></div>
<p>支持的时间单位包括天（<code>d</code>）、周（<code>w</code>）、月（<code>m</code>）和年（<code>y</code>），<code>+</code> 表示未来，<code>-</code> 表示过去。当你需要固定日期时，<code>2025-06-01</code> 这样的标准 ISO 8601 格式同样适用。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="文本搜索与自定义字段">文本搜索与自定义字段<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/query-syntax#%E6%96%87%E6%9C%AC%E6%90%9C%E7%B4%A2%E4%B8%8E%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%97%E6%AE%B5" class="hash-link" aria-label="文本搜索与自定义字段的直接链接" title="文本搜索与自定义字段的直接链接">​</a></h2>
<p>文本搜索使用 <code>LIKE</code>（区分大小写）和 <code>ILIKE</code>（不区分大小写），以 <code>%</code> 作为通配符：</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">title </span><span class="token operator" style="color:#393A34">ILIKE</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'%api%'</span><br></span></code></pre></div></div>
<p>自定义字段需加上 <code>cf.</code> 前缀：</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cf</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">priority </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> cf</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">department </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'engineering'</span><br></span></code></pre></div></div>
<p>自定义字段根据其类型支持完整的比较运算符——数字、文本、下拉选项、复选框和用户引用均可使用。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="自然语言查询">自然语言查询<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/query-syntax#%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E6%9F%A5%E8%AF%A2" class="hash-link" aria-label="自然语言查询的直接链接" title="自然语言查询的直接链接">​</a></h2>
<p>熟悉语法后，手写查询其实很快。但如果你更倾向于直接描述需求，AI 集成功能可以自动完成转换。</p>
<p>在 Web 界面中，打开任务页面的 AI Chat 面板，输入类似"显示带有 work 标签的逾期任务"，AI 会自动生成结构化查询并执行。</p>
<p>在 CLI 中，使用 <code>ud task nlquery</code>：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task nlquery "tasks I need to finish this week"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task nlquery "high priority engineering items with no deadline"</span><br></span></code></pre></div></div>
<p>如果想少打几个字，<code>nl</code> 别名同样有效。此功能需要配置 AI 提供商，但一旦设置完成，它能处理相当自然的描述方式。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="已保存查询">已保存查询<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/query-syntax#%E5%B7%B2%E4%BF%9D%E5%AD%98%E6%9F%A5%E8%AF%A2" class="hash-link" aria-label="已保存查询的直接链接" title="已保存查询的直接链接">​</a></h2>
<p>这是查询系统真正在日常使用中发挥价值的地方。已保存查询允许你为任意查询命名并存储，之后只需在侧边栏点击一下即可执行。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/query-syntax/saved-queries.png" alt="Saved queries for quick access to filtered views" class="img_ev3q"></p>
<p>以下几个查询值得立即配置：</p>
<table><thead><tr><th>名称</th><th>查询</th></tr></thead><tbody><tr><td>已逾期</td><td><code>deadline &lt; 'today' AND status != 'done' AND status != 'archived'</code></td></tr><tr><td>本周到期</td><td><code>deadline BETWEEN 'today' AND '+7d' AND status != 'done'</code></td></tr><tr><td>未规划</td><td><code>deadline IS NULL AND status = 'todo'</code></td></tr><tr><td>近期活跃</td><td><code>updated_at &gt;= '-7d' AND status IN ('todo', 'in-progress')</code></td></tr></tbody></table>
<p>你可以将常用查询置顶，通过拖拽调整顺序，并随时编辑。点击已保存查询后，结果会在当前页面内展开，无需跳转。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="在-cli-中使用查询">在 CLI 中使用查询<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/query-syntax#%E5%9C%A8-cli-%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%9F%A5%E8%AF%A2" class="hash-link" aria-label="在 CLI 中使用查询的直接链接" title="在 CLI 中使用查询的直接链接">​</a></h2>
<p>CLI 通过 <code>ud task query</code> 支持相同的查询语法：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "status = 'todo'" --sort deadline --order asc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "(status = 'todo' OR status = 'in-progress') AND tags = 'work'"</span><br></span></code></pre></div></div>
<p>分页（<code>--page</code>、<code>--limit</code>）和排序（<code>--sort</code>、<code>--order</code>）参数均可使用。这使得将查询结果导入其他工具或在 shell 脚本中调用查询变得非常方便。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="开始使用">开始使用<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/query-syntax#%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8" class="hash-link" aria-label="开始使用的直接链接" title="开始使用的直接链接">​</a></h2>
<p>完整的查询语法参考文档请见<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/query-syntax">查询语法文档</a>，包含所有运算符、日期时间表达式格式，以及一套可直接复用和改写的实用示例。</p>
<p>如果你还没有部署 UnDercontrol，<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/self-deployment">自托管指南</a>介绍了如何通过 Docker 完成部署。你的数据始终保存在自己的基础设施上——这正是它的核心价值所在。</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[让文件与工作同在：UnDercontrol 的资源管理]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management</guid>
            <pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[UnDercontrol 的文件与资源管理如何将收据、文档和图表与它们真正所属的任务和支出关联在一起。]]></description>
            <content:encoded><![CDATA[<p>大多数效率工具把文件存储当作附加功能——某个角落里的文件夹，与它所支撑的工作毫无关联。UnDercontrol 的做法不同：文件直接存放在它所属的任务、支出和预算旁边，收据跟着它对应的支出走，设计图跟着它所服务的任务走。</p>
<p>下面介绍资源管理系统在实际使用中的工作方式。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/resource-management/task-with-attachments.png" alt="Task list view — files attach directly to tasks, expenses, and budgets" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="按你的工作习惯上传">按你的工作习惯上传<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management#%E6%8C%89%E4%BD%A0%E7%9A%84%E5%B7%A5%E4%BD%9C%E4%B9%A0%E6%83%AF%E4%B8%8A%E4%BC%A0" class="hash-link" aria-label="按你的工作习惯上传的直接链接" title="按你的工作习惯上传的直接链接">​</a></h2>
<p>将文件导入 UnDercontrol 不应该每次都要打开文件选择器绕一圈。目前支持三种主要上传方式：</p>
<p><strong>拖放上传</strong> — 打开资源页面，或在任务、支出的附件面板中，直接将文件拖入即可。支持单文件和批量上传。</p>
<p><strong>剪贴板粘贴</strong> — 按下 Ctrl+V，剪贴板中的文件会立即上传。这对截图尤其方便。对着收据或界面 bug 截个图，切换到 UnDercontrol，粘贴。无需先保存到磁盘。</p>
<p><strong>CLI 上传</strong> — 如果你习惯在终端工作，<code>ud</code> CLI 可以直接处理上传：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud upload resource ./receipt.png --entity-type expense --entity-id exp-456</span><br></span></code></pre></div></div>
<p>这在自动化工作流中很有用，比如将导出的报告自动附加到每月预算审查任务中。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="一次附加随处引用">一次附加，随处引用<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management#%E4%B8%80%E6%AC%A1%E9%99%84%E5%8A%A0%E9%9A%8F%E5%A4%84%E5%BC%95%E7%94%A8" class="hash-link" aria-label="一次附加，随处引用的直接链接" title="一次附加，随处引用的直接链接">​</a></h2>
<p>同一个资源可以关联到多个条目。如果有一份合同 PDF 同时与某个预算和某个任务相关，你可以将它分别附加到两者——无需重复文件，也无需翻找文件夹。当任务标记为完成后，可以取消该文件与任务的关联，同时保留它与预算的附加关系。</p>
<p>检查器面板会清晰显示某个文件附加到了哪些条目，让你随时掌握文件的引用情况。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="快速找到所需文件">快速找到所需文件<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management#%E5%BF%AB%E9%80%9F%E6%89%BE%E5%88%B0%E6%89%80%E9%9C%80%E6%96%87%E4%BB%B6" class="hash-link" aria-label="快速找到所需文件的直接链接" title="快速找到所需文件的直接链接">​</a></h2>
<p>资源页面提供所有已上传文件的完整概览，并内置筛选功能。你可以按文件类型、附加的实体类型（任务、支出、预算、账户）或日期范围进行筛选。对于图片，图库视图会显示缩略图，让你无需逐一打开便能快速浏览一批收据或截图。</p>
<p>检查器还会显示照片的 EXIF 元数据——如果你需要确认照片的拍摄时间或地点，这非常实用。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/resource-management/resources-grid.png" alt="Resource management page showing uploaded files with thumbnails and metadata" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="存储本地或-s3">存储：本地或 S3<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management#%E5%AD%98%E5%82%A8%E6%9C%AC%E5%9C%B0%E6%88%96-s3" class="hash-link" aria-label="存储：本地或 S3的直接链接" title="存储：本地或 S3的直接链接">​</a></h2>
<p>由于 UnDercontrol 是自托管的，你可以完全掌控文件的存储位置。默认使用本地磁盘存储，对于运行在家庭服务器或 VPS 上的个人使用场景完全够用。对于更大规模的部署或远程访问需求，可以配置兼容 S3 的对象存储——AWS S3、Backblaze B2、MinIO，用你已有的方案即可。</p>
<p>关键一点：你的文件不会经过任何第三方服务，直接从浏览器传输到你自己的服务器。</p>
<p>存储限制可自行配置。普通用户默认获得 1 GB 空间，单文件上限 10 MB。管理员则不受限制。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="内置-drawio-图表">内置 Drawio 图表<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management#%E5%86%85%E7%BD%AE-drawio-%E5%9B%BE%E8%A1%A8" class="hash-link" aria-label="内置 Drawio 图表的直接链接" title="内置 Drawio 图表的直接链接">​</a></h2>
<p>如果你的工作流程涉及系统图、流程图或架构草图，UnDercontrol 内置了 drawio 支持。你可以直接在应用内创建和编辑图表，无需导出为 PNG，也无需切换到其他工具再重新上传。图表文件作为资源附加在对应的任务或笔记上。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai-识别图片内容">AI 识别图片内容<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management#ai-%E8%AF%86%E5%88%AB%E5%9B%BE%E7%89%87%E5%86%85%E5%AE%B9" class="hash-link" aria-label="AI 识别图片内容的直接链接" title="AI 识别图片内容的直接链接">​</a></h2>
<p>对于收据和文档扫描件，AI 集成功能值得了解。你可以打开一张图片资源，让 AI 从中提取信息——比如收据上的明细条目、扫描表格中的文字。这与支出追踪工作流天然契合：拍一张收据照片，附加到支出条目，让 AI 自动提取金额和商家名称。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="日常使用场景">日常使用场景<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management#%E6%97%A5%E5%B8%B8%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF" class="hash-link" aria-label="日常使用场景的直接链接" title="日常使用场景的直接链接">​</a></h2>
<p>举一个实际的例子：你在追踪一个自由职业项目。有一个"审查客户合同"的任务，你将合同 PDF 附加到该任务。随后，你为项目采购的软件记录了一笔支出，并将发票附加到该支出条目。这两个文件都会出现在资源页面中——你可以按实体类型筛选，只查看支出附件，也可以一起查看，对整个项目进行完整的文件审计。</p>
<p>所有内容集中在一处，无需外部文件托管，也无需翻找邮件记录。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/resource-management/budget-overview.png" alt="Budget overview — receipts and invoices attach to expenses within budgets" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="开始使用">开始使用<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/05/resource-management#%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8" class="hash-link" aria-label="开始使用的直接链接" title="开始使用的直接链接">​</a></h2>
<p>如果你已经在运行 UnDercontrol，资源页面可以在主导航中找到。如果你正在评估是否自托管，<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/self-deployment">部署指南</a> 涵盖了实例搭建的全部流程，包括存储配置。</p>
<p><a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/features/resources">资源管理文档</a> 提供了 CLI 命令、存储配置和实体附加选项的完整参考。</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[UnDercontrol 的 AI 工作流——从收据到记录，只需几秒]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/ai-assistant</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/ai-assistant</guid>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[了解 UnDercontrol 的 AI 助手如何将照片、文字和语音转化为结构化的支出与任务记录，以及如何通过 Apple Shortcuts 实现一键录入。]]></description>
            <content:encoded><![CDATA[<p>个人财务和任务管理中最让人头疼的环节，往往不是做决策，而是录入数据。吃完午饭，手里拿着一张收据，却要打开 app、一路点开表单、输入金额、选择分类、再点保存。这样的操作每天要重复无数次——每杯咖啡、每次打车、每趟买菜——日积月累，就成了真实存在的摩擦。</p>
<p>UnDercontrol 的 AI 助手正是为了消除这种摩擦而设计的。下面介绍它在实际使用中的具体表现。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/ai-assistant/ai-chat.png" alt="AI assistant chat interface for logging expenses and creating tasks" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/ai-assistant/dashboard.png" alt="UnDercontrol dashboard — AI assistant integrates across all features" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="拍张收据跳过表单">拍张收据，跳过表单<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/ai-assistant#%E6%8B%8D%E5%BC%A0%E6%94%B6%E6%8D%AE%E8%B7%B3%E8%BF%87%E8%A1%A8%E5%8D%95" class="hash-link" aria-label="拍张收据，跳过表单的直接链接" title="拍张收据，跳过表单的直接链接">​</a></h2>
<p>最直接实用的 AI 功能是收据扫描。新建支出时，你可以上传一张照片——拖拽、从剪贴板粘贴或选择文件均可。AI 会读取图片，自动提取金额、货币、商家名称、日期，并给出一个建议分类。</p>
<p>它能处理揉皱的收据、倾斜的角度和不同格式的小票，表现相当稳定。有一个实用技巧值得记住：光线比摆放角度更重要。在充足光线下拍摄的清晰照片，几乎都能正确解析；而在昏暗餐厅里拍的模糊照片，则很可能识别失败。</p>
<p>你也可以一次批量上传多张收据，非常适合出差回来或积压了一周账单的情况。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="文字输入快速记账">文字输入，快速记账<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/ai-assistant#%E6%96%87%E5%AD%97%E8%BE%93%E5%85%A5%E5%BF%AB%E9%80%9F%E8%AE%B0%E8%B4%A6" class="hash-link" aria-label="文字输入，快速记账的直接链接" title="文字输入，快速记账的直接链接">​</a></h2>
<p>并不是每笔支出都有收据。对于这类情况，直接用自然语言描述就好：</p>
<ul>
<li>"面馆吃午饭，18 美元"</li>
<li>"从机场打车回家，34 欧元"</li>
<li>"Figma 月订阅，15 美元"</li>
</ul>
<p>AI 会将描述解析成填好各字段的结构化支出记录，比逐个点选表单快得多，在手机上尤其明显。</p>
<p>同样的方式也适用于任务。不需要填写任务表单，直接描述要做的事：</p>
<ul>
<li>"跟会计确认一季度税务的后续事宜"</li>
<li>"在周五之前给 Sarah 买生日礼物"</li>
<li>"调研自托管备份方案"</li>
</ul>
<p>UnDercontrol 会根据描述生成结构化任务，包括标题、可推断的相关标签以及描述内容。你检查一遍，改掉不准确的地方，保存即可。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/ai-assistant/task-list.png" alt="Task list — AI can create and manage tasks from text or voice input" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="自然语言查询">自然语言查询<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/ai-assistant#%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E6%9F%A5%E8%AF%A2" class="hash-link" aria-label="自然语言查询的直接链接" title="自然语言查询的直接链接">​</a></h2>
<p>当系统中积累了一定数量的任务和支出后，你可以用日常语言直接提问。比如"显示逾期任务"或"本周有什么待办"，这些问题会被转化为查询条件并返回匹配结果。这不是什么魔法——对于简单直接的问题效果最好——但它确实省去了记忆 UnDercontrol 查询语法的麻烦。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="apple-shortcuts-集成">Apple Shortcuts 集成<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/ai-assistant#apple-shortcuts-%E9%9B%86%E6%88%90" class="hash-link" aria-label="Apple Shortcuts 集成的直接链接" title="Apple Shortcuts 集成的直接链接">​</a></h2>
<p>在 iOS 和 macOS 上，UnDercontrol 提供了 Apple Shortcuts，可以将 AI 功能接入系统的分享菜单和快捷指令自动化。实际好处就是：在设备上任意位置，一键即可完成录入。</p>
<p>最实用的一个快捷指令：用相机拍一张照片，运行该指令，收据就会作为支出记录保存下来，全程无需打开 app。你也可以分享文字内容——复制的邮件片段、一条消息、一条备忘录——直接从中创建任务。</p>
<p>快捷指令可在你的 UnDercontrol 实例的订阅/下载页面获取。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="自带-ai-服务商">自带 AI 服务商<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/ai-assistant#%E8%87%AA%E5%B8%A6-ai-%E6%9C%8D%E5%8A%A1%E5%95%86" class="hash-link" aria-label="自带 AI 服务商的直接链接" title="自带 AI 服务商的直接链接">​</a></h2>
<p>UnDercontrol 不绑定任何单一 AI 后端。你可以接入自己的 API key，来源可以是 OpenAI、Anthropic，或任何兼容 OpenAI 接口的服务。如果你希望所有计算都在本地完成、不依赖任何外部 API，也可以通过 Ollama 或 LM Studio 接入本地模型。</p>
<p>配置过程很简单：进入个人资料设置，找到 AI Providers 部分，添加服务商和 API key，选择模型，测试连接。你可以添加多个服务商并设置优先级，列表中第一个可用的服务商会被实际调用。</p>
<p>如果你运行的是多人共享的 UnDercontrol 实例，管理员还可以配置系统级服务商，供所有用户使用——对于家庭服务器或小型团队来说非常方便。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="使用注意事项">使用注意事项<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/ai-assistant#%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" class="hash-link" aria-label="使用注意事项的直接链接" title="使用注意事项的直接链接">​</a></h2>
<p>AI 提取的准确率很高，但并非完美。保存之前，务必快速检查一下解析结果，尤其是金额和日期字段。如果收据上的合计金额在视觉上与小计行很接近，解析器可能会混淆。花两秒钟确认一下，远比事后追查一笔记错的账要省力得多。</p>
<p>对于文字输入，描述越具体，结果越准确。"咖啡"比"登机前在机场喝的咖啡，6.50 美元"更难分类。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="开始使用">开始使用<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/ai-assistant#%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8" class="hash-link" aria-label="开始使用的直接链接" title="开始使用的直接链接">​</a></h2>
<p>如果你已经在运行 UnDercontrol，前往个人资料设置，添加一个 AI 服务商。下次记录支出时，试着上传一张收据——工作流上的差异会立刻显现出来。</p>
<p>如果你还没有部署 UnDercontrol，自托管指南涵盖了从 Docker 部署到配置的全部内容：<a href="https://undercontrol.dev/docs/intro" target="_blank" rel="noopener noreferrer">UnDercontrol 文档</a>。</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[用 UnDercontrol 的预算追踪功能掌控个人财务]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/budget-expense-tracking</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/budget-expense-tracking</guid>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[了解 UnDercontrol 的预算管理功能如何帮助你追踪支出、记录消费，并全面掌控财务状况——完全自托管。]]></description>
            <content:encoded><![CDATA[<p>大多数个人理财工具都让你在隐私与功能之间二选一：要么把财务数据交给云服务，要么凑合用一张电子表格——而后者一旦情况稍微复杂就会变得难以维护。UnDercontrol 提供了另一种选择：一个功能完整的预算追踪系统，运行在你自己的服务器上，数据始终在你的掌控之中。</p>
<p>下面来看看 UnDercontrol 的预算追踪功能在实际使用中是如何运作的。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="创建真正符合实际的预算">创建真正符合实际的预算<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/budget-expense-tracking#%E5%88%9B%E5%BB%BA%E7%9C%9F%E6%AD%A3%E7%AC%A6%E5%90%88%E5%AE%9E%E9%99%85%E7%9A%84%E9%A2%84%E7%AE%97" class="hash-link" aria-label="创建真正符合实际的预算的直接链接" title="创建真正符合实际的预算的直接链接">​</a></h2>
<p>在 UnDercontrol 中创建预算，从基本信息开始：名称、初始金额、开始日期和周期频率。支持按周、按月、按季度或按年——选择最符合你日常思维习惯的方式即可。</p>
<p>但真正的强大之处在于预算计划。UnDercontrol 不会把你锁定在一个固定金额里，而是允许你随时添加新的计划。比如你年初设定了每月 500 美元的餐饮预算，到了三月物价上涨，需要调整为 650 美元，直接添加一个更新金额的新计划即可。系统会自动处理计算逻辑——根据每个计划的生效时间段来汇总金额——历史数据保持准确，当前视图也始终是最新状态。</p>
<p>一次性调整可以覆盖周期计划无法处理的情况：收到意外退款、项目奖金分配、修正数据录入错误……每笔调整都会记录金额、日期和可选的备注说明。几个月后对账时，你会庆幸当初留下了那些备注。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="记录消费并关联到预算">记录消费并关联到预算<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/budget-expense-tracking#%E8%AE%B0%E5%BD%95%E6%B6%88%E8%B4%B9%E5%B9%B6%E5%85%B3%E8%81%94%E5%88%B0%E9%A2%84%E7%AE%97" class="hash-link" aria-label="记录消费并关联到预算的直接链接" title="记录消费并关联到预算的直接链接">​</a></h2>
<p>在 UnDercontrol 中，消费记录是一等公民。添加一笔支出时，你可以将其关联到某个具体的预算。这个关联关系正是"预算 vs 实际"视图的数据基础——支出金额会汇总到该预算的已花费总额中，并显示在对应预算的账目明细里。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/budget-expense-tracking/transactions.png" alt="Transaction list with expense entries" class="img_ev3q"></p>
<p>这种设计也允许存在不关联任何预算的支出记录，这是有意为之的。并非每笔交易都需要立刻分类。你可以先记下来，之后再回来关联，等到合适的时机处理即可。</p>
<p>预算详情页将所有信息整合在一起：顶部概览区一目了然地展示总分配额、已花费金额和剩余余额；支出趋势图则以 7 天、30 天或 90 天为维度，将实际支出与预算线并排呈现。如果你在追踪月度餐饮预算，图表显示在第 22 天就已突破分配上限，这个信号足够清晰，无需任何心算。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/budget-expense-tracking/budget-detail.png" alt="Budget detail with spending trend chart" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="多账户支持与全局视图">多账户支持与全局视图<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/budget-expense-tracking#%E5%A4%9A%E8%B4%A6%E6%88%B7%E6%94%AF%E6%8C%81%E4%B8%8E%E5%85%A8%E5%B1%80%E8%A7%86%E5%9B%BE" class="hash-link" aria-label="多账户支持与全局视图的直接链接" title="多账户支持与全局视图的直接链接">​</a></h2>
<p>UnDercontrol 的账户系统支持同时追踪多个资金来源——活期账户、储蓄账户、独立的业务账户，无论你的财务结构如何都能适配。预算账户会汇入整体可用余额，因此在规划新预算时，你看到的是真实数字，而不是凭空估算。</p>
<p>当你管理小团队或家庭财务时，这一功能尤为实用。协作系统允许你与其他用户共享预算，多人可以同时向同一个预算记录支出，并看到相同的实时汇总数据。不再需要来回发送电子表格，也不用手动合并两套独立的记录系统。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="轻松掌握支出无需繁琐操作">轻松掌握支出，无需繁琐操作<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/budget-expense-tracking#%E8%BD%BB%E6%9D%BE%E6%8E%8C%E6%8F%A1%E6%94%AF%E5%87%BA%E6%97%A0%E9%9C%80%E7%B9%81%E7%90%90%E6%93%8D%E4%BD%9C" class="hash-link" aria-label="轻松掌握支出，无需繁琐操作的直接链接" title="轻松掌握支出，无需繁琐操作的直接链接">​</a></h2>
<p>预算列表页的设计让你可以一眼掌握全局：进度条、已花费和剩余金额，以及汇总所有预算总额的侧边栏。搜索功能帮助你快速定位特定预算。"显示隐藏项"开关则适用于那些想归档但不想删除的预算。</p>
<p><img decoding="async" loading="lazy" src="https://pub-35d77f83ee8a41798bb4b2e1831ac70a.r2.dev/features/blog/budget-expense-tracking/budget-list.png" alt="Budget overview with progress bars showing spent vs remaining" class="img_ev3q"></p>
<p>隐私模式值得一提：开启后，界面上所有金额数字都会被隐藏。在会议中共享屏幕时非常实用——你不需要向同事解释自己的餐饮预算。</p>
<p>在数据导出与可移植性方面，UnDercontrol 支持将消费历史以结构化格式导出。由于是自托管部署，你还可以直接访问底层数据库，随时执行自定义查询或将数据接入其他工具。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="自托管由你做主">自托管，由你做主<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/budget-expense-tracking#%E8%87%AA%E6%89%98%E7%AE%A1%E7%94%B1%E4%BD%A0%E5%81%9A%E4%B8%BB" class="hash-link" aria-label="自托管，由你做主的直接链接" title="自托管，由你做主的直接链接">​</a></h2>
<p>上述所有功能都运行在你自己的服务器上。你的财务数据不会经过任何第三方的基础设施。备份策略、访问权限、数据保留周期——一切都由你决定。对于那些在第三方应用里输入银行流水时感到不安的人来说，这一点至关重要。</p>
<p>如果你想开始上手，<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/self-deployment">自部署指南</a> 提供了使用 Docker 搭建 UnDercontrol 的完整流程。<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/features/budget">预算功能文档</a> 则详细介绍了每项功能，包括预算总额的计算方式以及如何有效使用调整记录。</p>
<p>创建你的第一个预算，关联几笔支出，一周后再来看看。支出趋势图告诉你的，会比任何电子表格都多。</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[在 UnderControl 中使用看板进行可视化项目管理]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/kanban-boards</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/kanban-boards</guid>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[了解 UnderControl 的看板功能如何为你的自托管环境带来拖拽式任务管理、状态自动更新、自定义列以及团队共享能力。]]></description>
            <content:encoded><![CDATA[<p>如果你一直用平铺列表管理任务，却越来越觉得力不从心，那看板很可能就是你需要的答案。UnderControl 的看板视图在你现有任务系统之上提供了一套基于列的布局——无需维护独立系统，无需重复数据，只是一种更直观地掌握全局的方式。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="看板是视图而非数据孤岛">看板是视图，而非数据孤岛<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/kanban-boards#%E7%9C%8B%E6%9D%BF%E6%98%AF%E8%A7%86%E5%9B%BE%E8%80%8C%E9%9D%9E%E6%95%B0%E6%8D%AE%E5%AD%A4%E5%B2%9B" class="hash-link" aria-label="看板是视图，而非数据孤岛的直接链接" title="看板是视图，而非数据孤岛的直接链接">​</a></h2>
<p>在了解其他内容之前，这一点值得先搞清楚。在 UnderControl 中，看板是任务系统之上的一层可视化界面。当你把一张卡片从"待办"拖到"进行中"时，你不只是在移动看板上的一张卡——你是在更新该任务的状态。这个变更会立即反映在任务列表、CLI 查询结果以及所有其他地方。不存在同步问题，因为始终只有一个数据来源。</p>
<p>这意味着你可以在看板视图和列表视图之间自由切换，完全不用担心数据不一致。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="快速上手全部任务看板">快速上手：全部任务看板<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/kanban-boards#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%E5%85%A8%E9%83%A8%E4%BB%BB%E5%8A%A1%E7%9C%8B%E6%9D%BF" class="hash-link" aria-label="快速上手：全部任务看板的直接链接" title="快速上手：全部任务看板的直接链接">​</a></h2>
<p>每个账户都内置了一个"全部任务"看板。打开它，你会看到所有任务按六个列排列：待办、进行中、待定、已搁置、已完成和已归档。这个看板无法删除，且始终显示在最前面。</p>
<p>这是一个很好的起点。把一个任务从"待办"拖到"进行中"，状态会立即更新。这就是基本的操作逻辑——卡片的位置决定任务状态，而非反过来。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="基于查询条件的自定义列">基于查询条件的自定义列<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/kanban-boards#%E5%9F%BA%E4%BA%8E%E6%9F%A5%E8%AF%A2%E6%9D%A1%E4%BB%B6%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E5%88%97" class="hash-link" aria-label="基于查询条件的自定义列的直接链接" title="基于查询条件的自定义列的直接链接">​</a></h2>
<p>真正有意思的地方在于你创建自己的看板时。每一列都由一个过滤条件定义——本质上是一个查询，决定哪些任务属于这一列。"被阻塞"列可以过滤出打了 <code>blocked</code> 标签的任务，"本周到期"列可以按截止日期过滤。列不只是一个标签，而是一个实时查询。</p>
<p>当你为列配置操作后，移动卡片就变成了一个触发器。把任务拖入"已完成"列，它会自动标记为完成；把任务移入"待审核"列，可以一次性完成打标签和指派操作。你来定义拖入某一列意味着什么，看板负责处理后续的数据更新。</p>
<p>这对多步骤工作流非常实用。如果你的流程是草稿 -&gt; 审核 -&gt; 待发布 -&gt; 完成，你可以完整地建模这个流程——每次列间转换都会对底层任务数据做出正确的变更。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="私有看板与共享看板">私有看板与共享看板<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/kanban-boards#%E7%A7%81%E6%9C%89%E7%9C%8B%E6%9D%BF%E4%B8%8E%E5%85%B1%E4%BA%AB%E7%9C%8B%E6%9D%BF" class="hash-link" aria-label="私有看板与共享看板的直接链接" title="私有看板与共享看板的直接链接">​</a></h2>
<p>私有看板只对你可见。你可以按需创建任意数量——为某个副业项目创建一个，为每周计划创建一个，为家装项目创建一个。它们都从你的完整任务池中拉取数据，并通过你配置的列条件进行过滤。</p>
<p>共享看板的工作方式有所不同。当你把看板共享给一个群组时，该看板只显示属于该群组的任务。群组中的每个人都可以看到这个看板，并根据各自的权限移动卡片。这是一个清晰的模型：看板的数据范围由群组决定，访问权限通过群组成员身份控制。</p>
<p>这让共享看板对小团队来说非常实用。为一个两三人的团队搭建一个迭代看板，让所有人都能看到哪些任务在进行、哪些被阻塞，配置简单，也不需要任何额外工具。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="几种值得尝试的工作流模式">几种值得尝试的工作流模式<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/kanban-boards#%E5%87%A0%E7%A7%8D%E5%80%BC%E5%BE%97%E5%B0%9D%E8%AF%95%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%A8%A1%E5%BC%8F" class="hash-link" aria-label="几种值得尝试的工作流模式的直接链接" title="几种值得尝试的工作流模式的直接链接">​</a></h2>
<p>如果你还不确定如何规划看板结构，以下几种方式效果都不错：</p>
<p><strong>基于状态的看板</strong>与默认设置类似——待办、进行中、已完成。结构简单、维护成本低，适合个人使用。</p>
<p><strong>基于时间的看板</strong>使用积压、本周、今日、已完成这样的列结构。过滤条件基于截止日期或自定义字段，而非任务状态。把任务拖入"今日"列可以自动更新优先级字段。</p>
<p><strong>带共享访问的项目看板</strong>利用群组功能将任务范围限定在特定项目内。列的划分对应团队实际的工作流阶段，所有人在同一个看板上协作。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="所有内容保持连通">所有内容保持连通<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/kanban-boards#%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9%E4%BF%9D%E6%8C%81%E8%BF%9E%E9%80%9A" class="hash-link" aria-label="所有内容保持连通的直接链接" title="所有内容保持连通的直接链接">​</a></h2>
<p>由于看板构建在与 UnderControl 其他功能相同的任务和标签系统之上，它能与其他功能自然地组合使用。你在任务过滤器中使用的标签同样可以作为列的条件。你为项目创建的自定义字段可以驱动列的归属，并通过列操作自动更新。看板不是一个独立模块，而是任务系统的可视化呈现。</p>
<p>如果你想了解它如何融入整体配置，<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/features/kanban">看板文档</a>详细介绍了列配置、自动操作和共享功能。如果你还没有运行 UnderControl，<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/docs/self-deployment">自托管部署指南</a>可以帮你在一小时内完成搭建——你的数据始终保存在自己的基础设施上。</p>]]></content:encoded>
            <category>Feature</category>
        </item>
        <item>
            <title><![CDATA[How UnderControl Handles Task Management: Views, Links, and the CLI]]></title>
            <link>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview</link>
            <guid>https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview</guid>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A practical look at UnderControl's task system — multiple views, bidirectional linking, markdown notes, and a kubectl-style CLI for power users.]]></description>
            <content:encoded><![CDATA[<p>Most task managers give you a list. Maybe a kanban board if you're lucky. UnderControl takes a different approach: your tasks are a data structure you can view, query, and manipulate from multiple angles — whether you're in the browser, the desktop app, or a terminal.</p>
<p>Here's a practical walkthrough of how the task system works.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="six-statuses-that-actually-mean-something">Six Statuses That Actually Mean Something<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview#six-statuses-that-actually-mean-something" class="hash-link" aria-label="Six Statuses That Actually Mean Something的直接链接" title="Six Statuses That Actually Mean Something的直接链接">​</a></h2>
<p>Tasks in UnderControl move through six statuses: <strong>Todo</strong>, <strong>In Progress</strong>, <strong>Pending</strong>, <strong>Done</strong>, <strong>Stale</strong>, and <strong>Archived</strong>.</p>
<p>The distinction between Pending and Stale is one I find genuinely useful. Pending means you're deliberately waiting — on a reply, a dependency, a decision. Stale means the task just hasn't been touched in a while. That difference matters when you're doing a weekly review and trying to figure out what to act on versus what to clean up.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="pick-the-view-that-matches-your-mental-model">Pick the View That Matches Your Mental Model<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview#pick-the-view-that-matches-your-mental-model" class="hash-link" aria-label="Pick the View That Matches Your Mental Model的直接链接" title="Pick the View That Matches Your Mental Model的直接链接">​</a></h2>
<p>Different work calls for different views. UnderControl gives you seven:</p>
<ul>
<li><strong>List</strong> — The default. Fast, filterable, keyboard-friendly.</li>
<li><strong>Kanban</strong> — Drag cards between status columns. Good for sprint-style work.</li>
<li><strong>Calendar</strong> — Tasks plotted by deadline. Useful before a busy week.</li>
<li><strong>Tree</strong> — Hierarchical view of parent and child tasks. Great for projects with nested sub-tasks.</li>
<li><strong>Graph</strong> — A node-link diagram of all your bidirectional task relationships. Looks cool, but also genuinely useful for spotting how things connect.</li>
<li><strong>Mindmap</strong> — Freeform brainstorming layout.</li>
<li><strong>Trash</strong> — Review and restore deleted tasks.</li>
</ul>
<p>Switching between views doesn't change your data — it's the same tasks, just rendered differently. The Graph view in particular is worth trying if you use linked tasks heavily.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bidirectional-linking">Bidirectional Linking<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview#bidirectional-linking" class="hash-link" aria-label="Bidirectional Linking的直接链接" title="Bidirectional Linking的直接链接">​</a></h2>
<p>You can link any two tasks together, and the connection is bidirectional — follow it from either side. Over time, this turns your task list into something closer to a knowledge graph. The Graph view is where this becomes visible: nodes are tasks, edges are links, and you can see clusters form around related work.</p>
<p>Derived tasks (parent-child relationships) work differently. When you create a task from an existing one, the child inherits context from the parent and links back to it automatically. This is the right pattern for breaking down a large project into concrete steps.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="markdown-notes-with-edit-history">Markdown Notes with Edit History<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview#markdown-notes-with-edit-history" class="hash-link" aria-label="Markdown Notes with Edit History的直接链接" title="Markdown Notes with Edit History的直接链接">​</a></h2>
<p>Every task has a notes section. Notes support full markdown — headers, code blocks, lists, links. More importantly, every note keeps a full edit history. If you wrote something, changed your mind, and want to go back, you can revert to any previous version.</p>
<p>I use notes for things like decision logs, blockers, and meeting summaries attached to a task. It keeps everything in one place instead of scattered across documents and chat threads.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="filtering-and-queries">Filtering and Queries<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview#filtering-and-queries" class="hash-link" aria-label="Filtering and Queries的直接链接" title="Filtering and Queries的直接链接">​</a></h2>
<p>The quick filters cover the common cases: filter by status, tags, or deadline range (overdue, today, this week, and so on). For more specific needs, there's a structured query language:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">status = 'pending' AND tag:work = 'true'</span><br></span></code></pre></div></div>
<p>If you don't want to write the query yourself, the AI assistant accepts plain English — something like "show me overdue tasks tagged with client work" — and translates it into a filter.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="file-attachments-and-sharing">File Attachments and Sharing<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview#file-attachments-and-sharing" class="hash-link" aria-label="File Attachments and Sharing的直接链接" title="File Attachments and Sharing的直接链接">​</a></h2>
<p>Attach any file to a task — images, PDFs, diagrams, exported reports. The attachments live on your server, under your control.</p>
<p>For sharing, you can generate a public link to a specific task with an optional expiration date. Or share with a group and set whether they get read or read-write access.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-cli-is-a-first-class-interface">The CLI Is a First-Class Interface<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview#the-cli-is-a-first-class-interface" class="hash-link" aria-label="The CLI Is a First-Class Interface的直接链接" title="The CLI Is a First-Class Interface的直接链接">​</a></h2>
<p>If you work in a terminal, <code>ud</code> gives you the full task API from the command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ud task list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task create "Review Q2 metrics"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task done &lt;id&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task query "status = 'todo' AND deadline &lt; '2026-05-01'"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ud task apply -f task.md</span><br></span></code></pre></div></div>
<p>The <code>apply</code> command is particularly useful — you can write a task in a markdown file and push it to UnderControl, which fits nicely into scripting and automation workflows. The CLI follows kubectl-style conventions, so if you spend time in Kubernetes or similar tools, the patterns feel familiar.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="recurring-tasks-and-check-ins">Recurring Tasks and Check-ins<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview#recurring-tasks-and-check-ins" class="hash-link" aria-label="Recurring Tasks and Check-ins的直接链接" title="Recurring Tasks and Check-ins的直接链接">​</a></h2>
<p>For repeating work, recurring tasks generate new task instances on a schedule — daily standups, weekly reviews, monthly reports. You can use presets or write a custom CRON expression.</p>
<p>Check-ins are a lighter-weight alternative for habit tracking: each check-in increments a counter and records a timestamp, giving you a simple log of consistency without the overhead of a full task lifecycle.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it-yourself">Try It Yourself<a href="https://ud-docs.lintao-amons.workers.dev/zh-Hans/blog/2026/04/04/task-management-overview#try-it-yourself" class="hash-link" aria-label="Try It Yourself的直接链接" title="Try It Yourself的直接链接">​</a></h2>
<p>All of this runs on your own infrastructure. No data leaves your server, no subscriptions, no vendor lock-in.</p>
<p>The full task management documentation is at <a href="https://undercontrol.dev/docs/tasks" target="_blank" rel="noopener noreferrer">undercontrol.dev/docs/tasks</a>, and the self-hosting guide covers deployment with Docker or the prebuilt binaries. If you run into anything, the GitHub repo is the right place to file issues or ask questions.</p>]]></content:encoded>
            <category>Feature</category>
        </item>
    </channel>
</rss>