Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.oobo.ai/llms.txt

Use this file to discover all available pages before exploring further.

Anchor (metadata.json)

The root-level metadata.json for each commit:
{
  "anchor_schema_version": 1,
  "oobo_version": "1.0.0",
  "commit_hash": "c8e12fa9b3d4abcdef1234567890abcdef123456",
  "branch": "main",
  "author": "Teddy <teddy@example.com>",
  "author_type": "assisted",
  "contributors": [
    { "name": "Teddy <teddy@example.com>", "role": "human" },
    { "name": "cursor", "role": "agent", "model": "claude-sonnet-4-20250514" }
  ],
  "committed_at": 1714500000,
  "message": "feat: add widget support",
  "files_changed": ["src/widget.rs", "src/lib.rs"],
  "added": 42,
  "deleted": 5,
  "file_changes": [
    {
      "path": "src/widget.rs",
      "added": 40,
      "deleted": 0,
      "attribution": "ai",
      "agent": "cursor",
      "line_attributions": [
        {
          "author": "ai",
          "ranges": [{ "start": 1, "end": 40 }],
          "agent": "cursor"
        }
      ]
    },
    {
      "path": "src/lib.rs",
      "added": 2,
      "deleted": 5,
      "attribution": "human"
    }
  ],
  "ai_added": 40,
  "ai_deleted": 0,
  "human_added": 2,
  "human_deleted": 5,
  "ai_percentage": 85.1,
  "session_ids": ["sess-abc"],
  "summary": "Added widget module with rendering pipeline",
  "intent": "User asked to create a reusable widget component",
  "reasoning": "Chose composition over inheritance for flexibility",
  "transparency_mode": "on",
  "file_interactions": [
    {
      "path": "src/widget.rs",
      "sessions": [
        { "session_id": "sess-abc", "role": "writer" },
        { "session_id": "sess-def", "role": "reader" }
      ]
    }
  ],
  "turns": [
    {
      "id": "turn-001",
      "session_id": "sess-abc",
      "source": "cursor",
      "turn_index": 3,
      "tree_hash": "a1b2c3d4e5f6..."
    }
  ]
}

Field Reference

FieldTypeRequiredDescription
anchor_schema_versionu32YesAlways 1. Use for forward compatibility checks
oobo_versionstringYesCLI version that wrote this anchor (semver)
commit_hashstringYesFull 40-char SHA of the enriched commit
branchstringYesBranch name at commit time
authorstringYesGit author line: Name <email>
author_typeenumYesHow the commit was authored (see below)
contributorsarrayNoAll humans + AI tools that contributed
committed_ati64YesUnix timestamp in seconds
messagestringYesFull commit message
files_changedstring[]YesPaths of all files changed in the commit
addedu32YesTotal lines added
deletedu32YesTotal lines deleted
file_changesarrayNoPer-file breakdown (empty for legacy anchors)
ai_addedu32YesLines added attributed to AI
ai_deletedu32YesLines deleted attributed to AI
human_addedu32YesLines added attributed to human
human_deletedu32YesLines deleted attributed to human
ai_percentagef64?No0.0-100.0. null if no AI involvement
session_idsstring[]YesIDs of linked AI sessions (empty if pure human)
summarystring?NoAI-generated summary of the commit
intentstring?NoWhat the user asked the AI to do
reasoningstring?NoWhy the AI chose this approach
transparency_modeenumYes"on" or "off" - indicates if transcripts are present
file_interactionsarray?NoMulti-agent file access patterns (present when 2+ sessions)
turnsarrayNoTurn references that led into this commit

author_type Enum

ValueMeaning
"agent"AI autonomously committed (non-interactive terminal + active session)
"assisted"Human committed while collaborating with AI (most common)
"human"Pure human commit - no AI involvement whatsoever
"automated"CI/CD or script (non-interactive, no AI session)

contributors[].role Enum

ValueMeaning
"human"Human developer
"agent"AI tool/model

file_changes[].attribution Enum

ValueMeaning
"ai"AI agent wrote/edited this file
"human"Human wrote this file
"mixed"Both contributed to this file

line_attributions[].ranges

  • 1-indexed line numbers
  • Inclusive on both ends (start and end)
  • Only covers lines added or modified in this commit
  • Lines unchanged from the parent are not represented

file_interactions[].sessions[].role Enum

ValueMeaning
"writer"Session edited this file
"reader"Session read this file
"both"Session both read and wrote this file

turns[] Fields

FieldTypeDescription
idstringUnique turn identifier
session_idstringParent session
sourcestringTool that generated the turn
turn_indexi64Position within the session
tree_hashstring?Git tree hash capturing workspace state at this turn

{
  "session_id": "sess-abc",
  "agent": "cursor",
  "model": "claude-sonnet-4-20250514",
  "link_type": "explicit",
  "input_tokens": 15000,
  "output_tokens": 8000,
  "cache_read_tokens": 5000,
  "cache_creation_tokens": 2000,
  "duration_secs": 120,
  "tool_calls": 14,
  "files_touched": ["src/widget.rs", "src/lib.rs"],
  "tool_usage": { "Edit": 8, "Bash": 3, "Read": 2, "Grep": 1 },
  "tool_failures": 1,
  "subagent_count": 2,
  "bash_commands": ["cargo build", "cargo test"],
  "thinking_duration_ms": 45000,
  "compact_count": 1,
  "context_tokens": 128000,
  "context_window_size": 200000,
  "is_subagent": false,
  "parent_session_id": null,
  "subagent_type": null,
  "is_estimated": false,
  "peer_session_ids": ["sess-def"]
}

Field Reference

FieldTypeRequiredDescription
session_idstringYesUnique session identifier
agentstringYesTool name (see supported agents below)
modelstring?NoLLM model identifier
link_typeenumYes"explicit" (hooks confirmed) or "inferred" (time-window heuristic)
input_tokensu64?NoPrompt tokens consumed
output_tokensu64?NoCompletion tokens generated
cache_read_tokensu64?NoTokens served from prompt cache
cache_creation_tokensu64?NoTokens written to prompt cache
duration_secsu64?NoWall-clock session duration in seconds
tool_callsu32?NoTotal tool invocations
files_touchedstring[]?NoRelative file paths the AI read or wrote
tool_usagemap<string, u32>?NoTool call breakdown by name
tool_failuresu32?NoCount of failed tool calls
subagent_countu32?NoNumber of subagents spawned
bash_commandsstring[]?NoShell commands the AI executed
thinking_duration_msu64?NoCumulative thinking/reasoning time
compact_countu32?NoContext compaction events
context_tokensu64?NoTotal context tokens at session end
context_window_sizeu64?NoMax context window capacity
is_subagentboolYesWhether this is a child/sub session
parent_session_idstring?NoParent session ID (if is_subagent is true)
subagent_typestring?Noe.g. "explore", "shell", "generalPurpose"
is_estimatedboolYestrue if token counts are heuristic estimates
peer_session_idsstring[]NoSessions that shared files with this one

Supported agent Values

ValueTool
"cursor"Cursor IDE
"claude"Claude Code (CLI)
"codex"OpenAI Codex CLI
"copilot"GitHub Copilot
"aider"Aider
"gemini"Google Gemini CLI
"zed"Zed editor
"continue"Continue.dev
"windsurf"Windsurf
"amp"Amp
"kiro"Kiro
"junie"JetBrains Junie
"trae"Trae
"droid"Factory Droid
"opencode"OpenCode

Transcript (N/transcript.json)

The transcript is the full AI conversation in JSON format. Its internal structure varies by agent:
  • Cursor/Claude/Codex: JSONL-style array of message objects with role, content, tool calls
  • Copilot/Gemini/Zed: Platform-specific JSON format
All transcripts are:
  • Redacted: Secrets (API keys, passwords, tokens) replaced with [REDACTED]
  • Path-stripped: Absolute paths normalized to relative paths
  • Present only when transparency_mode == "on" in the parent anchor
The backend should store transcripts as opaque JSON blobs and parse them as needed.

Timeline (timeline.json, optional)

Present only when multiple sessions interacted with the same files during a commit window.
{
  "session_count": 2,
  "longest_session_ms": 120000,
  "file_interactions": [
    {
      "path": "src/main.rs",
      "sessions": [
        { "session_id": "s1", "role": "writer" },
        { "session_id": "s2", "role": "reader" }
      ]
    }
  ],
  "events": [
    { "session_id": "s1", "path": "src/main.rs", "action": "write", "timestamp": 1714500010 },
    { "session_id": "s2", "path": "src/main.rs", "action": "read", "timestamp": 1714500059 }
  ]
}

Subagent Metadata (subagents/N/metadata.json, optional)

{
  "subagent_type": "explore",
  "session_id": "sub-abc123"
}
Present alongside subagent transcripts to identify the subagent type.

JSON Response Fields (--json)

oobo anchors --json

Array of objects: sha, project, subject, timestamp, tool, tokens, sessions, ai_pct.

oobo anchor show <sha> --json

Object: sha, parents[], timestamp, author.raw, subject, tools[], tokens.{input,output,cache_read,cache_write,total}, attribution.{ai_lines,human_lines,ai_pct}, sessions[], files_changed[].

oobo search --json

Object: query, sources[], total_hits, hits[] for local and/or remote matches.

oobo blame --json

Per-line attribution with cross-commit tracing. Each line is traced to its originating commit via git blame --porcelain, and the anchor for that commit is loaded to resolve AI/human attribution. Includes origin_sha, ai, agent, session_ids, tokens, committed_at, and message per line. See the blame command reference for the full schema.

oobo goto --json

Object: action: "goto", target, stashed (bool), memory_path (optional).

oobo back --json

Object: action: "back", label, stash_applied (bool), remaining_depth (int).

oobo settings --json

Object/array of effective setting rows. Valid keys: key, api_url, remote, transparency, tools.experimental, setup.scan_roots.

Bare oobo --json (outside a repo)

Object: projects[] and aggregate stats. Each project includes id, name, path, remote, enabled, last_activity, anchors, tokens, ai_pct.