Skip to content

refactor: extension.ts 모놀리스를 모듈로 분리 (21,836 → 18,910줄, 동작 보존) - #4

Open
vip7612-maker wants to merge 23 commits into
wonseokjung:mainfrom
vip7612-maker:refactor/split-extension
Open

refactor: extension.ts 모놀리스를 모듈로 분리 (21,836 → 18,910줄, 동작 보존)#4
vip7612-maker wants to merge 23 commits into
wonseokjung:mainfrom
vip7612-maker:refactor/split-extension

Conversation

@vip7612-maker

Copy link
Copy Markdown

무엇을 / 왜

src/extension.ts 단일 파일이 21,836줄까지 비대해져 코드 리뷰·충돌·온보딩이 어려운 상태였습니다. 코드 주석에도 "25,000줄에 묻혀있다"는 자조가 남아 있을 정도입니다. 이 PR은 동작을 100% 보존하면서 응집도 높은 모듈로 분리합니다.

  • extension.ts: 21,836 → 18,910줄 (−2,926, 약 −13.4%)
  • 신규 모듈 15개 (core 5 · config · runtime-state · company 3 · git-sync · tracker · panels 2 · 검증 하네스)

원칙 (동작 보존 리팩토링)

  • 순수 이동: 기능 변경 없음. 함수를 export로 옮기고 extension.tsimport만.
  • 번들 무비용: 빌드가 esbuild --bundle 단일 번들이라 모듈 분리에 런타임/패키징 변화 0. (out/extension.js 1.4MB 동일)
  • 점진적·검증 가능: 한 커밋 = 한 도메인. 매 단계 tsc --noEmit(strict) + esbuild 번들이 둘 다 그린임을 확인 후 커밋(롤백 지점 확보).

모듈 구성

영역 파일 내용
잎 유틸 core/{git,fs-safe,search,proc,bridge}.ts git 호출·경로 안전·glob/grep·Python 실행·포트 브리지
설정 config.ts getConfig·프롬프트/툴시드 로더·_ensureBrainDir
런타임 상태 runtime-state.ts 교차 모듈 싱글톤 holder(extCtx·autoSyncRunning)
회사 company/{company,agents-state,orchestration}.ts 회사 상태·마이그레이션 / 에이전트 채용·활성 / 모델 오케스트레이션
동기화 git-sync.ts 두뇌·회사 GitHub 자동 동기화
할일 tracker.ts 추적 데이터 레이어(CRUD·이벤트·마크다운)
패널 panels/{brain-network,task-tree}.ts 지식 그래프 빌더+웹뷰 HTML / 사이드바 할일 트리뷰

리뷰어가 알아두면 좋은 점

  • 싱글톤 처리: _extCtx·_autoSyncRunning은 여러 모듈이 공유 → runtime-state.tsholder 객체로 노출. getter 함수가 아닌 객체 속성(runtime.extCtx)으로 둔 이유는 strict 모드의 null-narrowing(if (runtime.extCtx) { runtime.extCtx.x })을 보존하기 위함입니다.
  • tracker ↔ calendar 순환 결합 차단 (유일한 구조 변경): addTrackerTask/updateTrackerTask가 구글 캘린더 함수를 직접 호출하고 캘린더 함수는 TrackerTask 타입을 받아 순환이었습니다. DI 훅(setTrackerCalendarHooks)으로 의존성을 역전 — activate()에서 실제 캘린더 함수를 주입합니다. 동작은 동일하며, tsc strict가 훅 시그니처 일치를 검증합니다.
  • 순수 로직만 분리: showBrainNetwork(싱글톤 의존)·_taskTreeProvider(싱글톤)·tracker 인라인 명령은 의도적으로 extension.ts에 남겼습니다.
  • 함수 본문은 awk 바이트 추출 + perl export 부착으로 옮겨 regex 많은 로직(마이그레이션 등)이 한 글자도 변경되지 않음을 보장했습니다.
  • package-lock.json의 npm 정규화 변경은 리팩토링과 무관해 제외했습니다.

