Repository files navigation

gmap — Codebase Graph Mapper

Understand codebases at the speed AI generates them.

gmap statically analyses TypeScript/JavaScript projects and builds a navigable call graph stored in a local SQLite database. Query it from the CLI, the VS Code extension, or the browser dashboard — all without leaving your machine.


Quick Start

# Install globally
npm install -g gmap-cli
# Index your project
gmap scan .# Ask questions
gmap why approveEstimate # who calls this?
gmap impact approveEstimate # what breaks if I change it?
gmap trace approveEstimate # full call chain# Open the interactive graph dashboard
gmap serve # → http://localhost:7842

Package Architecture

 @gmap/cli ──────────────────────────────┐
│
@gmap/dashboard ─── (Vite build) ──┐ │
▼ ▼
┌─────────────────┐
@gmap/vscode ───────────── ▶│ @gmap/core │
│ │
@gmap/server ──────────── ▶│ • scanner │
│ • graph engine │
@gmap/tracer ─────────── ▶│ • SQLite DB │
│ • adapters │
└─────────────────┘

Every package consumes @gmap/core — the single source of truth. No package imports from a sibling.

graph TD
CLI["@gmap/cli"] --> Core["@gmap/core"]
Dashboard["@gmap/dashboard (static build)"] --> Server
VSCode["@gmap/vscode"] --> Server["@gmap/server"]
Server --> Core
Tracer["@gmap/tracer"] --> Core
VSCode -.->|HTTP + WebSocket| Server
CLI -.->|spawns if needed| Server
Loading

Package descriptions

PackageRole
@gmap/coreScanner, graph engine, SQLite layer, language adapter registry. The only package allowed to touch the database.
@gmap/cliCommander.js CLI. Thin wrapper — all logic lives in core.
@gmap/serverExpress + WebSocket API server. Serves the dashboard as static files. Binds to 127.0.0.1 only.
@gmap/dashboardReact + Cytoscape.js graph visualiser. Vite builds it to packages/server/dist/public/.
@gmap/vscodeVS Code extension. Talks to the API server over HTTP/WebSocket — never imports core directly.
@gmap/tracerRuntime instrumentation (M7). Patches function calls and streams real call events to the server.

CLI Reference

CommandWhat it does
gmap scan <path>Walk files, parse symbols, write to SQLite
gmap why <symbol>List every caller of a symbol
gmap impact <symbol>Blast radius — everything that would break
gmap trace <symbol>Full call chain from entrypoints
gmap explain <symbol>AI-generated description (opt-in)
gmap serveStart the API server + open dashboard

All commands use full English words. No abbreviations. No cryptic flags.


Architecture & Governance

Design decisions, standards, and workflow rules are documented here:

Architecture Decisions (ADRs)

ADRTitle
0001Local-first, server-optional
0002SQLite as the single source of truth
0003Language-agnostic adapter architecture
0004WebSocket for streaming, REST for queries
0005VS Code extension as primary distribution
0006ts-morph over raw TypeScript Compiler API
0007Call graph accuracy over completeness
0008AI is strictly optional
0009Web dashboard over terminal UI
0010Port 7842 as default API port
0011CLI commands read like plain English

Standards & Processes


Roadmap

MilestoneDescriptionStatus
Phase 1Monorepo scaffold✅ Done
M1Repository scanner (file walk + ts-morph parse)🔜 Next
M2Graph engine (SQLite-backed call graph)
M3REST + WebSocket API server
M4React graph dashboard
M5VS Code extension (hover, CodeLens, sidebar)
M6CLI commands (why, impact, trace)
M7Runtime tracer (real call edges)
M8AI explain layer (Ollama, Anthropic, OpenAI)

Development

# Install dependencies
pnpm install
# Build all packages
pnpm build
# Type-check all packages
pnpm typecheck
# Run all tests
pnpm test# Build + watch (Turbo)
pnpm dev

Requirements

  • Node.js 20+ (.nvmrc pins the version)
  • pnpm 9+

Design Principles

  • Local-first: runs entirely on your machine. No cloud, no telemetry, no account required.
  • AI-optional: core features work without any AI. gmap explain is the only AI-gated command.
  • TypeScript-first, language-agnostic: the parser is pluggable. Python and Go adapters don't touch the graph engine.
  • Honest about uncertainty: unresolvable call edges are marked unresolved, not silently dropped.

License

MIT

About

Understand codebases at the speed AI generates them.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

