@fengye404/termpilot 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -200
- package/dist/cli.js +12 -1
- package/docs/.vitepress/config.mts +64 -0
- package/docs/.vitepress/dist/404.html +23 -0
- package/docs/.vitepress/dist/README.html +26 -0
- package/docs/.vitepress/dist/architecture.html +42 -0
- package/docs/.vitepress/dist/assets/README.md.B4-OJVNQ.js +1 -0
- package/docs/.vitepress/dist/assets/README.md.B4-OJVNQ.lean.js +1 -0
- package/docs/.vitepress/dist/assets/app.BG4pRgiG.js +1 -0
- package/docs/.vitepress/dist/assets/architecture.md.JnC1zyYV.js +17 -0
- package/docs/.vitepress/dist/assets/architecture.md.JnC1zyYV.lean.js +1 -0
- package/docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.l5vdUGaZ.js +1 -0
- package/docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.DMeTzGam.js +9 -0
- package/docs/.vitepress/dist/assets/chunks/framework.BZohXCq9.js +19 -0
- package/docs/.vitepress/dist/assets/chunks/theme.D0_6rd9F.js +2 -0
- package/docs/.vitepress/dist/assets/development.md.iwUVjeO6.js +7 -0
- package/docs/.vitepress/dist/assets/development.md.iwUVjeO6.lean.js +1 -0
- package/docs/.vitepress/dist/assets/getting-started.md.Cirp1CHi.js +1 -0
- package/docs/.vitepress/dist/assets/getting-started.md.Cirp1CHi.lean.js +1 -0
- package/docs/.vitepress/dist/assets/index.md.D9XElNRh.js +1 -0
- package/docs/.vitepress/dist/assets/index.md.D9XElNRh.lean.js +1 -0
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/docs/.vitepress/dist/assets/operations-guide.md.DfNiIg5F.js +18 -0
- package/docs/.vitepress/dist/assets/operations-guide.md.DfNiIg5F.lean.js +1 -0
- package/docs/.vitepress/dist/assets/protocol.md.CCXFJUPR.js +40 -0
- package/docs/.vitepress/dist/assets/protocol.md.CCXFJUPR.lean.js +1 -0
- package/docs/.vitepress/dist/assets/style.B0lvUXq1.css +1 -0
- package/docs/.vitepress/dist/assets/tech-selection-2026.md.Dk_ymWTx.js +1 -0
- package/docs/.vitepress/dist/assets/tech-selection-2026.md.Dk_ymWTx.lean.js +1 -0
- package/docs/.vitepress/dist/development.html +32 -0
- package/docs/.vitepress/dist/favicon.svg +6 -0
- package/docs/.vitepress/dist/getting-started.html +26 -0
- package/docs/.vitepress/dist/hashmap.json +1 -0
- package/docs/.vitepress/dist/index.html +26 -0
- package/docs/.vitepress/dist/operations-guide.html +43 -0
- package/docs/.vitepress/dist/protocol.html +65 -0
- package/docs/.vitepress/dist/tech-selection-2026.html +26 -0
- package/docs/.vitepress/dist/vp-icons.css +1 -0
- package/docs/.vitepress/theme/custom.css +42 -0
- package/docs/.vitepress/theme/index.ts +10 -0
- package/docs/README.md +10 -7
- package/docs/getting-started.md +136 -0
- package/docs/index.md +57 -0
- package/docs/operations-guide.md +6 -6
- package/docs/public/favicon.svg +6 -0
- package/package.json +6 -2
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN" dir="ltr">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<title>开发文档 | TermPilot</title>
|
|
7
|
+
<meta name="description" content="手机和电脑共享同一个 tmux 会话的终端远程控制工具。">
|
|
8
|
+
<meta name="generator" content="VitePress v1.6.4">
|
|
9
|
+
<link rel="preload stylesheet" href="/assets/style.B0lvUXq1.css" as="style">
|
|
10
|
+
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
|
|
11
|
+
|
|
12
|
+
<script type="module" src="/assets/app.BG4pRgiG.js"></script>
|
|
13
|
+
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
|
14
|
+
<link rel="modulepreload" href="/assets/chunks/theme.D0_6rd9F.js">
|
|
15
|
+
<link rel="modulepreload" href="/assets/chunks/framework.BZohXCq9.js">
|
|
16
|
+
<link rel="modulepreload" href="/assets/development.md.iwUVjeO6.lean.js">
|
|
17
|
+
<meta name="theme-color" content="#1f7a53">
|
|
18
|
+
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
|
19
|
+
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<div id="app"><div class="Layout" data-v-1bdd7537><!--[--><!--]--><!--[--><span tabindex="-1" data-v-0a4b5d46></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-0a4b5d46>Skip to content</a><!--]--><!----><header class="VPNav" data-v-1bdd7537 data-v-07e0ee65><div class="VPNavBar" data-v-07e0ee65 data-v-bfcfe748><div class="wrapper" data-v-bfcfe748><div class="container" data-v-bfcfe748><div class="title" data-v-bfcfe748><div class="VPNavBarTitle has-sidebar" data-v-bfcfe748 data-v-6ce24249><a class="title" href="/" data-v-6ce24249><!--[--><!--]--><!--[--><img class="VPImage logo" src="/favicon.svg" alt data-v-105fdaa6><!--]--><span data-v-6ce24249>TermPilot</span><!--[--><!--]--></a></div></div><div class="content" data-v-bfcfe748><div class="content-body" data-v-bfcfe748><!--[--><!--]--><div class="VPNavBarSearch search" data-v-bfcfe748><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-bfcfe748 data-v-d1dc8fec><span id="main-nav-aria-label" class="visually-hidden" data-v-d1dc8fec> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>首页</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/getting-started" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>快速开始</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/operations-guide" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>部署与运维</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/architecture" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>架构</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/protocol" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>协议</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-bfcfe748 data-v-d994237e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-d994237e data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-bfcfe748 data-v-a61e22dd data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-bfcfe748 data-v-6d16081b data-v-35350ec6><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-35350ec6><span class="vpi-more-horizontal icon" data-v-35350ec6></span></button><div class="menu" data-v-35350ec6><div class="VPMenu" data-v-35350ec6 data-v-52b08d90><!----><!--[--><!--[--><!----><div class="group" data-v-6d16081b><div class="item appearance" data-v-6d16081b><p class="label" data-v-6d16081b>Appearance</p><div class="appearance-action" data-v-6d16081b><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6d16081b data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div></div></div><div class="group" data-v-6d16081b><div class="item social-links" data-v-6d16081b><div class="VPSocialLinks social-links-list" data-v-6d16081b data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-bfcfe748 data-v-1e510fee><span class="container" data-v-1e510fee><span class="top" data-v-1e510fee></span><span class="middle" data-v-1e510fee></span><span class="bottom" data-v-1e510fee></span></span></button></div></div></div></div><div class="divider" data-v-bfcfe748><div class="divider-line" data-v-bfcfe748></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-1bdd7537 data-v-18894e30><div class="container" data-v-18894e30><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-18894e30><span class="vpi-align-left menu-icon" data-v-18894e30></span><span class="menu-text" data-v-18894e30>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-18894e30 data-v-bdfacdf2><button data-v-bdfacdf2>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-1bdd7537 data-v-1d1d7027><div class="curtain" data-v-1d1d7027></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-1d1d7027><span class="visually-hidden" id="sidebar-aria-label" data-v-1d1d7027> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-594fed9e><section class="VPSidebarItem level-0" data-v-594fed9e data-v-cd30f15d><div class="item" role="button" tabindex="0" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><h2 class="text" data-v-cd30f15d>开始</h2><!----></div><div class="items" data-v-cd30f15d><!--[--><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>文档首页</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/getting-started" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>快速开始</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/operations-guide" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>部署与运维指南</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-594fed9e><section class="VPSidebarItem level-0 has-active" data-v-594fed9e data-v-cd30f15d><div class="item" role="button" tabindex="0" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><h2 class="text" data-v-cd30f15d>参考</h2><!----></div><div class="items" data-v-cd30f15d><!--[--><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/architecture" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>代码架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/protocol" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>协议说明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/development" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>开发文档</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/tech-selection-2026" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>技术选型</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-1bdd7537 data-v-f89b4fb6><div class="VPDoc has-sidebar has-aside" data-v-f89b4fb6 data-v-1870bdbd><!--[--><!--]--><div class="container" data-v-1870bdbd><div class="aside" data-v-1870bdbd><div class="aside-curtain" data-v-1870bdbd></div><div class="aside-container" data-v-1870bdbd><div class="aside-content" data-v-1870bdbd><div class="VPDocAside" data-v-1870bdbd data-v-2bdf3a15><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-2bdf3a15 data-v-3d03f0c2><div class="content" data-v-3d03f0c2><div class="outline-marker" data-v-3d03f0c2></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-3d03f0c2>本页目录</div><ul class="VPDocOutlineItem root" data-v-3d03f0c2 data-v-87a812ef><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-2bdf3a15></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-1870bdbd><div class="content-container" data-v-1870bdbd><!--[--><!--]--><main class="main" data-v-1870bdbd><div style="position:relative;" class="vp-doc _development" data-v-1870bdbd><div><h1 id="开发文档" tabindex="-1">开发文档 <a class="header-anchor" href="#开发文档" aria-label="Permalink to "开发文档""></a></h1><h2 id="本地开发" tabindex="-1">本地开发 <a class="header-anchor" href="#本地开发" aria-label="Permalink to "本地开发""></a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span></span>
|
|
23
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev:relay</span></span>
|
|
24
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev:app</span></span>
|
|
25
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> dev:agent</span></span></code></pre></div><h2 id="常用检查" tabindex="-1">常用检查 <a class="header-anchor" href="#常用检查" aria-label="Permalink to "常用检查""></a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> typecheck</span></span>
|
|
26
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> build</span></span>
|
|
27
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> test:ui-smoke</span></span>
|
|
28
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> check:stability</span></span></code></pre></div><p>说明:</p><ul><li><code>pnpm test:ui-smoke</code> 现在按手机视口跑,覆盖配对、切会话、关闭会话、清除绑定,以及“查看后终端区进入可视区”</li><li><code>pnpm check:stability</code> 会验证 relay / agent 长时间运行下的输出缓冲和重连一致性</li></ul><h2 id="当前仓库形态" tabindex="-1">当前仓库形态 <a class="header-anchor" href="#当前仓库形态" aria-label="Permalink to "当前仓库形态""></a></h2><ul><li>根入口:<code>src/cli.ts</code></li><li>PC 端:<code>agent/</code></li><li>手机端:<code>app/</code></li><li>relay:<code>relay/</code></li><li>共享协议:<code>packages/protocol/</code></li></ul><h2 id="发布流程" tabindex="-1">发布流程 <a class="header-anchor" href="#发布流程" aria-label="Permalink to "发布流程""></a></h2><ol><li>提升版本号</li><li>运行 <code>pnpm build</code></li><li>运行 <code>pnpm test:ui-smoke</code></li><li>运行 <code>pnpm check:stability</code></li><li>执行 <code>npm publish --access public</code></li></ol><p>当前已发布包名:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">@fengye404/termpilot</span></span></code></pre></div></div></div></main><footer class="VPDocFooter" data-v-1870bdbd data-v-b170fa4f><!--[--><!--]--><div class="edit-info" data-v-b170fa4f><div class="edit-link" data-v-b170fa4f><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/fengye404/TermPilot/edit/main/docs/development.md" target="_blank" rel="noreferrer" data-v-b170fa4f><!--[--><span class="vpi-square-pen edit-link-icon" data-v-b170fa4f></span> 在 GitHub 上编辑此页<!--]--></a></div><div class="last-updated" data-v-b170fa4f><p class="VPLastUpdated" data-v-b170fa4f data-v-33a4642e>Last updated: <time datetime="2026-03-10T17:07:50.000Z" data-v-33a4642e></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-b170fa4f><span class="visually-hidden" id="doc-footer-aria-label" data-v-b170fa4f>Pager</span><div class="pager" data-v-b170fa4f><a class="VPLink link pager-link prev" href="/protocol" data-v-b170fa4f><!--[--><span class="desc" data-v-b170fa4f>Previous page</span><span class="title" data-v-b170fa4f>协议说明</span><!--]--></a></div><div class="pager" data-v-b170fa4f><a class="VPLink link pager-link next" href="/tech-selection-2026" data-v-b170fa4f><!--[--><span class="desc" data-v-b170fa4f>Next page</span><span class="title" data-v-b170fa4f>技术选型</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-1bdd7537 data-v-9a5ea44b><div class="container" data-v-9a5ea44b><p class="message" data-v-9a5ea44b>为长期任务和跨端终端控制而构建。</p><p class="copyright" data-v-9a5ea44b>Copyright © 2026 Fengye</p></div></footer><!--[--><!--]--></div></div>
|
|
29
|
+
<script>window.__VP_HASH_MAP__=JSON.parse("{\"architecture.md\":\"JnC1zyYV\",\"development.md\":\"iwUVjeO6\",\"getting-started.md\":\"Cirp1CHi\",\"index.md\":\"D9XElNRh\",\"operations-guide.md\":\"DfNiIg5F\",\"protocol.md\":\"CCXFJUPR\",\"readme.md\":\"B4-OJVNQ\",\"tech-selection-2026.md\":\"Dk_ymWTx\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"TermPilot\",\"description\":\"手机和电脑共享同一个 tmux 会话的终端远程控制工具。\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"siteTitle\":\"TermPilot\",\"logo\":\"/favicon.svg\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维\",\"link\":\"/operations-guide\"},{\"text\":\"架构\",\"link\":\"/architecture\"},{\"text\":\"协议\",\"link\":\"/protocol\"}],\"sidebar\":[{\"text\":\"开始\",\"items\":[{\"text\":\"文档首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维指南\",\"link\":\"/operations-guide\"}]},{\"text\":\"参考\",\"items\":[{\"text\":\"代码架构\",\"link\":\"/architecture\"},{\"text\":\"协议说明\",\"link\":\"/protocol\"},{\"text\":\"开发文档\",\"link\":\"/development\"},{\"text\":\"技术选型\",\"link\":\"/tech-selection-2026\"}]}],\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/fengye404/TermPilot\"}],\"editLink\":{\"pattern\":\"https://github.com/fengye404/TermPilot/edit/main/docs/:path\",\"text\":\"在 GitHub 上编辑此页\"},\"outline\":{\"level\":[2,3],\"label\":\"本页目录\"},\"footer\":{\"message\":\"为长期任务和跨端终端控制而构建。\",\"copyright\":\"Copyright © 2026 Fengye\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
|
|
30
|
+
|
|
31
|
+
</body>
|
|
32
|
+
</html>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
|
|
2
|
+
<rect width="64" height="64" rx="18" fill="#0F4A33"/>
|
|
3
|
+
<path d="M18 22H46V28H18V22Z" fill="#FCFCF8"/>
|
|
4
|
+
<path d="M18 34H34V40H18V34Z" fill="#57C58D"/>
|
|
5
|
+
<path d="M38 34H46V40H38V34Z" fill="#DBB34D"/>
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN" dir="ltr">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<title>快速开始 | TermPilot</title>
|
|
7
|
+
<meta name="description" content="手机和电脑共享同一个 tmux 会话的终端远程控制工具。">
|
|
8
|
+
<meta name="generator" content="VitePress v1.6.4">
|
|
9
|
+
<link rel="preload stylesheet" href="/assets/style.B0lvUXq1.css" as="style">
|
|
10
|
+
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
|
|
11
|
+
|
|
12
|
+
<script type="module" src="/assets/app.BG4pRgiG.js"></script>
|
|
13
|
+
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
|
14
|
+
<link rel="modulepreload" href="/assets/chunks/theme.D0_6rd9F.js">
|
|
15
|
+
<link rel="modulepreload" href="/assets/chunks/framework.BZohXCq9.js">
|
|
16
|
+
<link rel="modulepreload" href="/assets/getting-started.md.Cirp1CHi.lean.js">
|
|
17
|
+
<meta name="theme-color" content="#1f7a53">
|
|
18
|
+
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
|
19
|
+
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<div id="app"><div class="Layout" data-v-1bdd7537><!--[--><!--]--><!--[--><span tabindex="-1" data-v-0a4b5d46></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-0a4b5d46>Skip to content</a><!--]--><!----><header class="VPNav" data-v-1bdd7537 data-v-07e0ee65><div class="VPNavBar" data-v-07e0ee65 data-v-bfcfe748><div class="wrapper" data-v-bfcfe748><div class="container" data-v-bfcfe748><div class="title" data-v-bfcfe748><div class="VPNavBarTitle has-sidebar" data-v-bfcfe748 data-v-6ce24249><a class="title" href="/" data-v-6ce24249><!--[--><!--]--><!--[--><img class="VPImage logo" src="/favicon.svg" alt data-v-105fdaa6><!--]--><span data-v-6ce24249>TermPilot</span><!--[--><!--]--></a></div></div><div class="content" data-v-bfcfe748><div class="content-body" data-v-bfcfe748><!--[--><!--]--><div class="VPNavBarSearch search" data-v-bfcfe748><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-bfcfe748 data-v-d1dc8fec><span id="main-nav-aria-label" class="visually-hidden" data-v-d1dc8fec> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>首页</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/getting-started" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>快速开始</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/operations-guide" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>部署与运维</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/architecture" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>架构</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/protocol" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>协议</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-bfcfe748 data-v-d994237e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-d994237e data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-bfcfe748 data-v-a61e22dd data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-bfcfe748 data-v-6d16081b data-v-35350ec6><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-35350ec6><span class="vpi-more-horizontal icon" data-v-35350ec6></span></button><div class="menu" data-v-35350ec6><div class="VPMenu" data-v-35350ec6 data-v-52b08d90><!----><!--[--><!--[--><!----><div class="group" data-v-6d16081b><div class="item appearance" data-v-6d16081b><p class="label" data-v-6d16081b>Appearance</p><div class="appearance-action" data-v-6d16081b><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6d16081b data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div></div></div><div class="group" data-v-6d16081b><div class="item social-links" data-v-6d16081b><div class="VPSocialLinks social-links-list" data-v-6d16081b data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-bfcfe748 data-v-1e510fee><span class="container" data-v-1e510fee><span class="top" data-v-1e510fee></span><span class="middle" data-v-1e510fee></span><span class="bottom" data-v-1e510fee></span></span></button></div></div></div></div><div class="divider" data-v-bfcfe748><div class="divider-line" data-v-bfcfe748></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-1bdd7537 data-v-18894e30><div class="container" data-v-18894e30><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-18894e30><span class="vpi-align-left menu-icon" data-v-18894e30></span><span class="menu-text" data-v-18894e30>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-18894e30 data-v-bdfacdf2><button data-v-bdfacdf2>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-1bdd7537 data-v-1d1d7027><div class="curtain" data-v-1d1d7027></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-1d1d7027><span class="visually-hidden" id="sidebar-aria-label" data-v-1d1d7027> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-594fed9e><section class="VPSidebarItem level-0 has-active" data-v-594fed9e data-v-cd30f15d><div class="item" role="button" tabindex="0" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><h2 class="text" data-v-cd30f15d>开始</h2><!----></div><div class="items" data-v-cd30f15d><!--[--><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>文档首页</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/getting-started" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>快速开始</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/operations-guide" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>部署与运维指南</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-594fed9e><section class="VPSidebarItem level-0" data-v-594fed9e data-v-cd30f15d><div class="item" role="button" tabindex="0" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><h2 class="text" data-v-cd30f15d>参考</h2><!----></div><div class="items" data-v-cd30f15d><!--[--><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/architecture" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>代码架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/protocol" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>协议说明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/development" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>开发文档</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/tech-selection-2026" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>技术选型</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-1bdd7537 data-v-f89b4fb6><div class="VPDoc has-sidebar has-aside" data-v-f89b4fb6 data-v-1870bdbd><!--[--><!--]--><div class="container" data-v-1870bdbd><div class="aside" data-v-1870bdbd><div class="aside-curtain" data-v-1870bdbd></div><div class="aside-container" data-v-1870bdbd><div class="aside-content" data-v-1870bdbd><div class="VPDocAside" data-v-1870bdbd data-v-2bdf3a15><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-2bdf3a15 data-v-3d03f0c2><div class="content" data-v-3d03f0c2><div class="outline-marker" data-v-3d03f0c2></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-3d03f0c2>本页目录</div><ul class="VPDocOutlineItem root" data-v-3d03f0c2 data-v-87a812ef><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-2bdf3a15></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-1870bdbd><div class="content-container" data-v-1870bdbd><!--[--><!--]--><main class="main" data-v-1870bdbd><div style="position:relative;" class="vp-doc _getting-started" data-v-1870bdbd><div><h1 id="快速开始" tabindex="-1">快速开始 <a class="header-anchor" href="#快速开始" aria-label="Permalink to "快速开始""></a></h1><p>这份文档面向第一次真正把 TermPilot 跑起来的用户。目标不是解释所有细节,而是让你在 5 分钟内跑通第一条完整链路。</p><h2 id="_1-你需要准备什么" tabindex="-1">1. 你需要准备什么 <a class="header-anchor" href="#_1-你需要准备什么" aria-label="Permalink to "1. 你需要准备什么""></a></h2><ul><li>一台服务器,或者一台手机能访问到的局域网机器</li><li>一台作为主力开发机的电脑</li><li>电脑上已经安装 <code>tmux</code></li><li>两端都安装了 <code>Node.js</code></li></ul><p>安装 TermPilot:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @fengye404/termpilot</span></span></code></pre></div><h2 id="_2-在服务器启动-relay" tabindex="-1">2. 在服务器启动 relay <a class="header-anchor" href="#_2-在服务器启动-relay" aria-label="Permalink to "2. 在服务器启动 relay""></a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span></span></code></pre></div><p>默认行为:</p><ul><li>后台启动</li><li>默认监听 <code>0.0.0.0:8787</code></li><li>同时提供网页和 <code>/ws</code> WebSocket</li></ul><p>如果你要停掉它:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> stop</span></span></code></pre></div><p>如果你要前台看日志:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span></span></code></pre></div><h2 id="_3-在电脑启动-agent" tabindex="-1">3. 在电脑启动 agent <a class="header-anchor" href="#_3-在电脑启动-agent" aria-label="Permalink to "3. 在电脑启动 agent""></a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span></span></code></pre></div><p>第一次运行时,终端会提示你输入:</p><ol><li>relay 域名或 IP</li><li>端口,直接回车默认 <code>8787</code></li></ol><p>然后它会自动:</p><ul><li>保存本地配置</li><li>后台启动 agent</li><li>打印一次性配对码</li></ul><p>以后日常再次执行:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span></span></code></pre></div><p>如果后台 agent 已存在,它会直接显示当前状态。</p><h2 id="_4-在手机完成配对" tabindex="-1">4. 在手机完成配对 <a class="header-anchor" href="#_4-在手机完成配对" aria-label="Permalink to "4. 在手机完成配对""></a></h2><p>手机浏览器打开:</p><ul><li><code>http://your-domain.com:8787</code></li><li>或配置 HTTPS 反代后的 <code>https://your-domain.com</code></li></ul><p>未配对时,首页只需要做一件事:</p><ul><li>输入电脑端打印出来的配对码</li></ul><p>配对成功后,你会直接进入会话列表。</p><h2 id="_5-直接跑一个可同步的任务" tabindex="-1">5. 直接跑一个可同步的任务 <a class="header-anchor" href="#_5-直接跑一个可同步的任务" aria-label="Permalink to "5. 直接跑一个可同步的任务""></a></h2><p>如果你平时主要跑 Claude Code,最短路径就是:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> claude</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> code</span></span></code></pre></div><p>如果你主要跑 OpenCode:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> open</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> code</span></span></code></pre></div><p>这两条命令都会:</p><ul><li>创建一个受 TermPilot 管理的 <code>tmux</code> 会话</li><li>把命令写进这个会话</li><li>让当前终端直接 attach 到这个会话</li></ul><p>此时手机上会看到同一个会话输出。</p><h2 id="_6-第一次跑通后你应该验证什么" tabindex="-1">6. 第一次跑通后你应该验证什么 <a class="header-anchor" href="#_6-第一次跑通后你应该验证什么" aria-label="Permalink to "6. 第一次跑通后你应该验证什么""></a></h2><p>建议你做这 4 个最小动作:</p><ol><li>电脑上看到任务开始流式输出</li><li>手机上打开同一个会话,确认输出同步</li><li>手机上发一条短命令,确认会进入同一个会话</li><li>手机上关闭这个会话,确认电脑端也同步结束</li></ol><h2 id="_7-常见问题" tabindex="-1">7. 常见问题 <a class="header-anchor" href="#_7-常见问题" aria-label="Permalink to "7. 常见问题""></a></h2><h3 id="termpilot-relay-为什么不占当前窗口" tabindex="-1"><code>termpilot relay</code> 为什么不占当前窗口 <a class="header-anchor" href="#termpilot-relay-为什么不占当前窗口" aria-label="Permalink to "`termpilot relay` 为什么不占当前窗口""></a></h3><p>因为它默认是后台启动。要看实时日志,请用:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span></span></code></pre></div><h3 id="termpilot-agent-为什么第二次执行没有再问域名" tabindex="-1"><code>termpilot agent</code> 为什么第二次执行没有再问域名 <a class="header-anchor" href="#termpilot-agent-为什么第二次执行没有再问域名" aria-label="Permalink to "`termpilot agent` 为什么第二次执行没有再问域名""></a></h3><p>因为第一次配置已经保存到了本地。再次执行时,它会直接使用本地配置启动或显示状态。</p><h3 id="为什么普通-iterm-标签页不会出现在手机上" tabindex="-1">为什么普通 iTerm 标签页不会出现在手机上 <a class="header-anchor" href="#为什么普通-iterm-标签页不会出现在手机上" aria-label="Permalink to "为什么普通 iTerm 标签页不会出现在手机上""></a></h3><p>因为只有 TermPilot 管理的会话才会同步。正确做法是从一开始就用:</p><ul><li><code>termpilot claude code</code></li><li><code>termpilot open code</code></li><li><code>termpilot create ...</code></li></ul><h2 id="_8-下一步看什么" tabindex="-1">8. 下一步看什么 <a class="header-anchor" href="#_8-下一步看什么" aria-label="Permalink to "8. 下一步看什么""></a></h2><ul><li>想长期部署:看 <a href="./operations-guide">部署与运维指南</a></li><li>想了解内部结构:看 <a href="./architecture">代码架构</a></li></ul></div></div></main><footer class="VPDocFooter" data-v-1870bdbd data-v-b170fa4f><!--[--><!--]--><div class="edit-info" data-v-b170fa4f><div class="edit-link" data-v-b170fa4f><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/fengye404/TermPilot/edit/main/docs/getting-started.md" target="_blank" rel="noreferrer" data-v-b170fa4f><!--[--><span class="vpi-square-pen edit-link-icon" data-v-b170fa4f></span> 在 GitHub 上编辑此页<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-b170fa4f><span class="visually-hidden" id="doc-footer-aria-label" data-v-b170fa4f>Pager</span><div class="pager" data-v-b170fa4f><a class="VPLink link pager-link prev" href="/" data-v-b170fa4f><!--[--><span class="desc" data-v-b170fa4f>Previous page</span><span class="title" data-v-b170fa4f>文档首页</span><!--]--></a></div><div class="pager" data-v-b170fa4f><a class="VPLink link pager-link next" href="/operations-guide" data-v-b170fa4f><!--[--><span class="desc" data-v-b170fa4f>Next page</span><span class="title" data-v-b170fa4f>部署与运维指南</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-1bdd7537 data-v-9a5ea44b><div class="container" data-v-9a5ea44b><p class="message" data-v-9a5ea44b>为长期任务和跨端终端控制而构建。</p><p class="copyright" data-v-9a5ea44b>Copyright © 2026 Fengye</p></div></footer><!--[--><!--]--></div></div>
|
|
23
|
+
<script>window.__VP_HASH_MAP__=JSON.parse("{\"architecture.md\":\"JnC1zyYV\",\"development.md\":\"iwUVjeO6\",\"getting-started.md\":\"Cirp1CHi\",\"index.md\":\"D9XElNRh\",\"operations-guide.md\":\"DfNiIg5F\",\"protocol.md\":\"CCXFJUPR\",\"readme.md\":\"B4-OJVNQ\",\"tech-selection-2026.md\":\"Dk_ymWTx\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"TermPilot\",\"description\":\"手机和电脑共享同一个 tmux 会话的终端远程控制工具。\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"siteTitle\":\"TermPilot\",\"logo\":\"/favicon.svg\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维\",\"link\":\"/operations-guide\"},{\"text\":\"架构\",\"link\":\"/architecture\"},{\"text\":\"协议\",\"link\":\"/protocol\"}],\"sidebar\":[{\"text\":\"开始\",\"items\":[{\"text\":\"文档首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维指南\",\"link\":\"/operations-guide\"}]},{\"text\":\"参考\",\"items\":[{\"text\":\"代码架构\",\"link\":\"/architecture\"},{\"text\":\"协议说明\",\"link\":\"/protocol\"},{\"text\":\"开发文档\",\"link\":\"/development\"},{\"text\":\"技术选型\",\"link\":\"/tech-selection-2026\"}]}],\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/fengye404/TermPilot\"}],\"editLink\":{\"pattern\":\"https://github.com/fengye404/TermPilot/edit/main/docs/:path\",\"text\":\"在 GitHub 上编辑此页\"},\"outline\":{\"level\":[2,3],\"label\":\"本页目录\"},\"footer\":{\"message\":\"为长期任务和跨端终端控制而构建。\",\"copyright\":\"Copyright © 2026 Fengye\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
|
|
24
|
+
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"architecture.md":"JnC1zyYV","development.md":"iwUVjeO6","getting-started.md":"Cirp1CHi","index.md":"D9XElNRh","operations-guide.md":"DfNiIg5F","protocol.md":"CCXFJUPR","readme.md":"B4-OJVNQ","tech-selection-2026.md":"Dk_ymWTx"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN" dir="ltr">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<title>TermPilot</title>
|
|
7
|
+
<meta name="description" content="手机和电脑共享同一个 tmux 会话的终端远程控制工具。">
|
|
8
|
+
<meta name="generator" content="VitePress v1.6.4">
|
|
9
|
+
<link rel="preload stylesheet" href="/assets/style.B0lvUXq1.css" as="style">
|
|
10
|
+
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
|
|
11
|
+
|
|
12
|
+
<script type="module" src="/assets/app.BG4pRgiG.js"></script>
|
|
13
|
+
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
|
14
|
+
<link rel="modulepreload" href="/assets/chunks/theme.D0_6rd9F.js">
|
|
15
|
+
<link rel="modulepreload" href="/assets/chunks/framework.BZohXCq9.js">
|
|
16
|
+
<link rel="modulepreload" href="/assets/index.md.D9XElNRh.lean.js">
|
|
17
|
+
<meta name="theme-color" content="#1f7a53">
|
|
18
|
+
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
|
19
|
+
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<div id="app"><div class="Layout" data-v-1bdd7537><!--[--><!--]--><!--[--><span tabindex="-1" data-v-0a4b5d46></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-0a4b5d46>Skip to content</a><!--]--><!----><header class="VPNav" data-v-1bdd7537 data-v-07e0ee65><div class="VPNavBar" data-v-07e0ee65 data-v-bfcfe748><div class="wrapper" data-v-bfcfe748><div class="container" data-v-bfcfe748><div class="title" data-v-bfcfe748><div class="VPNavBarTitle" data-v-bfcfe748 data-v-6ce24249><a class="title" href="/" data-v-6ce24249><!--[--><!--]--><!--[--><img class="VPImage logo" src="/favicon.svg" alt data-v-105fdaa6><!--]--><span data-v-6ce24249>TermPilot</span><!--[--><!--]--></a></div></div><div class="content" data-v-bfcfe748><div class="content-body" data-v-bfcfe748><!--[--><!--]--><div class="VPNavBarSearch search" data-v-bfcfe748><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-bfcfe748 data-v-d1dc8fec><span id="main-nav-aria-label" class="visually-hidden" data-v-d1dc8fec> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>首页</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/getting-started" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>快速开始</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/operations-guide" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>部署与运维</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/architecture" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>架构</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/protocol" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>协议</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-bfcfe748 data-v-d994237e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-d994237e data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-bfcfe748 data-v-a61e22dd data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-bfcfe748 data-v-6d16081b data-v-35350ec6><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-35350ec6><span class="vpi-more-horizontal icon" data-v-35350ec6></span></button><div class="menu" data-v-35350ec6><div class="VPMenu" data-v-35350ec6 data-v-52b08d90><!----><!--[--><!--[--><!----><div class="group" data-v-6d16081b><div class="item appearance" data-v-6d16081b><p class="label" data-v-6d16081b>Appearance</p><div class="appearance-action" data-v-6d16081b><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6d16081b data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div></div></div><div class="group" data-v-6d16081b><div class="item social-links" data-v-6d16081b><div class="VPSocialLinks social-links-list" data-v-6d16081b data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-bfcfe748 data-v-1e510fee><span class="container" data-v-1e510fee><span class="top" data-v-1e510fee></span><span class="middle" data-v-1e510fee></span><span class="bottom" data-v-1e510fee></span></span></button></div></div></div></div><div class="divider" data-v-bfcfe748><div class="divider-line" data-v-bfcfe748></div></div></div><!----></header><!----><!----><div class="VPContent is-home" id="VPContent" data-v-1bdd7537 data-v-f89b4fb6><div class="VPHome" data-v-f89b4fb6 data-v-79fcb04a><!--[--><!--]--><div class="VPHero VPHomeHero" data-v-79fcb04a data-v-f735660c><div class="container" data-v-f735660c><div class="main" data-v-f735660c><!--[--><!--]--><!--[--><h1 class="heading" data-v-f735660c><span class="name clip" data-v-f735660c>TermPilot</span><span class="text" data-v-f735660c>手机和电脑共享同一个 tmux 会话</span></h1><p class="tagline" data-v-f735660c>一个 npm 包,两个命令,手机浏览器直接接管你的长期任务。</p><!--]--><!--[--><!--]--><div class="actions" data-v-f735660c><!--[--><div class="action" data-v-f735660c><a class="VPButton medium brand" href="/getting-started" data-v-f735660c data-v-e4597ec5>5 分钟快速上手</a></div><div class="action" data-v-f735660c><a class="VPButton medium alt" href="/operations-guide" data-v-f735660c data-v-e4597ec5>部署与运维</a></div><div class="action" data-v-f735660c><a class="VPButton medium alt" href="https://github.com/fengye404/TermPilot" target="_blank" rel="noreferrer" data-v-f735660c data-v-e4597ec5>GitHub</a></div><!--]--></div><!--[--><!--]--></div><!----></div></div><!--[--><!--]--><!--[--><!--]--><div class="VPFeatures VPHomeFeatures" data-v-79fcb04a data-v-65135a9f><div class="container" data-v-65135a9f><div class="items" data-v-65135a9f><!--[--><div class="grid-4 item" data-v-65135a9f><div class="VPLink no-icon VPFeature" data-v-65135a9f data-v-b01aa713><!--[--><article class="box" data-v-b01aa713><!----><h2 class="title" data-v-b01aa713>一个包</h2><p class="details" data-v-b01aa713>服务器和电脑都使用同一个 npm 包,对外只暴露 `termpilot relay` 和 `termpilot agent` 两个主命令。</p><!----></article><!--]--></div></div><div class="grid-4 item" data-v-65135a9f><div class="VPLink no-icon VPFeature" data-v-65135a9f data-v-b01aa713><!--[--><article class="box" data-v-b01aa713><!----><h2 class="title" data-v-b01aa713>手机不安装</h2><p class="details" data-v-b01aa713>relay 同时托管网页和中继层,手机直接打开域名即可,不需要 App Store 或安卓安装包。</p><!----></article><!--]--></div></div><div class="grid-4 item" data-v-65135a9f><div class="VPLink no-icon VPFeature" data-v-65135a9f data-v-b01aa713><!--[--><article class="box" data-v-b01aa713><!----><h2 class="title" data-v-b01aa713>同一个会话</h2><p class="details" data-v-b01aa713>电脑和手机看到的是同一批 tmux 会话,创建、查看、关闭和输入都互通。</p><!----></article><!--]--></div></div><div class="grid-4 item" data-v-65135a9f><div class="VPLink no-icon VPFeature" data-v-65135a9f data-v-b01aa713><!--[--><article class="box" data-v-b01aa713><!----><h2 class="title" data-v-b01aa713>面向长期任务</h2><p class="details" data-v-b01aa713>适合 Claude Code、OpenCode、脚本批处理和各种需要离开电脑后继续观察的任务。</p><!----></article><!--]--></div></div><!--]--></div></div></div><!--[--><!--]--><div class="vp-doc container" style="" data-v-79fcb04a data-v-3b12a21d><!--[--><div style="position:relative;" data-v-79fcb04a><div><h2 id="你会怎么用它" tabindex="-1">你会怎么用它 <a class="header-anchor" href="#你会怎么用它" aria-label="Permalink to "你会怎么用它""></a></h2><p>最短路径只有四步:</p><ol><li>在服务器执行 <code>termpilot relay</code></li><li>在电脑执行 <code>termpilot agent</code></li><li>手机上打开 relay 域名并输入配对码</li><li>在电脑执行 <code>termpilot claude code</code></li></ol><p>之后你会得到:</p><ul><li>电脑和手机同步看到同一个会话输出</li><li>手机上能补命令、发快捷键、关闭会话</li><li>电脑离开当前桌面后,任务仍然在 <code>tmux</code> 里继续运行</li></ul><h2 id="文档地图" tabindex="-1">文档地图 <a class="header-anchor" href="#文档地图" aria-label="Permalink to "文档地图""></a></h2><ul><li><a href="/getting-started">快速开始</a></li><li><a href="/operations-guide">部署与运维指南</a></li><li><a href="/architecture">代码架构</a></li><li><a href="/protocol">协议说明</a></li><li><a href="/development">开发文档</a></li></ul><h2 id="推荐阅读顺序" tabindex="-1">推荐阅读顺序 <a class="header-anchor" href="#推荐阅读顺序" aria-label="Permalink to "推荐阅读顺序""></a></h2><ol><li>先看 <a href="/getting-started">快速开始</a></li><li>准备长期部署时再看 <a href="/operations-guide">部署与运维指南</a></li><li>想改代码时看 <a href="/architecture">代码架构</a> 和 <a href="/development">开发文档</a></li></ol></div></div><!--]--></div></div></div><footer class="VPFooter" data-v-1bdd7537 data-v-9a5ea44b><div class="container" data-v-9a5ea44b><p class="message" data-v-9a5ea44b>为长期任务和跨端终端控制而构建。</p><p class="copyright" data-v-9a5ea44b>Copyright © 2026 Fengye</p></div></footer><!--[--><!--]--></div></div>
|
|
23
|
+
<script>window.__VP_HASH_MAP__=JSON.parse("{\"architecture.md\":\"JnC1zyYV\",\"development.md\":\"iwUVjeO6\",\"getting-started.md\":\"Cirp1CHi\",\"index.md\":\"D9XElNRh\",\"operations-guide.md\":\"DfNiIg5F\",\"protocol.md\":\"CCXFJUPR\",\"readme.md\":\"B4-OJVNQ\",\"tech-selection-2026.md\":\"Dk_ymWTx\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"TermPilot\",\"description\":\"手机和电脑共享同一个 tmux 会话的终端远程控制工具。\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"siteTitle\":\"TermPilot\",\"logo\":\"/favicon.svg\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维\",\"link\":\"/operations-guide\"},{\"text\":\"架构\",\"link\":\"/architecture\"},{\"text\":\"协议\",\"link\":\"/protocol\"}],\"sidebar\":[{\"text\":\"开始\",\"items\":[{\"text\":\"文档首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维指南\",\"link\":\"/operations-guide\"}]},{\"text\":\"参考\",\"items\":[{\"text\":\"代码架构\",\"link\":\"/architecture\"},{\"text\":\"协议说明\",\"link\":\"/protocol\"},{\"text\":\"开发文档\",\"link\":\"/development\"},{\"text\":\"技术选型\",\"link\":\"/tech-selection-2026\"}]}],\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/fengye404/TermPilot\"}],\"editLink\":{\"pattern\":\"https://github.com/fengye404/TermPilot/edit/main/docs/:path\",\"text\":\"在 GitHub 上编辑此页\"},\"outline\":{\"level\":[2,3],\"label\":\"本页目录\"},\"footer\":{\"message\":\"为长期任务和跨端终端控制而构建。\",\"copyright\":\"Copyright © 2026 Fengye\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
|
|
24
|
+
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN" dir="ltr">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<title>TermPilot 部署与运维指南 | TermPilot</title>
|
|
7
|
+
<meta name="description" content="手机和电脑共享同一个 tmux 会话的终端远程控制工具。">
|
|
8
|
+
<meta name="generator" content="VitePress v1.6.4">
|
|
9
|
+
<link rel="preload stylesheet" href="/assets/style.B0lvUXq1.css" as="style">
|
|
10
|
+
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
|
|
11
|
+
|
|
12
|
+
<script type="module" src="/assets/app.BG4pRgiG.js"></script>
|
|
13
|
+
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
|
14
|
+
<link rel="modulepreload" href="/assets/chunks/theme.D0_6rd9F.js">
|
|
15
|
+
<link rel="modulepreload" href="/assets/chunks/framework.BZohXCq9.js">
|
|
16
|
+
<link rel="modulepreload" href="/assets/operations-guide.md.DfNiIg5F.lean.js">
|
|
17
|
+
<meta name="theme-color" content="#1f7a53">
|
|
18
|
+
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
|
19
|
+
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<div id="app"><div class="Layout" data-v-1bdd7537><!--[--><!--]--><!--[--><span tabindex="-1" data-v-0a4b5d46></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-0a4b5d46>Skip to content</a><!--]--><!----><header class="VPNav" data-v-1bdd7537 data-v-07e0ee65><div class="VPNavBar" data-v-07e0ee65 data-v-bfcfe748><div class="wrapper" data-v-bfcfe748><div class="container" data-v-bfcfe748><div class="title" data-v-bfcfe748><div class="VPNavBarTitle has-sidebar" data-v-bfcfe748 data-v-6ce24249><a class="title" href="/" data-v-6ce24249><!--[--><!--]--><!--[--><img class="VPImage logo" src="/favicon.svg" alt data-v-105fdaa6><!--]--><span data-v-6ce24249>TermPilot</span><!--[--><!--]--></a></div></div><div class="content" data-v-bfcfe748><div class="content-body" data-v-bfcfe748><!--[--><!--]--><div class="VPNavBarSearch search" data-v-bfcfe748><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-bfcfe748 data-v-d1dc8fec><span id="main-nav-aria-label" class="visually-hidden" data-v-d1dc8fec> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>首页</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/getting-started" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>快速开始</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/operations-guide" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>部署与运维</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/architecture" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>架构</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/protocol" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>协议</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-bfcfe748 data-v-d994237e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-d994237e data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-bfcfe748 data-v-a61e22dd data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-bfcfe748 data-v-6d16081b data-v-35350ec6><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-35350ec6><span class="vpi-more-horizontal icon" data-v-35350ec6></span></button><div class="menu" data-v-35350ec6><div class="VPMenu" data-v-35350ec6 data-v-52b08d90><!----><!--[--><!--[--><!----><div class="group" data-v-6d16081b><div class="item appearance" data-v-6d16081b><p class="label" data-v-6d16081b>Appearance</p><div class="appearance-action" data-v-6d16081b><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6d16081b data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div></div></div><div class="group" data-v-6d16081b><div class="item social-links" data-v-6d16081b><div class="VPSocialLinks social-links-list" data-v-6d16081b data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-bfcfe748 data-v-1e510fee><span class="container" data-v-1e510fee><span class="top" data-v-1e510fee></span><span class="middle" data-v-1e510fee></span><span class="bottom" data-v-1e510fee></span></span></button></div></div></div></div><div class="divider" data-v-bfcfe748><div class="divider-line" data-v-bfcfe748></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-1bdd7537 data-v-18894e30><div class="container" data-v-18894e30><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-18894e30><span class="vpi-align-left menu-icon" data-v-18894e30></span><span class="menu-text" data-v-18894e30>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-18894e30 data-v-bdfacdf2><button data-v-bdfacdf2>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-1bdd7537 data-v-1d1d7027><div class="curtain" data-v-1d1d7027></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-1d1d7027><span class="visually-hidden" id="sidebar-aria-label" data-v-1d1d7027> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-594fed9e><section class="VPSidebarItem level-0 has-active" data-v-594fed9e data-v-cd30f15d><div class="item" role="button" tabindex="0" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><h2 class="text" data-v-cd30f15d>开始</h2><!----></div><div class="items" data-v-cd30f15d><!--[--><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>文档首页</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/getting-started" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>快速开始</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/operations-guide" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>部署与运维指南</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-594fed9e><section class="VPSidebarItem level-0" data-v-594fed9e data-v-cd30f15d><div class="item" role="button" tabindex="0" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><h2 class="text" data-v-cd30f15d>参考</h2><!----></div><div class="items" data-v-cd30f15d><!--[--><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/architecture" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>代码架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/protocol" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>协议说明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/development" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>开发文档</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/tech-selection-2026" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>技术选型</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-1bdd7537 data-v-f89b4fb6><div class="VPDoc has-sidebar has-aside" data-v-f89b4fb6 data-v-1870bdbd><!--[--><!--]--><div class="container" data-v-1870bdbd><div class="aside" data-v-1870bdbd><div class="aside-curtain" data-v-1870bdbd></div><div class="aside-container" data-v-1870bdbd><div class="aside-content" data-v-1870bdbd><div class="VPDocAside" data-v-1870bdbd data-v-2bdf3a15><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-2bdf3a15 data-v-3d03f0c2><div class="content" data-v-3d03f0c2><div class="outline-marker" data-v-3d03f0c2></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-3d03f0c2>本页目录</div><ul class="VPDocOutlineItem root" data-v-3d03f0c2 data-v-87a812ef><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-2bdf3a15></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-1870bdbd><div class="content-container" data-v-1870bdbd><!--[--><!--]--><main class="main" data-v-1870bdbd><div style="position:relative;" class="vp-doc _operations-guide" data-v-1870bdbd><div><h1 id="termpilot-部署与运维指南" tabindex="-1">TermPilot 部署与运维指南 <a class="header-anchor" href="#termpilot-部署与运维指南" aria-label="Permalink to "TermPilot 部署与运维指南""></a></h1><p>这份文档面向准备长期使用 TermPilot 的用户。它不重复 <code>README</code> 里的 5 分钟快速上手,而是把部署、反代、日常运维、排障和安全边界收成一份更完整的运行手册。</p><p>文档风格参考了成熟开源项目常见的写法:先说明适用场景,再给推荐拓扑、部署步骤、运维动作、排障清单和安全边界。你可以把它当成 TermPilot 的管理员手册来用。</p><h2 id="_0-阅读这份文档前-你应该已经知道什么" tabindex="-1">0. 阅读这份文档前,你应该已经知道什么 <a class="header-anchor" href="#_0-阅读这份文档前-你应该已经知道什么" aria-label="Permalink to "0. 阅读这份文档前,你应该已经知道什么""></a></h2><p>建议你已经完成过下面这件事中的至少一件:</p><ul><li>在本地把 <code>termpilot relay</code>、<code>termpilot agent</code> 跑通过一次</li><li>已经看过 <a href="./getting-started">快速开始</a></li></ul><p>如果你还没有跑通过最小链路,请先回到 <a href="./getting-started">快速开始</a>。</p><h2 id="_1-适用场景" tabindex="-1">1. 适用场景 <a class="header-anchor" href="#_1-适用场景" aria-label="Permalink to "1. 适用场景""></a></h2><p>适合下面这些情况:</p><ul><li>你已经确认 TermPilot 的基本流程可用,准备长期跑在自己的服务器上</li><li>你希望用域名和 HTTPS/WSS 暴露 relay,而不是直接用裸 IP 和端口</li><li>你需要给自己或团队整理一份可维护的运行说明</li></ul><p>不适合下面这些情况:</p><ul><li>第一次体验产品</li><li>只想在局域网里临时试一下</li></ul><p>第一次使用请先看 <a href="./getting-started">快速开始</a>。</p><h2 id="_2-部署清单" tabindex="-1">2. 部署清单 <a class="header-anchor" href="#_2-部署清单" aria-label="Permalink to "2. 部署清单""></a></h2><p>开始之前,先确认下面这些前置条件:</p><ul><li>一台能被手机访问到的服务器</li><li>一个已经解析到服务器的域名</li><li>服务器已经放行 <code>80</code> 和 <code>443</code></li><li>电脑端已经安装 <code>tmux</code></li><li>服务器和电脑都已经安装 <code>@fengye404/termpilot</code></li></ul><p>推荐你按这个顺序推进:</p><ol><li>先让服务器上的 <code>termpilot relay</code> 跑起来</li><li>再让域名和 HTTPS 反代跑起来</li><li>再在电脑执行 <code>termpilot agent</code></li><li>最后用手机完成第一次配对</li></ol><h2 id="_3-运行模型" tabindex="-1">3. 运行模型 <a class="header-anchor" href="#_3-运行模型" aria-label="Permalink to "3. 运行模型""></a></h2><p>TermPilot 由三部分组成:</p><ul><li><code>relay</code>:运行在云服务器上,负责网页托管、WebSocket 中继、配对、设备权限和会话元数据</li><li><code>agent</code>:运行在你的电脑上,负责管理本地 <code>tmux</code> 会话并连接 relay</li><li><code>app</code>:手机浏览器直接打开 relay 域名,不需要单独安装 App</li></ul><p>推荐拓扑:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>手机浏览器 --https/wss--> 域名 / 反向代理 --> relay</span></span>
|
|
23
|
+
<span class="line"><span> ^</span></span>
|
|
24
|
+
<span class="line"><span> |</span></span>
|
|
25
|
+
<span class="line"><span> agent --wss--> /ws</span></span></code></pre></div><h2 id="_4-推荐部署模式" tabindex="-1">4. 推荐部署模式 <a class="header-anchor" href="#_4-推荐部署模式" aria-label="Permalink to "4. 推荐部署模式""></a></h2><h3 id="模式-a-最低成本验证" tabindex="-1">模式 A:最低成本验证 <a class="header-anchor" href="#模式-a-最低成本验证" aria-label="Permalink to "模式 A:最低成本验证""></a></h3><ul><li>服务器上直接运行 <code>termpilot relay</code></li><li>对外暴露 <code>8787</code></li><li>手机访问 <code>http://your-ip:8787</code></li><li>电脑连接 <code>ws://your-ip:8787/ws</code></li></ul><p>适合:</p><ul><li>自己先试通链路</li><li>不想先配置域名和 HTTPS</li></ul><p>缺点:</p><ul><li>没有 HTTPS/WSS</li><li>不适合长期使用</li></ul><h3 id="模式-b-推荐生产模式" tabindex="-1">模式 B:推荐生产模式 <a class="header-anchor" href="#模式-b-推荐生产模式" aria-label="Permalink to "模式 B:推荐生产模式""></a></h3><ul><li>服务器上运行 <code>termpilot relay</code></li><li>前面放一个反向代理,例如 Caddy</li><li>域名直接指向服务器</li><li>手机访问 <code>https://your-domain.com</code></li><li>电脑连接 <code>wss://your-domain.com/ws</code></li></ul><p>适合:</p><ul><li>个人长期使用</li><li>多设备跨网络访问</li><li>想降低手机端访问阻力</li></ul><h2 id="_5-生产部署步骤" tabindex="-1">5. 生产部署步骤 <a class="header-anchor" href="#_5-生产部署步骤" aria-label="Permalink to "5. 生产部署步骤""></a></h2><h3 id="_5-1-域名解析" tabindex="-1">5.1 域名解析 <a class="header-anchor" href="#_5-1-域名解析" aria-label="Permalink to "5.1 域名解析""></a></h3><p>把你的域名 A 记录指向服务器公网 IP,例如:</p><ul><li><code>fengye404.top -> 你的服务器公网 IP</code></li></ul><h3 id="_5-2-服务器启动-relay" tabindex="-1">5.2 服务器启动 relay <a class="header-anchor" href="#_5-2-服务器启动-relay" aria-label="Permalink to "5.2 服务器启动 relay""></a></h3><p>最简单的后台启动:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span></span></code></pre></div><p>常用命令:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span></span>
|
|
26
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> stop</span></span>
|
|
27
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span></span></code></pre></div><p>说明:</p><ul><li><code>termpilot relay</code> 或 <code>termpilot relay start</code>:后台启动</li><li><code>termpilot relay stop</code>:停止后台 relay</li><li><code>termpilot relay run</code>:前台运行,适合看日志</li></ul><p>默认监听:</p><ul><li><code>host=0.0.0.0</code></li><li><code>port=8787</code></li></ul><h3 id="_5-3-反向代理" tabindex="-1">5.3 反向代理 <a class="header-anchor" href="#_5-3-反向代理" aria-label="Permalink to "5.3 反向代理""></a></h3><p>推荐用 Caddy。最小配置如下:</p><div class="language-caddyfile vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">caddyfile</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>fengye404.top {</span></span>
|
|
28
|
+
<span class="line"><span> reverse_proxy 127.0.0.1:8787</span></span>
|
|
29
|
+
<span class="line"><span>}</span></span></code></pre></div><p>这会同时转发:</p><ul><li>网页请求 <code>/</code></li><li>WebSocket <code>/ws</code></li></ul><h3 id="_5-4-电脑启动-agent" tabindex="-1">5.4 电脑启动 agent <a class="header-anchor" href="#_5-4-电脑启动-agent" aria-label="Permalink to "5.4 电脑启动 agent""></a></h3><p>第一次:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span></span></code></pre></div><p>然后在终端里输入:</p><ol><li>relay 域名或 IP</li><li>端口,直接回车默认 <code>8787</code></li></ol><p>TermPilot 会自动:</p><ul><li>保存本地配置</li><li>后台启动 agent</li><li>输出一次性配对码</li></ul><p>以后日常:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span></span></code></pre></div><p>如果你只想重新生成一个配对码:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --pair</span></span></code></pre></div><h3 id="_5-5-首次上线后的验收" tabindex="-1">5.5 首次上线后的验收 <a class="header-anchor" href="#_5-5-首次上线后的验收" aria-label="Permalink to "5.5 首次上线后的验收""></a></h3><p>如果你刚完成一套新部署,建议按下面顺序验收:</p><ol><li>服务器执行 <code>termpilot relay</code>,确认后台已启动</li><li>服务器本机执行 <code>curl http://127.0.0.1:8787/health</code></li><li>手机打开 <code>https://your-domain.com</code></li><li>电脑执行 <code>termpilot agent</code></li><li>确认终端里已经打印出配对码</li><li>手机输入配对码并进入会话列表</li><li>电脑执行 <code>termpilot claude code</code></li><li>确认手机端能看到同一个会话的输出</li></ol><h2 id="_6-目录、数据与状态文件" tabindex="-1">6. 目录、数据与状态文件 <a class="header-anchor" href="#_6-目录、数据与状态文件" aria-label="Permalink to "6. 目录、数据与状态文件""></a></h2><p>默认状态目录:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>~/.termpilot</span></span></code></pre></div><p>常见文件:</p><ul><li><code>config.json</code>:agent 本地保存的 relay 配置</li><li><code>agent-runtime.json</code>:后台 agent 运行时状态</li><li><code>relay-runtime.json</code>:后台 relay 运行时状态</li><li><code>agent.log</code>:agent 日志</li><li><code>relay.log</code>:relay 日志</li><li><code>state.json</code>:本地会话状态</li></ul><p>如果你想切换状态目录,可以设置:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">TERMPILOT_HOME</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/your/path</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span></span>
|
|
30
|
+
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">TERMPILOT_HOME</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/your/path</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span></span></code></pre></div><h2 id="_7-推荐的日常工作流" tabindex="-1">7. 推荐的日常工作流 <a class="header-anchor" href="#_7-推荐的日常工作流" aria-label="Permalink to "7. 推荐的日常工作流""></a></h2><h3 id="_7-1-服务器" tabindex="-1">7.1 服务器 <a class="header-anchor" href="#_7-1-服务器" aria-label="Permalink to "7.1 服务器""></a></h3><p>长期保持:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span></span></code></pre></div><p>只有排障时才用:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span></span></code></pre></div><h3 id="_7-2-电脑" tabindex="-1">7.2 电脑 <a class="header-anchor" href="#_7-2-电脑" aria-label="Permalink to "7.2 电脑""></a></h3><p>日常只记住:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span></span></code></pre></div><p>如果你要跑任务,最短路径是:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> claude</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> code</span></span></code></pre></div><p>或者:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> open</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> code</span></span></code></pre></div><h3 id="_7-3-手机" tabindex="-1">7.3 手机 <a class="header-anchor" href="#_7-3-手机" aria-label="Permalink to "7.3 手机""></a></h3><p>长期固定访问:</p><ul><li><code>https://your-domain.com</code></li></ul><p>第一次用配对码,之后正常重连不应该要求重新配对。</p><h2 id="_8-运维动作速查" tabindex="-1">8. 运维动作速查 <a class="header-anchor" href="#_8-运维动作速查" aria-label="Permalink to "8. 运维动作速查""></a></h2><h3 id="_8-1-relay" tabindex="-1">8.1 relay <a class="header-anchor" href="#_8-1-relay" aria-label="Permalink to "8.1 relay""></a></h3><p>后台启动:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span></span></code></pre></div><p>查看前台日志:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span></span></code></pre></div><p>停止后台 relay:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> stop</span></span></code></pre></div><h3 id="_8-2-agent" tabindex="-1">8.2 agent <a class="header-anchor" href="#_8-2-agent" aria-label="Permalink to "8.2 agent""></a></h3><p>按本机配置启动或查看状态:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span></span></code></pre></div><p>重新生成配对码:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --pair</span></span></code></pre></div><p>查看后台状态:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> status</span></span></code></pre></div><p>停止后台 agent:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> stop</span></span></code></pre></div><h3 id="_8-3-会话" tabindex="-1">8.3 会话 <a class="header-anchor" href="#_8-3-会话" aria-label="Permalink to "8.3 会话""></a></h3><p>直接启动常见任务:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> claude</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> code</span></span>
|
|
31
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> open</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> code</span></span></code></pre></div><p>手动管理会话:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-task</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --cwd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path/to/project</span></span>
|
|
32
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> list</span></span>
|
|
33
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> attach</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --sid</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> <</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">si</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span></span>
|
|
34
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> kill</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --sid</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> <</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">si</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span></span></code></pre></div><h2 id="_9-故障排查" tabindex="-1">9. 故障排查 <a class="header-anchor" href="#_9-故障排查" aria-label="Permalink to "9. 故障排查""></a></h2><h3 id="_9-1-手机打开域名-但页面进不去" tabindex="-1">9.1 手机打开域名,但页面进不去 <a class="header-anchor" href="#_9-1-手机打开域名-但页面进不去" aria-label="Permalink to "9.1 手机打开域名,但页面进不去""></a></h3><p>优先检查:</p><ul><li>DNS 是否已经生效</li><li><code>80</code> / <code>443</code> 是否放行</li><li>反向代理是否已启动</li><li><code>termpilot relay</code> 是否真的在跑</li></ul><p>服务器检查:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span></span>
|
|
35
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">curl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> http://127.0.0.1:8787/health</span></span></code></pre></div><h3 id="_9-2-电脑端执行-termpilot-agent-后手机还是看不到设备" tabindex="-1">9.2 电脑端执行 <code>termpilot agent</code> 后手机还是看不到设备 <a class="header-anchor" href="#_9-2-电脑端执行-termpilot-agent-后手机还是看不到设备" aria-label="Permalink to "9.2 电脑端执行 `termpilot agent` 后手机还是看不到设备""></a></h3><p>优先检查:</p><ul><li>电脑是否真的能连到 relay</li><li>agent 是否已经后台运行</li><li>是否第一次配对还没完成</li></ul><p>电脑检查:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span></span>
|
|
36
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> status</span></span></code></pre></div><h3 id="_9-3-手机端看不到某个任务" tabindex="-1">9.3 手机端看不到某个任务 <a class="header-anchor" href="#_9-3-手机端看不到某个任务" aria-label="Permalink to "9.3 手机端看不到某个任务""></a></h3><p>最常见原因:</p><ul><li>这个任务不是通过 TermPilot 管理的会话启动的</li></ul><p>正确做法:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> claude</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> code</span></span></code></pre></div><p>或:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> my-task</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --cwd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> /path/to/project</span></span>
|
|
37
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> attach</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --sid</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> <</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">si</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span></span></code></pre></div><h3 id="_9-4-想重新绑定手机" tabindex="-1">9.4 想重新绑定手机 <a class="header-anchor" href="#_9-4-想重新绑定手机" aria-label="Permalink to "9.4 想重新绑定手机""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --pair</span></span></code></pre></div><p>如果要撤销旧设备访问令牌:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> grants</span></span>
|
|
38
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> revoke</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --token</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> <</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">accessToke</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">n</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span></span></code></pre></div><h3 id="_9-5-relay-或-agent-想看实时日志" tabindex="-1">9.5 relay 或 agent 想看实时日志 <a class="header-anchor" href="#_9-5-relay-或-agent-想看实时日志" aria-label="Permalink to "9.5 relay 或 agent 想看实时日志""></a></h3><p>relay:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> relay</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run</span></span></code></pre></div><p>agent:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --foreground</span></span></code></pre></div><h3 id="_9-6-我改了域名或端口-电脑还是连旧地址" tabindex="-1">9.6 我改了域名或端口,电脑还是连旧地址 <a class="header-anchor" href="#_9-6-我改了域名或端口-电脑还是连旧地址" aria-label="Permalink to "9.6 我改了域名或端口,电脑还是连旧地址""></a></h3><p>先停掉后台 agent,再重新执行一次交互配置:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> stop</span></span>
|
|
39
|
+
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">termpilot</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> agent</span></span></code></pre></div><p>如果你使用了自定义状态目录,也要确认是不是改到了另一个 <code>TERMPILOT_HOME</code>。</p><h2 id="_10-安全建议" tabindex="-1">10. 安全建议 <a class="header-anchor" href="#_10-安全建议" aria-label="Permalink to "10. 安全建议""></a></h2><ul><li>正式环境优先使用域名 + HTTPS/WSS,不要长期裸露 <code>ws://ip:8787/ws</code></li><li>不要长期传播手机端访问令牌</li><li>换手机或多人共享设备后,及时撤销旧令牌</li><li>如果准备长期保存会话元数据,relay 建议接 PostgreSQL</li><li>不要把外网入口直接暴露到非预期端口和无 TLS 配置上</li></ul><h2 id="_11-升级建议" tabindex="-1">11. 升级建议 <a class="header-anchor" href="#_11-升级建议" aria-label="Permalink to "11. 升级建议""></a></h2><p>推荐的升级节奏:</p><ol><li>先在一台日常不关键的机器上升级验证</li><li>确认 <code>termpilot relay</code> 和 <code>termpilot agent</code> 都能正常启动</li><li>用手机完成一次真实配对和会话查看</li><li>再升级主力机器</li></ol><p>如果升级后出现异常,优先检查:</p><ul><li><code>~/.termpilot/relay.log</code></li><li><code>~/.termpilot/agent.log</code></li><li><code>curl http://127.0.0.1:8787/health</code></li><li><code>termpilot agent status</code></li></ul><h2 id="_12-建议的文档阅读顺序" tabindex="-1">12. 建议的文档阅读顺序 <a class="header-anchor" href="#_12-建议的文档阅读顺序" aria-label="Permalink to "12. 建议的文档阅读顺序""></a></h2><ol><li><a href="./getting-started">快速开始</a></li><li><a href="./architecture">代码架构</a></li><li><a href="./protocol">协议说明</a></li><li>本文档</li></ol></div></div></main><footer class="VPDocFooter" data-v-1870bdbd data-v-b170fa4f><!--[--><!--]--><div class="edit-info" data-v-b170fa4f><div class="edit-link" data-v-b170fa4f><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/fengye404/TermPilot/edit/main/docs/operations-guide.md" target="_blank" rel="noreferrer" data-v-b170fa4f><!--[--><span class="vpi-square-pen edit-link-icon" data-v-b170fa4f></span> 在 GitHub 上编辑此页<!--]--></a></div><div class="last-updated" data-v-b170fa4f><p class="VPLastUpdated" data-v-b170fa4f data-v-33a4642e>Last updated: <time datetime="2026-03-11T17:35:45.000Z" data-v-33a4642e></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-b170fa4f><span class="visually-hidden" id="doc-footer-aria-label" data-v-b170fa4f>Pager</span><div class="pager" data-v-b170fa4f><a class="VPLink link pager-link prev" href="/getting-started" data-v-b170fa4f><!--[--><span class="desc" data-v-b170fa4f>Previous page</span><span class="title" data-v-b170fa4f>快速开始</span><!--]--></a></div><div class="pager" data-v-b170fa4f><a class="VPLink link pager-link next" href="/architecture" data-v-b170fa4f><!--[--><span class="desc" data-v-b170fa4f>Next page</span><span class="title" data-v-b170fa4f>代码架构</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-1bdd7537 data-v-9a5ea44b><div class="container" data-v-9a5ea44b><p class="message" data-v-9a5ea44b>为长期任务和跨端终端控制而构建。</p><p class="copyright" data-v-9a5ea44b>Copyright © 2026 Fengye</p></div></footer><!--[--><!--]--></div></div>
|
|
40
|
+
<script>window.__VP_HASH_MAP__=JSON.parse("{\"architecture.md\":\"JnC1zyYV\",\"development.md\":\"iwUVjeO6\",\"getting-started.md\":\"Cirp1CHi\",\"index.md\":\"D9XElNRh\",\"operations-guide.md\":\"DfNiIg5F\",\"protocol.md\":\"CCXFJUPR\",\"readme.md\":\"B4-OJVNQ\",\"tech-selection-2026.md\":\"Dk_ymWTx\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"TermPilot\",\"description\":\"手机和电脑共享同一个 tmux 会话的终端远程控制工具。\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"siteTitle\":\"TermPilot\",\"logo\":\"/favicon.svg\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维\",\"link\":\"/operations-guide\"},{\"text\":\"架构\",\"link\":\"/architecture\"},{\"text\":\"协议\",\"link\":\"/protocol\"}],\"sidebar\":[{\"text\":\"开始\",\"items\":[{\"text\":\"文档首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维指南\",\"link\":\"/operations-guide\"}]},{\"text\":\"参考\",\"items\":[{\"text\":\"代码架构\",\"link\":\"/architecture\"},{\"text\":\"协议说明\",\"link\":\"/protocol\"},{\"text\":\"开发文档\",\"link\":\"/development\"},{\"text\":\"技术选型\",\"link\":\"/tech-selection-2026\"}]}],\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/fengye404/TermPilot\"}],\"editLink\":{\"pattern\":\"https://github.com/fengye404/TermPilot/edit/main/docs/:path\",\"text\":\"在 GitHub 上编辑此页\"},\"outline\":{\"level\":[2,3],\"label\":\"本页目录\"},\"footer\":{\"message\":\"为长期任务和跨端终端控制而构建。\",\"copyright\":\"Copyright © 2026 Fengye\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
|
|
41
|
+
|
|
42
|
+
</body>
|
|
43
|
+
</html>
|