검증

매 커밋마다 아래 하네스(scripts/verify-refactor.sh)가 그린:

tsc --noEmit (strict)  → exit 0
esbuild --bundle        → out/extension.js 1.4mb, exit 0
✅ VERIFY PASS

참고: 이 PR은 extension.ts 분리 1차분입니다. 남은 큰 덩어리(calendar·approvals·schedulers·telegram·server·OfficePanel·SidebarChatProvider)는 같은 방식으로 후속 진행 가능합니다.

🤖 Generated with Claude Code

vip7612-maker and others added 23 commits June 16, 2026 23:43
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
git·fs-safe·search·proc·bridge 5개 모듈로 잎 유틸 이동 (동작 보존).
extension.ts 21,836 → 21,206줄 (-630). tsc strict + esbuild 번들 그린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ig.ts

getConfig·_isLMStudioEngine·_ensureBrainDir·_loadPrompt·_loadToolSeed +
EXCLUDED_DIRS·MAX_CONTEXT_SIZE 이동 (동작 보존). 21,206 → 21,104줄. 그린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…runtime-state

- _safeReadText() 를 core/fs-safe.ts 로 이동 (fs 읽기 잎 헬퍼, 47곳 공유)
- _extCtx 싱글톤을 runtime-state.ts 의 holder(runtime.extCtx)로 이전 (25곳 치환).
  holder 객체라 strict null-narrowing 유지. company/telegram/schedulers/panels 공용.
동작 보존. tsc strict + esbuild 그린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…pany.ts

11 심볼(_migrate*·get/updateCompanyMetrics·getCompanyDay·is/readCompanyName·
_extractCompanyName·COMPANY_INTERNAL_DIRS) 이동. 동작 보존. 21,104 → 20,907줄. 그린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nts-state.ts

14종(LOCKED/ALWAYS/DEFAULT/OPTIONAL 상수·read/isAgent*·set/markAgent*·
_maybeRecommendCoderModel) 이동. awk 바이트추출+perl export로 본문 보존. 20,907→20,685. 그린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ation.ts

agent모델맵(read/write/getAgentModel)·_classifyModel·_autoOrchestrateModelMap·
listInstalledModels 이동. ModelTier는 내부전용. system-specs import는 패널서도 써서 잔류.
20,685 → 20,542줄. 그린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…sync.ts

_safeGitAutoSync·_safeGitAutoSyncCompany 이동. 공유 락 _autoSyncRunning →
runtime.autoSyncRunning holder(7곳), 회사 락은 git-sync 내부 private. 동작 보존.
20,542 → 20,364줄. 그린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…c/panels/brain-network.ts

buildKnowledgeGraph·_RENDER_GRAPH_HTML(~900줄 HTML)·Brain* 인터페이스 이동.
싱글톤(_activeChatProvider) 참조하는 showBrainNetwork 는 본문 잔류(순수 로직만 분리).
20,364 → 19,286줄 (-1,078). 그린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…calendar via DI hook)

타입(TrackerTask·TaskPriority)·CRUD(read/write/add/update/listOpen)·trackerToMarkdown·
변경이벤트(onTrackerChanged) 이동. tracker↔calendar 순환 결합은 setTrackerCalendarHooks()
IoC 훅으로 차단 — activate 에서 구글 캘린더 함수 주입. tsc strict 가 훅 시그니처 일치 검증.
동작 보존.    19111줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
TaskTreeItem·TaskTreeProvider·우선순위/상태/기한 아이콘 헬퍼 이동. tracker.ts 분리로
해금됨(readTracker·onTrackerChanged·_coercePriority 등 import). 싱글톤·인라인 명령은 본문 잔류.
동작 보존. 19,111 → 18,910줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
WORLD_LAYOUT·CUSTOM_MAP_DESKS·buildWorldDeskPositions + 좌표 인터페이스 5종 이동.
순수 데이터(의존 0), 소비자는 OfficePanel. 동작 보존. 18,910 → 18,797줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CalendarWriteConfig + 14함수(isCalendarWriteConnected·create/update/delete/patchEvent·
findCalendarEvents·refreshCalendarCacheViaOAuth·OAuth 위저드/루프백) 이동. tracker 와는
단방향 타입 import만(DI 훅이 순환 차단). 본문 역참조 0. 동작 보존. 18,797 → 18,130줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
AgentTool/ToolField 타입·listAgentTools·writeToolConfig·setToolEnabled·AGENT_TOOLS_CATALOG·
전체 _seed<Tool> Python 도구 시드 함수(32 export) 이동. 순수 시딩 레이어 — 본문 LLM/대화로그/
스킬저장 역참조 0(검증). 대화로그·saveAgentSkill 등 결합 함수는 본문 잔류. 18,130 → 17,262줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…any/structure.ts

ensureCompanyStructure(외부 22곳) + 미션 목표(_GOAL_PREAMBLE·DEFAULT_AGENT_GOALS·
read/writeAgentGoal·_seedAgentGoalIfMissing) 이동. 순수 시딩 — 본문 역참조 0. appendAgentMemory는
_copyDirRecursive 결합으로 잔류. http-server 추출 해금. 17,262 → 16,849줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tProviderLike)

38곳 _activeChatProvider → runtime.activeChatProvider. SidebarChatProvider 공개 표면 중
호출되는 11개 메서드를 ChatProviderLike 인터페이스로 고정(순환 방지). tsc strict 가 구조적
대입 가능성 검증. medium 배치(approvals·schedulers·telegram) 해금 인프라. 동작 보존.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
getConversationsDir·appendConversationLog(28곳)·readRecentConversations 이동. 순수 파일IO.
approvals·telegram·schedulers·scaffold 공통 의존 해금. 16,848 → 16,795줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…otifier)

PendingApproval·createApproval·listPendingApprovals·resolveApproval 등 이동. _approvalsPanelProvider
→ runtime holder(ApprovalsPanelLike). approvals→telegram 결합은 setApprovalNotifier IoC 훅으로
차단(activate서 sendTelegramReport 주입). pulseAgent·refresh는 holder 경유. 16,795 → 16,619줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
readTelegramConfig·sendTelegramReport(61곳)·sendTelegramLong·sendTelegramTyping·_markdownToTelegram
이동. 순수 axios 발신 — provider/LLM 결합 없음. 폴링·핸들러(provider 양방향)는 본문 잔류.
schedulers·approvals·scaffold 의 발신 의존 해금. 16,619 → 16,498줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
할일 nudge·데일리 브리핑·매출 감시·반복(recurrence)·사전알람·날짜유틸 이동(2개 연속 블록).
타이머 5종은 모듈 내부 전용(비export), start/stop 함수로만 제어. LLM 결합 0 — 의존은 전부
이미 분리된 모듈(tracker·telegram-send·conversation-log·calendar·company)+runtime holder. 16,498 → 16,019줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ld.ts

scaffoldDeveloperProject(vite-vanilla/react·static 템플릿) 이동. 의존 전부 importable
(telegram-send·conversation-log·tracker·core/proc). 함수 본문의 코드 template 문자열 보호 위해
perl 일괄치환 대신 수동 export. 16,019 → 15,852줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
_quickLLMCall(Ollama/LM Studio 공용 경량 호출, 6곳) 이동. 의존 axios+config 뿐.
telegram 분류·스킬 증류 등의 공통 LLM 의존 해금. 15,852 → 15,835줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ActiveDispatch·_activeDispatches Map·_start/find/update/endActiveDispatch 이동. 의존 0(순수 Map/TTL).
telegram 핸들러와 SidebarChatProvider 가 공유하는 상태를 leaf 로 분리 → telegram 추출의 선행 unlock. 15,835 → 15,778줄.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant