LifeOS Doctor Tool Capabilities: Checking and Fixing Dependencies Complete Guide
LifeOS Doctor is a self-contained diagnostic utility that probes external tools and services, writes a TTL-based capability manifest, and provides copy-paste fix commands for every detected failure.
The LifeOS Doctor tool, implemented in [Doctor.ts](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/install/LIFEOS/TOOLS/Doctor.ts), serves as the central health monitor for the LifeOS ecosystem. It performs offline and network-based checks across 13+ capabilities, records results in capabilities.json, and emits actionable remediation commands that users can run immediately. A companion Pulse module at [doctor.ts](https://github.com/danielmiessler/LifeOS/blob/main/LifeOS/install/LIFEOS/PULSE/modules/doctor.ts) exposes this data via API for UI consumption.
Core Diagnostic Actions
LifeOS Doctor executes three primary functions: Probe, Reconcile, and Statusline.
Probe: Capability Detection and Manifest Generation
The Probe action iterates over the CAPS registry and evaluates each capability through a defined lifecycle:
- Skip if the capability was previously declined
- Check configuration via the
configured()function - Execute
probeOfflinefor local validation - Optionally execute
probeNetworkwhen--networkflag is provided - Record results with timestamp, TTL, status, and
fixCmd
bun LIFEOS/TOOLS/Doctor.ts
By default, this produces a formatted table showing live, broken, declined, or stale states.
Reconcile: Hook Registration Validation
The Reconcile action compares hooks present on disk against those registered in settings.json. It detects:
- Unwired hooks (registered but missing files)
- Missing hooks (files present but unregistered)
- Interpreter misconfigurations
Statusline: Prompt-Aware Health Signaling
The Pulse module consumes capabilities.json and doctor-heartbeat.json to emit a concise glyph for command-line prompts, signaling only newly-broken capabilities (respecting the ackedBroken list).
The Capability Registry
Each capability is defined in Doctor.ts with these properties:
id— internal manifest keytitle— human-readable descriptionpowers— functionality summaryttlHours— freshness duration for cached resultsconfigured()— determines if setup is presentprobeOffline— local validation functionprobeNetwork— optional live service checkfixCmd— copy-paste remediation command
Complete Capability List and Fix Commands
| Capability | What It Checks | Failure Mode | Fix Command |
|---|---|---|---|
| shadow-home | Orphaned memory trees from pre-#1451 installs | Legacy $HOME/.claude/LIFEOS/MEMORY trees exist |
bun <configRoot>/LIFEOS/TOOLS/Doctor.ts --reclaim |
| codex | codex CLI on $PATH and ~/.codex/auth.json |
Binary missing or auth file absent | bun install -g @openai/codex && codex login |
| interceptor | Interceptor skills, Chrome/Brave/Chromium, CLI/daemon, INTERCEPTOR_TEST_CONTEXT_ID |
Missing skills, browser, or test context | Run Interceptor skill setup, set INTERCEPTOR_TEST_CONTEXT_ID, then re-run Doctor |
| cloudflare | CLOUDFLARE_API_TOKEN and wrangler binary; optionally validates via wrangler whoami |
Missing token or binary | Add CLOUDFLARE_API_TOKEN to <configRoot>/.env, then: bun LIFEOS/TOOLS/Doctor.ts --network |
| voice | ELEVENLABS_API_KEY and optionally ELEVENLABS_VOICE_ID; optionally performs TTS request |
Missing credentials or API error (e.g., "famous_voice_not_permitted") | Set ELEVENLABS_VOICE_ID to API-permitted voice in <configRoot>/.env |
| ripgrep | rg binary on $PATH |
Binary missing | brew install ripgrep (Linux: sudo apt-get install ripgrep) |
| imagemagick | magick binary on $PATH |
Binary missing | brew install imagemagick (Linux: sudo apt-get install imagemagick) |
| gh | GitHub CLI gh on $PATH |
Binary missing | brew install gh && gh auth login (Linux: see cli.github.com) |
| ffmpeg | ffmpeg binary on $PATH |
Binary missing | brew install ffmpeg (Linux: sudo apt-get install ffmpeg) |
| ytdlp | yt-dlp binary on $PATH |
Binary missing | brew install yt-dlp (Linux: sudo apt-get install yt-dlp) |
| fabric | fabric binary on $PATH |
Binary missing | See fabric project for install instructions |
| jq | jq binary on $PATH |
Binary missing | brew install jq (Linux: sudo apt-get install jq) |
| hook-interpreters | Executable permissions, valid shebangs, and interpreter availability for registered hooks | Non-executable script, bad shebang, or missing interpreter | bun <configRoot>/LIFEOS/TOOLS/Doctor.ts --hooks |
Running Diagnostic Commands
Basic Offline Scan
bun LIFEOS/TOOLS/Doctor.ts
Produces a table with status glyphs: ✅ live, ❌ broken, ⏸ declined, ◌ stale.
Include Network Validation
bun LIFEOS/TOOLS/Doctor.ts --network
Enables live API calls for cloudflare (wrangler whoami) and voice (ElevenLabs TTS probe).
JSON Export for Automation
bun LIFEOS/TOOLS/Doctor.ts --json > doctor-report.json
Outputs the full Manifest structure including version, updatedAt, capabilities array, and integrity hash.
Opt-Out of Specific Capabilities
bun LIFEOS/TOOLS/Doctor.ts decline voice
Permanently silences voice warnings. The entry is marked declined in capabilities.json.
Re-Enable Declared Capabilities
bun LIFEOS/TOOLS/Doctor.ts enable voice
Removes the declined flag; subsequent runs will probe the capability again.
Acknowledge Current Failures
bun LIFEOS/TOOLS/Doctor.ts ack
Adds all currently broken capabilities to ackedBroken, suppressing the statusline glyph until a new regression appears.
Diagnose Hook Interpreters
bun LIFEOS/TOOLS/Doctor.ts --hooks
Reports per-hook issues such as:
myhook.hook.ts: not executable (chmod +x)somehook.hook.sh: shebang interpreter sh not on PATH
Reclaim Legacy Memory Trees
bun LIFEOS/TOOLS/Doctor.ts --reclaim
Detects pre-#1451 shadow $HOME/.claude/LIFEOS/MEMORY trees, merges JSONL logs, copies missing artifacts, and moves old data to timestamped backups.
Key Files and Their Roles
| File | Purpose | Location |
|---|---|---|
Doctor.ts |
Core implementation, capability definitions, CLI, manifest I/O | LIFEOS/install/LIFEOS/TOOLS/Doctor.ts |
doctor.ts (Pulse) |
Read-only API serving manifest, heartbeat, and hook reconciliation | LIFEOS/install/LIFEOS/PULSE/modules/doctor.ts |
settings.json |
User hook registrations; inspected by hook-interpreters check |
~/.claude/settings.json (user-specific) |
capabilities.json |
TTL-based advisory cache with SHA-256 integrity hash | ~/.claude/LIFEOS/MEMORY/STATE/ (runtime) |
doctor-heartbeat.json |
Run timestamp and network flag record | ~/.claude/LIFEOS/MEMORY/STATE/ (runtime) |
.capabilities-salt |
32-byte random salt for manifest hashing | ~/.claude/LIFEOS/MEMORY/STATE/ (runtime) |
The manifest is write-locked to the Doctor tool itself; the UI and Pulse module consume it read-only, ensuring single-source-of-truth integrity.
Summary
- LifeOS Doctor probes 13+ capabilities ranging from CLI binaries (
rg,jq,ffmpeg) to authenticated services (codex,cloudflare,voice) - Three action modes: Probe (manifest generation), Reconcile (hook validation), and Statusline (prompt health glyph)
- TTL-based caching prevents redundant checks while keeping results fresh per-capability
- Copy-paste fix commands eliminate guesswork for every detected failure
- Network probing (
--network) validates live service authentication without making it mandatory - Declarative lifecycle management via
decline,enable, andacksubcommands lets users curate their dependency surface
Frequently Asked Questions
How does LifeOS Doctor determine if a capability is broken?
LifeOS Doctor calls the configured() function for each capability to check whether required setup exists (binaries on $PATH, environment variables, auth files). If configured() returns false, the capability is marked broken immediately with its fixCmd. Otherwise, probeOffline runs to validate functionality. Network probes only execute with the --network flag.
What is the difference between declined and ackedBroken states?
Declined (bun Doctor.ts decline <cap>) permanently removes a capability from consideration—the user explicitly opts out. AckedBroken (bun Doctor.ts ack) suppresses the statusline glyph for currently broken capabilities while keeping them in the manifest; new failures will still trigger alerts.
Can I use LifeOS Doctor output in CI/CD pipelines?
Yes. Run bun LIFEOS/TOOLS/Doctor.ts --json to emit machine-readable output. The JSON contains the full Manifest type with version, timestamp, per-capability status, and fix commands. Parse the capabilities array to gate workflows on specific dependency availability.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →