<?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/ko/tags/multi-repo/</link><description>Recent content in Multi Repo on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Mon, 04 May 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/ko/tags/multi-repo/index.xml" rel="self" type="application/rss+xml"/><item><title>gc-tree — CLAUDE.md/AGENTS.md 위에 얹는 글로벌 컨텍스트, Git 브랜치처럼 관리</title><link>https://ice-ice-bear.github.io/ko/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/ko/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 — CLAUDE.md/AGENTS.md 위에 얹는 글로벌 컨텍스트, Git 브랜치처럼 관리" /&gt;&lt;h2 id="개요"&gt;개요
&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;는 &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://github.com/openai/codex" target="_blank" rel="noopener"
 &gt;OpenAI Codex CLI&lt;/a&gt; 같은 AI 코딩 도구를 위해 &lt;strong&gt;레포 위 레이어&lt;/strong&gt;(above-the-repo)에 글로벌 컨텍스트를 저장하는 &lt;a class="link" href="https://nodejs.org" target="_blank" rel="noopener"
 &gt;Node.js 20+&lt;/a&gt; CLI다. 이름의 &amp;ldquo;gc&amp;quot;는 garbage collection이 아니라 &lt;strong&gt;Global Context&lt;/strong&gt;, &amp;ldquo;tree&amp;quot;는 &lt;a class="link" href="https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell" target="_blank" rel="noopener"
 &gt;Git branch&lt;/a&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;와 &lt;a class="link" href="https://agents.md/" target="_blank" rel="noopener"
 &gt;AGENTS.md&lt;/a&gt;가 한 레포 안에서 잘 작동한다면, &lt;a class="link" href="https://github.com/handsupmin/gc-tree" target="_blank" rel="noopener"
 &gt;gc-tree&lt;/a&gt;는 &lt;strong&gt;여러 레포·여러 워크스트림을 가로지를 때&lt;/strong&gt; 매 세션마다 반복 설명을 하지 않도록 만드는 도구다.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 User["개발자"] --&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; (컴팩트 인덱스)"]
 Index --&gt; Match["매칭된 문서 요약 &amp;lt;br/&amp;gt; (전체의 ~4%)"]
 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-무엇이-문제인가"&gt;1. 무엇이 문제인가
&lt;/h2&gt;&lt;p&gt;AI는 당신을 모른다. 어떻게 일하는지, 팀이 어떤 용어를 쓰는지, 어느 레포가 어느 레포와 묶이는지, 어떤 루틴을 무의식적으로 반복하는지. 그래서 매 세션마다 같은 짓을 한다 — 자기소개 다시, 도메인 언어 다시, 아키텍처 문서 다시 붙여넣기.&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;와 &lt;a class="link" href="https://agents.md/" target="_blank" rel="noopener"
 &gt;AGENTS.md&lt;/a&gt;는 한 레포 안에서는 훌륭하다. 문제는 &lt;strong&gt;레포 경계를 넘는 순간&lt;/strong&gt; 시작된다 — &lt;a class="link" href="https://monorepo.tools/" target="_blank" rel="noopener"
 &gt;monorepo&lt;/a&gt; 가 아닌 환경에서 backend/frontend/platform 레포가 따로 있을 때, 공통 백그라운드는 어디에 두는가? 매번 양쪽에 중복 복사할 것인가? gc-tree는 이 반복을 제거하기 위해 만들어졌다.&lt;/p&gt;
&lt;h2 id="2-작동-모델--git-브랜치처럼"&gt;2. 작동 모델 — Git 브랜치처럼
&lt;/h2&gt;&lt;p&gt;gc-tree의 멘탈 모델은 단순하다. &lt;strong&gt;Git 브랜치 = 코드 레인&lt;/strong&gt;이라면 &lt;strong&gt;gc-branch = 컨텍스트 레인&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;이 한 줄로 &lt;code&gt;project-b&lt;/code&gt;라는 독립 컨텍스트가 생긴다. 다른 워크스트림으로 옮길 때 &lt;code&gt;gctree checkout main&lt;/code&gt;으로 돌아오면 그쪽 컨텍스트가 통째로 활성화된다. 같은 &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; 멘탈 모델을 그대로 빌려왔기 때문에 새 개념을 배울 게 거의 없다.&lt;/p&gt;
&lt;p&gt;저장 구조도 직관적이다.&lt;/p&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;~/.gctree/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; branches/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; main/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index.md ← 가장 먼저 로드되는 컴팩트 인덱스
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docs/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth.md ← 필요할 때만 읽히는 full doc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; architecture.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; project-b/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; index.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docs/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; branch-repo-map.json ← 어떤 레포가 어떤 gc-branch에 속하는지
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; settings.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;레포 바깥에 있으니 &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; 규칙도 필요 없고, 실수로 커밋될 일도 없다. 같은 gc-branch를 쓰는 모든 프로젝트가 같은 컨텍스트를 공유한다.&lt;/p&gt;
&lt;h2 id="3-progressive-disclosure--토큰-윈도우-4만-주입"&gt;3. Progressive disclosure — 토큰 윈도우 ~4%만 주입
&lt;/h2&gt;&lt;p&gt;gc-tree의 핵심 성능 주장은 &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;가 &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; → 안정적인 ID와 함께 컴팩트 매치만 반환&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gctree related --id &amp;lt;match-id&amp;gt;&lt;/code&gt; → 그 매치 주변 보조 문서&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gctree show-doc --id &amp;lt;match-id&amp;gt;&lt;/code&gt; → 해당 문서의 full markdown&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;핵심 수치 — &lt;strong&gt;쿼리당 전체 컨텍스트의 ~4%만 주입된다.&lt;/strong&gt; 나머지 96%는 디스크에 남아 토큰 윈도우 바깥에 있다. 이는 &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의 long-context best practices&lt;/a&gt;가 권고하는 &amp;ldquo;필요할 때만, 관련된 것만&amp;quot;과 정확히 일치한다.&lt;/p&gt;
&lt;p&gt;또한 매칭이 없거나 레포가 스코프에서 제외됐을 때 모호하게 실패하지 않고 &lt;strong&gt;명시적 상태&lt;/strong&gt;를 돌려준다는 점도 중요하다. AI 도구가 &amp;ldquo;컨텍스트가 없다&amp;quot;와 &amp;ldquo;컨텍스트를 찾지 못했다&amp;quot;를 구분할 수 있어야 잘못된 추측을 안 한다.&lt;/p&gt;
&lt;h2 id="4-hook-통합--sessionstart--userpromptsubmit"&gt;4. Hook 통합 — 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;이 하는 일은 단순한 파일 스캐폴딩이 아니다. Claude Code의 &lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/hooks" target="_blank" rel="noopener"
 &gt;SessionStart hook&lt;/a&gt;과 &lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/hooks" target="_blank" rel="noopener"
 &gt;UserPromptSubmit hook&lt;/a&gt;에 gc-tree를 물려 &lt;strong&gt;세션 시작 전 자동 체크&lt;/strong&gt;를 거는 것이 진짜 가치다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SessionStart → 세션 시작 시 gc-tree가 활성 브랜치를 확인&lt;/li&gt;
&lt;li&gt;UserPromptSubmit → 사용자 프롬프트 직전에 &lt;code&gt;resolve --query&lt;/code&gt;로 관련 문서 검색&lt;/li&gt;
&lt;li&gt;빈 결과 / no-match는 세션 동안 캐시 → 매번 디스크 읽지 않음&lt;/li&gt;
&lt;li&gt;매치된 요약은 컨텍스트에 직접 주입 → AI가 제목만이 아니라 &lt;strong&gt;실제 패턴과 명령어&lt;/strong&gt;를 본다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Codex 쪽도 동일하다. &lt;a class="link" href="https://github.com/openai/codex" target="_blank" rel="noopener"
 &gt;Codex의 skill 시스템&lt;/a&gt;에 &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;가 설치되고 &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 스니펫 + /gc-onboard 등&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 스니펫 + $gc-onboard 등&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;# 양쪽 동시&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;두 provider가 &lt;strong&gt;같은 컨텍스트 저장소&lt;/strong&gt;(&lt;code&gt;~/.gctree&lt;/code&gt;)를 공유한다는 점이 핵심이다. 온보딩 한 번이면 양쪽 도구에서 같이 쓴다.&lt;/p&gt;