gmap — Codebase Graph Mapper

Understand codebases at the speed AI generates them.

gmap statically analyses TypeScript/JavaScript projects and builds a navigable call graph stored in a local SQLite database. Query it from the CLI, the VS Code extension, or the browser dashboard — all without leaving your machine.


Quick Start

# Install globally
npm install -g gmap-cli
# Index your project
gmap scan .# Ask questions
gmap why approveEstimate # who calls this?
gmap impact approveEstimate # what breaks if I change it?
gmap trace approveEstimate # full call chain# Open the interactive graph dashboard
gmap serve # → http://localhost:7842

Package Architecture

 @gmap/cli ──────────────────────────────┐
│
@gmap/dashboard ─── (Vite build) ──┐ │
▼ ▼
┌─────────────────┐
@gmap/vscode ───────────── ▶│ @gmap/core │
│ │
@gmap/server ──────────── ▶│ • scanner │
│ • graph engine │
@gmap/tracer ─────────── ▶│ • SQLite DB │
│ • adapters │
└─────────────────┘

Every package consumes @gmap/core — the single source of truth. No package imports from a sibling.

graph TD
CLI["@gmap/cli"] --> Core["@gmap/core"]
Dashboard["@gmap/dashboard (static build)"] --> Server
VSCode["@gmap/vscode"] --> Server["@gmap/server"]
Server --> Core
Tracer["@gmap/tracer"] --> Core
VSCode -.->|HTTP + WebSocket| Server
CLI -.->|spawns if needed| Server
Loading

Package descriptions

PackageRole
@gmap/coreScanner, graph engine, SQLite layer, language adapter registry. The only package allowed to touch the database.
@gmap/cliCommander.js CLI. Thin wrapper — all logic lives in core.
@gmap/serverExpress + WebSocket API server. Serves the dashboard as static files. Binds to 127.0.0.1 only.
@gmap/dashboardReact + Cytoscape.js graph visualiser. Vite builds it to packages/server/dist/public/.
@gmap/vscodeVS Code extension. Talks to the API server over HTTP/WebSocket — never imports core directly.
@gmap/tracerRuntime instrumentation (M7). Patches function calls and streams real call events to the server.

CLI Reference

CommandWhat it does
gmap scan <path>Walk files, parse symbols, write to SQLite
gmap why <symbol>List every caller of a symbol
gmap impact <symbol>Blast radius — everything that would break
gmap trace <symbol>Full call chain from entrypoints
gmap explain <symbol>AI-generated description (opt-in)
gmap serveStart the API server + open dashboard

All commands use full English words. No abbreviations. No cryptic flags.


Architecture & Governance

Design decisions, standards, and workflow rules are documented here:

Architecture Decisions (ADRs)

ADRTitle
0001Local-first, server-optional
0002SQLite as the single source of truth
0003Language-agnostic adapter architecture
0004WebSocket for streaming, REST for queries
0005VS Code extension as primary distribution
0006ts-morph over raw TypeScript Compiler API
0007Call graph accuracy over completeness
0008AI is strictly optional
0009Web dashboard over terminal UI
0010Port 7842 as default API port
0011CLI commands read like plain English

Standards & Processes


Roadmap

MilestoneDescriptionStatus
Phase 1Monorepo scaffold✅ Done
M1Repository scanner (file walk + ts-morph parse)🔜 Next
M2Graph engine (SQLite-backed call graph)
M3REST + WebSocket API server
M4React graph dashboard
M5VS Code extension (hover, CodeLens, sidebar)
M6CLI commands (why, impact, trace)
M7Runtime tracer (real call edges)
M8AI explain layer (Ollama, Anthropic, OpenAI)

Development

# Install dependencies
pnpm install
# Build all packages
pnpm build
# Type-check all packages
pnpm typecheck
# Run all tests
pnpm test# Build + watch (Turbo)
pnpm dev

Requirements

  • Node.js 20+ (.nvmrc pins the version)
  • pnpm 9+

Design Principles

  • Local-first: runs entirely on your machine. No cloud, no telemetry, no account required.
  • AI-optional: core features work without any AI. gmap explain is the only AI-gated command.
  • TypeScript-first, language-agnostic: the parser is pluggable. Python and Go adapters don't touch the graph engine.
  • Honest about uncertainty: unresolvable call edges are marked unresolved, not silently dropped.

License

MIT

About

