feat(integration): add DeepSeek Harness (dsh) skills support (#846)

Adds DeepSeek Harness as an integration target: 279 agency-* SKILL.md skills installed to ${DSH_HOME:-~/.dsh}/skills (or DSH_SKILLS_DIR for project scope).

Verified in DeepSeek Harness itself (@deepseek-ai/dsh 0.1.7-rc.2, installed via the documented npx path on Ubuntu 26.04 arm64): the repo installer placed 279 skills, and dsh's own skill-filesystem parser accepted all 279 with zero warnings (a planted invalid name and a missing description were both rejected with dsh's own messages).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Roberto Solano
2026-09-27 18:45:36 -05:00
committed by GitHub
co-authored by Claude Opus 5.5
parent 053ddbbf39
commit 479193dcce
9 changed files with 502 additions and 294 deletions
+37 -2
View File
@@ -11,8 +11,8 @@
# * bash 3.2 + BSD userland, no jq, no GNU-only flags.
# * Never touches the real $HOME. Every case runs with HOME set to a fresh
# sandbox, so a broken default path writes into the sandbox, not your config.
# * Only exercises the two source tools (claude-code, copilot) so no case
# depends on convert.sh output being present or fresh.
# * Source-tool cases use claude-code/copilot directly; focused Codex and DSH
# cases exercise auto-conversion before installing into their sandboxes.
#
# Usage: ./scripts/test-install.sh [-v]
# -v echo the installer's own output for failing cases
@@ -217,6 +217,41 @@ assert_eq 0 "$RUN_STATUS" "pre-suffixed CLAUDE_CONFIG_DIR install exits 0"
assert_eq "$TOTAL_AGENTS" "$(count_md "$cfg")" \
"a CLAUDE_CONFIG_DIR already ending in /agents is used verbatim (no double-nesting)"
# DSH_HOME is DeepSeek Harness's official config root. DSH_SKILLS_DIR remains
# the more specific destination override and therefore wins when both are set.
home="$(sandbox dsh-home)"
dsh_home="$home/custom-dsh"
RUN_OUT="$(HOME="$home" DSH_HOME="$dsh_home" "$INSTALL" --no-interactive \
--tool dsh --agent "$FIRST_ENG_SLUG" 2>&1)"; RUN_STATUS=$?
assert_eq 0 "$RUN_STATUS" "DSH_HOME install exits 0"
[[ -f "$dsh_home/skills/agency-$FIRST_ENG_SLUG/SKILL.md" ]] \
&& pass "DSH_HOME installs skills into \$DSH_HOME/skills" \
|| fail "DSH_HOME installs skills into \$DSH_HOME/skills"
home="$(sandbox dsh-detect)"
dsh_home="$home/custom-dsh"
mkdir -p "$dsh_home"
RUN_OUT="$(HOME="$home" DSH_HOME="$dsh_home" "$INSTALL" --no-interactive --dry-run 2>&1)"; RUN_STATUS=$?
assert_eq 0 "$RUN_STATUS" "custom DSH_HOME detection exits 0"
tools_line="$(printf '%s\n' "$RUN_OUT" | awk '/^ Tools:/ { print; exit }')"
case " $tools_line " in
*" dsh "*) pass "custom DSH_HOME is detected without a dsh binary" ;;
*) fail "custom DSH_HOME is detected without a dsh binary" ;;
esac
home="$(sandbox dsh-skills-dir)"
dsh_home="$home/custom-dsh"
dsh_skills="$home/project/.dsh/skills"
RUN_OUT="$(HOME="$home" DSH_HOME="$dsh_home" DSH_SKILLS_DIR="$dsh_skills" "$INSTALL" \
--no-interactive --no-convert --tool dsh --agent "$FIRST_ENG_SLUG" 2>&1)"; RUN_STATUS=$?
assert_eq 0 "$RUN_STATUS" "DSH_SKILLS_DIR install exits 0"
[[ -f "$dsh_skills/agency-$FIRST_ENG_SLUG/SKILL.md" ]] \
&& pass "DSH_SKILLS_DIR overrides DSH_HOME" \
|| fail "DSH_SKILLS_DIR overrides DSH_HOME"
[[ ! -e "$dsh_home/skills/agency-$FIRST_ENG_SLUG/SKILL.md" ]] \
&& pass "DSH_SKILLS_DIR leaves DSH_HOME unused" \
|| fail "DSH_SKILLS_DIR leaves DSH_HOME unused"
# ---------------------------------------------------------------------------
# 4. Paths with spaces (regression: word-splitting in the install loop)
# ---------------------------------------------------------------------------