<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Multi Repo on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/tags/multi-repo/</link><description>Recent content in Multi Repo on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 04 May 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/tags/multi-repo/index.xml" rel="self" type="application/rss+xml"/><item><title>gc-tree — Global Context Above CLAUDE.md and AGENTS.md, Managed Like Git Branches</title><link>https://ice-ice-bear.github.io/posts/2026-05-04-gc-tree-visualization/</link><pubDate>Mon, 04 May 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/posts/2026-05-04-gc-tree-visualization/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post gc-tree — Global Context Above CLAUDE.md and AGENTS.md, Managed Like Git Branches" /&gt;&lt;h2 id="overview"&gt;Overview
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.npmjs.com/package/@handsupmin/gc-tree" target="_blank" rel="noopener"
 &gt;&lt;code&gt;@handsupmin/gc-tree&lt;/code&gt;&lt;/a&gt; is a &lt;a class="link" href="https://nodejs.org" target="_blank" rel="noopener"
 &gt;Node.js 20+&lt;/a&gt; CLI that stores &lt;strong&gt;above-the-repo&lt;/strong&gt; global context for AI coding tools like &lt;a class="link" href="https://www.anthropic.com/claude-code" target="_blank" rel="noopener"
 &gt;Claude Code&lt;/a&gt; and the &lt;a class="link" href="https://github.com/openai/codex" target="_blank" rel="noopener"
 &gt;OpenAI Codex CLI&lt;/a&gt;. The &amp;ldquo;gc&amp;rdquo; stands for &lt;strong&gt;Global Context&lt;/strong&gt;, not garbage collection. The &amp;ldquo;tree&amp;rdquo; comes from managing context lanes like &lt;a class="link" href="https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell" target="_blank" rel="noopener"
 &gt;Git branches&lt;/a&gt; — branch, switch, scope. If &lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/memory" target="_blank" rel="noopener"
 &gt;CLAUDE.md&lt;/a&gt; and &lt;a class="link" href="https://agents.md/" target="_blank" rel="noopener"
 &gt;AGENTS.md&lt;/a&gt; work well inside one repo, &lt;a class="link" href="https://github.com/handsupmin/gc-tree" target="_blank" rel="noopener"
 &gt;gc-tree&lt;/a&gt; is built for the moment work crosses repo boundaries and you stop wanting to re-explain the same background every session.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 User["developer"] --&gt; CC["Claude Code &amp;lt;br/&amp;gt; or Codex CLI"]
 CC --&gt; Hook["SessionStart / &amp;lt;br/&amp;gt; UserPromptSubmit hook"]
 Hook --&gt; Resolve["gctree resolve --query"]
 Resolve --&gt; Index["~/.gctree/branches/main/index.md &amp;lt;br/&amp;gt; (compact index)"]
 Index --&gt; Match["matched doc summaries &amp;lt;br/&amp;gt; (~4% of total)"]
 Match --&gt; CC
 Resolve -. on demand .-&gt; Show["gctree show-doc --id"]
 Show --&gt; Full["~/.gctree/branches/main/docs/*.md &amp;lt;br/&amp;gt; (full doc)"]
 Full --&gt; CC&lt;/pre&gt;&lt;h2 id="1-the-problem"&gt;1. The problem
&lt;/h2&gt;&lt;p&gt;AI does not know you. It does not know your working style, your team&amp;rsquo;s vocabulary, which repos belong together, or which routines you repeat without thinking. So every session repeats the same dance — reintroduce yourself, re-explain the domain language, paste the architecture doc in again.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/memory" target="_blank" rel="noopener"
 &gt;CLAUDE.md&lt;/a&gt; and &lt;a class="link" href="https://agents.md/" target="_blank" rel="noopener"
 &gt;AGENTS.md&lt;/a&gt; are great — for one repo. The pain starts the moment work crosses repos. In a non-&lt;a class="link" href="https://monorepo.tools/" target="_blank" rel="noopener"
 &gt;monorepo&lt;/a&gt; setup where backend, frontend, and platform live separately, where does the shared background go? Copy it into both? gc-tree exists to delete that repetition.&lt;/p&gt;
