lsp-onboard

$npx mdskill add blackwell-systems/agent-lsp/lsp-onboard

Explores and maps new codebases for efficient onboarding

  • Analyzes project structure to identify build systems and test runners
  • Uses LSP tools like documentSymbolProvider and referencesProvider
  • Detects entry points, key types, and architecture patterns
  • Generates a structured project profile for future reference

SKILL.md

.github/skills/lsp-onboardView on GitHub ↗
---
name: lsp-onboard
description: First-session project onboarding. Explores the project structure, detects build system, test runner, entry points, and key architecture patterns. Produces a structured project profile the agent can reference throughout the session.
argument-hint: "[workspace-root-path]"
user-invocable: true
allowed-tools: mcp__lsp__start_lsp mcp__lsp__detect_lsp_servers mcp__lsp__list_symbols mcp__lsp__find_symbol mcp__lsp__blast_radius mcp__lsp__run_build mcp__lsp__run_tests mcp__lsp__get_diagnostics mcp__lsp__get_editing_context
license: MIT
compatibility: Requires the agent-lsp MCP server (github.com/blackwell-systems/agent-lsp)
metadata:
  required-capabilities: documentSymbolProvider
  optional-capabilities: referencesProvider callHierarchyProvider
---

# lsp-onboard

First-session project onboarding. Run this when connecting to a new project
for the first time. Explores the codebase via LSP tools and produces a
structured project profile: languages, build system, test runner, entry
points, key types, and architecture patterns.

The profile helps the agent make better decisions throughout the session
without re-exploring the same ground. Run once per project; skip on
subsequent sessions unless the project structure has changed significantly.

## When to Use

- First time working in a new codebase
- After major structural changes (new packages, build system migration)
- When the agent seems confused about project conventions

Do NOT run this on every session. It's a one-time exploration.

---

## Step 1: Detect languages and servers

```
mcp__lsp__detect_lsp_servers({ "workspace_dir": "<root>" })
```

Record which languages are present and which servers are available.
This tells you what the project is built with.

## Step 2: Initialize and verify

```
mcp__lsp__start_lsp({ "root_dir": "<root>" })
```

Wait for initialization. Call `list_symbols` on one key file to verify
the workspace is indexed.

## Step 3: Identify entry points

Search for common entry point patterns:

```
mcp__lsp__find_symbol({ "query": "main" })
mcp__lsp__find_symbol({ "query": "Run" })
mcp__lsp__find_symbol({ "query": "Handler" })
```

Record entry points with their file paths. These are where execution starts.

## Step 4: Map the package structure

For each top-level directory that contains source files, call `list_symbols`
on one representative file:

```
mcp__lsp__list_symbols({ "file_path": "<dir>/main.go", "format": "outline" })
```

Build a mental map: which packages exist, what they export, how they relate.
Cap at 10 packages to avoid spending too long.

## Step 5: Detect build and test commands

```
mcp__lsp__run_build({ "workspace_dir": "<root>" })
mcp__lsp__run_tests({ "workspace_dir": "<root>" })
```

Record whether build and tests pass, and what language/toolchain was detected.
Note the test count and any failures.

## Step 6: Identify hotspots

Pick the 3-5 files that appear most central (entry points, shared types,
core logic). For each:

```
mcp__lsp__blast_radius({ "changed_files": ["<file>"] })
```

Files with the most non-test callers are the architectural hotspots.
Changes to these files have the widest blast radius.

## Step 7: Check for diagnostics

```
mcp__lsp__get_diagnostics({ "file_path": "<entry-point>" })
```

Note any pre-existing errors or warnings. This sets the baseline
so the agent knows what was broken before it started.

## Step 8: Produce the project profile

Write a structured summary:

```
## Project Profile: <name>

### Languages
- Go (primary), TypeScript (frontend)

### Build & Test
- Build: `go build ./...` (passes)
- Test: `go test ./...` (142 tests, 0 failures)

### Entry Points
- cmd/server/main.go:15 (main)
- cmd/worker/main.go:22 (main)

### Package Map
- cmd/server/     (HTTP server, routing)
- cmd/worker/     (background job processor)
- internal/api/   (handler layer)
- internal/store/ (database access)
- internal/types/ (shared type definitions)

### Hotspots (most referenced)
1. internal/types/models.go: 85 callers across 12 files
2. internal/store/queries.go: 42 callers across 8 files
3. internal/api/handlers.go: 31 callers across 6 files

### Pre-existing Issues
- 0 errors, 2 warnings (unused imports in test files)

### Conventions Observed
- Error wrapping with fmt.Errorf
- Table-driven tests
- Handler functions return (result, error)
```

This profile is for the agent's reference during the session. It does not
need to be saved to disk; it lives in the conversation context.

---

## Notes

- Cap exploration at 10 packages and 5 hotspot files to keep the
  onboarding under 2 minutes
- If `blast_radius` is slow (large files), skip the hotspot step
  and note "hotspot analysis skipped (large codebase)"
- The profile is advisory; update it mentally as you learn more during
  the session

More from blackwell-systems/agent-lsp

SkillDescription
lsp-architectureGenerate a structural architecture overview of a codebase: languages, package map, entry points, dependency graph, and hotspots. One call for the big picture.
lsp-concurrency-auditConcurrency safety audit for a type or file. Maps all fields, traces which are accessed from concurrent contexts (goroutines, threads, async tasks), and flags fields that lack synchronization. Produces a field-level safety report. Language-agnostic across 4 concurrency families.
lsp-cross-repoCross-repository analysis — find all callers of a library symbol in one or more consumer repos. Use when refactoring a shared library and need to understand how consumers use it.
lsp-dead-codeEnumerate exported symbols in a file and surface those with zero references across the workspace. Use when auditing for dead code, cleaning up APIs, or checking which exports are safe to remove.
lsp-docsThree-tier documentation lookup for any symbol — hover → offline toolchain doc → source definition. Use when hover text is absent, insufficient, or the symbol is in an unindexed dependency.
lsp-edit-exportSafe workflow for editing exported symbols or public APIs. Use when changing a function signature, modifying a public type, or altering any symbol used outside its own package — finds all callers first so nothing breaks silently.
lsp-edit-symbolEdit a named symbol without knowing its file or position. Use when you want to change a function, type, or variable by name and don't have exact coordinates. Resolves the symbol to its definition, retrieves its full range, and applies the edit.
lsp-explore"Tell me about this symbol": hover + implementations + call hierarchy + references in one pass — for navigating unfamiliar code.
lsp-extract-functionExtract a selected code block into a named function. Primary path uses the language server's extract-function code action; falls back to manual extraction when no code action is available. Validates captured variables, scope shadowing, and compilation after extraction.
lsp-fix-allApply available quick-fix code actions for all current diagnostics in a file, one at a time with re-collection between each fix. Use to bulk-resolve errors and warnings the language server can fix automatically.