첫 프로젝트 만들기
dira는 프로토콜과 티켓, 페르소나를 프로젝트 단위로 다룹니다. 프로젝트끼리는 서로 간섭하지 않습니다.
처음 열면 보이는 화면
등록된 프로젝트가 0건일 때의 첫 화면입니다. 위쪽 헤더에 dira 로고와 버튼 셋(매뉴얼, Star,
설정)이 있고, 본문은 dira와 한 줄로 시작합니다. 그 한 줄이
등록된 프로젝트가 없습니다. 하나 만들면 시작합니다.입니다. 아래로
이미 만들어 둔 .dira가 있다면 등록합니다.와 프로젝트 등록 버튼이 한 줄에 놓이고,
그다음이 새 프로젝트 카드입니다. 폼이 이미 열려 있습니다.

이 장에서 채우는 것이 그 폼입니다. 헤더에 새로 만들기가 없습니다. 폼이 눈앞에 펼쳐져 있는데
그 폼을 여는 버튼을 같은 화면에 또 둘 이유가 없기 때문입니다. 위의 등록 한 줄은 우회로입니다.
.dira를 이미 만들어 뒀거나 남이 쓰던 프로젝트를 받아온 분이 그리로 갑니다. 처음이라면
지나쳐도 됩니다.
폼 아래로 계속 내리면 제품 소개가 이어집니다. 웹에서 보는 그 페이지와 같은 글이고, 앱에서는 프로젝트 영역이 그 위에 놓여 첫 화면이 됩니다. 지금은 폼만 채우시면 됩니다.
폼에 넣는 것
카드 제목 밑에 한 줄이 붙어 있습니다. 이 폼이 하는 일이 그 문장에 다 들어 있습니다.
.dira를 만들고 워커 하나를 crontab에 올립니다 — 30초 뒤부터 티켓을 가져갑니다.
crontab은 cron이 읽는 예약 목록입니다. 여기에 한 줄이 올라가면 그때부터 맥이 알아서 워커를 30초마다 부릅니다.
| 필드 | 넣는 것 |
|---|---|
이름 | 화면에 보일 이름입니다. 아래에 주소에 쓰일 이름(슬러그)이 미리보기로 뜹니다 |
프로젝트 폴더 | .dira의 부모입니다. ~/Projects/myproject처럼 적으면 그 밑에 .dira를 만듭니다. 칸 아래 도움말도 같은 말을 합니다(여기에 .dira를 만듭니다. ~는 확장됩니다). 폴더가 없으면 만듭니다 |
통합 브랜치 | 세션이 일을 끝내고 결과를 올릴 브랜치입니다. 기본값은 main이고, 레포가 master나 develop을 쓰면 그 이름을 적으세요. 만든 뒤에도 설정에서 바꿉니다 |
스펙 문서 | 선택입니다. 프로젝트 스펙 파일 경로(docs/DESIGN.md 같은 것)를 적습니다. 아직 없는 파일을 미리 적어도 됩니다 |
한국어로 일하는 프로젝트 | 체크 표시 하나입니다. 켜 두면 한국어 글을 쓰고 고치는 스킬 셋을 페르소나 다섯이 전부 같이 받습니다. 앱 화면이 한국어면 켜진 채로, 영어면 꺼진 채로 떠 있으니 그대로 두거나 한 번 눌러 바꾸시면 됩니다. 무엇이 붙는지는 페르소나의 스킬 절에 적혀 있습니다 |
도움말에 나오는 ~는 홈 폴더를 가리키는 줄임말입니다. ~/Projects/myproject라고 적으면
/Users/<사용자 이름>/Projects/myproject와 같은 자리를 뜻합니다.
프로젝트 만들기를 누르세요.
이미 프로젝트가 있는 화면에서는 같은 폼이 다이얼로그로 열립니다. 목록 위 새로 만들기가 그
트리거고, 칸도 도움말도 제출 버튼도 방금 채운 것과 같습니다.

