dsh-mobile 0.1.0-alpha.13 → 0.1.0-alpha.14

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.en.md ADDED
@@ -0,0 +1,108 @@
1
+ <p align="center">
2
+ <img src="assets/brand/repository-hero.png" alt="Use DeepSeek Harness from a phone" width="100%">
3
+ </p>
4
+
5
+ <h1 align="center">DSH Mobile</h1>
6
+
7
+ <p align="center">Secure, live LAN access to DeepSeek Harness from a phone.</p>
8
+
9
+ <p align="center">
10
+ <a href="https://www.npmjs.com/package/dsh-mobile"><img src="https://img.shields.io/npm/v/dsh-mobile?label=npm&amp;color=CB3837" alt="npm version"></a>
11
+ <a href="https://github.com/saya-ch/dsh-mobile/releases"><img src="https://img.shields.io/badge/Download-Android_App-3DDC84?logo=android&amp;logoColor=white" alt="Download Android app"></a>
12
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-0F172A" alt="Apache-2.0"></a>
13
+ </p>
14
+
15
+ <p align="center"><a href="README.md">简体中文</a></p>
16
+
17
+ > Alpha software. Android is the only native app. This is a community plugin, not an official DeepSeek product.
18
+
19
+ <p align="center"><a href="https://github.com/saya-ch/dsh-mobile/releases"><strong>Download the Android app</strong></a></p>
20
+
21
+ DSH Mobile adapts the stock DeepSeek Harness React/Cordis surface for phones and exposes it through an authenticated HTTPS LAN gateway. Desktop, Android, and mobile browsers use the same Workspaces, sessions, messages, tools, settings, and event streams.
22
+
23
+ ## Quick start
24
+
25
+ With an installed `dsh` command:
26
+
27
+ ```powershell
28
+ dsh plugin --profile web add dsh-mobile
29
+ dsh plugin --profile web exec dsh-mobile setup
30
+ dsh --profile web
31
+ ```
32
+
33
+ From a DeepSeek Harness source checkout:
34
+
35
+ ```powershell
36
+ corepack enable; pnpm install
37
+ pnpm dsh plugin --profile web add dsh-mobile
38
+ pnpm dsh plugin --profile web exec dsh-mobile setup
39
+ pnpm dsh --profile web
40
+ ```
41
+
42
+ Open **Mobile** in the lower-left DeepSeek Harness sidebar, enable access, and create a pairing key. In the Android app, tap **Scan**, select the computer, and enter the key. The paired device remains trusted until it is revoked, expires, or its app data is cleared.
43
+
44
+ ## Connection options
45
+
46
+ | Client | Best for | Notes |
47
+ | --- | --- | --- |
48
+ | Android app | Everyday use | Automatic discovery, no browser chrome, private certificate pinning |
49
+ | Mobile browser | Temporary or cross-platform access | Open the HTTPS origin shown by the Mobile card |
50
+
51
+ Discovery uses mDNS/NSD, UDP announcements and queries, plus HTTPS probing. It publishes only the device name, address, port, protocol version, and stable `instanceId`. Keys and device tokens are never discoverable. IP changes do not require another Android pairing.
52
+
53
+ ## Mobile UI
54
+
55
+ Phones still render the stock DeepSeek Harness page. The plugin provides a lightweight default mobile adaptation, and you can freely redesign the page structure and extend its interactions through **Customize from DeepSeek Harness**. By default, the session sidebar becomes a drawer, details open as an overlay, settings use a single-column layout, and the native composer is adapted for touch. Adding a Workspace browses computer folders inside the phone page. Images can come from the phone or the computer.
56
+
57
+ The Android app is a thin Kotlin WebView shell and contains no frontend copy.
58
+
59
+ ## Customize from DeepSeek Harness
60
+
61
+ Customization is intentionally open-ended: use your own ideas to arrange the mobile layout, interactions, and features instead of staying within the default style.
62
+
63
+ Ask DeepSeek Harness to edit:
64
+
65
+ ```text
66
+ $DSH_HOME/mobile-access/mobile.css
67
+ $DSH_HOME/mobile-access/mobile.js
68
+ ```
69
+
70
+ Changes are applied to open Android and browser pages in about one second. Customization is not limited to colors: `mobile.js` can add navigation, shortcuts, dashboards, camera, voice, scanning, and complete interactions with same-origin DeepSeek Harness APIs.
71
+
72
+ ## How it works
73
+
74
+ ```mermaid
75
+ flowchart LR
76
+ Phone["Android / mobile browser"] -->|"HTTPS + device session"| Gateway["DSH Mobile gateway"]
77
+ Gateway -->|"loopback proxy"| DSH["Stock DSH Web and Host"]
78
+ ```
79
+
80
+ The Host face owns discovery, pairing, HTTPS, and the proxy. The Client face installs the responsive adapter on the stock DeepSeek Harness page. No DeepSeek Harness source files are modified.
81
+
82
+ ## Security
83
+
84
+ Use the plugin only on a trusted LAN or trusted VPN. Never expose it directly to the public Internet. A paired device is a fully trusted DeepSeek Harness operator. Revoke lost devices from the computer. See [SECURITY.md](SECURITY.md).
85
+
86
+ ## Uninstall
87
+
88
+ ```powershell
89
+ dsh plugin --profile web remove dsh-mobile
90
+ ```
91
+
92
+ To remove local plugin data first:
93
+
94
+ ```powershell
95
+ dsh plugin --profile web exec dsh-mobile purge --yes
96
+ dsh plugin --profile web remove dsh-mobile
97
+ ```
98
+
99
+ Source users replace `dsh` with `pnpm dsh`.
100
+
101
+ ## Development
102
+
103
+ ```powershell
104
+ npm ci
105
+ npm run verify
106
+ ```
107
+
108
+ See the [Android guide](apps/mobile/README.md). Licensed under [Apache-2.0](LICENSE).
package/README.md CHANGED
@@ -1,49 +1,43 @@
1
1
  <p align="center">