&lt;h2 id="2-the-model--like-git-branches"&gt;2. The model — like Git branches
&lt;/h2&gt;&lt;p&gt;The mental model is simple. If a Git branch is a &lt;strong&gt;code lane&lt;/strong&gt;, a gc-branch is a &lt;strong&gt;context lane&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree checkout -b project-b
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree onboard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That creates an independent context for &lt;code&gt;project-b&lt;/code&gt;. Switching workstreams becomes &lt;code&gt;gctree checkout main&lt;/code&gt; — the corresponding context activates wholesale. Because it borrows the &lt;a class="link" href="https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging" target="_blank" rel="noopener"
 &gt;Git branching&lt;/a&gt; mental model verbatim, there is almost nothing new to learn.&lt;/p&gt;
&lt;p&gt;Storage is just as direct:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;gctree&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;branches&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;compact&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loaded&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="n"&gt;needed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;architecture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;branch&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="n"&gt;belong&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;gc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It lives outside your repos, so no &lt;a class="link" href="https://git-scm.com/docs/gitignore" target="_blank" rel="noopener"
 &gt;&lt;code&gt;.gitignore&lt;/code&gt;&lt;/a&gt; rules, no accidental commits, and every project using the same gc-branch shares the same context.&lt;/p&gt;
&lt;h2 id="3-progressive-disclosure--only-4-of-the-token-window"&gt;3. Progressive disclosure — only ~4% of the token window
&lt;/h2&gt;&lt;p&gt;The core performance claim is that &lt;a class="link" href="https://github.com/handsupmin/gc-tree/blob/main/docs/usage.md" target="_blank" rel="noopener"
 &gt;&lt;code&gt;gctree resolve&lt;/code&gt;&lt;/a&gt; operates as &lt;strong&gt;progressive disclosure&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gctree resolve --query &amp;quot;...&amp;quot;&lt;/code&gt; → compact matches with stable IDs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gctree related --id &amp;lt;match-id&amp;gt;&lt;/code&gt; → supporting docs around one match&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gctree show-doc --id &amp;lt;match-id&amp;gt;&lt;/code&gt; → full markdown for that doc&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree resolve --query &lt;span class="s2"&gt;&amp;#34;auth token rotation policy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[gc-tree] 1 matching doc gc-branch=&amp;#34;main&amp;#34; repo=&amp;#34;my-repo&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Auth &amp;amp; Session Conventions] JWT rotation on every request, refresh tokens in httpOnly cookies, 15-min access token TTL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Auth &amp;amp; Session Conventions] show full doc: gctree show-doc --id &amp;#34;auth&amp;#34; --branch &amp;#34;main&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The headline number — &lt;strong&gt;~4% of total context is injected per query.&lt;/strong&gt; The other 96% stays on disk, outside the token window. That maps directly to &lt;a class="link" href="https://docs.claude.com/en/docs/build-with-claude/prompt-engineering/long-context-tips" target="_blank" rel="noopener"
 &gt;Anthropic&amp;rsquo;s long-context best practices&lt;/a&gt;: only what&amp;rsquo;s needed, only when it&amp;rsquo;s needed.&lt;/p&gt;
&lt;p&gt;A subtle but important detail: when there&amp;rsquo;s no match, or the repo is excluded from scope, gc-tree returns an &lt;strong&gt;explicit status&lt;/strong&gt; instead of failing ambiguously. The AI tool can tell &amp;ldquo;no context exists&amp;rdquo; apart from &amp;ldquo;context exists but didn&amp;rsquo;t match&amp;rdquo; — which prevents bad guesses.&lt;/p&gt;
&lt;h2 id="4-hook-integration--sessionstart--userpromptsubmit"&gt;4. Hook integration — SessionStart / UserPromptSubmit
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/handsupmin/gc-tree" target="_blank" rel="noopener"
 &gt;&lt;code&gt;gctree init&lt;/code&gt;&lt;/a&gt; does more than scaffold files. The real value is wiring gc-tree into Claude Code&amp;rsquo;s &lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/hooks" target="_blank" rel="noopener"
 &gt;SessionStart hook&lt;/a&gt; and &lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/hooks" target="_blank" rel="noopener"
 &gt;UserPromptSubmit hook&lt;/a&gt; so the &lt;strong&gt;check happens automatically before work starts&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SessionStart → verify the active gc-branch on session boot&lt;/li&gt;
&lt;li&gt;UserPromptSubmit → run &lt;code&gt;resolve --query&lt;/code&gt; against the prompt and surface matches&lt;/li&gt;
&lt;li&gt;empty / no-match results cached for the session — no repeated disk reads&lt;/li&gt;
&lt;li&gt;matched summaries are injected directly, so the AI sees &lt;strong&gt;actual patterns and commands&lt;/strong&gt;, not just titles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Codex side mirrors this. &lt;code&gt;$gc-resolve-context&lt;/code&gt;, &lt;code&gt;$gc-onboard&lt;/code&gt;, &lt;code&gt;$gc-update-global-context&lt;/code&gt; install as Codex skills and work the same way under &lt;code&gt;codex exec&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree scaffold --host claude-code &lt;span class="c1"&gt;# CLAUDE.md snippet + /gc-onboard et al&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree scaffold --host codex &lt;span class="c1"&gt;# AGENTS.md snippet + $gc-onboard et al&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree scaffold --host both &lt;span class="c1"&gt;# both at once&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The key part — both providers share &lt;strong&gt;the same backing store&lt;/strong&gt; (&lt;code&gt;~/.gctree&lt;/code&gt;). Onboard once, use from either tool.&lt;/p&gt;
&lt;h2 id="5-validated-performance--devholdout-split"&gt;5. Validated performance — DEV/HOLDOUT split
&lt;/h2&gt;&lt;p&gt;Most OSS dev tools just say &amp;ldquo;it works.&amp;rdquo; gc-tree publishes a quantified evaluation against &lt;a class="link" href="https://github.com/handsupmin/gc-tree/blob/main/tests/eval/RUBRIC.md" target="_blank" rel="noopener"
 &gt;tests/eval/RUBRIC.md&lt;/a&gt;:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Metric&lt;/th&gt;
 &lt;th&gt;DEV&lt;/th&gt;
 &lt;th&gt;HOLDOUT&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;recall@1&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;85.7%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;recall@3&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;92.9%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MRR&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;89.3%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Negative precision (irrelevant → empty)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tokens injected per query vs. total&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;~7%&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;~13%&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;What makes this table interesting is that &lt;strong&gt;the HOLDOUT fixture is isolated from the tuning loop&lt;/strong&gt;. The autoresearch loop only fits to DEV; HOLDOUT exists solely for honest reporting. Generalization gap = 10.0 pts. 38 labeled cases across 8 categories (exact-keyword, paraphrase, glossary, mixed-language, same-domain distractor, same-domain negative, cross-branch negative). Reporting &lt;a class="link" href="https://en.wikipedia.org/wiki/Evaluation_measures_%28information_retrieval%29" target="_blank" rel="noopener"
 &gt;recall@k&lt;/a&gt; alongside &lt;a class="link" href="https://en.wikipedia.org/wiki/Mean_reciprocal_rank" target="_blank" rel="noopener"
 &gt;MRR&lt;/a&gt; is the standard playbook for information retrieval evaluation.&lt;/p&gt;
