dsh-boot-doctor
DeepSeek Harness plugin: console log sink and stuck-plugin warnings
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 27, 2026
- Updated
- Aug 27, 2026
Introduction
dsh-boot-doctor
A DeepSeek Harness plugin. Mounts a console log sink and warns about plugins that resolve, validate, and then never activate.
Why this exists
Cordis, the plugin framework DeepSeek Harness is built on, always has a ctx.logger. But without an exporter registered, every ctx.logger.warn(...) call in the whole plugin tree is silently buffered and never printed. None of the shipped profiles (headless, web) mount a console exporter by default.
The practical effect: a plugin can be installed correctly, pass config validation, and then just never activate, most often because of an unsatisfied inject requirement or a config-load failure caught by a try/catch. Nothing prints. Nothing crashes. The plugin is just quietly inert, and there is no way to tell from the outside.
This plugin fixes both halves of that problem:
- It registers a minimal console exporter on
ctx.logger, so every plugin's existing log calls become visible, not just this plugin's own. - A few seconds after mount, it scans the loader's entry list for anything that resolved and validated but has no active fiber, and prints one clear line per stuck entry naming it.
Install
npm install dsh-boot-doctor
Use
Insert it first in a profile's patch, so it starts logging before anything else mounts:
- insert:
- id: boot-doctor
name: dsh-boot-doctor
dsh --profile headless --patch patch.yml "your task"
Config
| Field | Default | Meaning |
|---|---|---|
checkDelayMs | 5000 | How long to wait after mount before scanning for stuck entries. |
logEntryInit | false | Also log every entry as it mounts, not just the ones that never activate. |
- insert:
- id: boot-doctor
name: dsh-boot-doctor
config:
checkDelayMs: 8000
logEntryInit: true
What it does not do
It does not fix the underlying activation problem, it only makes it visible. It does not read plugin source or diagnose which specific inject key is missing, since that would mean reaching into framework internals this package does not depend on. It just tells you which plugin id and name is stuck, so you know where to start.
License
MIT