&lt;h2 id="5-검증된-성능--devholdout-분리"&gt;5. 검증된 성능 — DEV/HOLDOUT 분리
&lt;/h2&gt;&lt;p&gt;대부분의 OSS 도구가 &amp;ldquo;잘 작동한다&amp;quot;고만 말하는 반면 gc-tree는 &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;이 표가 인상적인 이유는 &lt;strong&gt;HOLDOUT 픽스처를 튜닝 루프에서 격리&lt;/strong&gt;했다는 점이다. autoresearch 루프는 DEV에만 적합하고, HOLDOUT은 정직한 리포팅용으로만 쓴다. Generalization gap = 10.0 pts. 8개 카테고리(exact-keyword, paraphrase, glossary, mixed-language, same-domain distractor, same-domain negative, cross-branch negative)에 38개 라벨 케이스. &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;와 &lt;a class="link" href="https://en.wikipedia.org/wiki/Mean_reciprocal_rank" target="_blank" rel="noopener"
 &gt;MRR&lt;/a&gt;을 함께 본다는 건 정보 검색 평가의 정석을 따른다는 뜻이다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;npm run eval:ranked&lt;/code&gt;로 재현 가능. &lt;strong&gt;이 정도 evaluation 디시플린을 갖춘 개인 OSS 도구는 흔치 않다.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="6-claudemd--agentsmd와의-비교"&gt;6. 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;스코프&lt;/td&gt;
 &lt;td&gt;레포 1개&lt;/td&gt;
 &lt;td&gt;다중 레포, 단일 컨텍스트&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;영속성&lt;/td&gt;
 &lt;td&gt;레포별 파일&lt;/td&gt;
 &lt;td&gt;레포 바깥, 세션 간 재사용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;컨텍스트 전환&lt;/td&gt;
 &lt;td&gt;수동 파일 편집&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;관련성 필터링&lt;/td&gt;
 &lt;td&gt;전부 또는 전무&lt;/td&gt;
 &lt;td&gt;매칭 문서만 주입 (~4%)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;온보딩&lt;/td&gt;
 &lt;td&gt;수기 작성&lt;/td&gt;
 &lt;td&gt;AI 도구가 가이드&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Codex 호환&lt;/td&gt;
 &lt;td&gt;가능&lt;/td&gt;
 &lt;td&gt;가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Claude Code 호환&lt;/td&gt;
 &lt;td&gt;가능&lt;/td&gt;
 &lt;td&gt;가능&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이 표의 가장 흥미로운 행은 &lt;strong&gt;관련성 필터링&lt;/strong&gt;이다. CLAUDE.md는 본질적으로 &lt;strong&gt;all-or-nothing&lt;/strong&gt; 파일이다 — 세션에 들어오거나 들어오지 않거나. 반면 gc-tree는 &lt;strong&gt;쿼리 기반 부분 주입&lt;/strong&gt;이다. 컨텍스트가 커질수록 이 차이가 결정적이 된다.&lt;/p&gt;
&lt;h2 id="7-흔한-사용-패턴"&gt;7. 흔한 사용 패턴
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;레포 스코프 분리:&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;# 현재 레포 포함&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;# 현재 레포 제외&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;이게 필요한 이유 — 같은 머신에서 &lt;code&gt;monorepo-a&lt;/code&gt;와 &lt;code&gt;legacy-b&lt;/code&gt;를 같이 만지는데 &lt;code&gt;project-b&lt;/code&gt; 컨텍스트가 &lt;code&gt;legacy-b&lt;/code&gt;에 새도록 두면 AI가 엉뚱한 컨벤션을 따른다. &lt;code&gt;set-repo-scope&lt;/code&gt;가 그걸 명시적으로 막는다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;컨텍스트 업데이트:&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;# 별칭: 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;AI 도구가 &amp;ldquo;뭐가 바뀌었어?&amp;ldquo;를 묻고 답을 받아 gc-branch에 다시 쓴다. CLAUDE.md를 수기로 편집하는 워크플로가 가이드된 업데이트로 바뀐다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gc-tree 자체 업데이트:&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;&lt;a class="link" href="https://www.npmjs.com/" target="_blank" rel="noopener"
 &gt;npm&lt;/a&gt;에서 최신 버전을 가져온 뒤, 이전에 설치한 모든 provider를 자동 재스캐폴딩한다. 사용자가 hook 통합 코드를 수동으로 옮길 필요가 없다.&lt;/p&gt;
