Add DeepSeek Harness (DSH) integration - #4336
Conversation
Add a skills-based integration for DeepSeek Harness (DSH), the agent runtime behind the dsh CLI and Web GUI. DSH discovers project skills one level deep from .dsh/skills (its native root, provider rank 100) and .agents/skills (rank 200), using speckit-<name>/SKILL.md directory bundles with name/description frontmatter — the same agentskills.io layout SkillsIntegration already scaffolds. Users invoke skills via the '/'-trigger input in the DSH Web GUI (/speckit-specify <description>); the harness injects the rendered <skill_content> into the turn. Project AGENTS.md guidance is loaded natively by DSH, so no context-file handling is needed. - Install skills to .dsh/skills/speckit-<name>/SKILL.md (isolated static root; multi-install safe alongside other agents) - CLI dispatch via 'dsh --profile headless "<prompt>"' one-shot mode - Register 'dsh' in ALWAYS_SLASH_AGENTS so init output and hook messages render /speckit-<command> invocations - Add init next-steps hint, catalog entry, issue-template lists, devcontainer install step, docs table row - Verify with the real dsh-skill-filesystem provider: all 10 skills discovered as user- and model-invocable, bodies loadable Assisted-by: DeepSeek Harness (model: glm-5.3, supervised)
There was a problem hiding this comment.
🟡 Changes recommended
The catalog timestamp is stale, and the new DSH next-step output lacks regression assertions.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds DeepSeek Harness as a native skills-based integration with headless CLI dispatch.
Changes:
- Registers DSH and installs skills under
.dsh/skills. - Adds slash invocation, next-step guidance, catalog, and documentation support.
- Adds integration, discovery, dispatch, and hook tests.
File summaries
| File | Description |
|---|---|
src/specify_cli/integrations/dsh/__init__.py |
Implements the DSH integration. |
src/specify_cli/integrations/__init__.py |
Registers DSH. |
src/specify_cli/_invocation_style.py |
Enables slash-style invocations. |
src/specify_cli/commands/init.py |
Adds DSH startup guidance. |
integrations/catalog.json |
Adds catalog metadata. |
docs/reference/integrations.md |
Documents DSH support. |
.github/ISSUE_TEMPLATE/agent_request.yml |
Adds DSH to supported agents. |
.github/ISSUE_TEMPLATE/bug_report.yml |
Adds DSH to the agent dropdown. |
.github/ISSUE_TEMPLATE/feature_request.yml |
Adds DSH to the agent dropdown. |
tests/integrations/test_integration_dsh.py |
Tests DSH behavior and compatibility. |
tests/integrations/test_registry.py |
Adds registry coverage. |
tests/test_agent_config_consistency.py |
Synchronizes issue-template expectations. |
Review details
- Files reviewed: 12/12 changed files
- Comments generated: 2
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| if dsh_skill_mode: | ||
| steps_lines.append( | ||
| f"{step_num}. Start DSH ([cyan]dsh web[/cyan]) in this project directory; spec-kit skills were installed to [cyan].dsh/skills[/cyan]" | ||
| ) |
There was a problem hiding this comment.
Fixed in f5987f4 — added TestDshNextSteps modeled on TestGrokNextSteps: asserts the next-steps panel shows the Start DSH (dsh web) guidance and .dsh/skills install path, renders /speckit-plan, and does not show dotted /speckit.plan invocations.
- Refresh integrations/catalog.json updated_at to the date of this catalog change (matches the bump convention in prior catalog PRs). - Add TestDshNextSteps asserting the init next-steps panel shows the 'Start DSH (dsh web)' guidance and .dsh/skills install path, and renders /speckit-<command> rather than dotted invocations — modeled on TestGrokNextSteps so a regression in the hint or path fails CI. Assisted-by: DeepSeek Harness (model: glm-5.3, supervised)
|
Review round 1 summary — both Copilot findings addressed in f5987f4:
Verified locally: Posted on behalf of @AnInteger by DeepSeek Harness (model: glm-5.3); fixes were reviewed and approved by the filer before push. |
There was a problem hiding this comment.
🔵 Needs a closer look
DSH extra arguments are positioned incorrectly, and one compatibility test rejects valid skill resource directories.
Review details
Suppressed comments (2)
Previously missed (2) — in code that hasn't changed since the last review.
tests/integrations/test_integration_dsh.py:192
- This rejects every resource subdirectory inside a skill bundle, but DSH's one-level rule only restricts where
SKILL.mddefinitions are discovered; bundle resource directories remain valid. This assertion would fail if the shared skills later add valid scripts or references, so only requireSKILL.mddirectly under each skill directory.
children = [p for p in skill_dir.iterdir() if p.is_dir()]
assert not children, (
f"nested directories under {skill_dir} are invisible to DSH "
"skill discovery"
)
src/specify_cli/integrations/dsh/init.py:62
SPECKIT_INTEGRATION_DSH_EXTRA_ARGSis appended after the task positional. DSH stops parsing launcher flags at that positional, so launcher options such as--patchare instead forwarded to the headless app and fail. Apply extra arguments before appending the task so both launcher and profile options can be routed correctly.
args = [self._resolve_executable(), "--profile", "headless", prompt]
self._apply_extra_args_env_var(args)
- Files reviewed: 12/12 changed files
- Comments generated: 0 new
- Review effort level: Balanced
Adds a skills-based integration for DeepSeek Harness (DSH) — the agent runtime behind the
dshCLI and its Web GUI. Closes #4334.How DSH consumes Spec Kit
DSH discovers skills one level deep from
.dsh/skills(its native project root, highest provider rank) and.agents/skills, usingspeckit-<name>/SKILL.mddirectory bundles withname/descriptionfrontmatter — the same agentskills.io layoutSkillsIntegrationalready scaffolds. Users invoke skills through the/-trigger input (e.g./speckit-specify <feature description>); the harness injects the rendered skill content into the turn. ProjectAGENTS.mdguidance is loaded natively by DSH, so no context-file handling is needed in the integration.What changed
src/specify_cli/integrations/dsh/SkillsIntegrationsubclass: installs to.dsh/skills/, slash-style invocations, CLI dispatch viadsh --profile headless "<prompt>",multi_install_safe(isolated.dsh/root coexists with other agents)src/specify_cli/integrations/__init__.py_register(), alphabetical)src/specify_cli/_invocation_style.pydshadded toALWAYS_SLASH_AGENTSso init output and hook messages render/speckit-<command>src/specify_cli/commands/init.pyintegrations/catalog.jsonTestCatalogParitygreen).github/ISSUE_TEMPLATE/*test_issue_template_agent_lists_match_runtime_integrations)docs/reference/integrations.mdtests/integrations/test_integration_dsh.pySkillsIntegrationTestssuite,build_exec_argsregression, DSH-discovery compatibility invariants (kebab-case names,name+descriptionfrontmatter, one-level-deep bundles), multi-install isolation, hook invocation renderingNo
templates/commands/*.mdfiles are touched, so no existing command behavior changes.Test selection reasoning
src/specify_cli/integrations/dsh/__init__.pyspecify init --integration dshsrc/specify_cli/integrations/__init__.pyspecify init/integration installsrc/specify_cli/_invocation_style.pydshadded toALWAYS_SLASH_AGENTSsrc/specify_cli/commands/init.pyspecify initoutputManual test results
Agent: DeepSeek Harness (
dshCLI v0.1.1-rc.2, headless profile) | OS/Shell: Linux (WSL2) / bashspecify init --integration dsh --script sh(T1).dsh/skills/speckit-<name>/SKILL.md; next-steps panel shows thedsh webhint and/speckit-<command>usage;integration listshows dsh (CLI required: yes, multi-install safe: yes);integration uninstall dshremoved all 10 tracked files cleanly/speckit-constitution(T2)dsh --profile headless "/speckit-constitution …"; the skill loaded through the/-token gesture boundary; the agent created.specify/memory/constitution.mdwith a sync impact report and self-validated; exit 0/speckit-specify(T3)create-new-feature.shran and createdspecs/001-markdown-notes-cli/; generatedspec.md(user stories with priorities, Given/When/Then acceptance scenarios, 11 functional requirements) andchecklists/requirements.md; the agent ran the requirements checklist and reported all items passing; exit 0Additional evidence:
@deepseek-ai/dsh-skill-filesystemFileSystemSkillProvideragainst a scaffolded project: all 10speckit-*skills discovered from theproject-dshroot withinvocation: {modelInvocable: true, userInvocable: true}; full skill bodies loadable throughprovider.get()..venv/bin/python -m pytest tests -q: 7231 passed / 156 skipped. The 25 failures are pre-existing PowerShell-encoding environment failures, reproduced identically on a cleanmaincheckout of this machine (verified viagit stash), unrelated to this change.AI disclosure
This PR was implemented with AI assistance (DeepSeek Harness, model: glm-5.3) under human supervision: the integration approach and each design decision (target directory, multi-install safety, CLI dispatch, invocation style) were presented for review and approved by the filer before submission, and all changes and manual test evidence were personally reviewed and re-verified. The commit carries an
Assisted-by:trailer to the same effect.