&lt;p&gt;Reproducible via &lt;code&gt;npm run eval:ranked&lt;/code&gt;. &lt;strong&gt;This level of evaluation discipline is rare for a solo OSS dev tool.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="6-compared-to-claudemd--agentsmd"&gt;6. Compared to CLAUDE.md / AGENTS.md
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;CLAUDE.md / AGENTS.md&lt;/th&gt;
 &lt;th&gt;gc-tree&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Scope&lt;/td&gt;
 &lt;td&gt;One repo&lt;/td&gt;
 &lt;td&gt;Multiple repos, one context&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Persistence&lt;/td&gt;
 &lt;td&gt;Per-repo file&lt;/td&gt;
 &lt;td&gt;Outside repos, reused across sessions&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Switching contexts&lt;/td&gt;
 &lt;td&gt;Manual file edits&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;gctree checkout project-b&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Relevance filtering&lt;/td&gt;
 &lt;td&gt;Everything or nothing&lt;/td&gt;
 &lt;td&gt;Only injects matching docs (~4%)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Onboarding&lt;/td&gt;
 &lt;td&gt;Hand-written&lt;/td&gt;
 &lt;td&gt;Guided by your AI tool&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Works with Codex&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Works with Claude Code&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The most interesting row is &lt;strong&gt;relevance filtering&lt;/strong&gt;. CLAUDE.md is fundamentally an &lt;strong&gt;all-or-nothing&lt;/strong&gt; file — it enters the session or it doesn&amp;rsquo;t. gc-tree does &lt;strong&gt;query-driven partial injection&lt;/strong&gt;. As context grows, that difference compounds.&lt;/p&gt;
&lt;h2 id="7-common-moves"&gt;7. Common moves
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Repo scoping:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree set-repo-scope --branch project-b --include &lt;span class="c1"&gt;# include current repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree set-repo-scope --branch project-b --exclude &lt;span class="c1"&gt;# exclude current repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Why this matters — if you touch both &lt;code&gt;monorepo-a&lt;/code&gt; and &lt;code&gt;legacy-b&lt;/code&gt; on the same machine, leaking &lt;code&gt;project-b&lt;/code&gt; context into &lt;code&gt;legacy-b&lt;/code&gt; makes the AI follow wrong conventions. &lt;code&gt;set-repo-scope&lt;/code&gt; makes that boundary explicit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context updates:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree update-global-context &lt;span class="c1"&gt;# aliases: gctree update-gc / gctree ugc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The AI tool asks &amp;ldquo;what changed?&amp;rdquo; and writes the answer back to the gc-branch. The hand-editing workflow on CLAUDE.md becomes a guided update.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updating gc-tree itself:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gctree update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pulls the latest from &lt;a class="link" href="https://www.npmjs.com/" target="_blank" rel="noopener"
 &gt;npm&lt;/a&gt;, then re-scaffolds every previously installed provider. You don&amp;rsquo;t have to migrate hook code by hand when integration snippets change.&lt;/p&gt;
&lt;h2 id="8-a-small-tool-filling-a-specific-gap"&gt;8. A small tool filling a specific gap
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/pahen/madge" target="_blank" rel="noopener"
 &gt;madge&lt;/a&gt; visualizes JS module dependencies. &lt;a class="link" href="https://github.com/depcheck/depcheck" target="_blank" rel="noopener"
 &gt;depcheck&lt;/a&gt; finds unused ones. &lt;a class="link" href="https://git-scm.com/docs/git-gc" target="_blank" rel="noopener"
 &gt;git&amp;rsquo;s reflog/gc&lt;/a&gt; prunes unreachable objects. The name might sound adjacent, but &lt;strong&gt;gc-tree is a different kind of tool entirely&lt;/strong&gt;. It picks one specific friction point in the AI coding workflow — &amp;ldquo;I keep re-explaining the same context across repos&amp;rdquo; — and isolates the fix to one layer: &lt;strong&gt;above the repo, above the session, above the tool&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is the kind of tool that only becomes possible because &lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/hooks" target="_blank" rel="noopener"
 &gt;Anthropic opened up SessionStart hooks and skills&lt;/a&gt;, and because the &lt;a class="link" href="https://github.com/openai/codex" target="_blank" rel="noopener"
 &gt;OpenAI Codex CLI&lt;/a&gt; offers the same shape of extension point. If CLAUDE.md is your vim&amp;rsquo;s &lt;code&gt;.vimrc&lt;/code&gt;, gc-tree does for context what &lt;a class="link" href="https://www.gnu.org/software/stow/" target="_blank" rel="noopener"
 &gt;&lt;code&gt;stow&lt;/code&gt;&lt;/a&gt; or &lt;a class="link" href="https://www.chezmoi.io/" target="_blank" rel="noopener"
 &gt;&lt;code&gt;chezmoi&lt;/code&gt;&lt;/a&gt; did for dotfiles — pull the durable parts out of the repo and version them somewhere reusable.&lt;/p&gt;