Understand codebases at the speed AI generates them.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gmap — Codebase Graph Mapper

Understand codebases at the speed AI generates them.

gmap statically analyses TypeScript/JavaScript projects and builds a navigable call graph stored in a local SQLite database. Query it from the CLI, the VS Code extension, or the browser dashboard — all without leaving your machine.


Quick Start

# Install globally
npm install -g gmap-cli
# Index your project
gmap scan .# Ask questions
gmap why approveEstimate # who calls this?
gmap impact approveEstimate # what breaks if I change it?
gmap trace approveEstimate # full call chain# Open the interactive graph dashboard
gmap serve # → http://localhost:7842

Package Architecture

 @gmap/cli ──────────────────────────────┐
│
@gmap/dashboard ─── (Vite build) ──┐ │
▼ ▼
┌─────────────────┐
@gmap/vscode ───────────── ▶│ @gmap/core │
│ │
@gmap/server ──────────── ▶│ • scanner │
│ • graph engine │
@gmap/tracer ─────────── ▶│ • SQLite DB │
│ • adapters │
└─────────────────┘

Every package consumes @gmap/core — the single source of truth. No package imports from a sibling.

graph TD
CLI["@gmap/cli"] --> Core["@gmap/core"]
Dashboard["@gmap/dashboard (static build)"] --> Server
VSCode["@gmap/vscode"] --> Server["@gmap/server"]
Server --> Core
Tracer["@gmap/tracer"] --> Core
VSCode -.->|HTTP + WebSocket| Server
CLI -.->|spawns if needed| Server
Loading

Package descriptions

PackageRole
@gmap/coreScanner, graph engine, SQLite layer, language adapter registry. The only package allowed to touch the database.
@gmap/cliCommander.js CLI. Thin wrapper — all logic lives in core.
@gmap/serverExpress + WebSocket API server. Serves the dashboard as static files. Binds to 127.0.0.1 only.
@gmap/dashboardReact + Cytoscape.js graph visualiser. Vite builds it to packages/server/dist/public/.
@gmap/vscodeVS Code extension. Talks to the API server over HTTP/WebSocket — never imports core directly.
@gmap/tracerRuntime instrumentation (M7). Patches function calls and streams real call events to the server.

CLI Reference

CommandWhat it does
gmap scan <path>Walk files, parse symbols, write to SQLite
gmap why <symbol>List every caller of a symbol
gmap impact <symbol>Blast radius — everything that would break
gmap trace <symbol>Full call chain from entrypoints
gmap explain <symbol>AI-generated description (opt-in)
gmap serveStart the API server + open dashboard

All commands use full English words. No abbreviations. No cryptic flags.


Architecture & Governance

Design decisions, standards, and workflow rules are documented here:

Architecture Decisions (ADRs)

ADRTitle
0001Local-first, server-optional
0002SQLite as the single source of truth
0003Language-agnostic adapter architecture
0004WebSocket for streaming, REST for queries
0005VS Code extension as primary distribution
0006ts-morph over raw TypeScript Compiler API
0007Call graph accuracy over completeness
0008AI is strictly optional
0009Web dashboard over terminal UI
0010Port 7842 as default API port
0011CLI commands read like plain English

Standards & Processes


Roadmap

MilestoneDescriptionStatus
Phase 1Monorepo scaffold✅ Done
M1Repository scanner (file walk + ts-morph parse)🔜 Next
M2Graph engine (SQLite-backed call graph)
M3REST + WebSocket API server
M4React graph dashboard
M5VS Code extension (hover, CodeLens, sidebar)
M6CLI commands (why, impact, trace)
M7Runtime tracer (real call edges)
M8AI explain layer (Ollama, Anthropic, OpenAI)

Development

# Install dependencies
pnpm install
# Build all packages
pnpm build
# Type-check all packages
pnpm typecheck
# Run all tests
pnpm test# Build + watch (Turbo)
pnpm dev

Requirements

  • Node.js 20+ (.nvmrc pins the version)
  • pnpm 9+

Design Principles

  • Local-first: runs entirely on your machine. No cloud, no telemetry, no account required.
  • AI-optional: core features work without any AI. gmap explain is the only AI-gated command.
  • TypeScript-first, language-agnostic: the parser is pluggable. Python and Go adapters don't touch the graph engine.
  • Honest about uncertainty: unresolvable call edges are marked unresolved, not silently dropped.

License

MIT

About

Understand codebases at the speed AI generates them.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gmap — Codebase Graph Mapper

Understand codebases at the speed AI generates them.

gmap statically analyses TypeScript/JavaScript projects and builds a navigable call graph stored in a local SQLite database. Query it from the CLI, the VS Code extension, or the browser dashboard — all without leaving your machine.


Quick Start

# Install globally
npm install -g gmap-cli
# Index your project
gmap scan .# Ask questions
gmap why approveEstimate # who calls this?
gmap impact approveEstimate # what breaks if I change it?
gmap trace approveEstimate # full call chain# Open the interactive graph dashboard
gmap serve # → http://localhost:7842

Package Architecture

 @gmap/cli ──────────────────────────────┐
│
@gmap/dashboard ─── (Vite build) ──┐ │
▼ ▼
┌─────────────────┐
@gmap/vscode ───────────── ▶│ @gmap/core │
│ │
@gmap/server ──────────── ▶│ • scanner │
│ • graph engine │
@gmap/tracer ─────────── ▶│ • SQLite DB │
│ • adapters │
└─────────────────┘

Every package consumes @gmap/core — the single source of truth. No package imports from a sibling.

graph TD
CLI["@gmap/cli"] --> Core["@gmap/core"]
Dashboard["@gmap/dashboard (static build)"] --> Server
VSCode["@gmap/vscode"] --> Server["@gmap/server"]
Server --> Core
Tracer["@gmap/tracer"] --> Core
VSCode -.->|HTTP + WebSocket| Server
CLI -.->|spawns if needed| Server
Loading

Package descriptions

PackageRole
@gmap/coreScanner, graph engine, SQLite layer, language adapter registry. The only package allowed to touch the database.
@gmap/cliCommander.js CLI. Thin wrapper — all logic lives in core.
@gmap/serverExpress + WebSocket API server. Serves the dashboard as static files. Binds to 127.0.0.1 only.
@gmap/dashboardReact + Cytoscape.js graph visualiser. Vite builds it to packages/server/dist/public/.
@gmap/vscodeVS Code extension. Talks to the API server over HTTP/WebSocket — never imports core directly.
@gmap/tracerRuntime instrumentation (M7). Patches function calls and streams real call events to the server.

CLI Reference

CommandWhat it does
gmap scan <path>Walk files, parse symbols, write to SQLite
gmap why <symbol>List every caller of a symbol
gmap impact <symbol>Blast radius — everything that would break
gmap trace <symbol>Full call chain from entrypoints
gmap explain <symbol>AI-generated description (opt-in)
gmap serveStart the API server + open dashboard

All commands use full English words. No abbreviations. No cryptic flags.


Architecture & Governance

Design decisions, standards, and workflow rules are documented here:

Architecture Decisions (ADRs)

ADRTitle
0001Local-first, server-optional
0002SQLite as the single source of truth
0003Language-agnostic adapter architecture
0004WebSocket for streaming, REST for queries
0005VS Code extension as primary distribution
0006ts-morph over raw TypeScript Compiler API
0007Call graph accuracy over completeness
0008AI is strictly optional
0009Web dashboard over terminal UI
0010Port 7842 as default API port
0011CLI commands read like plain English

Standards & Processes


Roadmap

MilestoneDescriptionStatus
Phase 1Monorepo scaffold✅ Done
M1Repository scanner (file walk + ts-morph parse)🔜 Next
M2Graph engine (SQLite-backed call graph)
M3REST + WebSocket API server
M4React graph dashboard
M5VS Code extension (hover, CodeLens, sidebar)
M6CLI commands (why, impact, trace)
M7Runtime tracer (real call edges)
M8AI explain layer (Ollama, Anthropic, OpenAI)

Development

# Install dependencies
pnpm install
# Build all packages
pnpm build
# Type-check all packages
pnpm typecheck
# Run all tests
pnpm test# Build + watch (Turbo)
pnpm dev

Requirements

  • Node.js 20+ (.nvmrc pins the version)
  • pnpm 9+

Design Principles

  • Local-first: runs entirely on your machine. No cloud, no telemetry, no account required.
  • AI-optional: core features work without any AI. gmap explain is the only AI-gated command.
  • TypeScript-first, language-agnostic: the parser is pluggable. Python and Go adapters don't touch the graph engine.
  • Honest about uncertainty: unresolvable call edges are marked unresolved, not silently dropped.

License

MIT

About

Understand codebases at the speed AI generates them.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

