Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
d0b75b6
feat(view): 네트워크 그래프 유틸리티
hyemimi Sep 7, 2025
81f992f
refactor(view): 직관적인 변수명으로 수정
hyemimi Sep 8, 2025
9c24c01
Merge pull request #878 from hyemimi/newviz
hyemimi Sep 8, 2025
c4ff5b6
feat(view): 네트워크 그래프 UI 구현 (#885)
hyemimi Sep 14, 2025
fcbb92b
feat(view): 스토리라인 차트 UI 구현
oortmealy Sep 17, 2025
48d9c0e
chore(view): 모달 barrel export 변환
oortmealy Sep 19, 2025
6efbcaf
chore(view): FolderActivityFlow모달 네이밍 변경
oortmealy Sep 19, 2025
3631233
chore(view): App.scss에서 스타일 적용
oortmealy Sep 19, 2025
d8b6b16
chore(view): 핸들러 별도 함수로 분리
oortmealy Sep 19, 2025
0d9b4ee
chore(view): Record-> index signature 변경, 타입 구체화
oortmealy Sep 19, 2025
dcb4727
refactor(view): getSubFolders 별도 파일로 분리
oortmealy Sep 19, 2025
73aa1ea
chore(view): handleGoBack-> handleGoUp, back-> up 버튼으로 변경
oortmealy Sep 19, 2025
8f2dddf
chore(view): key값 index-> crumb, onClick 핸들러 분리
oortmealy Sep 19, 2025
32f8b1f
chore(view): totalData, topFolders의 any 타입 구체화
oortmealy Sep 19, 2025
d88c5de
chore(view): totalData.flat() 제거, 방어코드 정리
oortmealy Sep 19, 2025
7c87e24
Merge pull request #888 from githru/feat/storyline-chart
oortmealy Sep 20, 2025
c7de90c
feat: Enhance FolderActivityFlow with release mode functionality
lee-kyu-hwan Sep 30, 2025
80531cd
refactor: 코드 정리 및 일관성 있는 로그 메시지 포맷 적용
lee-kyu-hwan Oct 1, 2025
6bf6818
feat: Release mode에서 폴더 네비게이션 기능
lee-kyu-hwan Oct 3, 2025
e376dde
refactor(view): Remove development logging from FolderActivityFlow
lee-kyu-hwan Oct 4, 2025
8278c5e
refactor(view): Separate visualization components
lee-kyu-hwan Oct 4, 2025
99204a1
refactor(view): Apply Strategy Pattern for navigation
lee-kyu-hwan Oct 4, 2025
faf3104
refactor(view): Improve type safety by removing 'any' types
lee-kyu-hwan Oct 4, 2025
cdde9cc
refactor(view): Extract navigation state to custom hook
lee-kyu-hwan Oct 4, 2025
35a93d9
docs(view): Add comprehensive JSDoc comments
lee-kyu-hwan Oct 4, 2025
0077e9d
refactor: 네비게이션 접근성 개선
lee-kyu-hwan Oct 5, 2025
147165c
Merge pull request #925 from lee-kyu-hwan/feature/newviz-storyline-re…
lee-kyu-hwan Oct 6, 2025
6de8cf2
refactor: 코드 정리 및 함수형 접근 방식으로 커밋 그룹화 개선
lee-kyu-hwan Oct 6, 2025
f5fd31e
refactor: groupCommitsByReleaseTags 함수형 리팩토링 및 타입 안정성 개선
lee-kyu-hwan Oct 7, 2025
91859bf
refactor: non-null assertion 제거 및 안전한 타입 가드 적용
lee-kyu-hwan Oct 7, 2025
b9a9de7
[chore] : 차트 스타일 변경
oortmealy Oct 7, 2025
fb4cc9b
Merge pull request #925 from lee-kyu-hwan/feature/newviz-storyline-re…
oortmealy Oct 7, 2025
eefdca3
[add] : 차트 컬러 추가
oortmealy Oct 7, 2025
98b38ac
[chore] : 차트 디자인 수정
oortmealy Oct 7, 2025
b047540
[refactor] : y축 폴더/파일명 구분
oortmealy Oct 7, 2025
3071cf3
Merge pull request #943 from githru/refactor/941
oortmealy Oct 8, 2025
ae15287
refactor: cluster mode 제거 및 코드 포맷팅·린팅 수정 (#946)
hyemimi Oct 8, 2025
a001a29
fix(view): fix the header elements layout (#906) (#948)
Jxxunnn Oct 8, 2025
5720716
refactor(view): 배열 업데이트 성능 최적화
lee-kyu-hwan Oct 9, 2025
4f298ac
refactor(view): Map 타입 정의 일관성 개선
lee-kyu-hwan Oct 9, 2025
f3ac430
refactor(view): 불필요한 주석 제거
lee-kyu-hwan Oct 9, 2025
6df8971
Merge pull request #940 from lee-kyu-hwan/931-refactor/group-commits-…
lee-kyu-hwan Oct 9, 2025
2c8ddd9
feat(view): 스토리라인 차트 표시 버튼에 MUI 적용 (#951)
Jxxunnn Oct 9, 2025
af4b0b7
[chore] : 툴팁 디자인 변경
oortmealy Oct 9, 2025
e318029
[refactor] : 노드 호버이벤트 수정 및 툴립 UI 수정
oortmealy Oct 9, 2025
efe9505
[refactor] : 툴팁 위치 계산 변경
oortmealy Oct 9, 2025
3d65cf4
Merge branch 'newviz' of https://github.com/githru/githru-vscode-ext …
oortmealy Oct 9, 2025
f503b9f
[chore] : 툴팁 초기화 변경
oortmealy Oct 9, 2025
33ef89f
[del] : 클러스터 모드 파일 삭제
oortmealy Oct 9, 2025
4422be7
[add] : 툴팁 스타일 인라인 -> scss 선언
oortmealy Oct 9, 2025
b635b48
[chore] : 툴팁 scss 적용
oortmealy Oct 9, 2025
ccd91ee
Merge pull request #958 from githru/refactor-tooltip/956
oortmealy Oct 10, 2025
a64647c
refactor: 클러스터 모드 관련 불필요한 파일 및 모듈 삭제 (#964)
hyemimi Oct 10, 2025
7c91993
chore: FolderActivityFlow.test.ts -> FolderActivityFlow.releaseAnalyz…
lee-kyu-hwan Oct 10, 2025
9e81b75
test(view): FolderActivityFlow releaseAnalyzer 테스트 수정 및 mock 데이터 추가
lee-kyu-hwan Oct 10, 2025
537d2fe
refactor: 테스트에서 사용하지 않는 mock 데이터 제거 및 import 정리
lee-kyu-hwan Oct 10, 2025
64868e2
[refactor] : 브레드크럼 컴포넌트 변경
oortmealy Oct 11, 2025
8fe971b
[refactor] : 차트 위치 고정을 위한 동적 높이 추가
oortmealy Oct 11, 2025
d0fa662
[fix] : contributor activity가 없는 폴더/파일은 차트에서 삭제
oortmealy Oct 11, 2025
2414b97
Merge pull request #973 from lee-kyu-hwan/963-refactor/release-analyz…
lee-kyu-hwan Oct 11, 2025
9573171
[chore] : 차트 크기 변경
oortmealy Oct 11, 2025
704556b
[del] : 중복 스타일 제거
oortmealy Oct 11, 2025
20f8f69
[del] : 불필요한 변수 제거
oortmealy Oct 11, 2025
cc5e94f
[del] : 차트 반응형 제거
oortmealy Oct 11, 2025
89bb57f
[del] : navigateUp 함수 제거
oortmealy Oct 11, 2025
739cce9
[add] : 타이틀 추가
oortmealy Oct 11, 2025
4c7408b
[add] : 서브타이틀 추가
oortmealy Oct 11, 2025
60f26c2
Merge pull request #976 from githru/refactor-breadcrumb/956
oortmealy Oct 11, 2025
195ce15
[chore] : 브레드크럼 정렬 수정
oortmealy Oct 11, 2025
70bbf0d
[chore] : 아이콘 변경
oortmealy Oct 11, 2025
1a77946
[chore] : cursor: "pointer" 인라인 스타일 옮김
oortmealy Oct 11, 2025
421c640
Merge pull request #980 from githru/feat-title/959
oortmealy Oct 12, 2025
a3ca1d6
[refactor] : Storyline Chart 반응형
oortmealy Oct 12, 2025
0c7d56d
[chore] : insertions/deletions 컬러팔레트 적용
oortmealy Oct 12, 2025
dec6749
Merge pull request #985 from githru/refactor-chart-responsive/960
oortmealy Oct 13, 2025
40439f0
fix(view): 스토리라인 차트 툴팁이 간헐적으로 나타나는 현상 해결 (#1005)
hyemimi Oct 19, 2025
173eb85
feat(view): 스토리라인 차트 모달 개선 (#1006)
Jxxunnn Oct 19, 2025
e05483a
refactor(view): FolderActivityFlow -> StorylineChart 변경, 네트워크 그래프 삭제 …
hyemimi Oct 25, 2025
29600f0
feat(view): 스토리라인 필터 릴리즈/기여자 필터링 UI, 기능 구현 (#1027)
hyemimi Oct 29, 2025
c81de72
feat(view): 스토리라인 애니메이션 추가 (#1028)
hyemimi Oct 30, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 151 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
# CLAUDE.md

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

클로드 memory bank?? 가 repo로 들어왔군요 ㅎㅎ
이런 것들도 잘 관리되면 좋긴 하겠습니다!


This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Overview

githru-vscode-ext is a VSCode extension that provides Git visualization and analytics. It's a monorepo with three main packages:

- **analysis-engine**: Core Git analysis engine that parses git logs and GitHub data
- **view**: React-based UI components for visualization (uses D3.js, Material-UI)
- **vscode**: VSCode extension wrapper that bridges the engine and view

## Development Commands

### Root Level
```bash
# Install dependencies for all packages
npm install

# Build all packages
npm run build:all

# Test all packages
npm run test:all

# Lint all packages
npm run lint
npm run lint:fix

# Format code
npm run prettier
npm run prettier:fix
```

### Package-Specific Commands

#### Analysis Engine (packages/analysis-engine)
```bash
# Build with type declarations
npm run build

# Run specific tests
npm run test:stem
npm run test

# Lint
npm run lint
```

#### View (packages/view)
```bash
# Start development server
npm run start

# Build for production
npm run build

# Run tests
npm run test

# Run E2E tests
npm run test:e2e
```

#### VSCode Extension (packages/vscode)
```bash
# Build extension (also builds view package)
npm run build

# Watch mode for development
npm run watch

# Package extension
npm run package

# Debug: F5 in VSCode or Run > Start Debugging
```

### Debugging the Extension
1. Run `npm run build:all` from root
2. Open the `packages/vscode` folder in VSCode
3. Press F5 or use Run > Start Debugging
4. In the Extension Development Host, use Command Palette > "Open Githru View"

## Architecture

### Data Flow
1. **VSCode Extension** captures git repository context
2. **Analysis Engine** processes git log and GitHub API data:
- Parses raw git commits (`parser.ts`)
- Builds commit dictionary (`commit.util.ts`)
- Creates stem/branch structure (`stem.ts`)
- Generates cluster summary map (`csm.ts`)
3. **View** renders interactive visualizations using the processed data

### Key Components

#### Analysis Engine Core Classes
- `AnalysisEngine`: Main orchestrator class
- `PluginOctokit`: GitHub API integration with retry/throttling
- Dependency injection using `tsyringe`

#### View Architecture
- **State Management**: Zustand stores in `src/store/`
- **Components**: Modular React components with D3.js integration
- **IDE Adapter Pattern**: `VSCodeIDEAdapter` bridges VSCode API
- Component structure: `ComponentName/index.ts` exports, separate `.const.ts`, `.type.ts`, `.util.ts` files

#### VSCode Extension
- Extension activation on git repositories
- Webview integration for React UI
- Command palette integration
- GitHub authentication management

## Code Conventions

### Commit Messages
Follow conventional commits with these scopes:
- `feat(engine)`: Analysis engine features
- `feat(view)`: UI/visualization features
- `feat(vscode)`: VSCode extension features
- `fix(scope)`: Bug fixes
- `refactor(scope)`: Code refactoring

### Code Style
- ESLint configuration with Prettier
- TypeScript strict mode
- 2-space indentation, 120 character line width
- Single quotes disabled, trailing commas on ES5

### Testing
- Jest for unit testing
- Playwright for E2E testing (view package)
- Test files: `*.spec.ts` or `*.test.ts`

## Development Environment Setup

### Prerequisites
- Node.js >= 16
- npm >= 8
- VSCode with ESLint extension

### TypeScript Configuration
In VSCode, activate workspace TypeScript:
1. Open a TypeScript file
2. Ctrl/Cmd + Shift + P
3. "Select TypeScript Version"
4. "Use Workspace Version"

### Package Structure
The project uses npm workspaces. Each package has its own dependencies and build configuration but shares root-level linting and formatting rules.
12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions packages/view/src/App.scss
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,17 @@ body {
padding: 0 0.75rem 0 1.25rem;
}

.header-container > :is(:first-child, :last-child) {
flex: 1;
}

.header-container > :last-child {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 0.5rem;
}

.top-container {
height: 13.75rem;
}
Expand Down
84 changes: 80 additions & 4 deletions packages/view/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,53 @@
import "reflect-metadata";
import { container } from "tsyringe";
import { useEffect, useRef } from "react";
import { useEffect, useRef, useState } from "react";
import BounceLoader from "react-spinners/BounceLoader";
import { Dialog, dialogClasses } from "@mui/material";
import Divider from "@mui/material/Divider";
import AppBar from "@mui/material/AppBar";
import Toolbar from "@mui/material/Toolbar";
import IconButton from "@mui/material/IconButton";
import Typography from "@mui/material/Typography";
import CloseIcon from "@mui/icons-material/Close";

import MonoLogo from "assets/monoLogo.svg";
import { BranchSelector, Statistics, TemporalFilter, ThemeSelector, VerticalClusterList } from "components";
import {
BranchSelector,
Statistics,
TemporalFilter,
ThemeSelector,
VerticalClusterList,
StorylineChart,
} from "components";
import "./App.scss";
import type IDEPort from "ide/IDEPort";
import { useAnalayzedData } from "hooks";
import { RefreshButton } from "components/RefreshButton";
import type { IDESentEvents } from "types/IDESentEvents";
import { useBranchStore, useDataStore, useGithubInfo, useLoadingStore, useThemeStore } from "store";
import { THEME_INFO } from "components/ThemeSelector/ThemeSelector.const";
import { InsightsButton } from "components/InsightsButton";
import { pxToRem } from "utils";

const App = () => {
const initRef = useRef<boolean>(false);
const [showStorylineChartModal, setShowStorylineChartModal] = useState(false);
const { handleChangeAnalyzedData } = useAnalayzedData();
const filteredData = useDataStore((state) => state.filteredData);
const { handleChangeBranchList } = useBranchStore();
const { handleGithubInfo } = useGithubInfo();
const { handleGithubInfo, repo } = useGithubInfo();
const { loading, setLoading } = useLoadingStore();
const { theme } = useThemeStore();
const ideAdapter = container.resolve<IDEPort>("IDEAdapter");

const handleOpenStorylineChartModal = () => {
setShowStorylineChartModal(true);
};

const handleCloseStorylineChartModal = () => {
setShowStorylineChartModal(false);
};

useEffect(() => {
if (initRef.current === false) {
const callbacks: IDESentEvents = {
Expand Down Expand Up @@ -59,7 +84,18 @@ const App = () => {
<div className="header-container">
<ThemeSelector />
<BranchSelector />
<RefreshButton />
<div>
<RefreshButton />
<InsightsButton
isNew
sx={{
width: "1.875rem",
height: "1.875rem",
color: "white",
}}
onClick={handleOpenStorylineChartModal}
/>
</div>
</div>
<div className="top-container">
<TemporalFilter />
Expand All @@ -78,6 +114,46 @@ const App = () => {
</div>
)}
</div>
{/* Storyline Chart Modal */}
{showStorylineChartModal && (
<Dialog
fullScreen
open={showStorylineChartModal}
onClose={handleCloseStorylineChartModal}
sx={{
[`& .${dialogClasses.paper}`]: {
backgroundColor: "#222324",
},
}}
>
<AppBar sx={{ position: "relative", backgroundColor: "#222324", paddingY: pxToRem(20) }}>
<Toolbar>
<Typography
sx={{ pl: pxToRem(25), flex: 1 }}
variant="h4"
component="div"
>
{`Storyline of ${repo}`}
</Typography>
<IconButton
edge="end"
color="inherit"
onClick={handleCloseStorylineChartModal}
size="large"
aria-label="close"
>
<CloseIcon />
</IconButton>
</Toolbar>
</AppBar>
<Divider
sx={{
backgroundColor: "#F7F7F780",
}}
/>
<StorylineChart />
</Dialog>
)}
</>
);
};
Expand Down
26 changes: 26 additions & 0 deletions packages/view/src/components/InsightsButton/InsightsButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Badge, IconButton, IconButtonProps } from "@mui/material";
import InsightsIcon from "@mui/icons-material/Insights";

type InsightsButtonProps = {
isNew?: boolean;
} & IconButtonProps;

const InsightsButton = ({ isNew = false, ...props }: InsightsButtonProps) => {
return (
<IconButton {...props}>
<Badge
badgeContent="NEW"
invisible={!isNew}
sx={{
"& .MuiBadge-badge": {
fontSize: "0.625rem",
},
}}
>
<InsightsIcon />
</Badge>
</IconButton>
);
};

export default InsightsButton;
1 change: 1 addition & 0 deletions packages/view/src/components/InsightsButton/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as InsightsButton } from "./InsightsButton";
Loading