@yejiming/dsh-data-agent 0.0.5 → 0.0.9

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 CHANGED
@@ -1,196 +1,195 @@
1
- # Data Agent · Let AI Connect Your Database and Write SQL
1
+ # DSH Data Agent · Analyze Data Through Conversation
2
2
 
3
3
  [中文](README.md) | **English**
4
4
 
5
- ![Data Agent session](assets/session.png)
5
+ <p align="center">
6
+ <img src="assets/dsh-data-agent-banner.png" alt="dsh-data-agent hero banner" width="100%">
7
+ </p>
8
+ <p align="center">
9
+ <img src="https://img.shields.io/github/v/release/omdsh-dev/dsh-data-agent?style=flat-square" alt="Version">
10
+ &nbsp;
11
+ <img src="https://img.shields.io/github/stars/omdsh-dev/dsh-data-agent?style=flat-square" alt="Stars">
12
+ &nbsp;
13
+ <img src="https://img.shields.io/npm/v/@yejiming%2Fdsh-data-agent?style=flat-square&label=npm" alt="npm">
14
+ &nbsp;
15
+ <img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="License">
16
+ </p>
17
+ <p align="center">
18
+ <strong>Connect DeepSeek Harness to databases and turn conversations into data analysis and business insights</strong><br>
19
+ <em>Natural-language queries · Automatic SQL execution · Iterative analysis · Web UI · dsh-tui · Read-only protection</em>
20
+ </p>
6
21
 
7
- This plugin is a Data Agent built on DeepSeek Harness, letting DeepSeek focus on database operations.
22
+ <p align="center">
8
23
 
9
- Leveraging the agent-preset capability of DeepSeek Harness, it adds a Data Agent preset. The preset keeps only the three DSH built-in tools — read, edit, write — and adds custom sql-query / sql-write / sqlcmd database tools in place of the bash tool, free from irrelevant tools and prompts.
24
+ [Project Overview](#project-overview) · [Features](#features) · [Quick Install](#quick-install) · [Web UI](#using-data-agent-in-the-web-ui) · [dsh-tui](#using-data-agent-in-dsh-tui) · [Security](#security)
10
25
 
11
- With this preset, you can configure a database connection right in the conversation UI, grant the AI access to the database, and complete CRUD operations.
26
+ </p>
27
+
28
+ ## Project Overview
29
+
30
+ dsh-data-agent is a data analysis plugin for DeepSeek Harness (DSH). Connect a database and ask a business question; DSH inspects schemas, writes and runs SQL, continues the analysis from real results, and returns clear conclusions and business insights. The plugin supports both the Web UI and dsh-tui without modifying the DSH source code.
12
31
 
13
32
  ## Features
14
33
 
15
- - **Database connection management**: per-session connections to MySQL / PostgreSQL / SQLite / Oracle / Hive / Impala (SQLite uses a file path, Oracle a service name/SID, Hive/Impala a default database). Connection state lives in server memory and survives layout switches; passwords stay in memory and travel to the client via environment variables or stdin connect prefixes — never written to disk on the server.
34
+ - **Analyze data through conversation**: Describe your goal in natural language. DSH understands the question, breaks it into analysis steps, queries real data, and organizes the conclusions. You can keep asking follow-up questions to explore the same context in greater depth.
35
+ - **Discover business insights automatically**: Data Agent goes beyond returning query results. It helps compare trends, locate anomalies, identify valuable customers or products, and turn the data into explanations that support decisions.
36
+ - **Web analysis reports (render-analysis)**: In the Web UI the agent can choose, within an ordinary tool call, to produce a single chart or a Dashboard-style report (metric/line/bar/pie/scatter/table views) with an inline preview and a “View analysis” Modal. Whether to chart is the agent's decision — schema exploration, single scalars, and queries without visual value are never forced into charts.
37
+ - **Works with both Web UI and dsh-tui**: For a visual workflow, we recommend [zhu1090093659/dsh-web-ui](https://github.com/zhu1090093659/dsh-web-ui), where you can connect databases, browse schemas, and inspect results in the browser. For a keyboard-first workflow, we recommend [ccch1mneyyy/dsh-TUI](https://github.com/ccch1mneyyy/dsh-TUI), where you can use the same Data Mode, connect through `/database`, and move directly into conversational analysis. Both interfaces provide the core Data Agent experience.
38
+ - **Connect common business databases**: Supports MySQL, PostgreSQL, SQLite, Oracle, Hive, and Impala across application databases, analytics systems, local data files, and data warehouses.
39
+ - **Let DSH complete the analysis loop**: DSH inspects table structures, writes SQL, runs the query, and adjusts its approach based on errors or returned data instead of stopping at an unverified SQL draft.
40
+ - **Stay focused with Data Mode**: The session uses DSH's native `str_replace_editor` for files and keeps `sql-query`, `sql-write`, and `sql-cmd`; Web additionally provides `render-analysis`. Host or community tools such as `describe_image` and `ssh_*` do not leak into Data Mode.
41
+ - **Work safely with real data**: Use read-only mode and a read-only database account when appropriate. TUI passwords are masked and are never restored as part of a form draft. You decide whether the session may modify data.
16
42
 
17
- ![Database connection](assets/connection.png)
43
+ ![Database connection](assets/connection.png)
18
44
 
19
- - **Database workbench** (embedded above the session's input bar): connection config card (collapses into a summary row after connecting, expandable for review); schema explorer (a "Tables" button opens a Modal — single-click a database to expand its scrollable table list, click a table to inspect its columns); SQL command box (write and run SQL on the non-agent channel, monospace output). The connection config is persisted to browser localStorage — switching pages or restarting restores the form and auto-reconnects. Once the conversation starts, the workbench becomes the left column and the chat records + input bar sit on the right.
20
- - **Database tools**: `sql-query` runs read-only SQL and returns structured `{ columns, rows, affectedRows, elapsedMs }`; `sql-write` runs one write/management SQL per call with explicit autocommit semantics; `sqlcmd` keeps the original raw terminal output. All three run through the database clients (mysql / psql / sqlite3 / sqlplus / beeline / impala-shell); no shell layer (argv arrays + SQL via stdin), timeouts terminate the process tree, output is bounded and truncated, and one call carries at most one SQL statement.
21
- - **Data Agent preset**: choose "Data Agent" when creating a session — the tool surface is `sql-query`/`sql-write`/`sqlcmd`/`read`/`write`/`edit`, and every other project tool (bash, grep, skill, todo, goal, web, subagent, …) is simply absent, i.e. disabled; non-Data-Agent sessions render no workbench at all.
45
+ The Web UI also includes an embedded database workbench for browsing schemas, inspecting columns, and running an occasional SQL statement. Once the conversation starts, the workbench moves to the sidebar so it does not interrupt the analysis.
22
46
 
23
- ![Data Agent preset](assets/settings.png)
47
+ ![Database workbench](assets/tables.png)
24
48
 
25
- - **Standard agent loop**: a data-agent session is an ordinary DSH session standard turn/step, streaming, tool scheduling, and persistence, with zero host changes.
49
+ Choose “Data Mode” when creating a session, and DSH will use the data-analysis workflow for everything that follows.
50
+
51
+ ![Data Mode preset](assets/settings.png)
26
52
 
27
53
  ## Quick Install
28
54
 
29
- Two install methods, neither requires a local build (the prebuilt output in
30
- `lib/` is committed, and no `prepare`/`prepack` scripts are declared).
55
+ The Web UI and dsh-tui use separate DSH profiles. Install only the profile for the interface you use, or run both commands if you use both interfaces.
31
56
 
32
57
  ### Method 1: npm (recommended)
33
58
 
34
59
  ```sh
35
- # Install from npm (initializes the profile on first use)
36
60
  dsh plugin --profile web add @yejiming/dsh-data-agent
61
+ dsh plugin --profile dsh-tui add @yejiming/dsh-data-agent
37
62
  ```
38
63
 
39
- ### Method 2: GitHub source
64
+ ### Method 2: GitHub
40
65
 
41
66
  ```sh
42
- # Install from the GitHub source (lib/ is committed, no build at install time)
43
67
  dsh plugin --profile web add github:omdsh-dev/dsh-data-agent
68
+ dsh plugin --profile dsh-tui add github:omdsh-dev/dsh-data-agent
44
69
  ```
45
70
 
46
- Verify the install:
71
+ The plugin installs the Data Mode preset automatically. No local build is required.
47
72
 
48
- ```sh
49
- dsh --profile web --dump-config # the data-agent layer should appear
50
- ls $DSH_HOME/.agent-presets/data-agent/ # agent.cordis.yml + preset.yml (auto-installed)
51
- ```
73
+ ## Using Data Agent in the Web UI
52
74
 
53
- Start the Web GUI:
75
+ Start the Web UI:
54
76
 
55
77
  ```sh
56
78
  dsh --profile web
57
79
  ```
58
80
 
59
- In the Web GUI: create a session → choose the "Data Agent" preset → the database workbench appears above the input bar → fill in the connection info (type/host/port/user/password/database; SQLite uses a file path) → after connecting, browse schemas (single-click a database to expand tables, click a table for its structure) or run SQL directly in the command box → once the conversation starts the workbench moves to the left; in Chat ask the AI to "list all tables and count rows" or "write a SQL query for orders in the last 30 days, save it to orders.sql and run it".
81
+ Then:
82
+
83
+ 1. Create a session and choose “Data Mode.”
84
+ 2. Enter your connection details in the database workbench.
85
+ 3. Once connected, ask an analysis question directly in the conversation.
86
+ 4. Follow up on the first result and ask DSH to narrow the scope, compare dimensions, or summarize the conclusions.
87
+
88
+ For example, ask: “Analyze order changes over the last 30 days, identify the regions and products with the largest revenue decline, and explain the main causes.” DSH will inspect the relevant tables, generate and run the queries, and complete the analysis from real results.
60
89
 
61
- > Database client binaries: sqlite3 usually ships with macOS/Linux; mysql / psql / sqlplus / beeline / impala-shell must be provided by the deployment and can be overridden per type via the `clients` config (missing clients are named in the connect error).
90
+ ### Web analysis reports
91
+
92
+ In the Web UI, Data Mode also provides the render-analysis tool: the agent first explores and verifies facts with sql-query, then decides for itself whether a visualization helps. When it does, one tool call produces one versioned analysis report:
93
+
94
+ - A report holds 1-6 read-only datasets and 1-8 views (metric, line, bar, pie, scatter, table); multiple views may reuse one dataset, and aggregation or Top N is written in the SQL itself;
95
+ - Simple questions produce a single main chart (inline preview in the result row); complex questions produce a compact summary plus a “View analysis” button;
96
+ - “View analysis” opens a large Modal with every view of that report: a compact metric band, a full-width main chart, a two-column secondary grid, and a detail table — responsive across light/dark themes and narrow screens;
97
+ - The complete report snapshot is persisted with the session log: refreshing or replaying history never re-queries the database and creates no extra browser storage;
98
+ - The tool is Web-only: the dsh-tui tool surface is unchanged and loads no chart or browser dependencies.
99
+
100
+ ## Using Data Agent in dsh-tui
101
+
102
+ Start the terminal interface:
103
+
104
+ ```sh
105
+ dsh --profile dsh-tui
106
+ ```
62
107
 
63
- ## Architecture
108
+ In a blank session, switch to Data Mode and connect a database:
64
109
 
65
110
  ```text
66
- Browser (apps/web) Host process (dsh --profile web)
67
- ┌─────────────────────────────┐ ┌──────────────────────────────────────┐
68
- │ Database workbench (input.dock) │ fetch │ @yejiming/dsh-data-agent (host row)│
69
- │ · connection config (6 types) │ ─────▶ │ · /plugins/data-agent/* routes │
70
- │ · schema explorer + SQL box │ │ · dataAgentConnections store │
71
- │ · hero stacked / active rail │ │ · preset self-install → $DSH_HOME/ │
72
- └─────────────────────────────┘ └──────────────┬───────────────────────┘
73
- │ same process
74
- data-agent session (full agent loop reuse) ▼
75
- ┌──────────────────────────────────────────────────────────────────────────┐
76
- │ agent.cordis.yml (preset layer, only 3 rows) │
77
- │ · persona → data-engineer system prompt │
78
- │ · dsh-tool-fs → read / write / edit (project built-ins) │
79
- │ · dsh-data-agent/tool → sql-query / sql-write / sqlcmd (tool half) │
80
- └──────────────────────────────────────────────────────────────────────────┘
111
+ /preset data-agent
112
+ /database connect
81
113
  ```
82
114
 
83
- One npm package, three loadable faces, two host rows:
84
-
85
- | Face | Entry | Loaded by |
86
- |---|---|---|
87
- | Server half (connection store / preset self-install) | `lib/index.js` (host row `data-agent`) | Host composition: provides `dataAgentConnections`, seeds connections, self-installs the preset; works headless too |
88
- | Server half (HTTP routes) | `lib/routes.js` (host row `data-agent-routes`, exports subpath `./routes`) | Host composition: registers routes via a nested inject only where a webserver exists (skipped automatically headless) |
89
- | Tool half | `lib/tool.js` (exports subpath `./tool`) | Only mounted by the data-agent preset (`tool-sqlcmd` row) |
90
- | Browser half | `lib/client.js` (`dsh.client` declaration) | Browser: the database workbench in the input dock (`conversation.input.dock`) |
91
-
92
- The tool half only consumes host services (`tools`, `subprocess`, `dataAgentConnections`) and provides none, so the preset guard needs no `isolate` realm.
93
-
94
- ## Configuration
95
-
96
- Every field has a loader default; there are no library-level defaults. Host row `data-agent`:
97
-
98
- | Key | Meaning |
99
- |---|---|
100
- | `presetId` | Preset directory name installed under `$DSH_HOME/.agent-presets/` (default `data-agent`) |
101
- | `installPreset` | Whether to self-install the preset on startup (default true; existing directories are skipped, keeping user edits) |
102
- | `connectTimeoutMs` | End-to-end deadline for one /connect connectivity check (default 10000 ms) |
103
- | `introspectMaxTables` | Cap on the table list returned by /connect and /status (default 500) |
104
- | `queryTimeoutMs` | Deadline for one database-tool query (default 30000 ms) |
105
- | `maxResultChars` | In-memory cap on captured database-tool output, per stream (default 20000 chars) |
106
- | `clients` | Per-type CLI client overrides: `{ command?, args? }` for keys `mysql` / `postgres` / `sqlite` / `oracle` / `hive` / `impala` (built-in defaults mysql/psql/sqlite3/sqlplus/beeline/impala-shell) |
107
- | `connections` | Config-seeded connections keyed by session id (`'*'` = wildcard default for any session without its own; headless/keyless runs and deployments pinning one database). **No password field** — passwords only enter memory via the /connect route |
108
-
109
- The `tool-sqlcmd` row (inside the data-agent preset) additionally has `maxRows` (default 100, enforced: an unbounded SELECT gets a top-level LIMIT and structured parsing truncates as a second guard); `queryTimeoutMs` / `maxResultChars` / `clients` share the host row's names and defaults.
110
-
111
- The `data-agent-routes` row has its own config: `connectTimeoutMs` / `introspectMaxTables` / `maxResultChars` mirror the main row; plus `queryTimeoutMs` (for /query and metadata queries, default 30000) and `maxQueryChars` (single-SQL length cap for /query, default 65536).
112
-
113
- ```yaml
114
- # Example override in cordis.patch.yml or a profile layer
115
- - id: data-agent
116
- name: '@yejiming/dsh-data-agent'
117
- config:
118
- clients:
119
- mysql:
120
- command: /usr/local/bin/mysql-client
121
- # Wildcard default connection: sessions without an explicit /connect fall back
122
- # to this database (password-free scenario only)
123
- connections:
124
- '*':
125
- type: sqlite
126
- database: /tmp/analytics.db
115
+ The connection form displays all relevant fields together. Use Tab or Shift+Tab to move between fields. Press Enter on database type or read-only mode to show every option, use the arrow keys to select one, and press Enter again to confirm.
116
+
117
+ After connecting, return to the chat input and ask a business question. Other useful database commands include:
118
+
119
+ ```text
120
+ /database status Show the current connection
121
+ /database test Test the current connection
122
+ /database disconnect Disconnect the current database
127
123
  ```
128
124
 
129
- ## Headless / One-shot Runs
125
+ When you reopen the connection form in the same session, it restores the latest database type, host, port, user, database, and read-only mode. The password always remains masked and is never restored.
130
126
 
131
- **Important**: `dsh run` (the headless bundle) does not mount the agent-presets roster and never mounts presets for sessions — preset mounting belongs to the web surface (the api-proxy mounts on session creation). Therefore **headless sessions cannot use the sql-query/sql-write/sqlcmd/read/write/edit tool surface**; the database tools are verified and used on the web surface. Headless database work is limited to the host base's own tools (e.g. calling clients via bash).
127
+ ![Data analysis in dsh-tui](assets/tui.png)
132
128
 
133
- (Note: inserting the roster row plus disabling the base tool rows cannot reproduce the preset tool surface headless — the agent ends up with an empty, zero-tool composition. For a headless smoke test, verify "seeded connections + host tools work" only.)
129
+ ## How to Ask Better Analysis Questions
134
130
 
135
- The `data-agent-routes` row is skipped automatically in profiles without a webserver (nested inject), so nothing needs special handling.
131
+ For more valuable results, include the business goal, time range, and dimensions you care about. For example:
136
132
 
137
- ## HTTP API
133
+ ```text
134
+ Analyze revenue and gross-margin changes by region in Q2 2026.
135
+ Find the regions with unusual performance, drill down into categories and key customers,
136
+ and recommend three concrete business actions.
137
+ ```
138
138
 
139
- Prefix `/plugins/data-agent` (same-origin calls from the browser half):
139
+ You can also ask DSH to save the SQL or analysis so it can be reviewed and reused:
140
140
 
141
- | Method/Path | Meaning |
142
- |---|---|
143
- | `POST /connect` | body `{ sessionId, type, host?, port?, user?, database, password? }`; validate connectivity check (list tables) → save only on success, returns `{ ok, tables }`, failure returns `{ ok: false, error }` without saving |
144
- | `POST /disconnect` | body `{ sessionId }`; drop the session's connection |
145
- | `GET /status?sessionId=` | `{ connected, summary? }`; summary is the password-stripped connection plus the table list |
146
- | `GET /schemas?sessionId=` | `{ ok, schemas: string[] }`; database list (sqlite returns `['main']`) |
147
- | `GET /tables?sessionId=&schema=` | `{ ok, tables: string[] }`; tables of one schema (sqlite ignores the schema param) |
148
- | `GET /describe?sessionId=&schema=&table=` | `{ ok, columns: [{ name, type, nullable? }] }`; table structure (sqlite ignores schema) |
149
- | `POST /query` | body `{ sessionId, sql }`; runs one SQL statement (the workbench command box, non-agent channel), returns `{ ok, result: { exitCode, stdout, stderr, truncated } }`; `sql` length capped by `maxQueryChars`; multiple statements are rejected; readonly rejects writes |
141
+ ```text
142
+ Complete a member repeat-purchase analysis, save the final SQL to
143
+ analysis/repurchase.sql, and summarize the main findings in a format suitable for a weekly report.
144
+ ```
145
+
146
+ ## Before You Start
147
+
148
+ DSH must be able to reach the target database from your machine, and the corresponding database client must be installed:
150
149
 
151
- Schema/table identifiers allow only `[A-Za-z0-9_$]` (server-side whitelist and per-type quoting; injection-shaped input is rejected).
150
+ - SQLite is usually included with macOS or Linux.
151
+ - MySQL requires the `mysql` client.
152
+ - PostgreSQL requires the `psql` client.
153
+ - Oracle, Hive, and Impala require their respective command-line clients.
152
154
 
153
- ## Security Notes
155
+ We recommend creating a read-only database account so Data Agent can explore and analyze data without modifying production records.
154
156
 
155
- - **Passwords**: server-side, memory only; transport per type — mysql via `MYSQL_PWD`, postgres via `PGPASSWORD` environment variables; oracle via the sqlplus `connect user/pass@...` stdin prefix, hive via the beeline `!connect` stdin prefix (never argv); impala sends no password by default (LDAP/kerberos configured through `clients`). `/status` and the public connection-store reads strip passwords.
156
- - **Connection-config persistence**: the workbench saves the connection config (type/host/port/user/database) to browser localStorage (key `dsh-data-agent.connection.v1`) to restore the form and auto-reconnect once on page switches/restarts. **Passwords are not persisted by default**; they are stored only when "remember password" is explicitly checked (plain-text localStorage, opt-in). To clear: run `localStorage.removeItem('dsh-data-agent.connection.v1')` in the browser console.
157
- - **No shell layer**: `ctx.subprocess.spawn` uses argv arrays, SQL and connect prefixes travel via stdin — no shell concatenation injection surface; metadata route identifiers pass the whitelist.
158
- - **SQL execution authority**: with the approval policy set to `never`, `sql-write`/`sqlcmd` and `/query` execute DDL/DML directly — connections are session-isolated; assess the data-plane risk yourself. `readonly: true` rejects write statements; each database-tool call is an independent client process with autocommit, so transactions do not span calls.
159
- - **Timeouts & caps**: query timeouts, output truncation, table-list caps, and the /query SQL length are all config items — no hard-coded tunables.
157
+ If you see `failed to mount` or a missing `@yejiming/dsh-data-agent` package error, the plugin is usually not installed in the current profile. Make sure you ran the matching install command for the Web UI or dsh-tui, then restart DSH.
160
158
 
161
- ## Uninstall & Rollback
159
+ ## Security
160
+
161
+ - Prefer a read-only database account and enable read-only mode in the connection form.
162
+ - Temporary passwords entered in the Web UI or dsh-tui are used only for the current connection. The TUI displays only `*` and never restores the password when the form is reopened.
163
+ - If authentication must be restored across processes, use a DSH credential reference instead of putting a plaintext password in command arguments.
164
+ - When read-only mode is disabled, Data Agent can run update or administrative statements at your request. Before connecting to a production database, review the account permissions and backup policy.
165
+ - Database connections are isolated by session, making it easier to keep different projects, customers, and analysis environments separate.
166
+
167
+ ## Uninstall and Rollback
162
168
 
163
169
  ```sh
164
- dsh plugin --profile web remove @yejiming/dsh-data-agent # removes the dependency and its layer
165
- rm -rf $DSH_HOME/.agent-presets/data-agent # manually delete the self-installed preset
170
+ dsh plugin --profile web remove @yejiming/dsh-data-agent
171
+ dsh plugin --profile dsh-tui remove @yejiming/dsh-data-agent
172
+ rm -rf $DSH_HOME/.agent-presets/data-agent
166
173
  ```
167
174
 
168
- Connections are in-memory; there is no persisted data to clean up.
169
-
170
- ## Development
175
+ Uninstalling the plugin does not automatically delete saved non-secret connection information. If you need to remove it completely, back it up first and then delete the corresponding Data Agent storage records in DSH.
171
176
 
172
- Build and test:
177
+ ## Local Development
173
178
 
174
179
  ```sh
175
- pnpm build # cleans and rebuilds lib/ (tsdown: lib/index.js, lib/routes.js, lib/tool.js, lib/invariant.js, lib/client.js) + tsc declarations
176
- pnpm test # vitest: connection store / CLI templates / sqlcmd execution (mocked subprocess)
180
+ pnpm install
181
+ pnpm build
182
+ pnpm test
177
183
  ```
178
184
 
179
- `lib/` is committed, so installing and debugging (including `dsh plugin add .`)
180
- never requires a build. To rebuild the artifacts, just run `pnpm install`: all
181
- `@deepseek-ai/*` dependencies are published on npm, so there is no need to copy
182
- or symlink `node_modules` from a local DSH checkout anymore.
183
- `pnpm-workspace.yaml` follows the dsh convention (`nodeLinker: hoisted`); pnpm
184
- 11's supply-chain policy blocks freshly published packages and dependency build
185
- scripts, so the repository pre-declares `minimumReleaseAgeExclude` (the rc.6
186
- family) and `allowBuilds: esbuild`.
185
+ The prebuilt `lib/` directory is committed to the repository, so npm and GitHub installations do not require a local build.
187
186
 
188
187
  ## License
189
188
 
190
189
  MIT
191
190
 
192
- ## Friends
191
+ ## Related Links
193
192
 
194
- - [dshfind.com](https://dshfind.com): Chinese learning & sharing community for DeepSeek Harness — read the papers, write plugins, see the whole ecosystem.
195
- - [dsh-web-ui](https://github.com/dsh-external/dsh-web-ui): Plugins & skins collection for the DeepSeek Harness (DSH) Web UI
196
- - [dsh-cc-tui](https://github.com/dsh-external/dsh-cc-tui): Claude Code style fullscreen interactive terminal plugin
193
+ - [dshfind.com](https://dshfind.com): A Chinese learning and sharing community for DeepSeek Harness
194
+ - [dsh-web-ui](https://github.com/dsh-external/dsh-web-ui): A collection of plugins and skins for the DeepSeek Harness Web UI
195
+ - [dsh-cc-tui](https://github.com/dsh-external/dsh-cc-tui): A Claude Code-style full-screen terminal interface