gmap — Codebase Graph Mapper

Understand codebases at the speed AI generates them.

gmap statically analyses TypeScript/JavaScript projects and builds a navigable call graph stored in a local SQLite database. Query it from the CLI, the VS Code extension, or the browser dashboard — all without leaving your machine.


Quick Start

# Install globally
npm install -g gmap-cli
# Index your project
gmap scan .# Ask questions
gmap why approveEstimate # who calls this?
gmap impact approveEstimate # what breaks if I change it?
gmap trace approveEstimate # full call chain# Open the interactive graph dashboard
gmap serve # → http://localhost:7842

Package Architecture

 @gmap/cli ──────────────────────────────┐
│
@gmap/dashboard ─── (Vite build) ──┐ │
▼ ▼
┌─────────────────┐
@gmap/vscode ───────────── ▶│ @gmap/core │
│ │
@gmap/server ──────────── ▶│ • scanner │
│ • graph engine │
@gmap/tracer ─────────── ▶│ • SQLite DB │
│ • adapters │
└─────────────────┘

Every package consumes @gmap/core — the single source of truth. No package imports from a sibling.

graph TD
CLI["@gmap/cli"] --> Core["@gmap/core"]
Dashboard["@gmap/dashboard (static build)"] --> Server
VSCode["@gmap/vscode"] --> Server["@gmap/server"]
Server --> Core
Tracer["@gmap/tracer"] --> Core
VSCode -.->|HTTP + WebSocket| Server
CLI -.->|spawns if needed| Server
Loading

Package descriptions

PackageRole
@gmap/coreScanner, graph engine, SQLite layer, language adapter registry. The only package allowed to touch the database.
@gmap/cliCommander.js CLI. Thin wrapper — all logic lives in core.
@gmap/serverExpress + WebSocket API server. Serves the dashboard as static files. Binds to 127.0.0.1 only.
@gmap/dashboardReact + Cytoscape.js graph visualiser. Vite builds it to packages/server/dist/public/.
@gmap/vscodeVS Code extension. Talks to the API server over HTTP/WebSocket — never imports core directly.
@gmap/tracerRuntime instrumentation (M7). Patches function calls and streams real call events to the server.

CLI Reference

CommandWhat it does
gmap scan <path>Walk files, parse symbols, write to SQLite
gmap why <symbol>List every caller of a symbol
gmap impact <symbol>Blast radius — everything that would break
gmap trace <symbol>Full call chain from entrypoints
gmap explain <symbol>AI-generated description (opt-in)
gmap serveStart the API server + open dashboard

All commands use full English words. No abbreviations. No cryptic flags.


Architecture & Governance

Design decisions, standards, and workflow rules are documented here:

Architecture Decisions (ADRs)

ADRTitle
0001Local-first, server-optional
0002SQLite as the single source of truth
0003Language-agnostic adapter architecture
0004WebSocket for streaming, REST for queries
0005VS Code extension as primary distribution
0006ts-morph over raw TypeScript Compiler API
0007Call graph accuracy over completeness
0008AI is strictly optional
0009Web dashboard over terminal UI
0010Port 7842 as default API port
0011CLI commands read like plain English

Standards & Processes


Roadmap

MilestoneDescriptionStatus
Phase 1Monorepo scaffold✅ Done
M1Repository scanner (file walk + ts-morph parse)🔜 Next
M2Graph engine (SQLite-backed call graph)
M3REST + WebSocket API server
M4React graph dashboard
M5VS Code extension (hover, CodeLens, sidebar)
M6CLI commands (why, impact, trace)
M7Runtime tracer (real call edges)
M8AI explain layer (Ollama, Anthropic, OpenAI)

Development

# Install dependencies
pnpm install
# Build all packages
pnpm build
# Type-check all packages
pnpm typecheck
# Run all tests
pnpm test# Build + watch (Turbo)
pnpm dev

Requirements

  • Node.js 20+ (.nvmrc pins the version)
  • pnpm 9+

Design Principles

  • Local-first: runs entirely on your machine. No cloud, no telemetry, no account required.
  • AI-optional: core features work without any AI. gmap explain is the only AI-gated command.
  • TypeScript-first, language-agnostic: the parser is pluggable. Python and Go adapters don't touch the graph engine.
  • Honest about uncertainty: unresolvable call edges are marked unresolved, not silently dropped.

License

MIT

About

Understand codebases at the speed AI generates them.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gmap — Codebase Graph Mapper

Understand codebases at the speed AI generates them.

gmap statically analyses TypeScript/JavaScript projects and builds a navigable call graph stored in a local SQLite database. Query it from the CLI, the VS Code extension, or the browser dashboard — all without leaving your machine.


Quick Start

# Install globally
npm install -g gmap-cli
# Index your project
gmap scan .# Ask questions
gmap why approveEstimate # who calls this?
gmap impact approveEstimate # what breaks if I change it?
gmap trace approveEstimate # full call chain# Open the interactive graph dashboard
gmap serve # → http://localhost:7842

Package Architecture

 @gmap/cli ──────────────────────────────┐
│
@gmap/dashboard ─── (Vite build) ──┐ │
▼ ▼
┌─────────────────┐
@gmap/vscode ───────────── ▶│ @gmap/core │
│ │
@gmap/server ──────────── ▶│ • scanner │
│ • graph engine │
@gmap/tracer ─────────── ▶│ • SQLite DB │
│ • adapters │
└─────────────────┘

Every package consumes @gmap/core — the single source of truth. No package imports from a sibling.

graph TD
CLI["@gmap/cli"] --> Core["@gmap/core"]
Dashboard["@gmap/dashboard (static build)"] --> Server
VSCode["@gmap/vscode"] --> Server["@gmap/server"]
Server --> Core
Tracer["@gmap/tracer"] --> Core
VSCode -.->|HTTP + WebSocket| Server
CLI -.->|spawns if needed| Server
Loading

Package descriptions

PackageRole
@gmap/coreScanner, graph engine, SQLite layer, language adapter registry. The only package allowed to touch the database.
@gmap/cliCommander.js CLI. Thin wrapper — all logic lives in core.
@gmap/serverExpress + WebSocket API server. Serves the dashboard as static files. Binds to 127.0.0.1 only.
@gmap/dashboardReact + Cytoscape.js graph visualiser. Vite builds it to packages/server/dist/public/.
@gmap/vscodeVS Code extension. Talks to the API server over HTTP/WebSocket — never imports core directly.
@gmap/tracerRuntime instrumentation (M7). Patches function calls and streams real call events to the server.

CLI Reference

CommandWhat it does
gmap scan <path>Walk files, parse symbols, write to SQLite
gmap why <symbol>List every caller of a symbol
gmap impact <symbol>Blast radius — everything that would break
gmap trace <symbol>Full call chain from entrypoints
gmap explain <symbol>AI-generated description (opt-in)
gmap serveStart the API server + open dashboard

All commands use full English words. No abbreviations. No cryptic flags.


Architecture & Governance

Design decisions, standards, and workflow rules are documented here:

Architecture Decisions (ADRs)

ADRTitle
0001Local-first, server-optional
0002SQLite as the single source of truth
0003Language-agnostic adapter architecture
0004WebSocket for streaming, REST for queries
0005VS Code extension as primary distribution
0006ts-morph over raw TypeScript Compiler API
0007Call graph accuracy over completeness
0008AI is strictly optional
0009Web dashboard over terminal UI
0010Port 7842 as default API port
0011CLI commands read like plain English

Standards & Processes


Roadmap

MilestoneDescriptionStatus
Phase 1Monorepo scaffold✅ Done
M1Repository scanner (file walk + ts-morph parse)🔜 Next
M2Graph engine (SQLite-backed call graph)
M3REST + WebSocket API server
M4React graph dashboard
M5VS Code extension (hover, CodeLens, sidebar)
M6CLI commands (why, impact, trace)
M7Runtime tracer (real call edges)
M8AI explain layer (Ollama, Anthropic, OpenAI)

Development

# Install dependencies
pnpm install
# Build all packages
pnpm build
# Type-check all packages
pnpm typecheck
# Run all tests
pnpm test# Build + watch (Turbo)
pnpm dev

Requirements

  • Node.js 20+ (.nvmrc pins the version)
  • pnpm 9+

Design Principles

  • Local-first: runs entirely on your machine. No cloud, no telemetry, no account required.
  • AI-optional: core features work without any AI. gmap explain is the only AI-gated command.
  • TypeScript-first, language-agnostic: the parser is pluggable. Python and Go adapters don't touch the graph engine.
  • Honest about uncertainty: unresolvable call edges are marked unresolved, not silently dropped.

License

MIT

About

Understand codebases at the speed AI generates them.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gmap — Codebase Graph Mapper

