moving-target
DSH plugin: cold-start context — distills your first prompts into one goal paragraph injected into every new session
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 27, 2026
- Updated
- Aug 27, 2026
Introduction
moving-target
Cold-start context for DeepSeek Harness. Every new session, you re-explain your project's goal to the agent. Context files (AGENTS.md and friends) fix that — until they rot: every stale idea and abandoned decision in them contaminates every future session.
moving-target takes a different input: not a hand-maintained file, but the first prompt you sent to every past session in this workspace. Those prompts are the truest record of what the project is about. A bootstrap run distills them into one goal paragraph, saved in the workspace; from then on, every new session starts with that paragraph already injected.
How it works
-
moving-target-bootstrapextracts the first user prompt of every top-level session recorded for this workspace (~/.dsh/sessions/…, deterministic scan — no LLM involved). -
The full DATE-TIME-PROMPT list is handed to the agent with one instruction: summarize the end goal of this project in one paragraph.
-
The agent returns the paragraph via the built-in
moving_target_save_summarytool, which validates it and writes.moving-target/summary.md(metadata header + paragraph). -
On every subsequent session start (
startuponly — resumed sessions are left alone), if.moving-target/summary.mdexists in the workspace, the summary is injected as visible plugin context before your first prompt:Project goal (moving-target, bootstrapped 2026-08-23T03:41:07.000Z): <paragraph>
Not bootstrapped? Nothing happens — zero overhead.
Install
Plugins install per-profile. From this repo, pack a tarball and add it to your profile:
dsh plugin --profile <your-profile> add github:andrepontesmelo/moving-target
Or from a local checkout:
npm pack
cd ~/.dsh/profiles/<your-profile>
dsh plugin --profile <your-profile> add file:/path/to/moving-target-0.1.5.tgz
Mount it by adding an insert row to the profile's cordis.patch.yml:
- insert:
- id: moving-target
name: moving-target
Requirements: Node ≥ 22.6 (type-stripping) and the zstd binary on PATH. Sessions are read-only to moving-target; it never writes to the DSH store.
Usage
/moving-target-bootstrap
Run it once per workspace. It is re-runnable and overwrites — that is the escape hatch when the frozen summary drifts from reality (see caveats). After bootstrapping, do nothing; new sessions pick up the summary automatically.
To update the summary based on the current session outcome:
/moving-target-update
The current summary is read deterministically by the command and injected into the prompt — the agent never reads the file itself.
The standalone extractor CLI is available too:
npx moving-target-extract /path/to/workspace
# 2026-08-22 20:19 /wayfinder Here, in this folder, I want to implement…
.gitignore guidance
.moving-target/ is personal context distilled from your session history. Ignore it by default:
.moving-target/
Commit it deliberately only if the team agrees the summary should be shared (and re-bootstrapped collectively).
Caveats
- Summaries go stale; refresh deliberately. The summary is a snapshot of the project at bootstrap time; re-run
/moving-target-bootstrapor run/moving-target-updateto refresh it. - Subagent sessions are excluded from extraction; only sessions where the first message came from a human count.
- The injected summary is model-facing context tagged
plugin/instructions— visible in transcripts, but it is not a substitute for a real prompt.