Skip to content

feat: DeepSeek Harness (dsh) agent support — skills, MCP scan + native toggle, audit - #116

Merged
RealZST merged 13 commits into
mainfrom
feat/dsh-agent-support
Aug 16, 2026
Merged

feat: DeepSeek Harness (dsh) agent support — skills, MCP scan + native toggle, audit#116
RealZST merged 13 commits into
mainfrom
feat/dsh-agent-support

Conversation

@RealZST

@RealZST RealZST commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Adds DeepSeek Harness (dsh) as the 12th supported agent.

What's included

Detection & config

  • Detects dsh via $DSH_HOME/~/.dsh profile signals (strong signal: profiles/*/package.json with dsh.profile.bundles); project signal: .dsh/skills/
  • Context files: ~/.dsh/AGENTS.md + project AGENTS.md/CLAUDE.md chain

Skills

  • Scans all 4 skill roots (~/.dsh/skills, shared ~/.agents/skills, project .dsh/skills / .agents/skills), non-recursive per dsh semantics, .system subdir skipped
  • Enable/disable via SKILL.md ⇄ SKILL.md.disabled rename (picked up live by dsh's file watcher)
  • Cross-agent skill install targets .dsh/skills; install validation rejects camelCase invocation keys (see audit rule below)

MCP

  • New McpFormat::DshCordis: parses @deepseek-ai/dsh-mcp-client rows from the home-layer cordis.patch.yml, tolerating the cordis YAML dialect (!!js expression tags are preserved, never evaluated)
  • Native enable/disable through an HK-managed marker block appended to the patch file — dsh's official id-targeted disabled override mechanism. Text-level only: user bytes are never re-serialized; removing the block restores the file byte-for-byte. Unbalanced markers fail hard (ConfigCorrupted) instead of silently dropping user content
  • Install/remove is intentionally not supported yet (loud Validation error); the managed-block insert writer is the headline of the follow-up PR together with plugin scanning

Audit

  • New rule skill-invocation-key-case (Medium): flags camelCase invocation keys (disableModelInvocation / modelInvocable / userInvocable) that dsh rejects fail-closed — the whole skill is silently dropped. Per-key kebab-case suggestions (including the inverted-meaning modelInvocable case) with file:line locations
  • Finding is also surfaced as a warning in the skill's detail panel (derived from the audit store; disappears once fixed and re-audited)

Frontend

  • dsh registered in agent order/display names, whale mascot (reduced-motion safe), brand-adjacent oklch color tokens, onboarding records
  • Audit rule registered in the frontend rule registry + i18n (en / zh / zh-TW)
  • MCP detail panel note bridging dsh's UI naming (servers appear in dsh Settings → Plugins as mcp-client plugin cards)

Hardening beyond the plan (all pinned by tests)

  • disabled: nullfalse (matches upstream entry semantics)
  • Native-toggle dispatch: hermes is now an explicit branch; a future native-toggle agent without a dispatch branch fails loudly instead of silently writing another agent's format
  • Remote-vs-stdio decided by url presence first (a url row with an omitted/unknown transport can't produce a contradictory empty-command stdio entry)

Verification

  • cargo test --workspace: 642 passed, 0 failed, no warnings
  • tsc: 0 errors; vitest: 286/286
  • Real-machine smoke against @deepseek-ai/dsh@0.1.0-rc.6: detect / skill scan (incl. shared ~/.agents attribution) / MCP scan all correct; hk disable → dsh's own --dump-config assembles disabled: true (official loader consuming HK's write); hk enable → byte-identical restore (MD5 verified); audit rule fires with per-key suggestions; toggles hot-reload live in dsh's own web UI

Known limitations (follow-up PR)

  • The MCP install dialog still lists dsh as a target; submitting fails with a clear error. Deliberately not gated here — the next PR either makes install work (managed-block insert writer) or grays it out
  • dsh plugin ecosystem (cordis rows) is not yet modeled; plugin scan/reconciliation is the next PR's main course
  • Presets, hooks-bridge display, and precise cordis row-id display are tracked as P1

🤖 Generated with Claude Code

@RealZST
RealZST marked this pull request as ready for review August 16, 2026 11:46
@RealZST
RealZST force-pushed the feat/dsh-agent-support branch from 2c26095 to 34f34e8 Compare August 16, 2026 12:47
The full name overflowed the fixed-width agent card. The mascot is now the
official whale logo rendered bare (no tile). Hover: breach loop — leap,
dive out below the mascot's clip box (which ends above the card label),
resurface. Click: spout — a teardrop water column bursts into two curling
splash lobes plus flung droplets, twemoji-style.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@RealZST
RealZST force-pushed the feat/dsh-agent-support branch from 34f34e8 to f510889 Compare August 16, 2026 12:49
Removing the mascot-level offsetY let the click spout's peak escape the
card's rounded corner; re-add dsh to the card overflow-hidden list. The
inner clip box still ends the dive above the label.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@RealZST
RealZST merged commit 4321a80 into main Aug 16, 2026
3 checks passed
@RealZST
RealZST deleted the feat/dsh-agent-support branch August 16, 2026 12:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant