원문 캡처 · github.com
원문 캡처 · github.com

rhythm.sh는 GitHub 저장소를 전체 화면 터미널 대시보드에서 훑어보는 TUI(터미널 사용자 인터페이스)다. 관심 있는 프로젝트의 열린 PR, Dependabot 알림, main 브랜치 상태를 한 화면에 표시하며, 각 행에서 브라우저로 이동할 수 있다. Bun과 OpenTUI로 만들었다.

대시보드의 테두리 색은 저장소 상태를 나타낸다. 빨간색은 main 실패, 주황색은 주의가 필요한 알림이나 CI가 실패한 PR, 노란색은 진행 중인 작업, 회색은 별다른 문제가 없는 상태다. 파란색은 선택한 카드를 뜻한다. 저장소 하나를 새로고침할 때 GitHub에 요청 하나를 보내며, 모든 저장소의 정보는 한 번의 묶음 GraphQL 쿼리로 가져온다. 제작자는 저장소 목록이 길어도 빠르고 API 요청 제한에 부담을 덜 주는 방식이라고 설명한다.

각 행은 터미널 하이퍼링크다. 대부분의 최신 터미널에서는 행을 클릭할 수 있고, enter를 누르면 선택한 행이 브라우저에서 열린다. 저장소별로 설정한 링크는 1~9 키로 열 수 있다.

설치와 인증

사용하려면 Bun 1.2 이상이 필요하다. 전역 설치 후 PATH에서 실행되는지 버전을 확인한다.

sh
bun install -g @problemsdev/rhythm
sh
rhythm --version

저장소를 내려받아 실행할 수도 있다.

sh
git clone https://github.com/problemsdev/rhythm
cd rhythm
bun install
bun start

체크아웃한 저장소에서 rhythm 명령을 쓰려면 진입점을 PATH에 심볼릭 링크로 연결한다. 실행 권한이 있으며 shebang을 통해 Bun으로 실행된다.

sh
ln -s "$PWD/src/index.tsx" ~/.bun/bin/rhythm

인증에는 설정된 GITHUB_TOKEN을 우선 사용하고, 설정되어 있지 않으면 gh auth token의 토큰을 사용한다. GitHub CLI가 작동한다면 Rhythm도 사용할 수 있으며, gh auth login의 기본 권한 범위로 접근 가능한 공개·비공개 저장소를 조회할 수 있다.

토큰의 접근 범위에 따라 표시 내용이 달라진다. 해당 저장소의 Dependabot 알림을 GitHub에서 볼 수 있을 때만 대시보드에 나타나며, 권한이 없으면 알림 행에 ⚠ alerts unavailable이라고 표시된다. 별 수는 공개 저장소에만 표시된다. 오타가 있거나 접근 권한이 없거나 삭제된 저장소는 해당 카드 안에 오류를 표시하며, 나머지 저장소는 정상적으로 불러온다.

설정과 조작

설정은 YAML 형식이며 다음 순서로 파일을 찾는다.

  • $RHYTHM_CONFIG
  • ./rhythm.yaml
  • ./rhythm.yml
  • $XDG_CONFIG_HOME/rhythm/config.yaml(기본값은 ~/.config/rhythm/config.yaml)

rhythm --config <path>로 설정 파일을 지정할 수 있으며, 짧은 옵션은 -c다. 시작용 설정 파일은 rhythm.example.yaml에서 확인할 수 있다.

yaml
refresh: 2m # how often to poll GitHub
columns: 2 # optional: cap the card grid width

repos:
 - problemsdev/rhythm # bare form
 - repo: anomalyco/opentui
 links: # jump-off links, opened with keys 1-9
 docs: https://github.com/anomalyco/opentui#readme

refresh는 GitHub를 조회하는 간격으로, 기본값은 2m다. 단위 없는 숫자는 초로 처리하며 문자열에는 ms, s, m, h를 쓸 수 있다. 예를 들어 90s, 2m, 1.5h로 지정한다.

