Completed
on 7 Jan 2026, 11:15 pm

Output

gvShell Software Component Diagram

github.com/greatvibe/gvshell • Go 1.23 • 647 tests

Loading component diagram...

Package Details

cmd/gvshell (Entry)

main.go
├─ Load config (YAML + env)
├─ Init providers (registry)
├─ Init readline (history)
├─ Start REPL loop
└─ Graceful shutdown

internal/repl (Core Loop)

engine.go
├─ Read input (readline)
├─ Parse @provider prefix
├─ Expand $refs in prompts
├─ Route to provider/command
├─ Store response ($N)
└─ Execute shell (! prefix)

internal/providers (AI Routing)

registry.go@prefix routing, aliases, fallback chain
claude/Anthropic SDK, streaming SSE
claudecli/Subprocess, stream-json, tool access
openai/GPT-4/O1/O3, SSE streaming
gemini/Google AI, SSE streaming
ollama/Local LLM, NDJSON streaming
codexcli/OpenAI Codex subprocess

internal/commands (Slash Commands)

/helpOverview, command docs
/modelslist, default, info
/sessionlist, new, switch, delete, export
/contextshow, clear, add, remove, stats
/historylist, search, show, replay
/projectinfo, status; /init
/templatelist, show, use, create
/configlist, get, set, reset
/secretslist, set, delete

internal/hub (WebSocket)

client.goConnect, reconnect, heartbeat
protocol.goMessage types, 8 capabilities
streaming.goEvent streaming, contiguous ack
workqueue.goReceive work, progress, result

internal/auth (OAuth)

device_flow.goRFC 8628 device flow
qrcode.goASCII QR for terminal
token_store.goFile + memory backends
token_manager.goAuto-refresh, multi-account

internal/core (Persistence)

session/store.goSQLite, CRUD, 45 tests
session/session.goModel: ID, Status, Title
journal/writer.goJSONL append-only
journal/reader.goRead, filter, 17 event types

internal/response (References)

store.go$1, $2, $claude memory
subfield.go.code, .json, .tokens, .lines
history.goSQLite cross-session persist

Key Dependencies

Package Version Purpose
anthropics/anthropic-sdk-go v1.19.0 Claude API streaming
chzyer/readline v1.5.1 History, tab completion
fsnotify/fsnotify v1.9.0 Auto-context file watching
gorilla/websocket v1.5.3 Hub WebSocket client
mattn/go-sqlite3 v1.14.24 Session + history store
gopkg.in/yaml.v3 v3.0.1 Config file parsing

Data Flow

User Input
    │
    ▼
readline ─────────────────────────────────────────────────────┐
    │                                                             │
    ▼                                                             │
