# dsh-ui-web

> DSH Web UI 全家桶聚合包，一键安装 task-board、aionui-panel、git-graph、pet、live-stats、usage-dashboard、ssh、web-ui-settings 及全部皮肤，并内置 DOM 兼容垫片与 crypto.randomUUID 兜底。

## Metadata

- Author: [@CAPTAIN1275](https://github.com/CAPTAIN1275)
- Repo: <https://github.com/CAPTAIN1275/dsh-ui-web.git>
- GitHub: [CAPTAIN1275/dsh-ui-web](https://github.com/CAPTAIN1275/dsh-ui-web)
- Stars: 34
- Language: TypeScript
- License: [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html)
- Topics: `dsh-plugin`, `dsh-plugin-market`, `dsh-plugins`
- Forks: 2
- Open Issues: 0
- Last push: 2026-08-16T18:08:27.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:CAPTAIN1275/dsh-ui-web/packages/dsh-web-ui-all
```

## Wiki

## One-Line Description

The aggregator package for the DSH Web UI suite: a single installation pulls in task-board, aionui-panel, git-graph, pet, live-stats, usage-dashboard, ssh, web-ui-settings, full-stats and all skins (including the skin center), and includes a compatibility shim that allows legacy DOM selectors to still match the dsh web shell. This package does not implement any business logic itself; all capabilities come from the aggregated sub-packages.

## Core Capabilities
- Aggregates 11 sub-packages into a single installation: `@captain1275/dsh-client-ui-aionui-panel` / `dsh-client-ui-task-board` / `dsh-client-ui-git-graph` / `dsh-pet` / `dsh-live-stats` / `dsh-usage-dashboard` / `dsh-ssh` / `dsh-client-ui-web-ui-settings` / `dsh-full-stats` / `dsh-skins` / `dsh-client-ui-skin-aurora`, eliminating the need to pick individually and install one by one (package.json:22-34).
- Compatibility shim (compat shim): When the current dsh web shell only renders css-module class names (e.g., `*_sidebarCol` / `*_centerCol` / `*_detailsCol`) without the legacy `data-pane` / `data-dsh-frame` attributes, this package's browser half uses selectors like `[class*="sidebarCol"]` to add attributes back to the three column containers and root container, ensuring sub-plugins and skins mounted via legacy selectors continue to work (src/client/index.ts:20-42).
- React re-render auto re-attribute: Uses MutationObserver to monitor DOM changes across the entire body; after React rebuilds the column containers, attributes are automatically added back; the shim only sets fixed attribute values, does not delete nodes or modify structure, and coordinates with React without interference (src/client/index.ts:75-83).
- Mobile `crypto.randomUUID` fallback: Some older WebViews and Chinese browsers don't have `crypto.randomUUID`, which triggers "crypto.randomUUID is not a function" causing crashes when loading official model directories, etc.; this package adds a UUID v4 polyfill early in page load (preferring `getRandomValues`, falling back to `Math.random` if missing), keeping subsequent flows from breaking (src/client/index.ts:45-64).
- Auto-aggregation script: `aggregate.yml` is a hand-written manifest (`patchFrom` collects sub-package insert lines, `deps` parses sub-package names to write to this package's dependencies, `self` loads the host/client halves of the aggregation package itself), `scripts/aggregate.mjs` regenerates `cordis.patch.yml` and `package.json#dependencies` based on this; CI uses `--check` mode to verify consistency (aggregate.yml:9-32, scripts/aggregate.mjs:1-317).

## Technical Implementation
- **Language**: TypeScript (ESM; host and browser halves layered compilation)
- **Key Dependencies**: `@deepseek-ai/cordis` (host half plugin runtime type); browser half has zero third-party dependencies; host half apply is an empty function (src/index.ts:11-14, src/client/index.ts:67-83, tsdown.config.ts:1-8)
- **Architecture Pattern**: cordis bundle aggregation package — `aggregate.yml` is the only hand-written manifest, `scripts/aggregate.mjs` generates `cordis.patch.yml` based on it (AUTO-GENERATED header forbids manual edits) and `package.json#dependencies`; host half has no business logic (empty apply), browser half is a DOM compatibility shim + crypto.randomUUID polyfill (src/index.ts:1-14, src/client/index.ts:17-83, cordis.patch.yml:1-3, aggregate.yml:1-32)
- **Entry Files**: `packages/dsh-web-ui-all/src/index.ts` (host entry, empty apply), `packages/dsh-web-ui-all/src/client/index.ts` (compat shim entry), `packages/dsh-web-ui-all/aggregate.yml` (aggregation manifest), `packages/dsh-web-ui-all/cordis.patch.yml` (auto-generated cordis patch), `scripts/aggregate.mjs` (aggregation generation script)

## Use Cases
Users who are new to DSH Web GUI and want a single command to get the full enhanced experience (task board, right file/preview panel, Git graph, mascot, real-time tokens, usage statistics, SSH operations, settings extension, all skins) but don't want to pick plugins one by one. Also serves as a fallback shim when official dsh web shell updates cause old plugins to stop working, ensuring sub-plugins can still mount via legacy selectors.

## Prerequisites & Compatibility
| Dependency | Minimum Version | Description |
|---|---|---|
| DSH | Not declared (this package) | This package's `package.json` has no `engines`; runtime is implicitly locked via `@deepseek-ai/dsh-*` SDK (sub-packages' `peerDependencies` lock `^0.1.0-rc.6`, e.g., packages/dsh-pet/package.json:55-68, packages/dsh-task-board/package.json:37-43) |
| Node | Not declared (this package) | This package's `package.json` has no `engines`; same-repo sub-packages packages/dsh-pet/package.json:6-8, packages/dsh-git-graph/package.json:6-8, packages/dsh-ssh/package.json:6-8 all declare `^22.19.0 || >=24.0.0` |
| Platform | Cross-platform | `package.json#dsh.client.platform` declares `web` (cordis.patch.yml registers under web profile), host dsh web runs cross-platform (package.json:12-20) |
| Native Modules | None | All go through cordis bundle + browser Web DOM API + Node standard library (`node:fs` / `node:http` / `node:path`), no native bindings like node-pty / `node:sqlite` |

## Installation
```bash
dsh plugin --profile web add github:CAPTAIN1275/dsh-ui-web/packages/dsh-web-ui-all
```

After installation, restart `dsh web` to see all sub-capabilities: skins, task board, pet, Git graph, usage dashboard, etc.

## Configuration
This plugin requires no additional configuration — the aggregation package itself has no independent configuration surface; all configuration goes through each sub-plugin's own settings (enable/disable each card in dsh web Settings → Web UI Plugins group, or edit each sub-plugin's JSON config file).

