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
+36 -4
View File
@@ -24,6 +24,7 @@
# osaurus — Osaurus skill files (~/.osaurus/skills/<name>/SKILL.md)
# hermes — Hermes lazy-router plugin (one plugin + on-disk agent index)
# vibe — Mistral Vibe agent TOML + prompt files (~/.vibe/agents/*.toml + ~/.vibe/prompts/*.md)
# dsh — DeepSeek Harness skill files (~/.dsh/skills/<name>/SKILL.md · .dsh/skills/<name>/SKILL.md)
# all — All tools (default)
#
# Output is written to integrations/<tool>/ relative to the repo root.
@@ -77,7 +78,7 @@ AGENT_DIRS=(
# --- Usage ---
usage() {
sed -n '3,27p' "$0" | sed 's/^# \{0,1\}//'
sed -n '3,28p' "$0" | sed 's/^# \{0,1\}//'
exit 0
}
@@ -168,6 +169,36 @@ ${body}
HEREDOC
}
convert_dsh() {
local file="$1"
local name description slug outdir outfile body
name="$(get_field "name" "$file")"
description="$(get_field "description" "$file")"
slug="agency-$(slugify "$name")"
body="$(get_body "$file")"
outdir="$OUT_DIR/dsh/$slug"
outfile="$outdir/SKILL.md"
mkdir -p "$outdir"
# DeepSeek Harness skill format: the Agent-Skills SKILL.md — a directory
# named for the skill containing a SKILL.md with name + description
# frontmatter (strict kebab-case, validated by the harness) and the persona
# as the instruction body. DSH scans ~/.dsh/skills/ (user) and
# <project>/.dsh/skills/ (project); skills there are user- and
# model-invocable by default, so an agent activates as /agency-<slug> or by
# name in conversation. Byte-identical to the antigravity/osaurus skill-md
# shape, which the Agency Agents app renders natively.
cat > "$outfile" <<HEREDOC
---
name: $(yaml_quote "$slug")
description: $(yaml_quote "$description")
---
${body}
HEREDOC
}
convert_codex() {
local file="$1"
local name description slug outfile body
@@ -701,6 +732,7 @@ run_conversions() {
zcode) convert_zcode "$file" ;;
kimi) convert_kimi "$file" ;;
osaurus) convert_osaurus "$file" ;;
dsh) convert_dsh "$file" ;;
vibe) convert_vibe "$file" ;;
aider) accumulate_aider "$file" ;;
windsurf) accumulate_windsurf "$file" ;;
@@ -732,7 +764,7 @@ main() {
esac
done
local valid_tools=("antigravity" "gemini-cli" "opencode" "cursor" "aider" "windsurf" "openclaw" "qwen" "zcode" "kimi" "codex" "osaurus" "hermes" "vibe" "all")
local valid_tools=("antigravity" "gemini-cli" "opencode" "cursor" "aider" "windsurf" "openclaw" "qwen" "zcode" "kimi" "codex" "osaurus" "hermes" "vibe" "dsh" "all")
local valid=false
for t in "${valid_tools[@]}"; do [[ "$t" == "$tool" ]] && valid=true && break; done
if ! $valid; then
@@ -751,7 +783,7 @@ main() {
local tools_to_run=()
if [[ "$tool" == "all" ]]; then
tools_to_run=("antigravity" "gemini-cli" "opencode" "cursor" "aider" "windsurf" "openclaw" "qwen" "zcode" "kimi" "codex" "osaurus" "hermes" "vibe")
tools_to_run=("antigravity" "gemini-cli" "opencode" "cursor" "aider" "windsurf" "openclaw" "qwen" "zcode" "kimi" "codex" "osaurus" "hermes" "vibe" "dsh")
else
tools_to_run=("$tool")
fi
@@ -762,7 +794,7 @@ main() {
if $use_parallel && [[ "$tool" == "all" ]]; then
# Tools that write to separate dirs can run in parallel; buffer output so each tool's output stays together
local parallel_tools=(antigravity gemini-cli opencode cursor openclaw qwen zcode kimi codex osaurus hermes vibe)
local parallel_tools=(antigravity gemini-cli opencode cursor openclaw qwen zcode kimi codex osaurus hermes vibe dsh)
local parallel_out_dir
parallel_out_dir="$(mktemp -d)"
info "Converting: ${#parallel_tools[@]}/${n_tools} tools in parallel (output buffered per tool)..."