&lt;h2 id="8-작은-도구가-채우는-큰-틈"&gt;8. 작은 도구가 채우는 큰 틈
&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;가 JS 모듈 의존성을 시각화하고, &lt;a class="link" href="https://github.com/depcheck/depcheck" target="_blank" rel="noopener"
 &gt;depcheck&lt;/a&gt;이 미사용 deps를 찾고, &lt;a class="link" href="https://git-scm.com/docs/git-gc" target="_blank" rel="noopener"
 &gt;git의 reflog/gc&lt;/a&gt;가 도달 불가능 객체를 정리하듯 — &lt;strong&gt;이름은 비슷해 보여도 gc-tree는 완전히 다른 결의 도구&lt;/strong&gt;다. AI 코딩 워크플로에서 매번 반복되던 마찰점을 정확히 한 군데 — &lt;strong&gt;레포 위, 세션 위, 도구 위&lt;/strong&gt; — 의 레이어로 분리해 해결한다.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/hooks" target="_blank" rel="noopener"
 &gt;Anthropic이 SessionStart hook과 skill 시스템&lt;/a&gt;을 열어둔 덕분에, 그리고 &lt;a class="link" href="https://github.com/openai/codex" target="_blank" rel="noopener"
 &gt;OpenAI Codex CLI&lt;/a&gt;도 같은 결의 확장점을 제공한 덕분에 이런 &amp;ldquo;외부에서 컨텍스트를 주입하는&amp;rdquo; 도구가 만들어질 수 있다. CLAUDE.md가 vim의 &lt;code&gt;.vimrc&lt;/code&gt;라면, gc-tree는 &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;나 &lt;a class="link" href="https://www.chezmoi.io/" target="_blank" rel="noopener"
 &gt;&lt;code&gt;chezmoi&lt;/code&gt;&lt;/a&gt;가 dotfile에 한 일을 컨텍스트에 한다.&lt;/p&gt;
&lt;h2 id="인사이트"&gt;인사이트
&lt;/h2&gt;&lt;p&gt;gc-tree가 흥미로운 건 기능 자체보다 &lt;strong&gt;AI 코딩 도구의 컨텍스트 계층이 어떤 모양으로 진화하는가&lt;/strong&gt;를 보여주기 때문이다. 첫 단계는 &lt;strong&gt;레포 내부 마크다운&lt;/strong&gt;(CLAUDE.md, AGENTS.md)이었다. 그 다음은 &lt;strong&gt;레포 위 글로벌 컨텍스트&lt;/strong&gt;(gc-tree)다. 그 다음은 아마 &lt;strong&gt;팀 공유 컨텍스트&lt;/strong&gt;, &lt;strong&gt;버저닝된 컨텍스트&lt;/strong&gt;, &lt;strong&gt;컨텍스트 머지/리베이스&lt;/strong&gt; 같은 &lt;a class="link" href="https://git-scm.com/book/en/v2" target="_blank" rel="noopener"
 &gt;Git이 코드에 한 일&lt;/a&gt;을 컨텍스트에 그대로 가져오는 단계일 가능성이 높다 — gc-tree의 작명이 이미 그 방향을 가리킨다. 또 하나 주목할 건 평가 디시플린이다. &lt;strong&gt;DEV/HOLDOUT 분리&lt;/strong&gt;, recall@k + MRR + negative precision, mixed-script 쿼리까지 커버하는 픽스처를 갖춘 개인 OSS 도구는 드물고, 이는 컨텍스트 검색을 진지하게 정보 검색 문제로 다룬다는 뜻이다. 한국 개발자 입장에서 즉시 시도해볼 만한 건 &lt;code&gt;npm install -g @handsupmin/gc-tree &amp;amp;&amp;amp; gctree init&lt;/code&gt;으로 시작해서, 평소 자주 반복 설명하던 도메인 용어 한 다발을 &lt;code&gt;gctree onboard&lt;/code&gt;로 한 번 넣어 두고, 세션 시작 시 AI 도구가 그 컨텍스트를 자동으로 끌어가는지 확인하는 길이다. 매 세션 첫 3~5분의 반복 설명이 사라지는 것만으로도 ROI가 명확하다.&lt;/p&gt;
&lt;h2 id="참고"&gt;참고
&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;li&gt;&lt;a class="link" href="https://github.com/handsupmin/gc-tree/blob/main/README.ko.md" target="_blank" rel="noopener"
 &gt;README.ko.md (한국어)&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;호스트 AI 도구&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;비교/배경&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 모듈 의존성 시각화&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 공식 문서&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 매니지먼트 비유&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>