Code → Symbols →
Ghost Tree.
GhostMap works in layers. Each layer builds on the previous one - the model is consistent whether you open a 10-line file or a 60,000-line one.
Four layers. One tree.
Symbol extraction
GhostMap reads your file and extracts meaningful symbols: classes, functions, interfaces, structs, and enums. It uses the strongest available extractor for your supported language, then falls back gracefully when needed.
Anchor parsing
Every @ghost comment in the file is parsed: description, status, name, range markers. Contextual anchors attach to the nearest symbol. Named anchors and Ghost Ranges create independent nodes.
Tree construction
Symbols and anchors are organized into a hierarchy by range containment - if a symbol starts inside a Range, it becomes a child of that Range. The result is a tree that reflects your code's actual structure.
After the first analysis of an active file, GhostMap persists the complete tree into the per-document Ghost Index – a local snapshot fingerprinted with the file’s content hash, stored under .ghostmap/ghostmap.json. Every subsequent open of that same file loads from the snapshot in milliseconds, with zero LSP work. V1 is per-file: only files you have opened are cached.
Active file today. Workspace tomorrow.
GhostMap V1 ships an active-file Ghost Tree backed by a per-document local cache. The workspace-wide indexing engine is the V2 direction – designed but not shipped.
V1 – today shipped
- Active-file Ghost Tree from the best available local extractor.
- Per-document snapshot in
.ghostmap/ghostmap.json. - Fingerprint-validated reload, optimistic trust on activate.
- No workspace-wide index, no file-system watcher, no background fingerprint validator (the previous one was removed in round 6 because it froze the host).
V2 indexing engine planned
- Workspace-wide Ghost Index v2 as sharded JSON snapshots.
- Ghost Watcher on the file system, debounced per URI.
- Incremental background indexing in a worker thread, off the Extension Host main loop.
- Keeps V1 active-file responsiveness untouched on the fast path.
Status: V2 design + skeleton branches only. Not in any shipped 0.5.x. Future enterprise-oriented integrations on top of V2 (Jira / Slack, Ghost Threads, Ghost Graph, AI explanations, permissions & audit log) are sketched on the Roadmap page as future direction, not shipped.
Three ways to annotate.
Pick the right anchor for what you're describing. Each type creates a different kind of node in the Ghost Tree.
No name. Attaches silently to the nearest symbol within the ownership radius (default: 5 lines). The description and status appear on login in the tree.
Has a #name. Creates an independent node in the tree - doesn't need a symbol nearby. Good for notes, open questions, or flagging a section of a file.
A named anchor that owns everything between start and end. All symbols inside become children of this node in the tree.
Track work state in the tree.
Every anchor can carry a status. Filter the Ghost Tree by status to see only what's pending, in review, or done.
in progress → in-progress). If you use a value GhostMap doesn't recognize, it offers a quick fix with the closest match.
Try it on your own project.
Install from a local VSIX, then add your first @ghost in minutes.
GhostMap