columns는 카드 열의 최대 개수이며 기본값은 자동 설정이다. 자동 설정에서는 터미널 크기에 맞춰 폭 56셀짜리 카드를 가능한 한 많이 배치한다.

repos는 필수 항목으로, 비어 있지 않은 저장소 목록이어야 한다. 각 항목은 owner/name 형식이거나 repo와 선택 항목인 links를 포함하는 매핑이다. repos[].links는 레이블과 URL의 매핑이며, 앞에서부터 아홉 개까지 1~9 키에 연결된다. 링크를 설정하지 않으면 기본값은 없다.

키보드로 저장소와 행을 이동하고, 선택한 항목을 열거나 새로고침할 수 있다.

키동작
tab / shift+tab다음 / 이전 저장소
h l / ← →이전 / 다음 저장소
j k / ↑ ↓저장소를 넘나들며 행 이동
enter / o선택한 행을 브라우저에서 열기
space선택한 저장소의 main 체크 실행 목록을 펼치거나 접기
1–9선택한 저장소에 설정한 링크 열기
r즉시 새로고침
q / ctrl+c종료

대시보드 읽기

머리글에는 저장소 수와 마지막 새로고침 시각이 표시된다. 데이터를 가져오는 동안에는 스피너가 나타나며, 새로고침에 실패하면 오류가 표시된다. 저장소별 카드는 격자 형태로 배치된다. 바닥글에는 키 안내와 현재 사용 중인 설정 파일이 나온다.

카드에는 위에서부터 main 브랜치와 최신 커밋, 최근 업데이트된 열린 PR 최대 10개, Dependabot 알림 요약, 설정한 링크가 표시된다. 열린 PR이 더 있으면 … N more open PRs 행으로 나머지 개수를 알린다.

표시뜻
✓ ✗ ◌ ·main과 각 PR의 헤드 커밋에 대한 CI 통과 / 실패 / 실행 중 / CI 없음
◇초안 PR이며 행 전체가 흐리게 표시됨
✔ ±검토 승인 / 변경 요청
⚠열린 Dependabot 알림이며 심각도별로 critical, high, medium, low 개수를 표시
▸N ▾main의 체크 실행 N개가 접힘 / 펼쳐짐
⋯ ⊘대기열에 들어감 / 취소된 체크 실행
★별 수(공개 저장소에만 표시)

저장소에서 space를 누르면 main의 체크 실행을 펼칠 수 있다. 각 체크 행에는 워크플로와 작업 이름, 실행 시간이 나온다. 실행 중인 체크는 3m12s…처럼 경과 시간을 표시하고 실시간으로 갱신된다. 체크는 실패, 실행 중, 대기 중, 완료 순으로 정렬된다. 상대 시간(4m, 2h, 3d)은 새로고침 사이에도 자체적으로 갱신된다.

각 행을 열면 이동하는 곳은 행의 종류에 따라 다르다.

행열리는 페이지
main브랜치 커밋 기록
체크 실행해당 실행의 로그
PR풀 리퀘스트
no open PRs / … N more open PRs저장소의 풀 리퀘스트 목록
알림저장소의 Dependabot 알림 페이지

개발 환경에서 설치하고 파일 변경 시 다시 시작하려면 다음 명령을 사용한다. 이어서 타입 검사를 실행할 수 있다.

sh
bun install
bun run dev # restarts on file changes
bun run typecheck

저장소의 주요 파일은 다음과 같은 역할을 한다.

경로내용
src/index.tsxCLI 진입점: 플래그, 설정과 토큰 확인, 렌더러 설정
src/config.tsYAML 로드, 검색 경로, 유효성 검사
src/github.ts묶음 GraphQL 쿼리와 응답 파싱
src/model.ts공유 타입과 저장소별 상태 요약
src/open.ts플랫폼 간 브라우저 열기 기능
src/ui/OpenTUI React 컴포넌트, 행 배치, 서식, 테마

라이선스는 MIT다.