2
- <img src="https://unpkg.com/dsh-mobile@latest/assets/brand/repository-hero.png" alt="A lively whale girl using a phone beside a desktop running DSH" width="100%">
2
+ <img src="assets/brand/repository-hero.png" alt="使用手机连接 DeepSeek Harness" width="100%">
3
3
  </p>
4
4
 
5
5
  <h1 align="center">DSH Mobile</h1>
6
6
 
7
- <p align="center">Private, authenticated LAN access to DeepSeek Harness.</p>
7
+ <p align="center">在手机上安全、实时地使用电脑中的 DeepSeek Harness。</p>
8
8
 
9
9
  <p align="center">
10
- <a href="https://www.npmjs.com/package/dsh-mobile"><img src="https://img.shields.io/npm/v/dsh-mobile?label=npm&amp;color=CB3837" alt="npm version"></a>
11
- <a href="https://www.npmjs.com/package/dsh-mobile"><img src="https://img.shields.io/npm/dm/dsh-mobile?color=2563EB" alt="npm downloads"></a>
12
- <img src="https://img.shields.io/badge/build-verified-059669" alt="Verified build">
13
- <a href="apps/mobile/README.md"><img src="https://img.shields.io/badge/platform-Android-3DDC84?logo=android&amp;logoColor=white" alt="Android"></a>
14
- <a href="#a-native-dsh-plugin"><img src="https://img.shields.io/badge/DSH-stock%20compatible-2563EB" alt="Compatible with stock DSH"></a>
15
- <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-0F172A" alt="Apache-2.0 license"></a>
10
+ <a href="https://www.npmjs.com/package/dsh-mobile"><img src="https://img.shields.io/npm/v/dsh-mobile?label=npm&amp;color=CB3837" alt="npm 版本"></a>
11
+ <a href="https://github.com/saya-ch/dsh-mobile/releases"><img src="https://img.shields.io/badge/下载-Android_App-3DDC84?logo=android&amp;logoColor=white" alt="下载 Android App"></a>
12
+ <img src="https://img.shields.io/badge/DSH-插件-2563EB" alt="DSH 插件">
13
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-0F172A" alt="Apache-2.0"></a>
16
14
  </p>
17
15
 
18
16
  <p align="center">
19
- <a href="README.zh.md">简体中文</a> ·
20
- <a href="#quick-start">Quick start</a> ·
21
- <a href="#customize-the-mobile-web-ui">Customize the UI</a> ·
22
- <a href="#uninstall">Uninstall</a>
17
+ <a href="#快速开始">快速开始</a> ·
18
+ <a href="#连接方式">连接方式</a> ·
19
+ <a href="#自定义移动布局与功能">自定义</a> ·
20
+ <a href="README.en.md">English</a>
23
21
  </p>
24
22
 
25
- > Public npm alpha. The source repository remains private during the current testing phase. Android is the only supported native app. This is a community project, not an official DeepSeek product.
23
+ > Alpha 版本,当前原生 App 仅支持 Android。本项目是社区插件,不是 DeepSeek 官方产品。
26
24
 
27
- DSH Mobile keeps the stock DSH Host, sessions, workspaces, and plugin capabilities, but provides its own lightweight mobile Web app. It does not reuse desktop page components or patch the desktop DOM. The desktop UI stays unchanged; Android and mobile browsers read the same live DSH data through the standalone mobile client.
25
+ <p align="center"><a href="https://github.com/saya-ch/dsh-mobile/releases"><strong>下载 Android App</strong></a></p>
28
26
 
29
- The mobile client is self-editable: ask DSH in an ordinary conversation to change `mobile.css` for presentation or `mobile.js` for behavior, keep the phone open, and watch the Android app or mobile browser apply the result automatically within about one second.
27
+ DSH Mobile 不复制 DeepSeek Harness 前端。它为原生 React/Cordis 页面增加移动布局,并通过受保护的局域网 HTTPS 网关让 Android App 或手机浏览器访问同一份工作区、会话、消息和运行状态。
30
28
 
31
- ## Features
29
+ ## 能做什么
32
30
 
33
- | Capability | Android app | Mobile browser |
34
- | --- | :---: | :---: |
35
- | Standalone mobile DSH Web UI | Yes | Yes |
36
- | Authenticated HTTPS LAN access | Yes | Yes |
37
- | One-time device pairing | Yes | Yes |
38
- | Extend mobile UI and Web functions through a DSH conversation with live preview | Yes | Yes |
39
- | Phone/computer image selection and downloads | Yes | Yes (the browser supplies the phone picker) |
40
- | iOS native app | Not yet | Safari can use the Web UI |
31
+ - 实时控制电脑上的 DeepSeek Harness,会话和消息与桌面端同步。
32
+ - 复用原生对话、Markdown、工具卡、模型、设置、批准和已安装 UI 插件。
33
+ - 手机侧边栏、单列设置、移动输入栏和工具详情层。
34
+ - 从手机或电脑选择图片;添加工作区时在手机上浏览电脑目录。
35
+ - 自动发现局域网中的 DSH,IP 变化后按稳定设备标识更新地址。
36
+ - 直接在 DeepSeek Harness 对话中修改移动布局和功能,手机约一秒内实时刷新。
41
37
 
42
- The mobile client owns its conversation column, Workspace drawer, composer, and computer directory browser. It subscribes directly to DSH's `sessions` and `workspaces` services, so desktop and phone use the same authoritative Workspace account. The image action asks for Phone files or Computer files: the first opens Android's or the browser's picker, while the second browses the computer inside the phone UI. Stock DSH currently models image attachments only, so this surface does not pretend that arbitrary files can be sent. Treat every paired device as a fully trusted operator of the computer, not as a guest account.
38
+ ## 快速开始
43
39
 
44
- ## Quick start
45
-
46
- Use the first block when `dsh` is available globally:
40
+ 已经安装 `dsh` 命令:
47
41
 
48
42
  ```powershell
49
43
  dsh plugin --profile web add dsh-mobile
@@ -51,162 +45,112 @@ dsh plugin --profile web exec dsh-mobile setup
51
45
  dsh --profile web
52
46
  ```
53
47
 
54
- If you cloned the DSH source, run the second block from its repository root:
48
+ 直接使用 DeepSeek Harness 源码:
55
49
 
56
50
  ```powershell
57
- corepack enable
58
- pnpm install
51
+ corepack enable; pnpm install
59
52
  pnpm dsh plugin --profile web add dsh-mobile
60
53
  pnpm dsh plugin --profile web exec dsh-mobile setup
61
54
  pnpm dsh --profile web
62
55
  ```
63
56
 
64
- Both paths install the public npm package into stock DSH without patching its source. Setup remembers the selected LAN interface, creates one local CA, stores plugin data under `$DSH_HOME/mobile-access/`, and on Windows requests administrator approval once for TCP/UDP rules limited to Windows' dynamic `LocalSubnet`. Use `--no-firewall` only when those rules are managed separately. While DSH is running, the plugin follows DHCP, Wi-Fi, and phone-hotspot address changes on that interface, rebinds the gateway, and signs a matching server certificate from the same CA. Paired devices and the Android app-private certificate pin remain valid.
65
-
66
- 1. Open the Mobile card in the lower-left corner of the desktop DSH UI.
67
- 2. Start access and select **Create pairing key**. The fingerprint-bound key is copied to the clipboard; the same card also shows a complete browser link.
68
- 3. Open the Android app, select **Scan**, then select the discovered DSH. Paste the key and connect.
69
- 4. Connect. The app fingerprint-pins this DSH inside its encrypted private storage; it does not install a CA into Android settings. Mobile browsers still require an HTTPS certificate they already trust.
70
-
71
- The key and browser link expire after two minutes and work once. After pairing, Android stores a revocable device credential encrypted by Android Keystore. Every later app launch silently renews a short Web session from that credential; no key is requested again unless the device is revoked, its trust expires, or app data is cleared. The app can rediscover the same DSH installation on the default port after its LAN address changes. Browser profiles still pair separately.
72
-
73
- ## Everyday control
74
-
75
- The Mobile card remains in DSH's lower-left corner. Stopping mobile access closes only the external HTTPS listener and active mobile sessions; the local DSH Web UI keeps running. Starting it again does not reinstall the plugin.
76
-
77
- The two access modes are equivalent:
57
+ 启动后:
78
58
 
79
- - Android app: a thin system WebView shell without browser address and tab bars.
80
- - Mobile browser: open the setup origin directly; no app installation is required.
59
+ 1. DeepSeek Harness 左下角打开“移动端”,确认移动访问已开启。
60
+ 2. 点击“生成配对密钥”。
61
+ 3. Android App 点击“扫描”,选择电脑并输入密钥。
62
+ 4. 配对完成后会建立持久设备信任,以后打开 App 无需重复输入。
81
63
 
82
- On a narrow screen, only the active conversation is shown. Use the top-left navigation button for the session and workspace drawer; choosing a session closes it. The image button in the composer offers two sources:
64
+ 插件不会修改 DeepSeek Harness 源码。设置、证书、设备和自定义文件保存在 `$DSH_HOME/mobile-access/`。
83
65
 
84
- - **Phone files** opens photos, camera, or device storage and uploads selected images into the current composer.
85
- - **Computer files** browses computer folders inside the phone UI and uploads the selected image without opening a desktop dialog.
66
+ ## 连接方式
86
67
 
87
- **Add workspace** always shows the computer directory browser on the phone, including folder creation and navigation. It does not browse phone storage because the workspace is owned by the DSH Host running on the computer.
68
+ | 方式 | 适合场景 | 说明 |
69
+ | --- | --- | --- |
70
+ | Android App | 日常使用 | 自动发现、无浏览器栏、App 内私有证书固定 |
71
+ | 手机浏览器 | 临时或跨平台访问 | 打开“移动端”卡片显示的 HTTPS 地址 |
88
72
 
89
- While Mobile Access is running, DSH publishes a small DNS-SD/mDNS service and a periodic UDP announcement. Each contains only the computer name, HTTPS origin, port, protocol version, and stable installation identifier. Android listens to both, also sends the original UDP query, and keeps HTTPS `/24` probing as a last compatibility fallback. Results are merged by installation identifier, so a new Wi-Fi or hotspot address updates the existing device instead of requiring another pairing. No pairing key, CA, device token, Cookie, or DSH data is discoverable. The first screen contains only Scan and the discovered DSH list; the pairing-key field appears after selecting one result.
73
+ Android 同时使用 mDNS/NSD、UDP 公告、主动 UDP 查询和 HTTPS 探测发现 DeepSeek Harness。发现只广播设备名、地址、端口、协议版本和稳定 `instanceId`,不会广播密钥或令牌。
90
74
 
91
- After the user selects a result and enters its fingerprint-bound pairing key, the app fetches the public CA from that selected HTTPS origin without sending the key or any credential. It keeps the CA only inside the app and accepts the DSH certificate only when its chain, hostname, validity, and SHA-256 fingerprint match the key and discovered installation identifier. Nothing is installed into Android's system trust settings. Mobile browsers cannot use this app-private trust and therefore still need an already trusted certificate.
75
+ App 配对后保存可撤销的设备凭据和私有证书信任;Wi-Fi、热点或 DHCP 导致 IP 变化时不需要重新配对。手机浏览器不能使用 App 的私有信任,因此需要浏览器本身信任该 HTTPS 证书。
92
76
 
93
- ## Customize the mobile Web UI
77
+ ## 移动端界面
94
78
 
95
- This is a same-origin Web extension surface, not a fixed theme editor. DSH can edit two files on the computer:
79
+ 手机端仍然渲染原生 DeepSeek Harness 页面。插件提供轻量的默认移动适配;你也可以通过“自定义移动布局与功能”自由调整页面结构并扩展交互:
96
80
 
97
- - `mobile.css` controls layout, visual hierarchy, safe areas, typography, and responsive behavior.
98
- - `mobile.js` mounts mobile-only DOM and behavior, can use browser capabilities, and can call the same-origin DSH Web API as the paired page.
81
+ - 左上角打开工作区与会话抽屉。
82
+ - 对话、轨迹、工具详情和 Session log 保持原有能力。
83
+ - 设置页使用顶部分类和单列内容。
84
+ - 输入栏保留命令、权限、模型、上下文、图片和发送控件。
85
+ - “添加工作区”在手机上展示电脑目录,不会在电脑上弹系统选择器。
99
86
 
100
- That is enough to build a one-handed command dock, a gesture command palette, a session dashboard, terminal shortcut keys, a floating context panel, voice input, a camera or QR workflow, or a completely different mobile navigation model. Camera, microphone, notifications, and similar capabilities still require browser or Android permission.
87
+ Android App 只是 Kotlin WebView 薄壳,不内置另一份网页。手机浏览器访问的也是同一页面。
101
88
 
102
- The easiest workflow stays entirely inside DSH. In a conversation with filesystem write access, try a broad request:
89
+ ## 自定义移动布局与功能
103
90
 
104
- ```text
105
- Turn DSH Mobile into a one-handed field console by editing
106
- $DSH_HOME/mobile-access/mobile.css and mobile.js.
107
-
108
- Add a bottom command dock, swipe shortcuts for switching conversations,
109
- a push-to-talk button when the browser supports speech input, and a collapsible
110
- session monitor. Keep every feature mobile-only. Register JavaScript through
111
- window.dshMobile.register(), return a cleanup function, and do not modify DSH source.
112
- ```
91
+ 自定义程度很高:你可以发挥创意,自由布置移动端的布局、交互和功能,而不必局限于默认样式。
113
92
 
114
- Keep the phone page open while DSH edits. The Android app and mobile browser check both authenticated files once per second and apply saved changes automatically—no DSH restart, new pairing, or manual page refresh. Invalid JavaScript does not replace the last successfully mounted extension.
115
-
116
- Setup creates:
93
+ 直接在 DeepSeek Harness 对话中提出修改即可。默认文件:
117
94
 
118
95
  ```text
119
96
  $DSH_HOME/mobile-access/mobile.css
120
97
  $DSH_HOME/mobile-access/mobile.js
121
98
  ```
122
99
 
123
- The files load only through the authenticated mobile gateway. They do not modify the DSH installation and survive DSH upgrades. Continue the same conversation with requests such as “turn the dock into a radial menu,” “add a full-screen monitoring view,” or “use the camera to prepare an attachment,” and inspect each revision directly on the phone.
124
-
125
- `mobile.js` uses a small lifecycle entry point:
126
-
127
- ```js
128
- window.dshMobile.register(({ root, document, request }) => {
129
- const workspace = document.createElement('section')
130
- workspace.ariaLabel = 'My mobile workspace'
131
- root.append(workspace)
132
-
133
- // Build any mobile Web UI and behavior inside workspace. Use request()
134
- // for same-origin DSH API calls with the paired Session and CSRF protection.
135
-
136
- return () => workspace.remove()
137
- })
138
- ```
139
-
140
- The supplied `root` isolates mobile-only DOM, while `request()` rejects cross-origin targets and carries the paired session plus the gateway's CSRF header. An extension may still use ordinary secure-context browser APIs directly when the device grants permission.
141
-
142
- Basic theme controls:
143
-
144
- ```css
145
- :root {
146
- --dsh-mobile-accent: #2563eb;
147
- --dsh-mobile-font-scale: 1.05;
148
- --dsh-mobile-radius: 16px;
149
- }
150
- ```
151
-
152
- Narrow-screen adjustments:
100
+ 例如对 DeepSeek Harness 说:
153
101
 
154
- ```css
155
- @media (max-width: 720px) {
156
- textarea { min-height: 88px; }
157
- button, [role='button'] { min-height: 48px; }
158
- }
102
+ ```text
103
+ 请编辑 $DSH_HOME/mobile-access/mobile.css mobile.js,
104
+ 把移动端改成适合单手操作的开发控制台:增加底部快捷指令、
105
+ 会话状态面板和长按语音入口。只影响窄屏,不修改 DSH 源码。
159
106
  ```
160
107
 
161
- Prefer stable Web APIs and DSH extension points over generated class names. Delete `mobile.css` to restore the visual defaults and replace `mobile.js` with an empty registered mount to remove custom behavior; the open phone page updates automatically.
108
+ 保存后,已打开的 App 和浏览器通常会在一秒内应用变化。自定义能力不限于配色:`mobile.js` 可以添加导航、快捷操作、状态面板、相机、语音、扫码,以及调用同源 DSH API 的完整交互。
162
109
 
163
- ## A native DSH plugin
164
-
165
- One standard bundle contributes two faces: the Host face owns the gateway and loopback control route; the Client face owns the responsive layer and desktop control card. The package injects only stock `webServer`, installs with `dsh plugin add`, and uninstalls with `dsh plugin remove`.
110
+ ## 工作原理
166
111
 
167
112
  ```mermaid
168
113
  flowchart LR
169
- Phone["Android app or mobile browser"] -->|"HTTPS and paired session"| Gateway["DSH Mobile plugin"]
170
- Gateway -->|"loopback-only proxy"| DSH["Stock DSH Host and Client Runtime"]
114
+ Phone["Android App / 手机浏览器"] -->|"HTTPS + 设备会话"| Gateway["DSH Mobile 网关"]
115
+ Gateway -->|"回环代理"| DSH["原生 DSH Web Host"]
116
+ DSH -->|"同一工作区、会话和事件流"| Phone
171
117
  ```
172
118
 
173
- ## Security model
119
+ 插件包含两部分:Host face 提供发现、配对、HTTPS 和回环代理;Client face 为原生 DeepSeek Harness 页面安装移动响应式适配。安装和卸载都通过 DeepSeek Harness 插件机制完成。
120
+
121
+ ## 安全
174
122
 
175
- - The gateway accepts only the selected private LAN CIDR, exact Host, and same-origin browser requests.
176
- - The Android app pins the pairing-key CA privately. Native requests use that trust anchor; WebView accepts only an otherwise-untrusted leaf signed by it for the exact host and validity period.
177
- - Pairing creates an HttpOnly session; devices and active sessions can be revoked from the computer.
178
- - Control and device-management routes are loopback-only.
179
- - Authentication happens before any request reaches the stock DSH loopback server. DSH itself is never rebound to `0.0.0.0`.
180
- - `mobile.js` runs as application code inside the paired DSH page. Only let trusted DSH conversations edit it, and review generated integrations before keeping them.
123
+ - 仅在可信家庭、办公局域网或可信 VPN 中使用,不要转发到公网。
124
+ - 配对设备拥有控制电脑端 DeepSeek Harness 的能力,应视为完全可信设备。
125
+ - 移动网关开启时才监听局域网;关闭后 DeepSeek Harness 仍正常在电脑本机运行。
126
+ - 丢失手机后应在电脑端撤销设备。
181
127
 
182
- Do not expose this gateway through public Wi-Fi, port forwarding, a public IP, or an untrusted VPN. See [SECURITY.md](SECURITY.md).
128
+ 完整说明见 [SECURITY.md](SECURITY.md)
183
129
 
184
- ## Uninstall
130
+ ## 卸载
185
131
 
186
- Normal removal preserves certificates, paired devices, and custom CSS:
132
+ 保留设备和自定义数据:
187
133
 
188
134
  ```powershell
189
135
  dsh plugin --profile web remove dsh-mobile
190
136
  ```
191
137
 
192
- To remove all local data, purge before removing the package:
138
+ 同时清除插件数据:
193
139
 
194
140
  ```powershell
195
141
  dsh plugin --profile web exec dsh-mobile purge --yes
196
142
  dsh plugin --profile web remove dsh-mobile
197
143
  ```
198
144
 
199
- ## Android app
200
-
201
- The supported native shell lives in [`apps/mobile/android`](apps/mobile/android). It does not bundle a frontend copy; it renders the standalone mobile page served live by the plugin, which is also available to mobile browsers. See the [Android guide](apps/mobile/README.md).
145
+ 源码模式把上述 `dsh` 换成 `pnpm dsh`。
202
146
 
203
- ## Development
147
+ ## 开发
204
148
 
205
149
  ```powershell
206
150
  npm ci
207
151
  npm run verify
208
152
  ```
209
153
 
210
- Release validation starts from the actual `npm pack` tarball and exercises install, setup, boot, pairing, and uninstall against an isolated stock DSH Web profile.
154
+ Android 构建见 [App 文档](apps/mobile/README.zh-CN.md)。
211
155
 
212
- Apache-2.0 licensed. See [LICENSE](LICENSE).
156
+ Apache-2.0,详见 [LICENSE](LICENSE)
Binary file
Binary file