## FAQ

**Q: Is there anything else needed after installation for the plugin to take effect?**

A: Restart `dsh web`. If it's source code development mode, also run `pnpm install && pnpm -r build` in the repo, then `node scripts/link-profile.mjs` to link the local package into the profile, and finally restart `dsh web` to take effect.

**Q: What if I only want to install one or two sub-plugins?**

A: Simply install the corresponding independent sub-package directly (e.g., `dsh plugin --profile web add @captain1275/dsh-pet`), rather than going through this aggregation package. Installing this package will activate all sub-plugins at once; you cannot pick just a subset.

**Q: Will there be conflicts if installed alongside same-named independent plugin packages?**

A: Yes. Aggregation entry IDs (e.g., `task-board`, `pet`, `ssh`, `live-stats`) are exactly the same as independent sub-package IDs; the cordis loader will refuse duplicate registration; before switching, first `dsh plugin remove` to remove the old package, then install this aggregation package (or vice versa).

**Q: What custom logic is actually in this package's code?**

A: The host half has no business logic at all (`apply` is an empty function); the browser half only has a compat shim that adds legacy `data-pane` / `data-dsh-frame` attributes to the dsh web shell's sidebar/center/detail three column containers, allowing sub-plugins and skins mounted via legacy selectors to continue working; also provides a UUID v4 polyfill for missing `crypto.randomUUID` in older WebViews.

**Q: Will this package still work after the official dsh web shell upgrades?**

A: Yes. The compat shim uses MutationObserver to monitor DOM changes across the entire body; after React re-renders and rebuilds column containers, it automatically adds attributes back, and only writes fixed attribute values, does not delete nodes or break React reconciliation; it can be triggered repeatedly idempotently.

**Q: How to sync changes to sub-plugin's cordis.patch.yml to this package?**

A: Don't directly edit this package's `cordis.patch.yml` (file header clearly marks AUTO-GENERATED). After modifying `aggregate.yml`'s `patchFrom` / `deps` lists, run `node scripts/aggregate.mjs`; the script will re-aggregate sub-package insert lines and write to this package's patch; CI uses `node scripts/aggregate.mjs --check` to verify consistency.

**Q: After upgrading to a new version, the new version doesn't take effect. How to troubleshoot?**

A: After modifying the profile's `package.json` version number, run `pnpm install`; top-level `node_modules/@captain1275/*` entries may still link to the old store directory. Verify these links point to the new version, then restart `dsh web`.

## Difficulty
Beginner — one command to install, restart `dsh web` to take effect; this package has no independent configuration surface; all capabilities are provided by the aggregated sub-packages.

## Known Issues & Limitations
- Activating the full suite loads all sub-plugins at once; you cannot select a subset; for partial installation, use the corresponding independent sub-packages (README.md:73-89).
- Aggregation entry IDs are exactly the same as independent sub-package IDs (e.g., `task-board`, `pet`, `ssh`, `live-stats`); cannot be installed alongside corresponding independent packages; before switching, first `dsh plugin remove` to remove the old package (cordis.patch.yml:11-49, aggregate.yml:11-32).
- The `crypto.randomUUID` polyfall falls back to `Math.random` when the browser has neither `crypto.randomUUID` nor `crypto.getRandomValues`; the generated UUID does not have cryptographic strength; only serves as a fallback on older mobile WebViews and should not be used in security-sensitive scenarios (src/client/index.ts:54-56).
- The `cordis.patch.yml` file header clearly marks "AUTO-GENERATED by scripts/aggregate.mjs — do not edit"; manual edits will be overwritten by `node scripts/aggregate.mjs` (cordis.patch.yml:1-3).
- The `aggregate.yml` comments clearly state that skins (`packages/skins/<id>`) do not enter the `patchFrom` section; skin assets are separately bundled by `packages/dsh-skins/build.mjs` to `dsh-skins/skins/<id>`; skin enablement exclusivity goes through `dsh-skin use`; this package does not take over (aggregate.yml:1-8).
- This package's `cordis.patch.yml` comment order deliberately places `ui-web-ui-settings` after self and before other plugins, making the settings group's `web-ui.plugin.item` sub-slot declare first, avoiding perceived registration order ambiguity (aggregate.yml:5-8, cordis.patch.yml:5-14).
- Strict (isolated) profile layout requires hoisting in profile (`nodeLinker: hoisted` or `public-hoist-pattern`), otherwise the aggregation package's `workspace:*` dependency resolution fails (docs/plugins.md:39-58).

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dsh-ui-web](https://deepseek-plugin.org/plugins/CAPTAIN1275/dsh-ui-web/packages/dsh-web-ui-all)
Wiki generated by AI (model: `MiniMax-M2.5`)