프로젝트가 만들어졌습니다
고른 폴더 밑에 .dira가 이렇게 놓입니다.
<프로젝트>/.dira/
tickets/ 빈 큐
team/apm.yml 이 프로젝트의 팀 선언. dira-protocols와 squad-default 패키지를 버전 고정으로 받는다
team/protocols/AGENTS.md 협업 프로토콜. 브랜치와 스펙 문서가 치환된 원본
team/protocols/apm.yml 위 AGENTS.md를 로컬 패키지로 묶는 선언
team/.gitignore 설치 산출물(apm_modules/ 등)을 git에서 뺀다
team/apm_modules/ 설치된 패키지. 스쿼드 default와 페르소나 다섯이 여기 있다
protocols/ 설치 뒤 펼친 협업 문서 사본. AGENTS.md, CORE*.md, tickets.md 등
workers/w1.sh 워커 하나. 실행 권한까지 붙어 있다
integration-branch 통합 브랜치 이름 한 줄. 폼에 적은 그 값이다
push.sh 워커가 통합 브랜치로 푸시할 때 부르는 헬퍼
dispatch-gate.sh 디스패치 전에 통합 브랜치를 체크아웃한 트리가 깨끗한지 보는 게이트
self-heal.sh 앱을 지우면 워커가 스스로 물러납니다
watchdog.sh, watchdog_gates.py, watchdog_alert.py 디스패치 감시자
browse.sh, browser.sh 워커 세션이 웹을 열 때 쓰는 브라우저 셸여기에 crontab 등록(w1.sh를 30초마다 부르는 줄)과 레지스트리 등록(앱이 이 프로젝트를
목록에 유지하게 하는 것)이 더해집니다. <프로젝트> 안에서 .dira 밖을 건드리는 일은 둘뿐입니다.
.gitignore에 .dira 한 줄을 더하고, 폴더가 아직 git 저장소가 아니면 git init을 한 뒤 그
.gitignore 하나만 담은 첫 커밋을 만듭니다. 프로젝트 소스 파일에는 손대지 않습니다.
페르소나와 스쿼드는 team/apm.yml이 받는 squad-default 패키지에서 옵니다. 이 패키지가
pm, developer, qa, designer, writer 다섯 페르소나를 default라는 스쿼드 하나로 묶고,
리더는 pm입니다. 티켓을 발행할 때 수행자 칸이 이 스쿼드로 골라져 있고, 그렇게 발행한 티켓은
pm에게 갑니다. 스쿼드에서 다룹니다.
패키지는 만들 때 내려받습니다. 네트워크가 끊겼거나 설치가 실패해도 프로젝트는 만들어지고 결과
화면에 실패 사유가 한 줄 뜹니다. 그때는 team/apm_modules/와 protocols/에 아직 아무것도 없고, 워커가
다음에 돌 때 설치를 다시 시도합니다.
워커는 하나입니다. 한 번에 티켓 하나가 돈다는 뜻입니다. 동시에 두 건 이상 돌리고 싶으면 워커를 더 만들면 됩니다. 워커에서 다룹니다.
통합 브랜치를 나중에 바꾸기
통합 브랜치는 만든 뒤에도 설정에서 고칩니다. 레포가 main에서 master로 넘어갔거나 폼에 잘못
적었을 때 여기로 오세요.
우측 위 톱니를 눌러 설정을 열고 트리 첫 그룹 프로젝트 아래에서 지금 보고 있는 프로젝트를
고르세요. 이름 아래에 통합 브랜치 한 줄이 있습니다. 지금 값이 거기 적혀 있습니다. 누르면
입력칸이 열립니다. 새 이름으로 고치고 저장을 누르세요. 값을 안 바꿨으면 저장이 아예 안
눌립니다.
바꾼 값은 .dira/integration-branch에 한 줄로 남습니다. 앱도 워커도 이 파일 하나만 읽습니다.
저장하면 그 이름을 이미 쓰고 있던 파일 다섯이 같이 바뀝니다.
| 파일 | 어떻게 바뀌나 |
|---|---|
.dira/dispatch-gate.sh | 새 이름으로 통째로 다시 만듭니다 |
.dira/push.sh | 새 이름으로 통째로 다시 만듭니다 |
.dira/protocols/AGENTS.md | git rebase <이름>처럼 브랜치를 부르는 명령 줄만 고칩니다 |
.dira/protocols/push-거부.md | 위와 같습니다 |
.dira/protocols/재디스패치-복구.md | 위와 같습니다 |
문서 셋에서는 앱이 명령 줄 안쪽만 고칩니다. 산문에 나온 main이라는 낱말은 그대로 둡니다.
브랜치 이름이 워낙 흔한 낱말이라, 눈에 보이는 대로 다 바꾸면 엉뚱한 문장까지 고쳐 놓기
때문입니다.
저장을 누른 자리 바로 아래에 다시 쓴 파일:과 실제로 바뀐 파일 목록이 한 줄 뜹니다. 이미 새
이름을 쓰고 있던 파일은 그 목록에 들어가지 않습니다. dispatch-gate.sh를 손으로 고쳐 둔
프로젝트도 빠집니다. 앱이 만든 원본에서 이미 달라진 파일이라, 통째로 다시 만들면 손댄 내용이
사라지기 때문입니다. 그 파일은 직접 고치세요.
예전에 만든 프로젝트에는 integration-branch 파일이 아직 없습니다. 그때는 앱이 두 군데를 확인해
값을 찾습니다. 먼저 protocols/AGENTS.md의 git rebase 줄을 보고, 거기서도 못 찾으면
프로젝트 폴더가 지금 체크아웃하고 있는 브랜치 이름을 씁니다. 찾아낸 값은 곧바로 파일에 적어
두니 다음부터는 파일 하나만 읽습니다. 두 군데에서 모두 찾지 못하면 칸이 빈 채로 뜨고 그 아래
통합 브랜치를 입력하세요.가 붙습니다. 없는 값을 지어내지는 않습니다.
이제 요구할 차례입니다
성공하면 목록에 행이 하나 생기고, 폼이 있던 자리가 결과 카드로 바뀝니다. 카드 안은 세 줄입니다. 만든 파일 수, 유도한 엔진 레포 경로, 그리고 마지막 줄입니다.
crontab에 등록됨 — 30초 뒤부터 티켓을 가져갑니다
이 줄이 보이면 끝났습니다. 카드에는 보드 열기와 닫기가 같이 있고, 닫기를 눌러야
결과가 접힙니다. 급하지 않으면 읽고 나서 닫으세요. 잘못 적은 경로는 여기서 알아챕니다.
승인 창과 등록 실패와 이미 있는 .dira
macOS가 승인 창을 띄웁니다. crontab에 쓰려면 앱 관리 권한이 필요합니다. 만드는 동안 폼
아래에 권한 창이 뜨면 [허용]을 누르세요 — crontab 등록이 그 대답을 기다립니다.가 떠
있습니다. 허용을 누르면 하던 등록이 그대로 이어집니다. 창을 방치하면 3분 뒤에 등록만 실패로
처리됩니다.
crontab 등록만 실패해도 프로젝트는 만들어져 있습니다. 만든 파일을 되돌리지 않고 사유와 등록 명령을 화면에 함께 보여 줍니다. 복사해서 터미널에 붙여 넣으면 그 자리에서 끝납니다. 실패했을 때만 나오는 우회로입니다.
고른 폴더에 이미 .dira가 있으면 만들지 않습니다. 안에 tickets/나 workers/가 있으면
<경로>/.dira는 이미 dira 프로젝트입니다. 만들지 않고 등록하세요.와 등록 다이얼로그를 여는
버튼이 뜹니다. 이미 있는 파일을 덮어쓰는 동작은 이 앱에 없습니다.
아직 비어 있는 큐
프로젝트가 돌기 시작했지만 워커가 맡을 티켓이 없습니다. 다음 장에서 하고 싶은 말을 한 칸에 넣으면 pm이 그것을 티켓으로 쪼갭니다.
다음은 요구사항 접수하기입니다.