Achievement and gamification plugin: unlock badges for turns, tool calls, sessions, daily streaks and coding behavior (edits/reads/tests), with a badge wall, unlock toasts and a ctx.achievements SDK.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:luumod/dsh-achievements
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
An achievement / gamification plugin for DeepSeek Harness: cross-session badges for turns, tool calls, sessions and daily streaks, with a badge panel, unlock toasts and a
ctx.achievementsservice. Zero core changes. A fork of Blaczz/dsh-achievements adding behavior achievements, thectx.achievementsSDK and a sharing layer.
A DeepSeek Harness (DSH) gamification plugin that quietly counts your real usage (turns, tool calls, sessions, consecutive days) and unlocks achievements at milestones, toasting in real time and showing a badge wall in the settings page. State survives across sessions (stored in the DSH home directory), and all counting rides the official session/event seam (turn/end, tool/call, tool/result) — no core changes.
✨ Built-in achievements (48)
Achievements come in two tracks. Each of the seven lifetime progression lines has five tiers, always common → uncommon → rare → epic → legendary (10 / 30 / 75 / 175 / 400 XP for new milestones):
| Line | Common | Uncommon | Rare | Epic | Legendary |
|---|---|---|---|---|---|
| 🎬 Turns | 1 | 25 | 50 | 100 | 500 |
| 🔧 Tool calls | 1 | 25 | 100 | 500 | 2000 |
| 💬 Sessions | 1 | 10 | 50 | 200 | 500 |
| 🌅 Active days | 1 | 7 | 30 | 100 | 365 |
| 📖 File reads | 10 | 100 | 500 | 2500 | 10000 |
| ✏️ File edits | 1 | 10 | 50 | 250 | 1000 |
| 🧪 Test runs | 1 | 10 | 50 | 250 | 1000 |
Plus special achievements: streak days (streak-3 / streak-7), the early ten-turns bonus, and ten per-session behavior badges:
| Achievement | Condition |
|---|---|
| 🔁 Déjà Vu | edit the same file 5 times in one session |
| 🕳 Rabbit Hole | read 20 files before your first edit |
| 💣 YOLO | edit 8 files before your first test |
| 🔥 It Works Eventually | pass after 5 failed tests |
| 🎰 Surely This Time | same test command fails 5 times in a row |
| 🎯 One Shot | pass the first test after a single edit |
| 📚 Librarian | read 30 distinct files in one session |
| 🌱 Touch Grass | 100 tool calls in one session |
| 🦴 Dependency Archaeologist | read a file inside a dependency directory |
| 🗿 Gigachad | read, edit and pass a test within 5 tool calls |
Lifetime counters (turns, toolCalls, sessions, activeDays, fileReads, fileEdits, testRuns) live on the profile and never depend on the 64-session retention window. On upgrade, missing counters are conservatively recovered from the retained sessions as a provable lower bound, and already-satisfied lifetime milestones are silently unlocked once (no toast storm).
📦 Install
Prereqs: DSH (dsh web works), Node ≥ 22.19, pnpm.
# From GitHub (prebuilt lib/ committed, no allowBuilds needed)
dsh plugin --profile web add "github:luumod/dsh-achievements#main"
# Local directory
cd dsh-achievements && npm install --legacy-peer-deps && npm run build
dsh plugin --profile web add ./dsh-achievements
Restart dsh web after install, then just use it — the first completed turn unlocks the first achievement.
🎮 Usage
- Chat and let the agent work: turns, tool calls, new sessions and daily activity accumulate; a toast pops when a new achievement unlocks.
- Settings → 🏆 成就: seven lifetime counters (turns / tool calls / sessions / active days / file reads / file edits / test runs) plus a separate streak line, the seven
/5growth routes, and the badge wall split into "成长里程碑 / 特殊行为" (unlocked with timestamps, locked dimmed).
🔌 For developers: the ctx.achievements SDK
Register your own achievements from a Host plugin (built-in and third-party share one evaluation path):
export const inject = ['achievements']
export function apply(ctx: Context): void {
ctx.achievements.register({
id: 'python-first-run',
icon: '🐍',
title: { zh: '蟒蛇出洞', en: 'First Python Run' },
description: { zh: '首次运行 Python', en: 'Run Python for the first time' },
rarity: 'uncommon',
xp: 20,
scope: 'session',
evaluate: ctx => ({ unlocked: ctx.session.toolCalls >= 1 }),
})
}
Or register a whole pack: ctx.achievements.registerPack({ id, version, name, achievements }). Duplicate ids throw. See docs/SDK.md for the full guide + examples/python-pack.ts.
On the browser side, other client plugins read state via ctx.achievementsState.refresh() / ctx.achievementsState.unlockedIds().
🛠️ Development
npm install --legacy-peer-deps
$env:DSH_NODE_MODULES = "$env:USERPROFILE\.dsh\profiles\node_modules"
npm run setup:dsh-workspace
npm run verify # ★ one-shot gate: clean + typecheck + test + build
npm test # vitest (engine unlock rules / streaks / idempotency + manifest)
Layout
dsh-achievements/
├── package.json # dual contract: dsh.bundle.patch + dsh.client
├── cordis.patch.yml # bundle patch layer
├── tsdown.config.ts # client bundle (__ModuleLoader__.load + purity gate)
├── scripts/ # build / clean / setup-dsh-workspace / verify
├── src/
│ ├── achievements.ts # ★ pure engine (applyEvent / BUILTIN_ACHIEVEMENTS, unit-testable)
│ ├── state.ts # persistence (JSON in the DSH home)
│ ├── index.ts # host half: event hooks + HTTP API + settings
│ └── client/ # browser half
│ ├── index.ts # apply: ctx.achievements service + polling + slot injection
│ ├── achievements-client.ts # state API client
│ ├── badge-panel.tsx # badge wall (settings.section)
│ └── toast.ts # unlock toast (zero-dependency DOM)
└── tests/ # engine + manifest
🧩 Ecosystem positioning
- Fills a gap: before this, the DSH ecosystem had no unified achievement/badge system (only
dsh-daily-progresstracks streaks/completion), and community research explicitly flagged "no real gamification tasks/achievements/levels". - Technical route: host drives a pure engine off the official event seams (
session/event+tools/result); the browser half is a client plugin (settings.section+ polling), the same dual-sided pattern asdsh-soundscape. - Zero core changes: read-only events + a private state file +
ctx.effectregistrations.
⚖️ License
MIT © 2026 Blaczz (upstream). This repo is a fork of Blaczz/dsh-achievements, adding behavior achievements, the ctx.achievements SDK and a sharing layer on top; if the upstream PR lands, this fork will be archived in favor of the original. An independent community plugin, not affiliated with DeepSeek Harness.
Links
More in this category
Nagi-ovo/dsh-ads★ 421
Parody ads in 2005-Chinese-web style: sidebar banners, in-chat feeds, corner popups, and a close button whose hit area is smaller than it looks. All fictional.
vlln/whale-girl★ 173
Desktop pet (QQ-pet style): floats in the corner, draggable, feedable, playable.
PC2005-cloud/dsh-pet#dsh-pet★ 48
Desktop pet for the DSH Web UI with 25 transparent animations, screen wandering, click reactions and drag, plus a reproducible asset-generation pipeline.
Awu12277/dsh-stock-watch★ 22
A-share watchlist real-time market monitoring plugin: a collapsible popup in the top-right corner of the DeepSeek Harness (DSH) web interface for real-time quote monitoring, group switching, intraday and candlestick (K-line) charts, and buy/sell target price settings.
lhh010/dsh-minigames★ 18
Side-panel arcade: 18 offline mini-games to play while the model thinks.
hellodigua/dsh-emoji★ 17
Automatically add emojis to AI replies.