
Senior 엔지니어를 위한 오픈소스 도구 Junior는 맥에서 GitHub·Slack·Linear 등의 업무를 모아 우선순위를 매기고, 코드를 수정하거나 반복 작업을 수행한다. 외부로 나가는 푸시·PR·댓글·메시지는 사용자가 승인해야 한다. 현재는 macOS용 초기 소프트웨어이며, Apple silicon과 Intel 맥에서 사용할 수 있다.
curl -fsSL https://usejunior.sh/install.sh | sh
설치 명령은 macOS용 Junior.app을 설치한다. 앱은 아직 Apple 공증을 받지 않았으므로 제작자는 설치 전에 install.sh를 읽으라고 안내한다. Junior는 2026년 10월까지 Triage라는 이름을 사용했다. Triage에서 업데이트하면 첫 실행 때 데이터를 /.triage에서 /.junior로 옮긴다.
Junior가 하는 일
Junior는 GitHub, Slack, Linear와 MCP 서버가 있는 도구의 업무를 한 목록에 모아 순위를 매긴다. 각 항목에는 목록에 들어온 이유가 표시되고, 기다리는 사람이 있는 일은 위로 올라간다. 제작자에 따르면 순위는 모델의 판단이 아니라 명시적인 규칙으로 정한다. 업무를 맥락과 함께 요약해 주고, 코드를 고치거나 CI를 기다리며 재시도하고, 예약된 반복 작업을 수행하거나 답변 초안을 작성할 수도 있다.
- GitHub·Slack·Linear 및 MCP 서버가 있는 도구의 업무를 한 우선순위 목록에서 확인한다. 각 항목에 이유를 표시하며, 기다리는 사람이 있는 항목을 우선한다.
- 코드 수정, 재시도, CI 대기, 예약 작업과 답변 초안 작성을 맡길 수 있다. 외부로 전송되는 내용은 사용자가 승인한다.
- 맥에서 사용자가 이미 결제한 Claude Code 또는 Codex 요금제를 이용한다. Junior에 API 키를 입력할 필요가 없고, Junior 측에 별도 요금을 내지 않는다.
Junior는 사용자가 여러 도구를 확인하느라 필요한 업무를 찾는 상황을 하나의 정렬된 목록으로 바꾸고, 팀원이 기다리는 업무를 먼저 보여준다. PR이나 티켓을 열기 전에 요약을 요청해 맥락을 확인할 수도 있다. Junior가 맡은 업무와 사용자가 맡은 업무는 받은 편지함의 각 행에 구분된다.
설치와 사용
설치는 터미널에서 한 줄의 명령으로 진행한다. 앱이 아직 공증되지 않았으므로 제작자는 설치 스크립트를 먼저 읽으라고 안내한다. 설치가 끝나면 Junior.app과 junior, junior-mcp 명령이 ~/.local/bin에 놓인다.
curl -fsSL https://usejunior.sh/install.sh | sh
Junior는 GitHub와 Slack을 기본 지원한다. MCP 서버가 있는 다른 도구는 작업(job)을 통해 연결한다. 기존 로그인 정보를 사용하므로 새 계정을 만들거나 API 키를 설정할 필요가 없다. Codex는 대화에 사용할 수 있다.
사용자는 긴 설명 대신 한 줄로 업무를 맡긴다. Junior는 요청을 다시 말해 확인하고 계획을 세운 뒤 작업한다. 예를 들어 “의존성을 지난주와 똑같이 올려”라고 요청하면 Junior는 “패치 버전만 올리고, PR은 검토를 기다리며, 지난주와 똑같이 진행한다”고 되짚는다.
인수인계는 다음과 같이 이뤄진다.
- 한 줄로 요청한다. 예를 들어 “#498의 불안정한 테스트를 고쳐”라고 하면 Junior가 관련 PR과 로그, 이력을 직접 확인한다.
- Junior는 이해한 내용을 되짚고 필요한 질문을 한 번에 묻는다. 각 질문에는 제안하는 답도 붙인다.
- 코드를 건드리기 전에 계획을 제시한다. 사용자는 PR을 검토하듯 계획을 살펴본다. 오타 같은 작은 작업은 계획 단계를 건너뛴다.
- Junior는 맥에서 코드를 수정하고 테스트하며 로컬 커밋을 만들 수 있다. 사용자의 승인 전까지 변경 사항은 맥에 남는다.
- 푸시, PR, 댓글, 티켓 이동과 메시지는 전송할 문구 그대로 사용자의 승인을 기다린다. 기본 브랜치로의 푸시와 일반적인 강제 푸시도 승인 대상이며, 작업물을 파괴할 수 있는 명령은 확인을 요청한다.
사용자는 특정 사람에게 특정 종류의 메시지를 보내도록 미리 허가할 수도 있다. 예를 들어 “PR이 준비되면 Junior가 프리야에게 DM을 보내도 된다”고 설정할 수 있다. Junior가 승인 카드로 제안하며, 사용자는 설정의 Approvals에서 허가를 추가하거나 취소한다.
승인과 안전장치
Junior에는 끌 수 없는 세 가지 규칙이 있다. 이름이나 말투를 바꿔도 규칙은 유지된다.
- 작업을 시작하기 전에 요청을 한두 문장으로 다시 말한다.
- 질문은 한 메시지에 모으고, 각 질문에 제안 답변을 붙인다.
- 외부로 나가는 내용은 사용자가 승인해야 한다. 단, 코드 수정·테스트·로컬 커밋은 맥에 남으므로 사전 승인이 필요하지 않다.
일부 전송은 별도 카드 없이 이뤄진다. 다른 사람이 아직 볼 수 없는 사용자의 개인 브랜치 푸시와 초안 PR이 이에 해당한다. 기본 브랜치로 푸시하거나 일반적인 강제 푸시를 하는 경우에는 승인을 기다린다. 삭제 등 작업물을 파괴하는 명령도 확인을 요구한다.
Junior는 사용자의 승인 없이 PR이나 메시지를 게시하지 않는다. 제작자는 Junior가 #general에 임의로 글을 올린 적이 없으며, 그렇게 할 수 없다고 설명한다. 병합은 현재 사용자가 직접 해야 한다. 이후 사용자가 신뢰한 업무에 한해, 사용자가 허용할 경우 Junior가 병합하는 기능을 계획하고 있다.
기능과 화면
- 받은 편지함에는 GitHub·Slack·Linear와 MCP 서버가 있는 도구의 업무가 정렬되어 표시된다. 사람의 응답을 기다리는 항목이 우선이다.
Today는 아침 브리핑과 하루 계획을 보여준다. 사용자와 Junior가 맡은 일, 기한이 지난 일을 확인할 수 있다.Goals에서는 단계별 지시 대신 완료 조건을 맡길 수 있다. Junior는 CI와 리뷰어를 기다리고, 문제를 고치며 재시도하고, 설정된 예산에서 멈춘다.Jobs는 일정에 따라 반복하는 업무다. Junior와 대화하며 설정하고, 켜기 전에 시험 실행을 한다.Review nits는 PR에 달린 사소한 리뷰 의견을 읽어 수정한다. 푸시 전에는 변경 diff를 보여준다.Replies는 반복 답변의 초안을 만든다. 전송은 사용자의 승인을 기다린다.Briefs는 PR의 diff, 대화와 이력을 읽고 먼저 살펴볼 부분을 정리한다.Log에는 전송 항목이 승인 카드와 함께 기록된다. 실제로 무엇이 나갔고 누가 허가했는지 볼 수 있다.Sessions에서는 Claude Code와 Codex 대화, 실제 터미널을 같은 작업 공간에서 사용할 수 있다. Junior는 브라우저 창에서 UI 작업을 확인하며, 사용자는 이를 볼 수 있다.Receipts에서는 자동 실행을 세션으로 열어 확인할 수 있다. “찾은 것이 없다”는 결과도 실제로 살펴보고 발견하지 못했다는 뜻이다.Workspaces는 업무와 개인 용도를 분리한다. 받은 편지함, 작업, 연결 도구와 Claude 로그인을 각각 따로 둔다.
Junior의 화면 표정은 여덟 가지 상태를 나타낸다. 걱정하는 표정은 사용자가 확인할 일이 있다는 뜻이다.
| 상태 | 뜻 |
|---|---|
| Hello | 지금 확인할 일이 없다. |
| Listening | 사용자가 입력 중이며 Junior가 읽고 있다. |
| Thinking | PR, 로그와 대화를 살펴보고 있다. |
| Working | 작업 중이며, 맥 밖으로 나간 것은 없다. |
| Needs you | 제안 답변을 붙인 질문 하나가 있다. |
| Done | 작업을 끝냈으며, 외부 전송은 승인을 기다린다. |
| Stuck | 문제가 생겼으며, 추측하지 않고 문제를 알린다. |
| Asleep | 맥이 잠자고 있어 Junior도 멈춰 있다. |
현재 기능과 계획
Junior가 업무를 맡는 범위는 단계적으로 넓어지는 구상이다. 첫날에는 이슈를 찾고, 코드를 고친 뒤 사용자가 diff를 검토한다. Junior가 PR 초안을 만들면 사용자가 승인하고, Junior가 CI 문제를 고칠 때는 답변을 사용자가 승인한다. 병합은 사용자가 맡는다.
몇 주 뒤와 그 이후의 열은 계획일 뿐 현재 구현된 기능이 아니다. 계획상 몇 주 뒤에는 Junior가 diff를 훑고 정해진 규칙에 따라 PR을 열며, CI 문제도 처리한다. 더 나중에는 Junior가 코드 수정과 PR 생성, CI 대응을 맡고, 사용자가 신뢰한 작업은 사용자가 허용한 경우 병합까지 할 수 있도록 구상한다. Junior는 사용자가 허락할 때만 다음 단계로 넘어간다. 예를 들어 의존성 PR 12건을 수정 없이 승인했다는 이력을 근거로 직접 병합해도 되는지 물을 수 있다.
현재 지원 대상은 Claude Code를 매일 사용하고 맥에서 일하며, 팀원이 기다리는 상황을 겪는 시니어·스태프 엔지니어와 기술 리드다. 클라우드 에이전트를 팀 단위로 공유하려는 조직, 검토 없이 AI가 행동하기를 원하는 사람, 맥을 쓰지 않는 사람을 위한 제품은 아직 아니다.
도구 연결과 데이터
GitHub와 Slack은 기본 제공 연결을 사용한다. GitHub는 사용자의 gh 로그인으로 연결하며 리뷰 요청, 상태별 PR, 멘션을 가져온다. Slack은 claude.ai 커넥터를 사용하며 읽기 전용으로 읽지 않은 DM과 멘션을 가져온다. Linear, Sentry, PagerDuty, Notion 등은 Claude Code가 볼 수 있는 MCP 서버를 통해 작업에 연결한다. 웹 검색과 가져오기도 Claude Code의 검색·가져오기를 사용하는 작업으로 설정할 수 있다.
사용자는 화면의 입력창, ⌘⇧T, junior add 명령 또는 MCP를 통해 업무를 추가할 수 있다. 같은 PR이 Slack과 GitHub에서 각각 언급돼도 정규 ID를 바탕으로 목록에는 한 행만 생긴다.
작업은 어디를 살펴보고 무엇을 업무로 판단하며 얼마나 자주 확인할지 Junior에게 말해 설정한다. Junior는 설정 내용을 되짚고 한 번 질문한 뒤, 꺼진 상태의 초안을 만든다. 시험 실행으로 어떤 항목이 등록될지 확인한 다음 작업을 켠다. 각 작업에는 사용자가 허용한 도구만 제공된다.
Junior 도구는 Claude Code, Codex 또는 Cursor 세션에서도 사용할 수 있다. 표준 입력·출력 방식은 다음과 같다.
claude mcp add junior -- junior-mcp # stdio
# or point a client at http://localhost:5178/mcp # streamable HTTP
설정의 MCP 항목에는 현재 작업 공간의 URL과 각 클라이언트에 필요한 명령이 표시된다. 도구는 받은 편지함, 오늘의 계획, 산출물과 작업 초안을 다룬다. Upsert는 멱등적으로 동작하고 사용자의 상태를 덮어쓰지 않는다. 따라서 스캐너가 중복 항목을 만들거나 done 상태를 되돌리지 않는다.
데이터는 맥의 ~/.junior 아래 SQLite에 저장되며 작업 공간마다 데이터베이스가 하나씩 있다. 서버는 휴대전화를 설정에서 연결하지 않는 한 현재 맥에서만 응답한다. Junior는 GitHub·Slack·Linear 자격 증명을 보관하지 않고 기존 로그인을 사용한다. 다만 Claude, Codex 또는 연결 서비스에 보내는 정보는 해당 서비스로 전송된다. Junior의 작업과 브리핑은 사용자의 Claude 또는 Codex 요금제를 사용하며, 앱은 각 세션의 비용을 달러로 보여준다.
설치 조건과 명령
필요한 것은 Apple silicon 또는 Intel 맥과 설치 및 로그인이 끝난 Claude Code다. Codex는 대화 기능에 선택적으로 사용할 수 있다. gh 로그인은 GitHub 소스에, claude.ai Slack 커넥터는 Slack 소스에 각각 선택 사항이다.
| 항목 | 용도 |
|---|---|
| macOS, Apple silicon 또는 Intel | Junior는 맥 앱이다. |
| Claude Code, 로그인 완료 | Junior·작업·브리핑이 API 키가 아니라 사용자의 로그인을 이용한다. |
gh, 로그인 완료 | GitHub 소스에 선택적으로 사용한다. |
claude.ai Slack 커넥터 | Slack 소스에 선택적으로 사용한다. |
| Codex, 로그인 완료 | Codex 대화에 선택적으로 사용한다. |
같은 설치 명령을 다시 실행하면 업데이트한다. Junior.app에는 Node가 포함돼 있어 npm에서 별도로 설치할 필요가 없다. 앱을 실행하면 이미 실행 중인 Junior에 연결하거나 새로 시작한다. 자세한 내용은 desktop/README.md에 있다.
설치되는 명령은 다음과 같다.
junior # start if not running, print the URL
junior status # version, build, port, live sessions
junior restart # how an update takes effect
junior stop # stop it (ends live sessions)
junior logs # tail the server log
junior doctor # check node, claude, gh, the agent and the server
junior add "Look at the flaky deploy check" # file a to-do from any terminal
⌘ ⇧ T를 누르면 맥 어디서든 같은 방식으로 할 일을 추가할 수 있다. Junior는 초기 소프트웨어이므로 거친 부분과 호환성을 깨는 변경이 있을 수 있다.
맥이 잠들면 Junior도 멈춘다. 재부팅 뒤에는 다시 시작한다. 실행하지 못한 예약 작업은 조용히 사라지지 않고 누락된 작업으로 기록된다. 창을 닫아도 Junior는 멈추지 않는다. LaunchAgent가 서버를 계속 실행한다.
비용과 제한
Junior는 MIT 라이선스로 제공되는 무료 오픈소스 소프트웨어다. 별도의 계정이나 결제 카드가 필요하지 않으며, 사용자가 보유한 Claude 또는 Codex 요금제를 이용한다. 각 세션에서 발생한 비용은 달러로 표시된다.
Junior는 맥이 잠든 동안 작동하지 않는다. 공증되지 않은 앱이라 브라우저에서 내려받으면 차단될 수 있어 터미널 설치 스크립트를 사용해야 한다. 제작자는 설치 전에 스크립트 내용을 확인하라고 안내한다.
개발 환경
저장소를 내려받고 의존성을 설치한 뒤 개발 서버를 실행한다.
git clone https://github.com/usejunior-sh/junior && cd junior
npm install
npm run dev # server on :5188, Vite on :5189. Open the Vite URL.
개발 환경의 데이터는 ~/.junior-dev에 저장되므로 마이그레이션이 실제 받은 편지함을 건드리지 않는다. 서버는 파일 변경 감시자 아래에서 실행하지 않도록 되어 있다. 서버를 재시작하면 실행 중인 Claude 하위 프로세스가 종료되기 때문이다. server/를 수정한 뒤에는 직접 재시작해야 한다. npm run typecheck는 양쪽 코드의 타입을 확인하고, npm test는 단위 테스트를 실행하며, npm run smoke는 실행 중인 서버를 대상으로 종단 간 검사를 한다.
| 경로 | 내용 |
|---|---|
shared/protocol.ts | 양쪽에서 가져오는 WebSocket 계약 |
core/ | 저장소, 점수 산정, 작업, 팀·목표와 소스 |
server/ | HTTP·WebSocket 서버와 junior, junior-mcp 실행 파일 |
web/ | Vite와 React UI |
desktop/ | 서버 위에 Electron 창을 띄우는 Junior.app |
저장소와 설치 방법은 Junior GitHub 저장소에서 확인할 수 있다. Junior가 README 초안을 작성했고 사마르(Samar)가 승인했다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요