26382a7ac6
CI / Clippy (push) Failing after 15m13s
CI / Test (ubuntu-latest) (push) Failing after 16m1s
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Build (no embeddings / no ORT) (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Cookbook (Node) (push) Has been cancelled
CI / Pi Extension (Node) (push) Has been cancelled
CI / Rust SDK (lean-ctx-client) (push) Has been cancelled
CI / Embed SDK (lean-ctx-sdk) (push) Has been cancelled
CI / Python SDK (leanctx) (push) Has been cancelled
CI / Hermes Plugin (Python) (push) Has been cancelled
CI / SDK Conformance Matrix (push) Has been cancelled
CI / Coverage (push) Has been cancelled
CI / cargo-deny (push) Has been cancelled
CI / Adversarial Safety (push) Has been cancelled
CI / Benchmarks (push) Has been cancelled
CI / Output-Quality Gate (eval A/B) (push) Has been cancelled
CI / Documentation (push) Has been cancelled
CI / CI Green (push) Has been cancelled
JetBrains Plugin / Actionlint (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (rust) (push) Has been cancelled
JetBrains Plugin / Validation (push) Has been cancelled
JetBrains Plugin / Build (push) Has been cancelled
JetBrains Plugin / Test (push) Has been cancelled
Security Check / Security Scan (push) Has been cancelled
258 lines
11 KiB
Markdown
258 lines
11 KiB
Markdown
# Journey 6 — Lifecycle & Troubleshooting
|
||
|
||
> You're set up and using lean-ctx. Now you need to update it, fix something, or
|
||
> remove it cleanly. This journey covers the whole lifecycle.
|
||
|
||
> **Just need to fix a specific symptom?** Jump to the central
|
||
> [Journey 12 — Troubleshooting Playbook](12-troubleshooting.md) (symptom →
|
||
> diagnosis → fix). This journey covers the lifecycle *commands* themselves.
|
||
|
||
Source files:
|
||
- `rust/src/core/updater.rs` — self-update + post-update rewire
|
||
- `rust/src/core/update_scheduler.rs` — auto-update scheduling
|
||
- `rust/src/uninstall/mod.rs` — clean removal
|
||
- `rust/src/doctor/` — diagnostics & `--fix`
|
||
- `rust/src/cli/dispatch/lifecycle.rs` — `stop`, `restart`, `dev-install`
|
||
|
||
---
|
||
|
||
## 1. `lean-ctx update` — self-update from GitHub Releases
|
||
|
||
> **This is how everyone updates lean-ctx.** It downloads a prebuilt binary for
|
||
> your platform in seconds — no Rust toolchain, no compilation. The network
|
||
> phases (DNS, connect, time-to-first-byte) are bounded by timeouts, so a dead
|
||
> network or unresponsive mirror fails fast with a clear error instead of
|
||
> appearing "stuck". (For building from source, see `dev-install` in §4 — that's
|
||
> a contributor workflow, not the normal update path.)
|
||
|
||
```bash
|
||
lean-ctx update # check + install latest
|
||
lean-ctx update --check # only report whether an update exists
|
||
lean-ctx update --insecure # skip checksum verification (not recommended)
|
||
lean-ctx update --skip-rules # update without touching your rules files
|
||
```
|
||
|
||
**Under the hood** (`updater::run`):
|
||
|
||
1. Fetches `releases/latest` from the GitHub API; compares tag to current
|
||
`CARGO_PKG_VERSION`.
|
||
2. If already current: prints "Already up to date", then still runs a **setup
|
||
refresh** (`post_update_rewire`) so your wiring stays correct after an editor
|
||
update — unless `--check`.
|
||
3. If newer: downloads the platform asset (`platform_asset_name` resolves
|
||
os/arch, including glibc vs musl on Linux), **verifies the SHA256 checksum**
|
||
(refuses to install an unverifiable binary unless `--insecure`), then
|
||
replaces the running binary safely:
|
||
- macOS: unlink-then-rename (avoids SIGKILL from code-page revalidation),
|
||
then re-`codesign`.
|
||
- Windows: rename-out / rename-in, with a deferred `.bat` updater if the
|
||
binary is locked by a running editor MCP server.
|
||
4. Runs `post_update_rewire(skip_rules)`.
|
||
|
||
### `post_update_rewire` — why your settings are safe
|
||
|
||
This is the function behind the old "update changed my settings" complaint. It:
|
||
|
||
- Re-enables the proxy **only if it was already active**.
|
||
- Computes `effective_skip_rules`: CLI `--skip-rules` always wins; otherwise it
|
||
respects your `config.toml` rules opt-in. **If you never opted into rules,
|
||
update will not write rules files.**
|
||
- Runs `run_setup_with_options({ non_interactive, yes, fix, skip_proxy, skip_rules })`
|
||
which always refreshes MCP configs (so the editor reconnects to the new
|
||
binary) but only touches rules when allowed.
|
||
|
||
> The unchanged version of any file lean-ctx edits is always in a sibling
|
||
> `*.lean-ctx.bak`. Rules edits only ever change content between
|
||
> `<!-- lean-ctx -->` markers.
|
||
|
||
### Auto-update scheduling
|
||
|
||
```bash
|
||
lean-ctx update --schedule # enable 6-hourly auto-update
|
||
lean-ctx update --schedule 12h # custom interval (1–168h)
|
||
lean-ctx update --schedule notify # check + notify, don't auto-install
|
||
lean-ctx update --schedule off # disable
|
||
lean-ctx update --schedule status # show current schedule
|
||
```
|
||
|
||
Backed by a LaunchAgent (macOS) / systemd user timer (Linux). No mid-session
|
||
restarts — updates install in the background and take effect on next launch.
|
||
|
||
---
|
||
|
||
## 2. `lean-ctx uninstall` — clean removal
|
||
|
||
```bash
|
||
lean-ctx uninstall # full removal: processes, configs, autostart, data, binary
|
||
lean-ctx uninstall --keep-config # keep MCP configs + rules (for reinstall)
|
||
lean-ctx uninstall --keep-binary # remove everything except the binary
|
||
lean-ctx uninstall --dry-run # preview every change, write nothing
|
||
```
|
||
|
||
No binary on PATH (or you installed via `curl … | sh`)? The same removal runs
|
||
straight from the installer:
|
||
|
||
```bash
|
||
curl -fsSL https://leanctx.com/install.sh | sh -s -- --uninstall
|
||
```
|
||
|
||
**Under the hood** (`uninstall::run`) — removes, in order:
|
||
|
||
1. **Stops everything first** — daemon, proxy, and any stray `lean-ctx` processes
|
||
(mirrors `lean-ctx stop`; the current process and IDE-owned MCP servers are
|
||
excluded). This guarantees nothing respawns or holds the files we delete next.
|
||
2. Shell hook + proxy env exports (RC files cleaned surgically).
|
||
3. MCP configs + rules files (unless `--keep-config`).
|
||
4. Agent hook files, plan-mode settings, skill dirs, project agent files.
|
||
5. Proxy autostart + daemon autostart (LaunchAgent/systemd `unload` + file removal).
|
||
6. Orphaned `.lean-ctx.bak` / `.tmp` backups across all known editor dirs.
|
||
7. The data directory (`~/.lean-ctx`, `~/.config/lean-ctx`) + project-local
|
||
`.lean-ctx/` and `.lean-ctx-id`.
|
||
8. **The binary itself** (unless `--keep-binary`): the managed copy/symlink in
|
||
`~/.local/bin` (or `$LEAN_CTX_INSTALL_DIR`), `/usr/local/bin`, and the running
|
||
executable. On Unix the running binary is unlinked safely (the process keeps
|
||
working until exit). Package-manager and in-repo dev installs are **not** touched:
|
||
- cargo install → defers with `cargo uninstall lean-ctx`
|
||
- Homebrew → defers with `brew uninstall lean-ctx`
|
||
- a build under `target/release` → left alone (your repo checkout)
|
||
|
||
Every edit backs up first; successful surgical edits then clean their backups.
|
||
Afterwards: restart your shell, then `command -v lean-ctx # should print nothing`.
|
||
|
||
---
|
||
|
||
## 3. `lean-ctx doctor [--fix]` — diagnose & repair
|
||
|
||
See [Journey 1 §6](01-setup-and-onboarding.md#6-lean-ctx-doctor--is-everything-wired-up).
|
||
For troubleshooting specifically:
|
||
|
||
- `doctor` shows what's wrong with an action-oriented footer.
|
||
- `doctor --fix` re-runs merge-based setup and repairs MCP/rules/hook drift.
|
||
- `doctor integrations` does deep per-editor checks (Cursor/Claude Code).
|
||
|
||
---
|
||
|
||
## 4. Process control — `stop`, `restart`, `dev-install`
|
||
|
||
```bash
|
||
lean-ctx stop # stop ALL lean-ctx processes (daemon, proxy, orphans)
|
||
lean-ctx restart # restart the daemon (applies config.toml changes)
|
||
lean-ctx dev-install # build release + atomic install + restart (dev only)
|
||
```
|
||
|
||
> **`dev-install` builds from source** (`cargo build --release`) and is meant for
|
||
> **contributors** hacking on lean-ctx itself. The first build compiles the whole
|
||
> dependency tree and can take **several minutes** — the live cargo output is
|
||
> normal progress, not a hang. If you just want the latest release, use
|
||
> **`lean-ctx update`** (§1) instead: it downloads a prebuilt binary in seconds
|
||
> and needs no toolchain.
|
||
|
||
> Important (macOS): the proxy runs as a LaunchAgent with `KeepAlive=true`. A
|
||
> plain `kill`/`pkill` will be respawned. `lean-ctx stop` unloads the LaunchAgent
|
||
> first, then terminates everything. Always `lean-ctx stop` before manually
|
||
> replacing the binary.
|
||
|
||
> macOS privacy (#356): the daemon, proxy and auto-updater LaunchAgents are
|
||
> launched through `sandbox-exec` with a Seatbelt profile that denies
|
||
> `~/Documents`, `~/Desktop` and `~/Downloads`. As their own TCC identity these
|
||
> processes would otherwise trigger the "access your Documents folder" prompt on
|
||
> every update; the kernel-level deny makes that prompt structurally impossible,
|
||
> with no "Allow" ever required. See Journey 13 §3.1.
|
||
|
||
---
|
||
|
||
## 5. Emergency / "my shell is broken"
|
||
|
||
If a shell alias misbehaves:
|
||
|
||
```bash
|
||
lean-ctx-off # disable all aliases for the current session
|
||
lean-ctx uninstall # permanent: remove all hooks
|
||
```
|
||
|
||
Aliases are designed to fall back to the original command if the binary is
|
||
missing, so a broken/removed binary never bricks your shell. The
|
||
`LEAN_CTX_DISABLED=1` env var bypasses all compression and prevents the hook
|
||
from loading at all.
|
||
|
||
---
|
||
|
||
## 6. Cache & storage maintenance
|
||
|
||
```bash
|
||
lean-ctx cache list # show file-read cache entries
|
||
lean-ctx cache stats # cache size + hit stats
|
||
lean-ctx cache invalidate <file> # drop one file from the read cache
|
||
lean-ctx cache clear # clear the read cache
|
||
lean-ctx cache reset [--project] # reset all cache (or just this project)
|
||
lean-ctx cache prune # remove oversized/quarantined/orphaned indexes (BM25 + graphs)
|
||
```
|
||
|
||
Use `cache invalidate <file>` for surgical eviction (e.g. a file changed outside
|
||
the watcher); `cache reset --project` wipes only the current project's cache,
|
||
while `cache reset` wipes everything.
|
||
|
||
**Golden output — `lean-ctx cache stats`** reports the read cache size and how
|
||
often re-reads were served from it (each hit is a ~13-token read instead of a
|
||
full file):
|
||
|
||
```text
|
||
CLI Cache Stats:
|
||
Entries: 1
|
||
Reads: 3
|
||
Hits: 1
|
||
Hit Rate: 33%
|
||
```
|
||
|
||
The doctor warns when the BM25 cache has quarantined indexes or when the archive
|
||
FTS approaches its size cap — both are resolved by the commands above.
|
||
|
||
---
|
||
|
||
## 7. Platform notes (Windows / cross-platform)
|
||
|
||
lean-ctx runs on macOS, Linux, and Windows. A few behaviors are platform-specific:
|
||
|
||
**Path display.** All file paths in tool output are normalized to forward
|
||
slashes (`C:/Users/you/proj/src/main.rs`), even on Windows. Forward slashes are
|
||
valid path separators on Windows, and — unlike backslashes — they are never
|
||
misinterpreted as escape sequences by the JSON, markdown, or terminal layers of
|
||
MCP clients. (Earlier versions could render `C:\Users\…` as `CUsers…` in some
|
||
clients; that is fixed.) This is purely a display normalization; the underlying
|
||
file operations use native paths.
|
||
|
||
**Data directory.** On Windows the data dir resolves the same way (§
|
||
[paths reference](appendix-paths-and-config.md)): `%LEAN_CTX_DATA_DIR%` →
|
||
`~/.lean-ctx` with markers → XDG → fallback. `~` is your user profile
|
||
(`C:\Users\<you>`).
|
||
|
||
**Shell hook.** PowerShell uses
|
||
`~/Documents/PowerShell/Microsoft.PowerShell_profile.ps1`; Git Bash / MSYS2 uses
|
||
the bash hook. lean-ctx auto-detects MSYS-style `/c/Users/...` paths and converts
|
||
them to `C:/Users/...`.
|
||
|
||
**Autostart.** Windows has no LaunchAgent/systemd equivalent wired up; the proxy
|
||
and daemon run on demand rather than via an OS autostart unit.
|
||
|
||
If a path ever looks wrong in tool output, run `lean-ctx doctor` and, if it
|
||
persists, file an issue with the exact rendered path and your client name.
|
||
|
||
---
|
||
|
||
## 8. Reporting a problem — `report-issue`
|
||
|
||
When something is wrong and `doctor --fix` didn't resolve it, lean-ctx can open a
|
||
pre-filled GitHub issue that bundles your diagnostics:
|
||
|
||
```bash
|
||
lean-ctx report-issue # (alias: lean-ctx report)
|
||
```
|
||
|
||
This gathers version, platform, integration status, and recent diagnostics into
|
||
an issue template so maintainers get a reproducible report without you hand-
|
||
collecting it. Review the contents before submitting — nothing is sent without
|
||
your confirmation, and secrets are not included.
|
||
|
||
> Best practice: run `lean-ctx doctor --json` first, attach that output, and
|
||
> describe the exact command and the client (Cursor/Claude/…) you were using.
|