refactor: v2.2.195-201 — slashRouter god-file 해체 (–95%) + 인프라 5개 추출

아키텍처 감사 결과 HIGH 2건 + MED 2건 + LOW 1건 — 7 라운드 정리 시리즈.
기능 변경 없음, 순수 구조 정리.

**slashRouter.ts: 4,174 → 201줄 (–3,973, –95%)**
**agent.ts: 1,617 → 1,551줄 (–66, –4%)**

v2.2.195: eventSourcedStore + SystemPromptBlock registry
  - createEventStore<E>(opts) — 4 store (customers/hire/runway/feedback) I/O 240줄 중복 제거
  - _turnCtx 5 named string field → 1 Map<string, string> (새 verification block 추가 25곳→1곳)
  - buildAstraModeSystemPrompt: 5 ternary gate + 5 위치 → 1 for-loop join

v2.2.196: trackers cluster split
  - src/features/teamops/handlers/_shared.ts (fmtKrw/parseAmount/daysUntil/parseTaskOwner/stageEmoji/STAGE_ORDER/TERMINAL_STAGES)
  - src/features/teamops/handlers/trackers.ts (runway/customers/hire)
  - src/features/teamops/handlers/index.ts (barrel)
  - extension.ts 에 side-effect import (순환 import 회피)

v2.2.197: mtimeFileCache + PostAnswerHook registry
  - src/lib/mtimeFileCache.ts — createMtimeFileCache<T>(name, parse) (terminologyBlock + termValidator 2-cache invariant 자동화)
  - src/agent/postAnswerHooks/{types,index}.ts — Devil/SelfCheck/TermValidator 3 _maybeX method → 1 runPostAnswerHooks(ctx) loop
  - agent.ts –66줄

v2.2.198: dashboards cluster split
  - src/features/teamops/handlers/dashboards.ts (morning/evening/cohort/weekly)

v2.2.199: coordination + communication clusters split
  - src/features/teamops/handlers/coordination.ts (task/decisions/onesie/blocked/standup)
  - src/features/teamops/handlers/communication.ts (draft/feedback)
  - callLmSynthesis export 노출 (communication 이 사용)
  - 옛 parseTaskOwner local 정의 삭제 (_shared.ts 사용)

v2.2.200: system cluster split
  - src/features/system/handlers.ts (memory/glossary/help)

v2.2.201: datacollect cluster split + LLM 인프라 추출
  - src/features/datacollect/handlers.ts (research/benchmark/youtube/blog/wikify/meet)
  - src/features/datacollect/llm.ts (callLmSynthesis + repairKoreanGlitches + bridgeErrorRemedy)
  - slashRouter import 4개로 축소: vscode/logInfo/getBridgeBaseUrl/bridgeErrorRemedy

**최종 slashRouter (201줄):**
- REGISTRY Map + registerSlashCommand/listSlashCommands/isSlashCommand
- handleSlashCommand (dispatcher + 에러 처리)
- Webview interface + chunk helper
- getRecentSlashCommands ring buffer (actionability scoring 용)

**미래 부담 감소 metrics:**
- 새 슬래시 명령: god-file 끝에 함수 + register → 1 파일 + 1 register call
- 새 verification block: 5곳 편집 → 1 set call
- 새 event store: 60줄 boilerplate → createEventStore 한 줄
- 새 post-answer hook: 3 step → 1 push
- 새 mtime cache: Map + invariant 관리 → createMtimeFileCache 한 줄

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-01 11:55:22 +09:00
parent 15a34e0889
commit 7bec20620a
40 changed files with 4784 additions and 4545 deletions
+183 -46
View File
@@ -1,6 +1,6 @@
{
"version": 1,
"generatedAt": "2026-05-29T07:30:42.949Z",
"generatedAt": "2026-06-01T02:30:44.174Z",
"files": {
"src/agent/actions/brainOps.ts": {
"mtimeMs": 1779764602582.9768,
@@ -135,9 +135,9 @@
]
},
"src/agent/handlePrompt/buildAstraModeSystemPrompt.ts": {
"mtimeMs": 1780033670993.9626,
"size": 8427,
"lines": 133,
"mtimeMs": 1780276266500.7705,
"size": 6433,
"lines": 100,
"role": "",
"imports": [
"src/lib/contextBuilders/localProjectIntent",
@@ -298,6 +298,26 @@
"src/agent"
]
},
"src/agent/postAnswerHooks/index.ts": {
"mtimeMs": 1780278997000.157,
"size": 3900,
"lines": 96,
"role": "Post-answer hook registry — 답변 완료 후 실행되는 부가 작업 모음. 새 hook 추가 = 1 객체 push. agent.ts 는 이 배열을 iterate 만 함. 현재 등록 순서 (v2.2.197): 1. devilRebuttal — Devil Agent 반박 카드 (비활성 시 silent skip) 2. postHocSelfChec",
"imports": [
"src/agent/postAnswerHooks/types",
"src/agent/llm/devilRebuttal",
"src/agent/postHocSelfCheck",
"src/agent/termValidator",
"src/config"
]
},
"src/agent/postAnswerHooks/types.ts": {
"mtimeMs": 1780278967597.8257,
"size": 2001,
"lines": 48,
"role": "Post-Answer Hook 인터페이스 — 답변 streaming 완료 후 실행되는 부가 작업. 옛 구조: agent.ts 의 maybeEmitDevilRebuttal, maybePostHocSelfCheck, maybeRunTermValidator 3개 private method. 새 hook 추가 시 (1) method 정의 (2) import (3)",
"imports": []
},
"src/agent/postHocSelfCheck.ts": {
"mtimeMs": 1780033021215.5054,
"size": 8943,
@@ -317,16 +337,18 @@
]
},
"src/agent/termValidator.ts": {
"mtimeMs": 1780039129011.7288,
"size": 8675,
"lines": 221,
"mtimeMs": 1780278698973.1787,
"size": 8156,
"lines": 202,
"role": "Post-generation Term Validator — 답변 완료 후 정규식/사전 기반 결정론적 스캔. v2.2.192 의 Terminology Dictionary 가 instructional (LLM 에게 표준 표기 사용 지시) 이면, 이건 deterministic — LLM 이 지시를 안 따랐을 때 catch. Glossary 파싱 — 두 패턴 인식",
"imports": []
"imports": [
"src/lib/mtimeFileCache"
]
},
"src/agent.ts": {
"mtimeMs": 1780039163639.0967,
"size": 87154,
"lines": 1589,
"mtimeMs": 1780278886140.8762,
"size": 81193,
"lines": 1503,
"role": "",
"imports": [
"src/utils",
@@ -397,8 +419,7 @@
"src/agent/handlePrompt/buildAstraModeSystemPrompt",
"src/agent/handlePrompt/computeBudgetedRequest",
"src/agent/handlePrompt/processFinalAnswer",
"src/agent/postHocSelfCheck",
"src/agent/termValidator",
"src/agent/postAnswerHooks",
"src/agent/handlePrompt/applyAutoContinuation",
"src/features/approval/approvalQueue",
"src/features/providers",
@@ -704,11 +725,13 @@
]
},
"src/extension.ts": {
"mtimeMs": 1779764602602.9807,
"size": 17079,
"lines": 354,
"mtimeMs": 1780280902153.7483,
"size": 17342,
"lines": 358,
"role": "",
"imports": [
"src/features/teamops/handlers",
"src/features/system/handlers",
"src/utils",
"src/config",
"src/agent",
@@ -1117,11 +1140,13 @@
"imports": []
},
"src/features/customers/customersStore.ts": {
"mtimeMs": 1779952731356.5476,
"size": 6815,
"lines": 176,
"mtimeMs": 1780275713140.8125,
"size": 5722,
"lines": 149,
"role": "고객사 / MRR / 갱신 트래커. 4인 기업의 수입 쪽 — /runway 가 통장과 burn 을 본다면, 여기는 어디서 돈이 들어오나. Salesforce / HubSpot 같은 CRM 아닌 가벼운 event-sourced 로그. 저장 형식: JSON Lines (.jsonl) — append-only event log. 같은 customer 의 여러 이",
"imports": []
"imports": [
"src/features/_shared/eventSourcedStore"
]
},
"src/features/datacollect/bridgeClient.ts": {
"mtimeMs": 1779764602617.1548,
@@ -1166,9 +1191,9 @@
"imports": []
},
"src/features/datacollect/slashRouter.ts": {
"mtimeMs": 1780039211177.6035,
"size": 226165,
"lines": 4096,
"mtimeMs": 1780280990100.2815,
"size": 67318,
"lines": 1240,
"role": "",
"imports": [
"src/utils",
@@ -1179,6 +1204,7 @@
"src/config",
"src/retrieval/terminologyBlock",
"src/agent/termValidator",
"src/features/teamops/handlers/_shared",
"src/features/setup/datacollectSetup",
"src/features/datacollect/prompts/synthesisPrompt",
"src/features/datacollect/prompts/youtubePrompts",
@@ -1214,18 +1240,22 @@
]
},
"src/features/feedback/feedbackStore.ts": {
"mtimeMs": 1779931731117.0737,
"size": 3406,
"lines": 81,
"mtimeMs": 1780275889230.5403,
"size": 1851,
"lines": 44,
"role": "고객 피드백 누적 저장소. 단일 운영자(대표) 모드에서 슬랙·이메일·CS 채널에 흩어진 고객 피드백을 /feedback <텍스트> 한 줄로 모아 둔다. 패턴 분석은 /feedback summary 로 LLM 이 누적 데이터를 보고 카테고리 분포 + 반복 주제를 추출. 저장 형식: JSON Lines (.jsonl) — 한 줄 = 한 entry. 누적·app",
"imports": []
"imports": [
"src/features/_shared/eventSourcedStore"
]
},
"src/features/hire/hireStore.ts": {
"mtimeMs": 1779964473915.006,
"size": 5586,
"lines": 150,
"mtimeMs": 1780275773463.53,
"size": 4567,
"lines": 125,
"role": "채용 파이프라인 트래커. 4인 → 5인 이상 확장 시점에 후보자가 여러 명, 여러 역할(개발/기획/디자인) 로 들어오기 시작 — 노션·스프레드시트·이메일에 흩어진 정보를 한 명령으로 본다. Event-sourced (customersStore 와 동일 패턴) — append-only 이벤트 로그를 재생해 후보자별 현재 단계 + 노트 누적 도출. 위치: <w",
"imports": []
"imports": [
"src/features/_shared/eventSourcedStore"
]
},
"src/features/projectArchitecture/index.ts": {
"mtimeMs": 1778720117531.2734,
@@ -1378,11 +1408,13 @@
"imports": []
},
"src/features/runway/runwayStore.ts": {
"mtimeMs": 1779935315716.9917,
"size": 6666,
"lines": 173,
"mtimeMs": 1780275853704.5698,
"size": 5511,
"lines": 146,
"role": "Runway / Cash 누적 저장소. 4인 기업 운영의 가장 중요한 숫자 — 현금 잔고 / 월 소진율 / 남은 개월수 — 를 한 명령 (/runway) 로 본다. 회계 시스템은 아니고, 대표가 머리에 가지고 있는 \"지금 통장에 얼마, 한 달에 얼마 나감\" 을 코드 옆에서 잡는 가벼운 트래커. 저장 형식: JSON Lines (.jsonl) — 한 줄 = ",
"imports": []
"imports": [
"src/features/_shared/eventSourcedStore"
]
},
"src/features/secondBrainTrace.ts": {
"mtimeMs": 1779411561816.5603,
@@ -1631,6 +1663,19 @@
"src/utils"
]
},
"src/features/system/handlers.ts": {
"mtimeMs": 1780280889224.8892,
"size": 20518,
"lines": 394,
"role": "System handlers — /memory · /glossary · /help (인프라·관리·발견). v2.2.200 에서 slashRouter.ts 에서 분리. 4인 팀 운영 도메인 아닌 \"ASTRA 자체 인프라\" 슬래시 명령. teamops handlers 와 같은 패턴.",
"imports": [
"src/features/datacollect/slashRouter",
"src/config",
"src/memory",
"src/retrieval/terminologyBlock",
"src/agent/termValidator"
]
},
"src/features/tasks/index.ts": {
"mtimeMs": 1779065453887.9194,
"size": 238,
@@ -1647,6 +1692,82 @@
"role": "Task tracker — .astra/company/shared/tasks.md 단일 파일. 설계 원칙: - 외부 DB 없이 사람이 읽을 수 있는 마크다운 테이블에 누적. git 으로 history 추적 가능. - 파싱은 regex 기반 (셀 구분자 |). 사용자가 손으로 편집해도 fault-tolerant. - 모든 task 는 안정적 id (t001,",
"imports": []
},
"src/features/teamops/handlers/communication.ts": {
"mtimeMs": 1780280515102.4714,
"size": 13781,
"lines": 254,
"role": "TeamOps Communication — /draft · /feedback (외부 출력·기록). v2.2.199 에서 slashRouter.ts 에서 분리. (원래는 v2.2.200 예정이었으나 coordination 추출 시 register 라인이 인접해 묶여 함께 진행.)",
"imports": [
"src/features/datacollect/slashRouter",
"src/features/feedback/feedbackStore"
]
},
"src/features/teamops/handlers/coordination.ts": {
"mtimeMs": 1780280322364.4475,
"size": 30738,
"lines": 572,
"role": "TeamOps Coordination — /task · /decisions · /onesie · /blocked · /standup. v2.2.199 에서 slashRouter.ts 에서 분리. 작업·결정·1:1·블로커·스탠드업 등 \"팀 운영의 실시간 부분\" 클러스터. 공통 헬퍼는 ./shared.ts 에서. 옛 slashRouter 의 local pars",
"imports": [
"src/features/datacollect/slashRouter",
"src/features/teamops/handlers/_shared",
"src/features/calendar",
"src/sidebar/managers/chronicleProjectStore"
]
},
"src/features/teamops/handlers/dashboards.ts": {
"mtimeMs": 1780279486170.9111,
"size": 42079,
"lines": 806,
"role": "TeamOps Dashboards — /morning · /evening · /cohort · /weekly (CEO 일·주 리듬). v2.2.198 에서 slashRouter.ts 에서 분리. cross-data 합성 (Tasks + customers + hire + runway + Chronicle ADR) 으로 일/주/월 단위 시야 제공. 공통 헬퍼는",
"imports": [
"src/features/datacollect/slashRouter",
"src/features/teamops/handlers/_shared",
"src/features/calendar",
"src/sidebar/managers/chronicleProjectStore",
"src/features/runway/runwayStore",
"src/features/customers/customersStore",
"src/features/hire/hireStore"
]
},
"src/features/teamops/handlers/index.ts": {
"mtimeMs": 1780280542425.257,
"size": 501,
"lines": 14,
"role": "TeamOps handlers 배럴 — extension activate 시 1회 import 로 모든 핸들러 등록. 각 핸들러 파일은 module scope 에서 registerSlashCommand({...}) 호출하므로 import 만으로 등록 완료. 새 핸들러 파일은 여기에 한 줄 추가. v2.2.196 — trackers (runway/custom",
"imports": [
"src/features/teamops/handlers/trackers",
"src/features/teamops/handlers/dashboards",
"src/features/teamops/handlers/coordination",
"src/features/teamops/handlers/communication"
]
},
"src/features/teamops/handlers/trackers.ts": {
"mtimeMs": 1780278032934.0896,
"size": 36032,
"lines": 704,
"role": "TeamOps Trackers — /runway · /customers · /hire (event-sourced 트래커 3종). v2.2.196 에서 slashRouter.ts 에서 분리. 모두 .astra/.jsonl event log 를 읽고 (createEventStore via 각 store 모듈) 대시보드 / 수정 명령 제공. 공통 헬퍼 (fmtK",
"imports": [
"src/features/datacollect/slashRouter",
"src/features/teamops/handlers/_shared",
"src/features/runway/runwayStore",
"src/features/customers/customersStore",
"src/features/hire/hireStore"
]
},
"src/features/teamops/handlers/_shared.ts": {
"mtimeMs": 1780277843419.9949,
"size": 3647,
"lines": 84,
"role": "TeamOps handlers 공통 헬퍼 — 4인 팀 운영 슬래시 명령 클러스터가 공유하는 함수·상수. 이전 위치: src/features/datacollect/slashRouter.ts 내부 module-local 함수 (v2.2.196 에서 분리). 핸들러 도메인별 분할 시 공통 항목만 여기에. 추후 datacollect / system 핸들러도 비슷한",
"imports": []
},
"src/features/_shared/eventSourcedStore.ts": {
"mtimeMs": 1780275610701.943,
"size": 3216,
"lines": 83,
"role": "Generic event-sourced store — append-only .jsonl 파일 1개를 읽고/쓰는 공통 기반. 배경: customers, hire, runway, feedback 4개 store 가 같은 패턴 4번 반복 (getXFilePath / readX / appendX / countX) — byte-for-byte 중복 ~240줄. 한 ",
"imports": []
},
"src/integrations/telegram/conversationHistory.ts": {
"mtimeMs": 1778720117535.294,
"size": 6427,
@@ -1797,9 +1918,9 @@
]
},
"src/lib/contextBuilders/memoryContext.ts": {
"mtimeMs": 1780033602782.2012,
"size": 18059,
"lines": 352,
"mtimeMs": 1780276328602.9944,
"size": 16862,
"lines": 328,
"role": "",
"imports": [
"src/agent",
@@ -1974,6 +2095,13 @@
"src/lib/engine"
]
},
"src/lib/mtimeFileCache.ts": {
"mtimeMs": 1780278539124.1875,
"size": 2553,
"lines": 72,
"role": "mtime-keyed file cache utility — 파일을 parse 결과 까지 캐싱. 배경: terminologyBlock.ts 와 termValidator.ts 가 같은 글로서리 파일에 별도 캐시 2개를 보유. \"함께 무효화\" 가 사람이 손으로 보장하는 invariant — 한쪽만 잊고 invalidate 안 하면 stale read 위험. 이 ",
"imports": []
},
"src/lib/paths.ts": {
"mtimeMs": 1778664139961.0637,
"size": 6567,
@@ -2249,11 +2377,13 @@
]
},
"src/retrieval/terminologyBlock.ts": {
"mtimeMs": 1780033577419.837,
"size": 5735,
"lines": 137,
"mtimeMs": 1780278609386.6382,
"size": 5450,
"lines": 127,
"role": "Terminology Dictionary — 프로젝트 표준 용어집을 시스템 프롬프트에 주입. 사용자 제안: \"표준 표기 강제 + 답변 내 표기 일관성 검증\". 예: runway vs 런웨이, P-Reinforce vs p-reinforce, Chronicle vs 크로니클. 설계 — 사용자 편집 markdown 파일: - 위치: <workspace>/.as",
"imports": []
"imports": [
"src/lib/mtimeFileCache"
]
},
"src/retrieval/types.ts": {
"mtimeMs": 1779764602656.6587,
@@ -3356,8 +3486,15 @@
"role": "Bug: 논문 Outline Title 인간-AI 상호작용에서 의도 정렬을 높이기 위한 최소 질의 구조 연구 또는 사용자의 인지적 편향을 보완하는 구조화...",
"imports": []
},
"docs/records/ConnectAI/bugs/BUG-0015-짚어둘-관찰-사항-참고용-face-api-js-환경-face-api-js는-원래-브라우저용입니다-node-단.md": {
"mtimeMs": 1780281037883.6174,
"size": 2482,
"lines": 16,
"role": "Bug: 짚어둘 관찰 사항 (참고용) face-api.js 환경: face-api.js는 원래 브라우저용입니다. Node 단독 실행 시 @tensorfl...",
"imports": []
},
"docs/records/ConnectAI/chronicle.config.json": {
"mtimeMs": 1780039836702.8801,
"mtimeMs": 1780281037893.3647,
"size": 371,
"lines": 11,
"role": "JSON configuration",
@@ -3910,9 +4047,9 @@
"imports": []
},
"docs/records/ConnectAI/timeline.md": {
"mtimeMs": 1780039836694.6646,
"size": 14881,
"lines": 233,
"mtimeMs": 1780281037885.788,
"size": 15049,
"lines": 236,
"role": "Project Timeline",
"imports": []
},