dsh-web-search-ddg
aooyoo
Zero-token DuckDuckGo search provider for the DeepSeek Harness (DSH) web seam — local headless browser, no API key, no m…
Sal7one/DSH-Design-Studio
Inspired By Calude design, A Deepseek harness Design Plugin!, Select elements, Use Open Router Vision agents, upload images and much more!! You can make quick changes with deepseek or invoke the Vision model with a prompt directly!
PROJECT TOPICS
PROJECT README
A DeepSeek Harness plugin that turns design mockups into a first-class AI workflow.
Live previews, an element picker, a real design agent, vision review, screenshots,
identity presets — and a two-agent apply flow where DeepSeek edits and the design
agent verifies. Everything is backed by real files on disk under temp_design_folder/,
and everything is launch-persistent: install once, the Design Studio tab is there
on every launch.
Click any thumbnail for the full-size image.
dsh-design-studio/
├── package.json # dual-face manifest: dsh.bundle (host) + dsh.client (web UI)
├── cordis.patch.yml # the composition layer this bundle contributes
├── README.md # this file
├── LICENSE # MIT
├── repo-images/ # UI screenshots shown at the top of this README
├── lib/
│ ├── index.js # HOST half: design_studio tool, /design-studio route + JSON API,
│ │ # design-agent engine, freshness stamps, auto-verification
│ └── client.js # WEB UI half: conversation tab, element picker, agent chat, settings
├── examples/ # example design systems (html/css/js mockups + presets)
└── dynamic/ # legacy dynamic-plugin prototype (reference only — not needed)
dsh.bundle + dsh.client package:
dsh plugin add once, and the tool, the preview route, the prompt section and the
Design Studio tab are all present on every launch. No build step, no TypeScript,
zero runtime dependencies (plain JavaScript).design_studio agent tool — your assistant (and any subagent) can
list / all / create / read / write / zip / reveal / delete / sweep design systems,
manage identity presets, run vision reviews, chat with the design agent, read its
history, and configure the studio — all scoped to temp_design_folder/ design folders./design-studio/<slug>/html/index.html, served by the
harness web server; the studio tab embeds it in an iframe with hot reload on save.html/index.html,
css/style.css, css/token.css, js/app.js (minimal presentation) plus
design_prompts_forcoders.md (the brief the coding agent follows) and
assets/images/ for uploads. Mock data stays honest — empty/loading states,
never fabricated live numbers.assets/images/ and auto-select in the agent chat picker._zips/<slug>.zip (files only), open -R,
and shell-free recursive delete that works even on hosts with no POSIX shell.Click 🎯 Select, click any element in the live preview, describe the change:
| Button | What happens |
|---|---|
| 🤖 Ask DeepSeek (default) | Saves EDIT_REQUEST.md, injects the request into your main chat. DeepSeek edits the files itself and invokes the design agent only when it needs vision (the tool routes it explicitly). A live run banner tracks queued → working → finished in the tab, and the studio auto-runs a design-agent verification once the edits settle — guaranteed designer involvement, not a hope. |
| ◈ Make the design agent do it | The classic flow: the design agent applies the change itself and replies in its chat. |
| 💾 Save only | Just writes EDIT_REQUEST.md — apply later from either chat. |
{hash, at} (fresh random hash + ISO time,
latest-status only) — the plugin detects changes from any editor via the
harness fs/observed stream, plus synchronous bumps on its own write paths.screencapture on macOS) straight into the
design system's assets/images/.GOOD | POOR verdict + one-sentence notes from your
OpenRouter vision model against the brief (configurable models, effort, options).preset_apply
writes css/token.css and copies logo assets. Credentials are handled through the
harness credential seam (OPENROUTER_API_KEY) — the key is never rendered or returned.temp_design_folder/.Works with both harness distributions — the npm distribution
(npx @deepseek-ai/dsh web) and a source checkout (pnpm dsh web).
# 1. start the harness (if not running): npx @deepseek-ai/dsh web
# 2. install the plugin
dsh plugin --profile web add "github:sal7two/dsh-design-studio#main"
# 3. restart the harness so the new layers load
From a local checkout:
dsh plugin --profile web add -w /absolute/path/to/dsh-design-studio
-wis only needed when your profile directory is a pnpm workspace root (pnpm-workspace.yamlwithpackages: [., packages/*]), and the path must be absolute — a bare relative path is misread as a GitHubowner/reposhorthand. Remove with the package name:dsh plugin --profile web remove @sal7one/dsh-design-studio.
The bundle row is enabled by default. To keep it installed but off, override it in
your profile's own cordis.patch.yml (profile layers apply after bundle layers and win
per row):
- id: dsh-design-studio
disabled: true
Optional: in the tab → Settings → Design Studio, paste an OpenRouter API key to enable vision review and image description (stored via the credential seam; never shown again). Everything else works without it.
Install Node.js (v22 or newer) from nodejs.org.
Start the harness:
npx @deepseek-ai/dsh web
I personally skipped npx, used npm, and installed this globally.
A browser window opens at http://127.0.0.1:3080 — that's the harness Web UI.
Install this plugin:
dsh plugin --profile web add "github:sal7two/dsh-design-studio#main"
Restart the harness (Ctrl+C, start again). The Design Studio tab now appears in every conversation, plus Settings → Design Studio / All designs.
Design something. Create a design system, or just describe a screen to the
assistant — it routes briefs into the studio automatically. The live preview is
http://127.0.0.1:3080/design-studio/<name>/html/index.html.
Iterate with the design agent. Open the Design Studio tab → select your design → type a request in the agent chat ("make the status bar left-aligned", "use this image as the background"). It reads, edits and summarizes; the preview reloads.
Pick an element and let DeepSeek change it. 🎯 Select → click the element → type the change → 🤖 Ask DeepSeek. The request appears in your main chat, DeepSeek edits, the tab banner tracks progress, and the design agent auto-verifies the result.
Give DeepSeek a visual job. Drop a palette image on the tab (it lands in
assets/images/), then in the main chat:
In the tic-tac-toe design, read the color palette from
assets/images/palette.pngand apply it tocss/token.css. Use the design agent for the visual read.
DeepSeek routes the vision work to the design agent (design_studio → agent), the
image is auto-attached and vision-described, and the result flows back into DeepSeek's
tool result.
0.1.0-rc.5, or a source checkout of
the same generation) with the standard host services
(fs, subprocess, webServer, llm, credentials, attachments, systemPrompt, tools).temp_design_folder/ (a symlink is fine).OPENROUTER_API_KEY, or a harness openrouter provider route.This plugin was built and broken against a moving harness base. The traps:
shell is gone at host level. The old shell executor (resolve/run) now lives
in session presets. A host row that injects shell waits forever silently —
no boot error, no route, no tool. Inject subprocess and build shell semantics
yourself (see lib/index.js → sh()).apply() runs as soon as its
injections resolve, which can be before webServer/tools/llm exist. A one-time
ctx.get() taken too early returns undefined and silently skips the route/tool/
section registration. Put integration points in inject so apply waits.llm-pi-ai,
which natively declares openrouter (among others). Registering your own
openrouter configurable provider throws DUPLICATE_DIRECTORY and kills the whole
web boot. Check the target base's catalog before releasing a provider plugin.lib/. A harness checkout's .gitignore ignores lib/ — a plugin
committed inside one ships without its entry point. This repo lives at its own top
level and ships plain JS, so lib/index.js is committed.dynamic/ is in-memory by design.
The bundle is the restart-safe part. Don't promise users a persistent tab from a
dynamic package.sessions.scope(sessionId).get('conversation') — property access
(scoped.conversation) does not resolve the service. (This exact bug shipped
once; the fix is in lib/client.js → askDeepSeek.)gh repo create sal7two/dsh-design-studio --public --source . --push
gh repo edit sal7two/dsh-design-studio --add-topic dsh --add-topic dsh-plugin
Then PR one entry into awesome-deepseek-harness (alphabetical, one PR per change,
carry the #dsh-plugin topic for discovery).
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。