Preface¶
DeepSeek Harness (dsh) is an agent framework open-sourced by DeepSeek AI, with the core design of “everything is a plugin”: models, tools, sessions, and storage can all be replaced at the configuration layer without modifying the core source code. It is currently in the developer preview stage and is iterating rapidly.
Many people do not use dsh from a blank environment. They may have accumulated a set of MCP configurations, skills, and long historical sessions in Codex, Claude Code, Qoder, or OpenCode previously. The most time-consuming part when switching tools is often not installing a new environment, but whether these accumulated assets need to be copied manually, and whether tokens will be transferred during copying.
There is a dedicated plugin in the community plugin directory for this task: deepseek-harness-external-migration. Below, based on cross-verification between the plugin directory page and the GitHub repository, we explain what it can migrate, how to install and use it, and clearly state what it will not do.
First, it is necessary to clarify the sources: the official repository of DeepSeek Harness is at deepseek-ai/deepseek-harness. deepseek-harness-plugin.com is a community-organized plugin directory, which has no official affiliation with DeepSeek / Magic Square, and should not be regarded as an official app store. Before installing any third-party plugins, you should first review the source code and license.
What is this¶
deepseek-harness-external-migration is maintained by buguoshixc, licensed under MIT, with JavaScript as the main language. The version in package.json is 0.1.0. The community directory categorizes it under the “Tools and Capabilities” section; both the directory page and GitHub currently show 4 stars.
The problem it solves is very specific: migrate configuration clues and historical sessions from Codex, Claude Code, Qoder (also accepts the alias qcoder) and OpenCode to DeepSeek Harness without manual copy-pasting. The repository README outlines the process as “Scan → Preview → Explicitly confirm import”:
- The source directory is always read-only, and no source files will be modified.
- Sessions are written to the native persistent backend currently enabled by Harness.
- Configurations are first exported as a reviewable migration package, and will not overwrite existing configurations directly.
- Authentication information will not be copied; MCP keys will be replaced with environment variable references, and the generated MCP configurations will not take effect automatically.
What can be migrated¶
The supported scope given in the README is as follows.
| Source | Historical Sessions | Configurations and Extensions |
|---|---|---|
| Codex | sessions/**/*.jsonl, optional archived_sessions/**/*.jsonl |
MCP, model/permissions summaries in config.toml, AGENTS.md, prompts, skills |
| Claude Code | ~/.claude/projects/*/*.jsonl |
User/project settings, .mcp.json, CLAUDE.md, commands, agents, skills |
| Qoder | ~/.qoder/projects/*/transcript/*.jsonl |
User/project settings, .mcp.json, commands, agents, skills |
| OpenCode | Current opencode.db session/message/part tables, also compatible with the old storage/ JSON tree |
opencode.json / opencode.jsonc, AGENTS, commands, agents, skills |
The migrated sessions use Harness’s native events such as turn/start, user/message, assistant/message, and session/title, which can be read by JSONL or SQLite persistence implementations. Each session will also include an ignorable source event that records the source, original session ID, and content fingerprint to avoid duplicate imports.
The default lookup root directories are:
Codex: $CODEX_HOME or ~/.codex
Claude: $CLAUDE_CONFIG_DIR or ~/.claude
Qoder: $QODER_HOME or ~/.qoder
OpenCode: $XDG_DATA_HOME/opencode or ~/.local/share/opencode
Configs: $XDG_CONFIG_HOME/opencode or ~/.config/opencode
If your data is not in the default locations, you can override them by configuring the roots parameter for the plugin. The README specifically reminds: Harness will completely replace the config field in subsequent patches, so you need to restate all fields you wish to retain, and cannot only write the modified items.
Three model-side tools¶
The plugin exposes three tools to the model, with separate responsibilities, and writes only happen in the final step.
external_migration_scan: Read-only inventory check. It reads directories, file metadata, and configurations for summarization, does not read session content, does not return authentication values, and does not write anything. It is suitable for first checking “what migratable objects are available” before deciding whether to proceed.external_migration_preview: Read-only parsing. It parses sessions and returns titles and a small amount of content previews, still without writing anything. It is suitable for confirming before import whether “the content to be migrated is the conversation segments I want”.external_migration_import: Actual write operation. It must be passedconfirm=trueto execute; it writes sessions to Harness and generates a configuration migration package.
By default, each source will process up to the last 200 sessions, with a single session file cap of 25 MiB. Identical sessions will be skipped if imported again; if the source file content changes, a new import version will be generated, and the old version will not be deleted.
Installation and Enablement¶
The runtime requirements come from the repository README: DeepSeek Harness 0.1.0-rc.5 or higher compatible versions, and Node.js 22.19+ or 24+. The corresponding peer dependencies in package.json are @deepseek-ai/dsh-session, @deepseek-ai/dsh-session-persistence, and @deepseek-ai/dsh-tools with version ^0.1.0-rc.5.
The installation command given on the community directory page is:
dsh plugin add github:buguoshixc/deepseek-harness-external-migration
For reproducible installations, the directory page recommends pinning the commit hash. The latest commit on the current main branch of the repository is 12218a3f6d59370567ab92e6bde410ca4ccdd769 (2026-08-14), which can be written as:
dsh plugin add github:buguoshixc/deepseek-harness-external-migration#12218a3f6d59370567ab92e6bde410ca4ccdd769
The repository README also provides a local installation method. This package declares dsh.bundle.patch, so dsh plugin will activate it as a configuration layer for the selected profile. Replace the path with your local absolute path to install the packaged file or source directory:
dsh plugin --profile web add /absolute/path/deepseek-harness-external-migration-0.1.0.tgz
dsh plugin --profile web add /absolute/path/deepseek-harness-external-migration
After installation, you need to restart the profile. The plugin runs with the permissions of the current dsh process, and may execute code during installation. You should check the source code repository and license before installing.
Typical Usage¶
After installing and restarting the profile, you can follow three steps directly in the Harness conversation. The following three sentences are from the repository README:
- First perform an inventory scan, with no actual import:
Scan the migratable content from Codex, Claude Code, Qoder, and OpenCode, do not import.
- Then preview sessions from specified sources:
Only preview the last 10 sessions from Codex and Claude.
- After reviewing the results, confirm the import:
Confirm importing the sources previewed just now, and export the configuration migration package.
The configuration migration package is written to:
$DSH_HOME/migrations/external-agents/
It usually contains:
- migration-report.json: Sources, mapping results, unsupported items, and environment variables that need to be set.
- cordis.mcp.patch.yml: A reviewable MCP plugin configuration layer.
- artifacts/: Reviewable text copies of instructions, commands, agents, and skills.
- README.txt: Application checklist.
The plugin will not automatically apply cordis.mcp.patch.yml. After reviewing the report and setting the listed environment variables, you can test it at startup (replace the path with the actual file location):
dsh --profile web --patch /absolute/path/cordis.mcp.patch.yml
After confirming everything is correct, merge this configuration layer into your own profile workflow.
Authentication information will not be written to the migration package. Environment variables or request headers containing token, secret, password, api key, auth, or credential in their names, parameter values that look like API tokens, and usernames, passwords, or suspected key query parameters in URLs will all be replaced with process.env[...] references. The required environment variables are listed in migration-report.json. WebSocket MCP configurations for OpenCode / Claude / Qoder will only be reported as unsupported and will not be incorrectly converted.
Applicable Scenarios and Notes¶
This plugin is suitable for users who have accumulated sessions and configurations in Codex, Claude Code, Qoder, or OpenCode and are preparing to connect their workflow to DeepSeek Harness. It is not a tool for “one-click overwriting existing dsh configurations”: by default, the configuration part only exports a review package, and you need to review and merge it yourself.
The repository README lists several intentional limitations, which are worth reviewing before use:
- Tool calls and tool results from the original client will be converted into readable text, and will not be disguised as re-executable Harness tool events.
- Images and file attachments only retain placeholder descriptions, and binary content will not be copied.
- Model and permission settings only write summaries, because the semantics of different clients and Harness do not fully correspond; the plugin will not arbitrarily reduce Harness’s security policies.
- Instructions, commands, agents, and skills are only copied to the review directory and need to be manually checked and merged.
- Text extension files that detect common private key or token patterns will be marked as possible-secret and skipped, and will not be written to the review directory.
- OpenCode supports the current SQLite structure of message/part tables and the old JSON structure; if it fully switches to a different V2-only table structure in the future, a new adapter will need to be added.
The repository also states: Tests use synthetic data, covering four source parsing, OpenCode SQLite, event log generation, MCP desensitization, configuration export, and duplicate imports; the maintainer has performed smoke tests using the actual SessionStore and JSONL persistence backend of DeepSeek Harness 0.1.0-rc.6. This is the verification description from the repository itself, not a third-party review.
Finally, re-emphasize the security boundary. The scan tool only performs read-only inventory checks, does not return credentials, and does not write anything; the preview is still read-only; the import must be explicitly confirmed. Even so, the plugin runs with the permissions of the current dsh process, and the generated migration reports and artifacts may contain private session content. Check the source code and license before installing, preview first before importing, and review migration-report.json before applying MCP configurations.
Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/deepseek-harness-external-migration/
GitHub: https://github.com/buguoshixc/deepseek-harness-external-migration