Preface¶
Running agents in DeepSeek Harness (DSH) is plagued by a recurring issue: once a session ends, accumulated experience is lost. A common workaround is to let the model write notes into a local directory, but this approach has obvious shortcomings — there is no history to roll back to if a file gets corrupted, manual synchronization is required across devices, and there are no guardrails for sensitive information being written in.
The idea behind dsh-evolve-in-git is to switch to a mature infrastructure: Git. It treats a Git repository as a memory storage, writing session notes, branch-specific records, and reusable skill drafts as plain files, with commits being ordinary Git history. Below, based on verified information, I will introduce the positioning, functions, installation, and usage of this plugin.
What is this¶
dsh-evolve-in-git is a DSH workflow plugin. In one sentence: Git-backed long-term memory and evolution plugin for DeepSeek Harness. Maintainer is Kytolly, current version 0.6.3, license is MIT, and code is open source on GitHub.
The plugin takes a user-specified or pre-configured Git repository as memory storage, allowing the writing of session notes, branch-specific records, and reusable skill drafts, which are committed as ordinary Git history. One point needs to be clarified in advance: the plugin does not embed any personal repository address. The built-in default value for repoUrl is the placeholder https://github.com/<your-github-username>/<your-memory-repo>.git. After installation, you need to configure the memory repository yourself.
Core Features¶
Memory Write and Recall¶
You don’t need to memorize tool names; using natural language to describe intent will trigger the evolve_* / memory_* tools. The complete tool list is: evolve_remember, evolve_recall, evolve_timeline, evolve_skill_draft, evolve_skill_promote, evolve_status, evolve_branches, evolve_rollback, memory_save, memory_search.
Versioned Updates and Soft Delete¶
When updating memory, new active records come with supersedes / supersededBy fields; old files are never deleted, and the modification history remains fully in Git. Deletion is also restrained: evolve_forget performs a soft delete, moving the record into archiveRoot, taking it out of recall and timeline, but still recoverable. The only constraint is: archiveRoot must be outside memoryRoot.
Skill Drafts and Promotion¶
Skills are placed under skillsRoot, drafts in the drafts/ directory, and after promotion they enter enabled/ to be discovered. Promotion and demotion are done via git mv, not copying, so they are reversible and preserve history. The plugin also includes built-in skill synchronization.
Privacy Write Gating¶
Every memory write must pass a privacy gate. Detected content includes email, phone, ID card, credit card, AWS keys, GitHub token, private keys, and password-type keys. privacyMode determines the handling after detection:
block: Refuse to write.redact: Only store redacted content, never store plaintext.ask: Store as-is and marksensitivity, pending review and confirmation.
The default is ask.
Web Settings Interface and Session Digest¶
Starting from v0.1.4, the plugin comes with a browser-side settings interface: registering a top-level settings area “Settings → Evolve Memory” on the Web profile’s Settings page, directly reading and writing each user’s config file via the loopback-only /api/evolve-git/config route.
The plugin also supports injecting persona + warning digest at the start of a session, controlled by three config items: digestEnabled, digestMaxRecords, digestMaxChars.
Git Authentication¶
Authentication support for private repositories has two auth.mode options:
ssh: Uses system ssh, can configure a customsshCommand.token: Usestokenor reads fromtokenEnv, accompanied by a GitHub-style Authorization header.
The default profile prioritizes SSH and supports token.
Installation and Initial Configuration¶
Installation command (using web profile as an example):
dsh plugin --profile web add github:Kytolly/dsh-evolve-in-git
After installation, the profile needs to be restarted so the client manifest rescan — this is also the prerequisite for the Web settings interface to take effect.
Initial configuration is recommended in this order:
- Create your own memory repository, configure
repoUrlto the actual address (built-in default is a placeholder). - Set
authas needed; for private repositories, use ssh or token. - Confirm each storage root directory, especially noting that
archiveRootmust be outsidememoryRoot.
Main configuration items and default values are as follows:
| Config Item | Default Value |
|---|---|
repoPath |
~/.dsh-evolve-in-git/remote-memory |
memoryRoot |
.dsh-evolve/memory |
skillsRoot |
.dsh-evolve/skills |
archiveRoot |
.dsh-evolve/archive |
defaultBranch |
main |
remoteName |
origin |
autoCommit |
true |
recallTopK |
10 |
recallMinScore |
0 |
recallMaxChars |
8000 |
privacyMode |
ask |
digestEnabled |
true |
digestMaxRecords |
5 |
digestMaxChars |
2000 |
With the above steps, the memory repository can be read and written normally.
Typical Usage¶
In most scenarios, describing intent directly will cause the model to select the right tool:
| You say (or similar) | Model Call |
|---|---|
| “Remember: whenever X happens, do Y” | evolve_remember / memory_save |
| “Any memory about the deploy flow?” | evolve_recall / memory_search |
| “Read my recent memory history” | evolve_timeline |
| “Turn this warning into a reusable skill” | evolve_skill_draft → evolve_skill_promote |
| “What is the memory repo’s current state?” | evolve_status / evolve_branches |
| “Undo the last memory commit” | evolve_rollback |
When deterministic control is needed, use the /evolve explicit command:
/evolve remember warning "pitfall" :: <content>
/evolve search deploy
/evolve skill list
/evolve skill promote evolve-process
/evolve status
/evolve help
Architecture Overview¶
The package is divided into two layers:
GitMemoryCoreinsrc/core.tsis the framework-agnostic core and the portable boundary; when parsing config, disk config files take precedence over base values provided by the host.GitEvolutionServiceinsrc/index.tsis the DSH adapter, responsible for registering Cordis tools,/evolvecommand, system prompt segments, skill providers, and config routes, and mapping each entry toGitMemoryCore.
Applicable Scenarios and Notes¶
Suitable scenarios: developers collaborating with DSH long-term, wanting experience to accumulate across sessions and be controllably reusable; teams needing audit-able and rollback-able memory history; environments with strict requirements on sensitive information writing.
Notes before use:
- The plugin runs with the permissions of the current dsh process, able to access files and network the process can access. Before installation, you should check the source code and license yourself (this project is MIT).
repoUrldefaults to a placeholder and must be configured to your own memory repository.privacyModedefaults toask; sensitive content will be stored as-is and marked for review; if strict no-plaintext is required, change toredact.auth.tokenis a write-only secret; it will be masked when echoed back during reading.
Summary¶
The value of dsh-evolve-in-git lies in borrowing Git’s existing capabilities to solve the agent memory persistence problem: history is traceable, deletion is recoverable, skill promotion is reversible, sensitive content is gated, and config changes can be done in the Web settings interface. Related links:
- GitHub Repository: https://github.com/Kytolly/dsh-evolve-in-git
- Community Plugin Directory: https://www.skillhub.cn/plugins/Kytolly/dsh-evolve-in-git
The community directory is an independent site with no official affiliation to DeepSeek or Huanfang.