engine.go ─── parse ───┬─── /command ─── commands/* ─── Result   │
                       │                                          │
                       ├─── @provider ─── providers/* ──┐       │
                       │                                 │       │
                       └─── ! shell ─── os/exec ──────────┼───────┤
                                                         │       │
                                              response store      │
                                              $1, $claude         │
                                                         │       │
                                                         ▼       ▼
                                                    hub streaming
                                                    (WebSocket)
                                                         │
                                                         ▼
                                                    core persist
                                                    (SQLite+JSONL)

📊 Build Statistics

647
Tests
93
Go Files
33/50
Steps Done
6
AI Providers

What's Next?

Choose an action:

Quick Actions

Original Request

No layout configured

Details

Type General
Status Completed
Scope vibetools
Tags gvshellarchitecturego
Created 7 Jan 2026, 11:15 pm
Updated 7 Jan 2026, 11:15 pm
Timing
⏱️ 90.1s
0 tools
TTFE 0% Thinking 100% Tools 0%
Created By claude

Raw Data

{
  "id": "cb93a322-af62-4a07-9d45-54584bfc342a",
  "type": "general",
  "status": "completed",
  "title": "gvShell Software Component Diagram",
  "description": "Technical architecture diagram of gvShell Go codebase for developers",
  "context": {
    "output": "<div style=\"background:#1e1e1e;color:#e0e0e0;padding:20px;border-radius:8px;font-family:system-ui,-apple-system,sans-serif;\">\n<h2 style=\"color:#fff;margin:0 0 8px 0;\">gvShell Software Component Diagram</h2>\n<p style=\"color:#7f848e;margin:0 0 20px 0;\">github.com/greatvibe/gvshell • Go 1.23 • 647 tests</p>\n\n<div id=\"component-diagram\" style=\"background:#2d2d2d;padding:16px;border-radius:8px;margin-bottom:20px;min-height:400px;\">\n<div style=\"color:#888;\">Loading component diagram...</div>\n</div>\n<script>\n(function() {\n  const definition = `\n%%{init: {'theme': 'dark'}}%%\nflowchart TB\n  subgraph Entry[\"cmd/gvshell\"]\n    MAIN[main.go<br/>Entry Point]\n  end\n\n  subgraph REPL[\"internal/repl\"]\n    ENGINE[engine.go<br/>REPL Loop]\n  end\n\n  subgraph Commands[\"internal/commands\"]\n    CMD[command.go<br/>Interface + Registry]\n    HELP[/help]\n    MODELS[/models]\n    SESSION[/session]\n    CONTEXT[/context]\n    HISTORY[/history]\n    PROJECT[/project]\n    TEMPLATE[/template]\n    CONFIG[/config]\n    SECRETS[/secrets]\n  end\n\n  subgraph Providers[\"internal/providers\"]\n    REG[registry.go<br/>Multi-Provider Router]\n    CLAUDE_API[claude/<br/>Anthropic API]\n    CLAUDE_CLI[claudecli/<br/>CLI Subprocess]\n    OPENAI[openai/<br/>OpenAI API]\n    GEMINI[gemini/<br/>Google API]\n    OLLAMA[ollama/<br/>Local LLM]\n    CODEX[codexcli/<br/>Codex CLI]\n  end\n\n  subgraph Core[\"internal/core\"]\n    SESS_STORE[session/store.go<br/>SQLite CRUD]\n    JOURNAL[journal/writer.go<br/>JSONL Append]\n  end\n\n  subgraph Hub[\"internal/hub\"]\n    CLIENT[client.go<br/>WebSocket]\n    PROTO[protocol.go<br/>Message Types]\n    STREAM[streaming.go<br/>Event Acking]\n    WORKQ[workqueue.go<br/>Work Handler]\n  end\n\n  subgraph Auth[\"internal/auth\"]\n    DEVICE[device_flow.go<br/>OAuth RFC 8628]\n    TOKENS[token_manager.go<br/>Auto-Refresh]\n    STORE_T[token_store.go<br/>File/Memory]\n  end\n\n  subgraph System[\"internal/system\"]\n    SYSCLIENT[system.go<br/>Hub-Proxied Ops]\n    OPS[operations.go<br/>Handlers]\n    SECR[secrets.go<br/>Credentials]\n  end\n\n  subgraph Response[\"internal/response\"]\n    RESP_STORE[store.go<br/>$1, $claude refs]\n    SUBFIELD[subfield.go<br/>.code, .json]\n    HIST[history.go<br/>SQLite Persist]\n  end\n\n  subgraph Context[\"internal/context\"]\n    AUTO[autocontext/<br/>File Watching]\n  end\n\n  subgraph Support[\"Support Packages\"]\n    READLINE[readline/<br/>History + Tab]\n    CFG[config/<br/>YAML + Env]\n    RETRY[retry/<br/>Backoff]\n    RATE[ratelimit/<br/>Token Bucket]\n    ERRS[errors/<br/>ProviderError]\n  end\n\n  MAIN --> ENGINE\n  ENGINE --> CMD\n  ENGINE --> REG\n  ENGINE --> RESP_STORE\n  ENGINE --> READLINE\n  ENGINE --> CLIENT\n\n  CMD --> HELP\n  CMD --> MODELS\n  CMD --> SESSION\n  CMD --> CONTEXT\n  CMD --> HISTORY\n  CMD --> PROJECT\n  CMD --> TEMPLATE\n  CMD --> CONFIG\n  CMD --> SECRETS\n\n  REG --> CLAUDE_API\n  REG --> CLAUDE_CLI\n  REG --> OPENAI\n  REG --> GEMINI\n  REG --> OLLAMA\n  REG --> CODEX\n\n  SESSION --> SESS_STORE\n  HISTORY --> HIST\n  PROJECT --> AUTO\n\n  CLIENT --> PROTO\n  CLIENT --> STREAM\n  CLIENT --> WORKQ\n\n  TOKENS --> DEVICE\n  TOKENS --> STORE_T\n  CONFIG --> SYSCLIENT\n  SECRETS --> SYSCLIENT\n  SYSCLIENT --> OPS\n  SYSCLIENT --> SECR\n\n  RESP_STORE --> SUBFIELD\n\n  CLAUDE_API --> RETRY\n  OPENAI --> RETRY\n  GEMINI --> RETRY\n  OLLAMA --> RETRY\n\n  style Entry fill:#3b82f6,stroke:#2563eb,color:#fff\n  style REPL fill:#22c55e,stroke:#16a34a,color:#000\n  style Commands fill:#f59e0b,stroke:#d97706,color:#000\n  style Providers fill:#8b5cf6,stroke:#7c3aed,color:#fff\n  style Core fill:#06b6d4,stroke:#0891b2,color:#000\n  style Hub fill:#ec4899,stroke:#db2777,color:#fff\n  style Auth fill:#ef4444,stroke:#dc2626,color:#fff\n  style System fill:#14b8a6,stroke:#0d9488,color:#000\n  style Response fill:#a855f7,stroke:#9333ea,color:#fff\n  style Context fill:#84cc16,stroke:#65a30d,color:#000\n  style Support fill:#6b7280,stroke:#4b5563,color:#fff\n`;\n  window.renderMermaidDiagram('component-diagram', definition);\n})();\n</script>\n\n<h3 style=\"color:#fff;margin:20px 0 12px 0;\">Package Details</h3>\n\n<div style=\"display:grid;grid-template-columns:1fr 1fr;gap:16px;\">\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h4 style=\"color:#3b82f6;margin:0 0 8px 0;\">cmd/gvshell (Entry)</h4>\n<pre style=\"background:#1e1e1e;padding:8px;border-radius:4px;color:#e5c07b;font-size:0.85rem;margin:0;overflow-x:auto;\">main.go\n├─ Load config (YAML + env)\n├─ Init providers (registry)\n├─ Init readline (history)\n├─ Start REPL loop\n└─ Graceful shutdown</pre>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h4 style=\"color:#22c55e;margin:0 0 8px 0;\">internal/repl (Core Loop)</h4>\n<pre style=\"background:#1e1e1e;padding:8px;border-radius:4px;color:#e5c07b;font-size:0.85rem;margin:0;overflow-x:auto;\">engine.go\n├─ Read input (readline)\n├─ Parse @provider prefix\n├─ Expand $refs in prompts\n├─ Route to provider/command\n├─ Store response ($N)\n└─ Execute shell (! prefix)</pre>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h4 style=\"color:#8b5cf6;margin:0 0 8px 0;\">internal/providers (AI Routing)</h4>\n<table style=\"width:100%;font-size:0.85rem;\">\n<tr><td style=\"color:#98c379;padding:4px 0;\">registry.go</td><td style=\"color:#7f848e;\">@prefix routing, aliases, fallback chain</td></tr>\n<tr><td style=\"color:#98c379;padding:4px 0;\">claude/</td><td style=\"color:#7f848e;\">Anthropic SDK, streaming SSE</td></tr>\n<tr><td style=\"color:#98c379;padding:4px 0;\">claudecli/</td><td style=\"color:#7f848e;\">Subprocess, stream-json, tool access</td></tr>\n<tr><td style=\"color:#98c379;padding:4px 0;\">openai/</td><td style=\"color:#7f848e;\">GPT-4/O1/O3, SSE streaming</td></tr>\n<tr><td style=\"color:#98c379;padding:4px 0;\">gemini/</td><td style=\"color:#7f848e;\">Google AI, SSE streaming</td></tr>\n<tr><td style=\"color:#98c379;padding:4px 0;\">ollama/</td><td style=\"color:#7f848e;\">Local LLM, NDJSON streaming</td></tr>\n<tr><td style=\"color:#98c379;padding:4px 0;\">codexcli/</td><td style=\"color:#7f848e;\">OpenAI Codex subprocess</td></tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h4 style=\"color:#f59e0b;margin:0 0 8px 0;\">internal/commands (Slash Commands)</h4>\n<table style=\"width:100%;font-size:0.85rem;\">\n<tr><td style=\"color:#e5c07b;padding:4px 0;\">/help</td><td style=\"color:#7f848e;\">Overview, command docs</td></tr>\n<tr><td style=\"color:#e5c07b;padding:4px 0;\">/models</td><td style=\"color:#7f848e;\">list, default, info</td></tr>\n<tr><td style=\"color:#e5c07b;padding:4px 0;\">/session</td><td style=\"color:#7f848e;\">list, new, switch, delete, export</td></tr>\n<tr><td style=\"color:#e5c07b;padding:4px 0;\">/context</td><td style=\"color:#7f848e;\">show, clear, add, remove, stats</td></tr>\n<tr><td style=\"color:#e5c07b;padding:4px 0;\">/history</td><td style=\"color:#7f848e;\">list, search, show, replay</td></tr>\n<tr><td style=\"color:#e5c07b;padding:4px 0;\">/project</td><td style=\"color:#7f848e;\">info, status; /init</td></tr>\n<tr><td style=\"color:#e5c07b;padding:4px 0;\">/template</td><td style=\"color:#7f848e;\">list, show, use, create</td></tr>\n<tr><td style=\"color:#e5c07b;padding:4px 0;\">/config</td><td style=\"color:#7f848e;\">list, get, set, reset</td></tr>\n<tr><td style=\"color:#e5c07b;padding:4px 0;\">/secrets</td><td style=\"color:#7f848e;\">list, set, delete</td></tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h4 style=\"color:#ec4899;margin:0 0 8px 0;\">internal/hub (WebSocket)</h4>\n<table style=\"width:100%;font-size:0.85rem;\">\n<tr><td style=\"color:#f472b6;padding:4px 0;\">client.go</td><td style=\"color:#7f848e;\">Connect, reconnect, heartbeat</td></tr>\n<tr><td style=\"color:#f472b6;padding:4px 0;\">protocol.go</td><td style=\"color:#7f848e;\">Message types, 8 capabilities</td></tr>\n<tr><td style=\"color:#f472b6;padding:4px 0;\">streaming.go</td><td style=\"color:#7f848e;\">Event streaming, contiguous ack</td></tr>\n<tr><td style=\"color:#f472b6;padding:4px 0;\">workqueue.go</td><td style=\"color:#7f848e;\">Receive work, progress, result</td></tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h4 style=\"color:#ef4444;margin:0 0 8px 0;\">internal/auth (OAuth)</h4>\n<table style=\"width:100%;font-size:0.85rem;\">\n<tr><td style=\"color:#fca5a5;padding:4px 0;\">device_flow.go</td><td style=\"color:#7f848e;\">RFC 8628 device flow</td></tr>\n<tr><td style=\"color:#fca5a5;padding:4px 0;\">qrcode.go</td><td style=\"color:#7f848e;\">ASCII QR for terminal</td></tr>\n<tr><td style=\"color:#fca5a5;padding:4px 0;\">token_store.go</td><td style=\"color:#7f848e;\">File + memory backends</td></tr>\n<tr><td style=\"color:#fca5a5;padding:4px 0;\">token_manager.go</td><td style=\"color:#7f848e;\">Auto-refresh, multi-account</td></tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h4 style=\"color:#06b6d4;margin:0 0 8px 0;\">internal/core (Persistence)</h4>\n<table style=\"width:100%;font-size:0.85rem;\">\n<tr><td style=\"color:#67e8f9;padding:4px 0;\">session/store.go</td><td style=\"color:#7f848e;\">SQLite, CRUD, 45 tests</td></tr>\n<tr><td style=\"color:#67e8f9;padding:4px 0;\">session/session.go</td><td style=\"color:#7f848e;\">Model: ID, Status, Title</td></tr>\n<tr><td style=\"color:#67e8f9;padding:4px 0;\">journal/writer.go</td><td style=\"color:#7f848e;\">JSONL append-only</td></tr>\n<tr><td style=\"color:#67e8f9;padding:4px 0;\">journal/reader.go</td><td style=\"color:#7f848e;\">Read, filter, 17 event types</td></tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h4 style=\"color:#a855f7;margin:0 0 8px 0;\">internal/response (References)</h4>\n<table style=\"width:100%;font-size:0.85rem;\">\n<tr><td style=\"color:#c4b5fd;padding:4px 0;\">store.go</td><td style=\"color:#7f848e;\">$1, $2, $claude memory</td></tr>\n<tr><td style=\"color:#c4b5fd;padding:4px 0;\">subfield.go</td><td style=\"color:#7f848e;\">.code, .json, .tokens, .lines</td></tr>\n<tr><td style=\"color:#c4b5fd;padding:4px 0;\">history.go</td><td style=\"color:#7f848e;\">SQLite cross-session persist</td></tr>\n</table>\n</div>\n\n</div>\n\n<h3 style=\"color:#fff;margin:20px 0 12px 0;\">Key Dependencies</h3>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<table style=\"width:100%;font-size:0.9rem;border-collapse:collapse;\">\n<tr style=\"border-bottom:1px solid #4b5563;\">\n<th style=\"text-align:left;padding:8px;color:#9ca3af;\">Package</th>\n<th style=\"text-align:left;padding:8px;color:#9ca3af;\">Version</th>\n<th style=\"text-align:left;padding:8px;color:#9ca3af;\">Purpose</th>\n</tr>\n<tr style=\"border-bottom:1px solid #3b3b3b;\">\n<td style=\"padding:8px;color:#e5c07b;\">anthropics/anthropic-sdk-go</td>\n<td style=\"padding:8px;color:#98c379;\">v1.19.0</td>\n<td style=\"padding:8px;color:#7f848e;\">Claude API streaming</td>\n</tr>\n<tr style=\"border-bottom:1px solid #3b3b3b;\">\n<td style=\"padding:8px;color:#e5c07b;\">chzyer/readline</td>\n<td style=\"padding:8px;color:#98c379;\">v1.5.1</td>\n<td style=\"padding:8px;color:#7f848e;\">History, tab completion</td>\n</tr>\n<tr style=\"border-bottom:1px solid #3b3b3b;\">\n<td style=\"padding:8px;color:#e5c07b;\">fsnotify/fsnotify</td>\n<td style=\"padding:8px;color:#98c379;\">v1.9.0</td>\n<td style=\"padding:8px;color:#7f848e;\">Auto-context file watching</td>\n</tr>\n<tr style=\"border-bottom:1px solid #3b3b3b;\">\n<td style=\"padding:8px;color:#e5c07b;\">gorilla/websocket</td>\n<td style=\"padding:8px;color:#98c379;\">v1.5.3</td>\n<td style=\"padding:8px;color:#7f848e;\">Hub WebSocket client</td>\n</tr>\n<tr style=\"border-bottom:1px solid #3b3b3b;\">\n<td style=\"padding:8px;color:#e5c07b;\">mattn/go-sqlite3</td>\n<td style=\"padding:8px;color:#98c379;\">v1.14.24</td>\n<td style=\"padding:8px;color:#7f848e;\">Session + history store</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#e5c07b;\">gopkg.in/yaml.v3</td>\n<td style=\"padding:8px;color:#98c379;\">v3.0.1</td>\n<td style=\"padding:8px;color:#7f848e;\">Config file parsing</td>\n</tr>\n</table>\n</div>\n\n<h3 style=\"color:#fff;margin:20px 0 12px 0;\">Data Flow</h3>\n\n<pre style=\"background:#2d2d2d;padding:16px;border-radius:6px;color:#e0e0e0;font-size:0.9rem;overflow-x:auto;line-height:1.6;\">\n<span style=\"color:#7f848e;\">User Input</span>\n    │\n    ▼\n<span style=\"color:#22c55e;\">readline</span> ─────────────────────────────────────────────────────┐\n    │                                                             │\n    ▼                                                             │\n<span style=\"color:#22c55e;\">engine.go</span> ─── parse ───┬─── <span style=\"color:#e5c07b;\">/command</span> ─── commands/* ─── Result   │\n                       │                                          │\n                       ├─── <span style=\"color:#8b5cf6;\">@provider</span> ─── providers/* ──┐       │\n                       │                                 │       │\n                       └─── <span style=\"color:#98c379;\">! shell</span> ─── os/exec ──────────┼───────┤\n                                                         │       │\n                                              <span style=\"color:#a855f7;\">response</span> store      │\n                                              $1, $claude         │\n                                                         │       │\n                                                         ▼       ▼\n                                                    <span style=\"color:#ec4899;\">hub</span> streaming\n                                                    (WebSocket)\n                                                         │\n                                                         ▼\n                                                    <span style=\"color:#06b6d4;\">core</span> persist\n                                                    (SQLite+JSONL)\n</pre>\n\n<div style=\"background:#1e3a5f;padding:16px;border-radius:6px;border:1px solid #3b82f6;margin-top:16px;\">\n<h4 style=\"color:#fff;margin:0 0 8px 0;\">📊 Build Statistics</h4>\n<div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:12px;text-align:center;\">\n<div>\n<div style=\"color:#3b82f6;font-size:1.5rem;font-weight:bold;\">647</div>\n<div style=\"color:#7f848e;font-size:0.85rem;\">Tests</div>\n</div>\n<div>\n<div style=\"color:#22c55e;font-size:1.5rem;font-weight:bold;\">93</div>\n<div style=\"color:#7f848e;font-size:0.85rem;\">Go Files</div>\n</div>\n<div>\n<div style=\"color:#f59e0b;font-size:1.5rem;font-weight:bold;\">33/50</div>\n<div style=\"color:#7f848e;font-size:0.85rem;\">Steps Done</div>\n</div>\n<div>\n<div style=\"color:#8b5cf6;font-size:1.5rem;font-weight:bold;\">6</div>\n<div style=\"color:#7f848e;font-size:0.85rem;\">AI Providers</div>\n</div>\n</div>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-top:16px;\">\n<h4 style=\"margin:0 0 8px 0;color:#fff;\">What's Next?</h4>\n<p style=\"color:#9ca3af;margin:0;\">Choose an action:</p>\n</div>\n</div>",
    "choices": [
      {
        "label": "Hub Protocol",
        "value": "Show me the hub WebSocket protocol message types and payloads in detail",
        "primary": true
      },
      {
        "label": "Provider Interface",
        "value": "Show me the Provider interface and how multi-provider routing works"
      },
      {
        "label": "Test Coverage",
        "value": "Show me the test coverage breakdown by package"
      }
    ],
    "requestedAt": "2026-01-07T07:35:00Z",
    "requestId": "a999a91e-12c3-4752-b6cf-db8a3ffd365c",
    "turnTiming": {
      "totalMs": 90131,
      "ttfeMs": 59,
      "thinkingMs": 90072,
      "toolExecutionMs": 0,
      "toolCallCount": 0,
      "thinkingPct": 100,
      "toolsPct": 0,
      "ttfePct": 0
    }
  },
  "createdBy": "claude",
  "createdAt": "2026-01-07T13:15:32.090Z",
  "updatedAt": "2026-01-07T13:15:37.445Z",
  "requestId": "a999a91e-12c3-4752-b6cf-db8a3ffd365c",
  "scope": "vibetools",
  "tags": [
    "gvshell",
    "architecture",
    "go"
  ],
  "targetUser": "claude"
}
DashboardReportsKontasksFlowsDecisionsSessionsTelemetryLogs + Go