Sno Station
Sno Station is your agents' workstation: open-source software that turns the AI agents you already run into one squad on your own machine. Two heads are better than one, and they get better with every
Find electronic parts and generate symbols, footprints and schematics with EDA plugins
AI summary · README
PluginsTypeScript · JavaScriptGitHub @Huaqiu-ElectronicsSelf-installOwner unconfirmed
Paste into Claude or ChatGPT for installation instructions suited to your environment.
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Installable projects can be verified without a deployment domain. Use GitHub sign-in for a personal repository, or the repository verification file above for an organization repository.
Ask about other verification options
Loading the full README. The saved excerpt is shown below.
Huaqiu PCB EDA for DeepSeek Harness (DSH) Brings Huaqiu electronic-design capabilities into DeepSeek Harness (DSH) as standalone, published DSH plugins: Huaqiu part search, symbol/footprint generation, and schematic / system-design generation — with an eda.cn account login flow and a local preview-artifact store. The codebase is migrated out of the HQ Edge monorepo into self-contained DSH plugins, each able to stand on its own and be published to npm. Every package is a DSH plugin composed into a profile's layer stack [README 설치·사용 부분 발췌] Install the pluginsRead the full README ↗
Brings Huaqiu electronic-design capabilities into DeepSeek Harness (DSH) as standalone, published DSH plugins: Huaqiu part search, symbol/footprint generation, and schematic / system-design generation — with an eda.cn account login flow and a local preview-artifact store.
The codebase is migrated out of the HQ Edge monorepo into self-contained DSH plugins, each able to stand on its own and be published to npm.
| Package | Shape | What it does | Status |
|---|---|---|---|
@huaqiu/dsh-auth | dual-face | eda.cn login HIT (embedded auth.eda.cn iframe) + sidebar login; node huaqiuAuth credential cache | Phase 0A — working |
@huaqiu/dsh-artifacts | node + routes | filesystem artifact store + HTTP preview routes; huaqiuArtifacts service | Phase 0B — working |
@huaqiu/dsh-ui-theme-huaqiu | browser Bundle | HuaQiu red palette, HQ marks, sidebar name, and blank-session slogan | working |
@huaqiu/dsh-tool-part-search | node only | 4 part-search tools wrapping the published @huaqiu/part-search library | Phase 1 — published v0.1.0 |
@huaqiu/dsh-tool-symbol-footprint | dual-face | symbol / footprint generation over wss://www.eda.cn/componentV2/chat + dimension-confirmation HIT card | working |
@huaqiu/dsh-tool-schematic-gen | dual-face | schematic + system-design generation via gen.eda.cn CopilotKit SSE + zip export + ECAD preview card | working |
@huaqiu/dsh-kicad | node + skills | 10 KiCad PCB tools over the official KiCad IPC API, bundled with the kicad-ipc and hardware-design-brief skills | working |
Every package is a DSH plugin composed into a profile's layer stack by its
cordis.patch.yml (dsh.bundle.patch in package.json):
# e.g. packages/dsh-tool-schematic-gen/cordis.patch.yml
- insert:
- id: huaqiu-tool-schematic-gen
name: '@huaqiu/dsh-tool-schematic-gen'
inject: ['tools'] # node services this half depends on
Two plugin shapes:
Node-only (inject: ['tools'], no dsh.client) — part search. Returns JSON,
never renders UI, so there is no browser bundle.
Dual-face (inject: ['tools', ...] + dsh.client.inject: ['@deepseek-ai/dsh-client-runtime']) —
auth, symbol/footprint, schematic-gen. A cordis node half registers tools/services/routes,
and a browser half registers React tool.call.toolview cards for human-in-the-loop steps.
Node + bundled skills (inject: ['skills', 'tools']) — dsh-kicad. Registers tools
and every skill under the package's skills/ in the same apply(), so installing the
plugin makes the skills available with no second installation step. The skills/ directory
ships in files[] and is located at runtime relative to the loaded module:
const root = join(dirname(fileURLToPath(import.meta.url)), '..', 'skills')
const skillDir = join(root, 'kicad-ipc') // one directory per skill id
ctx.skills.register({
name: 'kicad-ipc',
description, // from SKILL.md frontmatter
content: readFileSync(join(skillDir, 'SKILL.md'), 'utf8'),
resourceBase: { kind: 'directory', path: skillDir },
})
resourceBase is what lets the agent resolve the skill's scripts/ and references/
relative paths. See packages/dsh-kicad/README.md.
ctx.tools.register (defineTool), e.g.
generate_schematic_from_description, generate_system_module_graph.ctx.provide:
huaqiuAuth (@huaqiu/dsh-auth) — capability API isAuthenticated() /
getAccessToken() / getUserInfo(); token is never baked in.huaqiuArtifacts (@huaqiu/dsh-artifacts) — in-process artifact store; tools call it
directly (no HTTP loopback).ctx.webServer (the smallest supported extension
point — DSH's apiProxy dispatch table is closed):
/api/v1/huaqiu/auth — browser→node credential channel./api/v1/huaqiu/artifacts/<id> + /content — preview metadata / raw bytes.tool.call.toolview slot entries keyed by tool name, replacing the stock JSON
fallback. Cards are rendered from the frozen ToolCallBlock via a pure projection, and
human answers (e.g. "regenerate") are sent back to the agent through
sessions.binding(sessionId).session.prompt.huaqiu.dsh.auth) for display.@huaqiu/ecad-renderer (renderSchematic for a
single sheet, loadProjectZip → root sheet for a project zip).@huaqiu/dsh-tool-symbol-footprint ──► huaqiuAuth, huaqiuArtifacts
@huaqiu/dsh-tool-schematic-gen ──► huaqiuAuth, huaqiuArtifacts
@huaqiu/dsh-tool-part-search ──► (none — public API only)
Tools require the auth/artifacts services at runtime; a needs_auth result is returned
when the eda.cn login is missing (never a hard throw — it surfaces a login HIT instead).
browser ──► auth.eda.cn iframe ──postMessage (category-1 envelope)──► parse (validate
envelope) ──► localStorage cache ──► POST /api/v1/huaqiu/auth/session
──► node InMemoryHuaqiuAuthService ──► tools read getAccessToken()/getUserInfo()
The origin gate is intentionally dropped (the harness runs fully offline on 127.0.0.1),
but the envelope is still validated (category: 1 + well-formed token/userId) so
unrelated window messages can never corrupt the cache. Envelope types:
update_access_token, logout, close_dialog.
agent → tool → @huaqiu/part-search library → kiapi.eda.cn → JSON → agent
agent → tool → resolve account (huaqiuAuth) → WebSocket wss://www.eda.cn/componentV2/chat
→ generated .kicad_sym / .kicad_mod → store in huaqiuArtifacts (in-process)
→ result JSON { artifact ids } → browser card fetches /content → renders via ecad-renderer
Footprint generation is human-in-the-loop: dimensions extracted from the image are
returned as a needs_confirmation result; the browser card shows a dimension editor, the
user confirms/corrects, and only then does the agent call
generate_footprint_from_dimensions.
agent → tool → resolve account → POST gen.eda.cn/api/copilotkit (SSE stream,
STATE_DELTA → STATE_SNAPSHOT) ──►
schematic: extract inline .kicad_sch sheets → store each as 'schematic' artifact
system: extract module_graph → POST gen.eda.cn/api/modular_circuit/export-zip
→ store the KiCad project zip as 'zip' artifact (single source of truth)
→ result JSON { artifact ids } → browser card fetches /content (text for a sheet,
ArrayBuffer for a zip) → renders the sheet (or the root sheet matching the
.kicad_pro name) via ecad-renderer → download / regenerate / inspect
The backend design agents are slow (single runs routinely take 9–12+ minutes), so the
SSE/tool budget is 30 minutes (HTTP_TIMEOUT_MS = 1_800_000 in
packages/dsh-tool-schematic-gen/src/sse.ts).
Filesystem-backed store under ~/.dsh/artifacts/dsh-artifacts with meta.json,
atomic writes, TTL expiry, a maxBytes cap, and strict id validation (^art_[0-9a-f]+$).
The /content route returns already-decoded bytes (base64 is decoded at store time) —
clients must read it as an ArrayBuffer, never as text.
pnpm-workspace.yaml globs packages/*).dsh CLI is on public npm as @deepseek-ai/dsh — run with npx to avoid a
global install.pnpm install
pnpm -r typecheck # tsc --noEmit per package
pnpm -r test # vitest per package
pnpm -r build # tsdown → lib/
pnpm -r pack --dry-run # confirm npm-packable output
pnpm run check:publish # pre-publish integrity gate (entry/client/patch/exports)
pnpm launch-dsh rebuilds nothing — it kills port 3080, links every local package into the
web profile (dsh plugin add <path>), and starts the web profile:
pnpm launch-dsh # → http://127.0.0.1:3080
Per-package layout:
packages/<pkg>/
src/index.ts # cordis plugin entry: name, inject, apply()
src/tools.ts # agent tool bodies (defineTool)
src/client/ # browser half: HIT cards (React), ecad helpers, theme
skills/ # optional bundled skills (dsh-kicad) — must be in files[]
cordis.patch.yml # profile insert
tsdown.config.ts # build → lib/ (client bundle for dual-face packages)
test/ # vitest
Smoke-test scratch space lives in .smoke/ (a throwaway DSH_HOME so nothing touches the
real DSH home).
The five @huaqiu/dsh-* packages are released as one unit (auth/artifacts are
peer-dependencies of the tool packages, so their versions move together). Publishing
follows the community DSH-plugin patterns (see /Users/admin/code/dsh-plugin): a Git tag
vX.Y.Z triggers the release pipeline, and the tag must equal every package.json
version.
node scripts/bump.mjs 0.1.1 # write versions, rewrite @huaqiu/* peer deps, refresh lockfile
The bump is always applied — there is no dry-run mode.
bump.mjs keeps the root marker + all five packages on one version and rewrites the
hardcoded in-workspace peer references (^0.0.0 → ^<new>). It can force-resync an
out-of-sync workspace by passing an explicit version.
git add -A
git commit -m "chore: release v0.1.1"
git tag v0.1.1
git push origin main --tags
.github/workflows/ci.yml — on push/PR: install → typecheck → test → build →
pack dry-run → check:publish..github/workflows/release.yml — on tag v* (or manual dispatch with version /
publish / dry_run inputs): validates every package version against the tag, runs the
full gate (incl. check:publish:release which requires a clean tree), then publishes
via node scripts/publish.mjs --provenance.Publishing uses npm Trusted Publishing (OIDC) — no NPM_TOKEN secret needed (it is
only a fallback). One-time setup on npmjs.com for each @huaqiu/* package: Settings →
Publishing access → Add Trusted Publisher → GitHub Actions, org Huaqiu-Electronics,
repo dsh-pcb-eda, workflow release.yml.
node scripts/check-publish.mjs # entry/client/patch/exports integrity
node scripts/check-release-version.mjs 0.1.1 --tag v0.1.1
node scripts/publish.mjs --dry-run # build + gate + pack, nothing published
node scripts/publish.mjs # live publish (auth via OIDC or NODE_AUTH_TOKEN)
Publishing is idempotent: a version already on npm is skipped, never re-published.
Packages publish in dependency order: dsh-auth → dsh-artifacts → dsh-tool-part-search
→ dsh-tool-symbol-footprint → dsh-tool-schematic-gen.
Local development (link each package from this repo):
npx @deepseek-ai/dsh plugin --profile web add ./packages/dsh-auth
npx @deepseek-ai/dsh plugin --profile web add ./packages/dsh-artifacts
npx @deepseek-ai/dsh plugin --profile web add ./packages/dsh-tool-part-search
npx @deepseek-ai/dsh plugin --profile web add ./packages/dsh-tool-symbol-footprint
npx @deepseek-ai/dsh plugin --profile web add ./packages/dsh-tool-schematic-gen
Or add the published packages by name once they are published (e.g.
@huaqiu/dsh-tool-part-search is on npm today).
npx @deepseek-ai/dsh web --no-open # then open http://127.0.0.1:3080
The generation tools require a Huaqiu EDA (eda.cn) account. Log in via the 华秋EDA AI
button in the sidebar, or let the agent trigger a login HIT — a card with an embedded
auth.eda.cn iframe appears and the agent waits for you to finish before retrying.
Part search does not require login.
Ask in natural language, e.g.:
<part>" (part search)| Variable | Default | Used by |
|---|---|---|
HQ_EDA_COPILOTKIT_URL | https://gen.eda.cn/api/copilotkit | schematic / system design |
HQ_EDA_EXPORT_ZIP_URL | https://gen.eda.cn/api/modular_circuit/export-zip | system design zip export |
HQ_EDA_COMPONENT_WS_URL | wss://www.eda.cn/componentV2/chat | symbol / footprint (whitelist-checked) |
HQ_EDA_COOKIE | — | optional cookie for schematic backend |
dsh-auth — login HIT + node credential cache: working.dsh-artifacts — filesystem store + preview routes: working.dsh-tool-part-search — first published plugin (v0.1.0): done.dsh-tool-symbol-footprint, dsh-tool-schematic-gen — tools + React HIT
cards + ECAD preview: implemented and exercised end-to-end; publishing tracked in
docs/tasks/ (see phase0-implementation-spec.md and comment-on-migration-plan.md
for the exact contracts).