&lt;h2 id="insights"&gt;Insights
&lt;/h2&gt;&lt;p&gt;What makes gc-tree worth watching is less the feature set and more &lt;strong&gt;the shape of context infrastructure for AI coding tools&lt;/strong&gt;. Phase one was &lt;strong&gt;in-repo markdown&lt;/strong&gt; (CLAUDE.md, AGENTS.md). Phase two is &lt;strong&gt;above-the-repo global context&lt;/strong&gt; (gc-tree). Phase three is probably &lt;strong&gt;team-shared context, versioned context, context merge/rebase&lt;/strong&gt; — taking &lt;a class="link" href="https://git-scm.com/book/en/v2" target="_blank" rel="noopener"
 &gt;what Git did for code&lt;/a&gt; and porting it to context. gc-tree&amp;rsquo;s naming already points that direction. The other thing worth noting is the evaluation discipline. &lt;strong&gt;DEV/HOLDOUT split&lt;/strong&gt;, recall@k + MRR + negative precision, fixtures covering mixed-script queries — solo OSS dev tools rarely operate at this rigor, and treating context retrieval as a real information-retrieval problem is the right framing. The most immediate thing to try: &lt;code&gt;npm install -g @handsupmin/gc-tree &amp;amp;&amp;amp; gctree init&lt;/code&gt;, drop a domain glossary into &lt;code&gt;gctree onboard&lt;/code&gt;, and check whether the AI tool actually pulls it on the next session start. Cutting the first 3-5 minutes of repeat-explaining out of every session is enough ROI on its own.&lt;/p&gt;
&lt;h2 id="references"&gt;References
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/handsupmin/gc-tree" target="_blank" rel="noopener"
 &gt;handsupmin/gc-tree (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.npmjs.com/package/@handsupmin/gc-tree" target="_blank" rel="noopener"
 &gt;@handsupmin/gc-tree (npm)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Docs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/handsupmin/gc-tree/blob/main/docs/concept.md" target="_blank" rel="noopener"
 &gt;Concept&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/handsupmin/gc-tree/blob/main/docs/principles.md" target="_blank" rel="noopener"
 &gt;Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/handsupmin/gc-tree/blob/main/docs/usage.md" target="_blank" rel="noopener"
 &gt;Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/handsupmin/gc-tree/blob/main/tests/eval/RUBRIC.md" target="_blank" rel="noopener"
 &gt;Evaluation rubric&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Host AI tools&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.anthropic.com/claude-code" target="_blank" rel="noopener"
 &gt;Claude Code&lt;/a&gt; — &lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/memory" target="_blank" rel="noopener"
 &gt;memory / CLAUDE.md docs&lt;/a&gt;, &lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/hooks" target="_blank" rel="noopener"
 &gt;hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/openai/codex" target="_blank" rel="noopener"
 &gt;OpenAI Codex CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://agents.md/" target="_blank" rel="noopener"
 &gt;AGENTS.md spec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Comparisons and background&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/pahen/madge" target="_blank" rel="noopener"
 &gt;madge — JS module dependency visualization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/depcheck/depcheck" target="_blank" rel="noopener"
 &gt;depcheck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://git-scm.com/docs/git-gc" target="_blank" rel="noopener"
 &gt;git gc reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.chezmoi.io/" target="_blank" rel="noopener"
 &gt;chezmoi&lt;/a&gt; / &lt;a class="link" href="https://www.gnu.org/software/stow/" target="_blank" rel="noopener"
 &gt;GNU Stow&lt;/a&gt; — dotfile management analogy&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>