dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
A deepseek-harness plugin, making your agent evolve in customed git repository.
English · 中文
Git-backed long-term memory and evolution plugin for DeepSeek Harness.
This plugin treats a user-chosen or preconfigured Git repository as the memory store. It can write session notes, branch-specific records, and reusable skill drafts into that repo, then commit them as ordinary Git history.
# example: install into the web profile
dsh plugin --profile web add github:Kytolly/dsh-evolve-in-gitThe bundle inserts one dsh-evolve-in-git row with the plugin defaults. Later profile patches can override repoPath, repoUrl, auth, and the storage roots.
You do not need to remember tool names — describe the outcome and the model selects the right evolve_* / memory_* tool:
You say (or similar) · The model uses "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
/evolve)For explicit, deterministic control, type /evolve :
/evolve remember warning "pitfall" :: <content>
/evolve search deploy
/evolve skill list
/evolve skill promote evolve-process
/evolve status
/evolve helpThe full command reference is under Harness entry points.
The package is split into a framework-free core and a thin DSH adapter:
src/core.ts (GitMemoryCore) is the portability boundary. It depends only onNode built-ins and sibling core modules — never on @deepseek-ai/* — and resolves config from the on-disk file over the host-provided base.
src/index.ts (GitEvolutionService) is the adapter: it registers Cordistools, the /evolve command, the system-prompt section, the skill provider, and the config-file route, then maps every surface onto GitMemoryCore.
Module · Responsibility src/git.ts · Spawns git: clone/open, status, branch ops, push/fetch, commit, git mv, conflicts, rollback. src/memory.ts + src/memory-index.ts · Markdown+YAML-frontmatter scanning, a metadata index cache (HEAD + mtime signature), budgeted recall, timeline. src/update.ts · Versioned update: a new active record plus supersedes/supersededBy; the old file is never deleted. src/forget.ts · Soft-delete (move to archiveRoot) and restore. src/privacy.ts · Sensitive-content detection, sensitivity classification, redaction, export filtering. src/skill.ts · drafts/ ↔ enabled/ skill discovery; promote/demote via git mv; bundled-skill sync. src/strategy.ts · Slug/sanitize, draft generation from a memory, evolution suggestion, preview. src/harness.ts · /evolve command normalization/parsing plus help/usage/safety text. src/config.ts + src/defaults.ts · Config-file read/write/merge and the plugin defaults. src/invariant.ts · No-op invariant companion (the source of truth is the configured Git repo). src/loopback.ts + src/config-route.ts · Loopback-only /api/evolve-git/config route for the config-file editor. src/client/ · Browser settings section (evolve-git slot) and config-file editor.
///--.md, oneMarkdown file per record with YAML frontmatter (kind, title, branch, source, tags, createdAt, id, updatedAt, status, supersedes, supersededBy, expiresAt, sensitivity) followed by the body.
//drafts//SKILL.md (promotable) and//enabled//SKILL.md (discoverable). Promotion is a git mv between the two, never a copy, so it stays reversible and in history.
//… (same relative layout as memory);evolve_forget moves records here so they leave recall/timeline but stay recoverable. archiveRoot must remain outside memoryRoot.
Web settings UI (v0.1.4+). The plugin ships a browser half that registers a
first-level Settings → 演进记忆 section on the web profile's Settings page
(via thesettings.sectionslot). The form uses aSettingsScopeadapter that
reads and writes the per-user config file directly through the loopback-only
/api/evolve-git/config route, so what the form shows is exactly what takeseffect (defaults overlaid by the file) and saving writes the file immediately.
Nestedauthis written as one merged object, and theauth.tokenfield is
write-only (secret, redacted from read-back). Requires the profile to be
restarted after install so the client manifest is rescanned.
repoPath - the local Git checkout that stores memory and skills. Defaults to ~/.dsh-evolve-in-git/remote-memory.repoUrl - the remote memory repository. No personal default ships with the plugin: the built-in default is the placeholder https://github.com//.git, so configure your own repository (see "Per-user config file" below).auth - Git auth settings for private access. The default profile is SSH-first and token-capable.memoryRoot - where memory records are written, default .dsh-evolve/memory.skillsRoot - where skill drafts are written, default .dsh-evolve/skills.defaultBranch - branch to evolve from when creating new branches, default main.remoteName - remote to fetch and push, default origin.autoCommit - whether writes auto-commit, default true.archiveRoot - where evolve_forget moves records, default .dsh-evolve/archive.recallTopK - maximum results evolve_recall returns, default 10.recallMinScore - minimum relevance score to keep, default 0.recallMaxChars - cumulative character budget for returned recall content, default 8000.privacyMode - write-path privacy gate for sensitive content, default ask. block rejects the write when sensitive content is detected; redact stores the redacted content (never the plaintext); ask stores the content as-is and marks its sensitivity so it can be reviewed/confirmed.digestEnabled - whether to inject the session-start persona+warning digest, default true.digestMaxRecords - maximum persona/warning records in the session-start digest, default 5.digestMaxChars - maximum characters of the session-start digest, default 2000.auth.mode: "ssh" - use ssh or a custom sshCommand.auth.mode: "token" - use token or a token from tokenEnv and a GitHub-style Authorization header.Every memory write passes through the privacy gate (emails, phones, ID cards, credit cards, AWS keys, GitHub tokens, private keys, and password:-style secrets). privacyMode controls the response:
block - reject the write when sensitive content is detected.redact - replace detected fragments with `` and store that instead of the plaintext.ask (default) - store the content as-is and record its sensitivity so it can be reviewed and confirmed.evolve_show/evolve_export respect the recorded sensitivity level, and exports exclude secret records by default. Records without a recorded sensitivity (written before the gate existed) are treated as secret so they are never accidentally exported.
The gate covers memory writes only (writeMemoryRecord/updateMemory, i.e. evolve_remember/memory_save/evolve_update/memory_update). Skill-draft writes (writeSkillDraft/saveSkillDraftFromRecord) intentionally do not go through the privacy gate in this release; review drafts for secrets before promoting them.
Recall scoring.evolve_recall/memory_searchscore a query against record
metadata (title,kind,tags,branch,source) only; the body is loaded
lazily for the top matches but is not part of the relevance score. The human
command /evolve search uses the same metadata-indexed recall, so itreturns the same ranked results rather than a different matcher.
Archive constraint.archiveRootmust stay outsidememoryRoot(the
default.dsh-evolve/archivedoes). If you pointarchiveRootinside
memoryRoot, forgotten records are still scanned and will not disappear.Each DSH user keeps one local config file at $DSH_HOME/evolve-in-git.json (~/.dsh/evolve-in-git.json by default). It is user-local and never part of any Git repository — do not commit it. The file is the single user configuration layer: the web Settings → 演进记忆 form reads and writes exactly this file (showing the defaults overlaid by your file values, and saving writes the file immediately), and the /evolve config show|open|refresh|set commands edit it too. The embedded config-file editor opens the raw JSON.
Example:
{
"repoPath": "/absolute/path/to/your/local-memory-checkout",
"repoUrl": "https://github.com/<your-github-username>/<your-memory-repo>.git"
}Never put access tokens in this file — use auth.tokenEnv to name anenvironment variable, or the web settings token field (write-only).
The web Settings → 演进记忆 section also embeds a config-file editor that opens this file directly, edits it as raw JSON, and saves it through the loopback-only /api/evolve-git/config route (saves apply immediately).
The plugin targets the current Harness 0.1.1-rc.2 host contracts for commands, tools, system prompt, and invariants (peerDependencies are ^0.1.1-rc.2). Install it into a profile, then restart that profile so the bundle layer is composed.
Tools:
evolve_connectevolve_statusevolve_rememberevolve_updateevolve_forgetevolve_restoreevolve_showevolve_exportevolve_branchesevolve_branch_switchevolve_branch_diffevolve_skill_draftevolve_skill_listevolve_skill_promoteevolve_skill_demoteevolve_rollbackevolve_conflictsevolve_resolveevolve_timelineevolve_recallevolve_helpmemory_search (alias of evolve_recall)memory_save (alias of evolve_remember)memory_update (alias of evolve_update)memory_delete (alias of evolve_forget)Human command:
/evolve connect/evolve status/evolve branches/evolve remember [--expires ] :: /evolve update [--merge] :: /evolve forget /evolve restore /evolve config show|open|refresh|set /evolve skill draft :: /evolve skill list/evolve skill promote /evolve skill demote /evolve skill sync/evolve rollback [--dry]/evolve conflicts/evolve resolve /evolve timeline/evolve search [--kind k] [--tag t]/evolve branch switch \| /evolve branch diff [b] \| /evolve branch revert /evolve helpAfter installation, verify composition before starting a long-lived profile:
dsh --profile web --dump-config
dsh --profile webThe first command should show the evolve-git row from the plugin bundle. The second command boots the profile; once loaded, the model sees the evolve_* tools and the UI command registry exposes /evolve.
The package ships the evolve-process skill under skills/. On load the plugin materializes it into the repo's /drafts/evolve-process/ (creating it only when missing); /evolve skill sync overwrites the bundled copy on demand. Promote it with /evolve skill promote evolve-process. The adapter registers the repo's /enabled/ directory as a DSH skill provider, so promoted skills become callable without any copy into ~/.dsh/skills.
src/client/ - the browser bundle (lib/client.js) compiled bytsc -p tsconfig.client.json && tsdown (see tsdown.config.ts); registered as a settings.section slot so the web Settings page renders the config form.
package.json - exports["./client"] + dsh.client (platform: "web") are