Understand codebases at the speed AI generates them.

gmap statically analyses TypeScript/JavaScript projects and builds a navigable call graph stored in a local SQLite database. Query it from the CLI, the VS Code extension, or the browser dashboard — all without leaving your machine.


Quick Start

# Install globally
npm install -g gmap-cli
# Index your project
gmap scan .# Ask questions
gmap why approveEstimate # who calls this?
gmap impact approveEstimate # what breaks if I change it?
gmap trace approveEstimate # full call chain# Open the interactive graph dashboard
gmap serve # → http://localhost:7842

Package Architecture

 @gmap/cli ──────────────────────────────┐
│
@gmap/dashboard ─── (Vite build) ──┐ │
▼ ▼
┌─────────────────┐
@gmap/vscode ───────────── ▶│ @gmap/core │
│ │
@gmap/server ──────────── ▶│ • scanner │
│ • graph engine │
@gmap/tracer ─────────── ▶│ • SQLite DB │
│ • adapters │
└─────────────────┘

Every package consumes @gmap/core — the single source of truth. No package imports from a sibling.

graph TD
CLI["@gmap/cli"] --> Core["@gmap/core"]
Dashboard["@gmap/dashboard (static build)"] --> Server
VSCode["@gmap/vscode"] --> Server["@gmap/server"]
Server --> Core
Tracer["@gmap/tracer"] --> Core
VSCode -.->|HTTP + WebSocket| Server
CLI -.->|spawns if needed| Server
Loading

Package descriptions

PackageRole
@gmap/coreScanner, graph engine, SQLite layer, language adapter registry. The only package allowed to touch the database.
@gmap/cliCommander.js CLI. Thin wrapper — all logic lives in core.
@gmap/serverExpress + WebSocket API server. Serves the dashboard as static files. Binds to 127.0.0.1 only.
@gmap/dashboardReact + Cytoscape.js graph visualiser. Vite builds it to packages/server/dist/public/.
@gmap/vscodeVS Code extension. Talks to the API server over HTTP/WebSocket — never imports core directly.
@gmap/tracerRuntime instrumentation (M7). Patches function calls and streams real call events to the server.

CLI Reference

CommandWhat it does
gmap scan <path>Walk files, parse symbols, write to SQLite
gmap why <symbol>List every caller of a symbol
gmap impact <symbol>Blast radius — everything that would break
gmap trace <symbol>Full call chain from entrypoints
gmap explain <symbol>AI-generated description (opt-in)
gmap serveStart the API server + open dashboard

All commands use full English words. No abbreviations. No cryptic flags.


Architecture & Governance

Design decisions, standards, and workflow rules are documented here:

Architecture Decisions (ADRs)

ADRTitle
0001Local-first, server-optional
0002SQLite as the single source of truth
0003Language-agnostic adapter architecture
0004WebSocket for streaming, REST for queries
0005VS Code extension as primary distribution
0006ts-morph over raw TypeScript Compiler API
0007Call graph accuracy over completeness
0008AI is strictly optional
0009Web dashboard over terminal UI
0010Port 7842 as default API port
0011CLI commands read like plain English

Standards & Processes


Roadmap

MilestoneDescriptionStatus
Phase 1Monorepo scaffold✅ Done
M1Repository scanner (file walk + ts-morph parse)🔜 Next
M2Graph engine (SQLite-backed call graph)
M3REST + WebSocket API server
M4React graph dashboard
M5VS Code extension (hover, CodeLens, sidebar)
M6CLI commands (why, impact, trace)
M7Runtime tracer (real call edges)
M8AI explain layer (Ollama, Anthropic, OpenAI)

Development

# Install dependencies
pnpm install
# Build all packages
pnpm build
# Type-check all packages
pnpm typecheck
# Run all tests
pnpm test# Build + watch (Turbo)
pnpm dev

Requirements

  • Node.js 20+ (.nvmrc pins the version)
  • pnpm 9+

Design Principles

  • Local-first: runs entirely on your machine. No cloud, no telemetry, no account required.
  • AI-optional: core features work without any AI. gmap explain is the only AI-gated command.
  • TypeScript-first, language-agnostic: the parser is pluggable. Python and Go adapters don't touch the graph engine.
  • Honest about uncertainty: unresolvable call edges are marked unresolved, not silently dropped.

License

MIT

About

Understand codebases at the speed AI generates them.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

gmap — Codebase Graph Mapper

Understand codebases at the speed AI generates them.

gmap statically analyses TypeScript/JavaScript projects and builds a navigable call graph stored in a local SQLite database. Query it from the CLI, the VS Code extension, or the browser dashboard — all without leaving your machine.


Quick Start

# Install globally
npm install -g gmap-cli
# Index your project
gmap scan .# Ask questions
gmap why approveEstimate # who calls this?
gmap impact approveEstimate # what breaks if I change it?
gmap trace approveEstimate # full call chain# Open the interactive graph dashboard
gmap serve # → http://localhost:7842

Package Architecture

 @gmap/cli ──────────────────────────────┐
│
@gmap/dashboard ─── (Vite build) ──┐ │
▼ ▼
┌─────────────────┐
@gmap/vscode ───────────── ▶│ @gmap/core │
│ │
@gmap/server ──────────── ▶│ • scanner │
│ • graph engine │
@gmap/tracer ─────────── ▶│ • SQLite DB │
│ • adapters │
└─────────────────┘

Every package consumes @gmap/core — the single source of truth. No package imports from a sibling.

graph TD
CLI["@gmap/cli"] --> Core["@gmap/core"]
Dashboard["@gmap/dashboard (static build)"] --> Server
VSCode["@gmap/vscode"] --> Server["@gmap/server"]
Server --> Core
Tracer["@gmap/tracer"] --> Core
VSCode -.->|HTTP + WebSocket| Server
CLI -.->|spawns if needed| Server
Loading

Package descriptions

PackageRole
@gmap/coreScanner, graph engine, SQLite layer, language adapter registry. The only package allowed to touch the database.
@gmap/cliCommander.js CLI. Thin wrapper — all logic lives in core.
@gmap/serverExpress + WebSocket API server. Serves the dashboard as static files. Binds to 127.0.0.1 only.
@gmap/dashboardReact + Cytoscape.js graph visualiser. Vite builds it to packages/server/dist/public/.
@gmap/vscodeVS Code extension. Talks to the API server over HTTP/WebSocket — never imports core directly.
@gmap/tracerRuntime instrumentation (M7). Patches function calls and streams real call events to the server.

CLI Reference

CommandWhat it does
gmap scan <path>Walk files, parse symbols, write to SQLite
gmap why <symbol>List every caller of a symbol
gmap impact <symbol>Blast radius — everything that would break
gmap trace <symbol>Full call chain from entrypoints
gmap explain <symbol>AI-generated description (opt-in)
gmap serveStart the API server + open dashboard

All commands use full English words. No abbreviations. No cryptic flags.


Architecture & Governance

Design decisions, standards, and workflow rules are documented here:

Architecture Decisions (ADRs)

ADRTitle
0001Local-first, server-optional
0002SQLite as the single source of truth
0003Language-agnostic adapter architecture
0004WebSocket for streaming, REST for queries
0005VS Code extension as primary distribution
0006ts-morph over raw TypeScript Compiler API
0007Call graph accuracy over completeness
0008AI is strictly optional
0009Web dashboard over terminal UI
0010Port 7842 as default API port
0011CLI commands read like plain English

Standards & Processes


Roadmap

MilestoneDescriptionStatus
Phase 1Monorepo scaffold✅ Done
M1Repository scanner (file walk + ts-morph parse)🔜 Next
M2Graph engine (SQLite-backed call graph)
M3REST + WebSocket API server
M4React graph dashboard
M5VS Code extension (hover, CodeLens, sidebar)
M6CLI commands (why, impact, trace)
M7Runtime tracer (real call edges)
M8AI explain layer (Ollama, Anthropic, OpenAI)

Development

# Install dependencies
pnpm install
# Build all packages
pnpm build
# Type-check all packages
pnpm typecheck
# Run all tests
pnpm test# Build + watch (Turbo)
pnpm dev

Requirements

  • Node.js 20+ (.nvmrc pins the version)
  • pnpm 9+

Design Principles

  • Local-first: runs entirely on your machine. No cloud, no telemetry, no account required.
  • AI-optional: core features work without any AI. gmap explain is the only AI-gated command.
  • TypeScript-first, language-agnostic: the parser is pluggable. Python and Go adapters don't touch the graph engine.
  • Honest about uncertainty: unresolvable call edges are marked unresolved, not silently dropped.

License

MIT

About

Understand codebases at the speed AI generates them.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages