Back to home@Mide69

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:

  1. It registers a minimal console exporter on ctx.logger, so every plugin's existing log calls become visible, not just this plugin's own.
  2. 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

FieldDefaultMeaning
checkDelayMs5000How long to wait after mount before scanning for stuck entries.
logEntryInitfalseAlso 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