Problem
Time-to-first-prompt (TTFP) — from deepseek invocation to interactive cursor — is a first-impression metric. Slow startup hurts adoption. Today TTFP isn't measured.
Proposed solution
-
Measure. Add a --print-startup-trace debug flag that emits timestamps for every initialization step:
- process exec
- clap parse
- config load
- keyring probe
- MCP server connect (if enabled)
- skill discovery
- terminal init / alt-screen enter
- first render
-
Profile a cold launch on each platform. Linux x64, macOS arm64, Windows x64. Different bottlenecks.
-
Optimize the obvious:
- Lazy keyring probe — don't talk to the OS keyring unless the active provider has no env-var key. Today we probe all 4 providers regardless.
- Lazy MCP connect — defer MCP server connections to first tool-use, not startup. Saves the connect timeout × N when MCP is configured but unused this session.
- Lazy skill discovery — don't
fs::read_dir ~/.deepseek/skills/ unless /skill or /skills is invoked.
- Strip release binary — verify
[profile.release] strip = true in Cargo.toml. (Possibly already done.)
Acceptance criteria
Related
crates/cli/src/lib.rs and crates/tui/src/main.rs — startup paths.
crates/tui/src/mcp.rs — MCP connect timing.
crates/tui/src/skills.rs — skill discovery.
Problem
Time-to-first-prompt (TTFP) — from
deepseekinvocation to interactive cursor — is a first-impression metric. Slow startup hurts adoption. Today TTFP isn't measured.Proposed solution
Measure. Add a
--print-startup-tracedebug flag that emits timestamps for every initialization step:Profile a cold launch on each platform. Linux x64, macOS arm64, Windows x64. Different bottlenecks.
Optimize the obvious:
fs::read_dir~/.deepseek/skills/unless/skillor/skillsis invoked.[profile.release] strip = trueinCargo.toml. (Possibly already done.)Acceptance criteria
--print-startup-traceflag.docs/perf.md.Related
crates/cli/src/lib.rsandcrates/tui/src/main.rs— startup paths.crates/tui/src/mcp.rs— MCP connect timing.crates/tui/src/skills.rs— skill discovery.