준비와 변수
| 질문 | 명령 | 실습 |
|---|---|---|
| gh 버전이 충분한가 | gh --version (2.97.0 이상) | 준비 |
| 로그인 계정과 project 권한이 있는가 | gh auth status | 준비 |
| project 권한을 더하려면 | gh auth refresh -s project | 준비 |
| 새 터미널에서 변수를 다시 불러오려면 | cd ~/gh-pm-lab && source pm-lab/env.sh | 1 |
| 업무 키로 이슈 주소를 찾으려면 | awk -F'\t' '$1=="LP-03" {print $3}' pm-lab/backlog-map.tsv | 8 |
저장소, 마일스톤, 라벨
| 질문 | 명령 | 실습 |
|---|---|---|
| 실습 저장소를 만들려면 | gh repo create "$PM_REPO" --private --add-readme | 1 |
| 출시 목표(마일스톤)를 만들려면 | gh api --method POST "repos/$PM_REPO/milestones" -f title="..." -f due_on="2026-11-06T08:00:00Z" | 2 |
| 마일스톤별 남은 이슈 수는 | gh api "repos/$PM_REPO/milestones" --jq '.[] | "\(.title) 열림 \(.open_issues) 닫힘 \(.closed_issues)"' | 2, 6 |
| 라벨을 만들려면 | gh label create "area:qa" -R "$PM_REPO" --color FEF2C0 --description "검증" | 2 |
| 라벨 목록은 | gh label list -R "$PM_REPO" --limit 100 | 2 |
업무(이슈)
| 질문 | 명령 | 실습 |
|---|---|---|
| 본문 파일로 업무를 만들려면 | gh issue create -R "$PM_REPO" --title "[LP-08] ..." --body-file 파일 --label "kind:task,area:product" --assignee "@me" --milestone "$PM_MILESTONE" | 3 |
| 목록 파일로 업무를 한 번에 만들려면 | bash github-pm-starter-kit/seed-backlog.sh "$PM_REPO" "$PM_PROJECT" --dry-run | 5 |
| 담당자를 바꾸려면 | gh issue edit 3 -R "$PM_REPO" --add-assignee dev-lee --remove-assignee "@me" | 5 |
| 본문을 파일로 바꾸려면 | gh issue edit 주소 --body-file 파일 | 3 |
| 진행 댓글을 남기려면 | gh issue comment 주소 --body "..." | 7 |
| 여러 줄 댓글을 남기려면 | gh issue comment 주소 --body-file - <<'EOF' … EOF | 8 |
| 선행 업무(의존성)를 연결하려면 | gh issue edit 주소 --add-blocked-by 선행주소 --add-label blocked | 8 |
| 무엇에 막혀 있는지 보려면 | gh issue view 주소 --json blockedBy --jq '.blockedBy.nodes[].title' | 8 |
| 막힘이 풀렸을 때 | gh issue edit 주소 --remove-label blocked | 8, 12 |
| 완료로 닫으려면 | gh issue close 주소 --reason completed --comment "근거" | 12 |
| 하지 않기로 하고 닫으려면 | gh issue close 주소 --reason "not planned" --comment "결정 기록 주소" | 12 |
| 닫힌 업무를 다시 열려면 | gh issue reopen 주소 | 종합 |
| 운영 이슈를 맨 위에 고정하려면 | gh issue pin 주소 / gh issue unpin 주소 | 10, 12 |
Project
| 질문 | 명령 | 실습 |
|---|---|---|
| Project를 만들고 번호를 받으려면 | gh project create --owner "$PM_OWNER" --title "..." --format json --jq .number | 4 |
| 저장소와 연결하려면 | gh project link "$PM_PROJECT" --owner "$PM_OWNER" --repo "$PM_REPO_NAME" | 4 |
| 필드를 만들려면 | gh project field-create "$PM_PROJECT" --owner "$PM_OWNER" --name Priority --data-type SINGLE_SELECT --single-select-options "P0,P1,P2" | 4 |
| 필드 이름과 유형을 보려면 | gh project field-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 | 4 |
| 이슈를 Project에 넣으려면 | gh project item-add "$PM_PROJECT" --owner "$PM_OWNER" --url 주소 | 4 |
| Status를 바꾸려면 | gh project item-edit "$PM_PROJECT" --owner "$PM_OWNER" --url 주소 --field Status --value "In Progress" | 7 |
| 목표일을 바꾸려면 | gh project item-edit "$PM_PROJECT" --owner "$PM_OWNER" --url 주소 --field "Target date" --date 2026-10-14 | 7 |
| 스프린트(Iteration)를 바꾸려면 | 웹 화면, 또는 반복 ID를 조회해 --field Iteration --iteration-id ID | 6, 심화 |
| 한 업무의 Status만 보려면 | gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --format json --jq ".items[] | select(.content.url == \"$PM_POLICY_URL\") | .status" | 12 |
회의 전 조회
| 질문 | 명령 | 실습 |
|---|---|---|
| 이번 스프린트에서 아직 열린 일은 | gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 --query 'iteration:"Sprint 1" is:issue is:open' --field Status --field Priority | 7 |
| 현재 스프린트 기준으로 보려면 | --query 'iteration:@current is:open' | 6 |
| 담당자가 없는 일은 | gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 --query 'is:issue is:open no:assignee' | 7 |
| 막힌 일은 | gh issue list -R "$PM_REPO" --state open --label blocked --limit 100 | 7 |
| 출시 목표에 남은 일은 | gh issue list -R "$PM_REPO" --state open --milestone "$PM_MILESTONE" --limit 100 | 7 |
| 완료되지 않은 P0는 | gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 --query 'priority:P0 -status:Done' | 7 |
| 오래 갱신되지 않은 열린 업무는 | gh issue list -R "$PM_REPO" --state open --label "kind:task" --search "updated:<2026-10-10 sort:updated-asc" | 7 |
| 세 질문을 한 번에 | bash pm-lab/precheck.sh "Sprint 1" | 7 |
| 주간 사전 리포트를 만들려면 | bash github-pm-starter-kit/weekly-digest.sh "$PM_REPO" --days 7 --project "$PM_PROJECT" --iteration "Sprint 1" > pm-lab/weekly-$(date +%F).md | 11 |
| 나에게 할당된 일과 리뷰 요청은 | gh status | 심화 |
PR과 커밋
| 질문 | 명령 | 실습 |
|---|---|---|
| 열린 PR은 | gh pr list -R "$PM_REPO" | 9 |
| 리뷰 상태와 마지막 갱신일은 | gh pr list -R "$PM_REPO" --json number,title,isDraft,reviewDecision,updatedAt | 9 |
| 내 리뷰를 기다리는 PR은 | gh search prs --review-requested=@me --state=open | 심화 |
| 이번 주에 병합된 PR은 | gh pr list -R "$PM_REPO" --state merged --search "merged:>=2026-10-08" --limit 100 | 9 |
| 여러 저장소에서 병합된 PR은 | gh search prs --owner 조직 --merged-at ">=2026-10-08" | 심화 |
| 이 PR은 어느 업무인가 | gh pr view 주소 --json closingIssuesReferences --jq '.closingIssuesReferences[].number' | 9 |
| 무엇을 바꿨는가 | gh pr view 주소 --json files,commits 또는 gh pr diff 주소 --name-only | 9 |
| 자동 검사는 통과했는가 | gh pr checks 주소 | 9 |
| 리뷰 댓글까지 읽으려면 | gh pr view 주소 --comments | 심화 |
| 기본 브랜치의 최근 커밋은 | gh api "repos/$PM_REPO/commits?since=2026-10-08T00:00:00Z" --jq '.[].commit.message | split("\n")[0]' | 9 |
| 기본 브랜치의 최근 자동 검사 결과는 | gh run list -R "$PM_REPO" --branch main --limit 10 | 심화 |
| PR을 병합하려면 | gh pr merge 주소 --squash | 12 |
회의 기록과 종료
| 질문 | 명령 | 실습 |
|---|---|---|
| 스프린트 운영 이슈를 만들려면 | gh issue create -R "$PM_REPO" --title "[Sprint 1] ..." --body-file pm-lab/sprint-1.md --label kind:meeting | 10 |
| 시작 범위를 저장하려면 | gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 --query 'iteration:"Sprint 1" label:"kind:task"' --format json > pm-lab/sprint-1-start.json | 10 |
| 리포트나 보고를 댓글로 올리려면 | gh issue comment "$PM_SPRINT_URL" --body-file 파일 | 10, 11, 12 |
| 시작과 종료를 비교하려면 | bash github-pm-starter-kit/sprint-report.sh pm-lab/sprint-1-start.json pm-lab/sprint-1-end.json "Sprint 1" | 12 |
PM 방법론 (3회차)
| 질문 | 명령 | 실습 |
|---|---|---|
| 업무를 상위 이슈로 묶으려면 (WBS) | gh issue edit 상위주소 --add-sub-issue 하위주소 | 13 |
| 하위 이슈 완료 비율은 | gh issue view 상위주소 --json subIssuesSummary | 13 |
| 어느 업무가 늦으면 출시가 늦는가 (주경로) | bash github-pm-starter-kit/cpm.sh github-pm-starter-kit/schedule.tsv --start 2026-10-12 --deadline 2026-11-06 | 13 |
| 계산한 일정을 Project에 넣으려면 | bash github-pm-starter-kit/cpm.sh ... --commands > pm-lab/cpm-apply.sh 후 bash pm-lab/cpm-apply.sh | 13 |
| 선행 관계를 의존성으로 기록하려면 | bash github-pm-starter-kit/link-deps.sh "$PM_REPO" github-pm-starter-kit/schedule.tsv | 13 |
| EVM 입력 파일을 만들려면 | gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 200 --query 'label:"kind:task" milestone:"M1 비공개 베타"' --format json > pm-lab/evm-input.json | 14 |
| SPI, CPI, 예상 완료일은 | bash github-pm-starter-kit/evm-report.sh pm-lab/evm-input.json --status-date 2026-10-21 | 14 |
| EVM 추세를 쌓으려면 | ... --history pm-lab/evm-history.csv (매주 금요일) | 14 |
| 주별 처리량과 리드 타임은 | bash github-pm-starter-kit/flow-metrics.sh "$PM_REPO" --weeks 8 | 15 |
| 마감까지 끝낼 확률은 (몬테카를로) | bash github-pm-starter-kit/forecast.sh --remaining 5 --throughput 2,3,1,4,2,3,2,0 --deadline 2026-11-06 | 15 |
| 위험을 점수 순으로 보려면 | gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --query 'label:risk is:open' --format json --jq '.items | map(. + {score: (.probability * .impact)}) | sort_by(-.score)' | 16 |
| RICE 점수 순 백로그는 | gh project item-list ... --format json --jq '.items | map(. + {rice: (.reach * .impact * .confidence / .effort)}) | sort_by(-.rice)' | 도입 |
기록 확장과 프로세스 마이닝 입문 (4회차)
| 질문 | 명령 | 실습 |
|---|---|---|
| 위키를 켜고 열려면 | gh repo edit "$PM_REPO" --enable-wiki, gh browse -R "$PM_REPO" --wiki | 17 |
| 위키를 복제하려면 | gh repo clone "$PM_REPO.wiki" pm-lab/wiki | 17 |
| 결정 기록과 보고를 위키에 모으려면 | bash github-pm-starter-kit/wiki-sync.sh "$PM_REPO" --process pm-lab/process-map.md --push | 17 |
| 업무에 연결된 브랜치는 | gh issue develop --list 3 -R "$PM_REPO" | 18 |
| 멈춘 브랜치와 삭제 후보는 | bash github-pm-starter-kit/branch-report.sh "$PM_REPO" | 18 |
| 병합한 브랜치를 자동으로 지우려면 | gh repo edit "$PM_REPO" --delete-branch-on-merge | 18 |
| 스냅숏 워크플로를 지금 실행하려면 | gh workflow run pm-snapshot.yml -R "$PM_REPO" | 18 |
| 업무 하나의 타임라인은 | gh api "repos/$PM_REPO/issues/3/timeline" --paginate --jq '.[] | [.created_at, .event] | @tsv' | 19 |
| 토론 목록과 댓글은 | gh discussion list -R "$PM_REPO" --state all, gh discussion view 19 -R "$PM_REPO" --comments --order oldest | 19 |
| 기간 안의 결정, 토론, 변경 요청은 | bash github-pm-starter-kit/discussion-digest.sh "$PM_REPO" --since 2026-10-26 --until 2026-11-06 | 19 |
| 이벤트 로그를 만들려면 | bash github-pm-starter-kit/event-log.sh "$PM_REPO" --snapshots pm-lab/pm-data/snapshots > pm-lab/event-log.csv | 20 |
| 계획과 실제의 리드·래그는 | bash github-pm-starter-kit/lead-lag.sh github-pm-starter-kit/schedule.tsv pm-lab/event-log.csv --start 2026-10-12 | 20 |
| SS, FF 관계로 일정을 다시 계산하려면 | LP-03:SS+3처럼 적은 뒤 bash github-pm-starter-kit/cpm.sh pm-lab/schedule-v2.tsv --start 2026-10-12 | 20 |
| 업무가 흐른 순서와 변형은 | bash github-pm-starter-kit/process-map.sh pm-lab/event-log.csv | 21 |
| 프로세스 지도를 Mermaid로 | bash github-pm-starter-kit/process-map.sh pm-lab/event-log.csv --mermaid count | 21 |
| 남은 API 호출 한도는 | gh api rate_limit --jq '.resources.core' | 심화 |
프로세스 마이닝으로 개발 프로세스 개선 (2단계, 5·6회차)
| 질문 | 명령 | 실습 |
|---|---|---|
| 로그에 품질 문제가 있는가 | bash github-pm-starter-kit/log-check.sh pm-lab/orbit-event-log.csv | 22 |
| 순서를 바로잡고 끝나지 않은 사례를 뺀 로그는 | bash github-pm-starter-kit/log-check.sh pm-lab/orbit-event-log.csv --clean > pm-lab/orbit-event-log-clean.csv | 22 |
| 주된 흐름만 남긴 지도는 | bash github-pm-starter-kit/process-map.sh pm-lab/orbit-event-log-clean.csv --mermaid time --min-count 30 | 23 |
| PM4Py 분석을 내 컴퓨터에서 | python3 github-pm-starter-kit/pm4py-notebook.py pm-lab/orbit-event-log-clean.csv | 24 |
| 단계별 대기와 병목은 | bash github-pm-starter-kit/bottleneck.sh pm-lab/orbit-event-log-clean.csv --to 2026-05-31 --roles github-pm-starter-kit/roles.tsv | 25 |
| 막힘을 누가 풀었는가 | awk -F, 'NR > 1 && $2 == "막힘 해소" { n[$4]++ } END { for (k in n) print n[k], k }' pm-lab/orbit-event-log-clean.csv | 25 |
| QA 업무를 규칙에서 빼려면 | process-rules.tsv 여섯째 열에 area!=qa, process-map.sh 로그 --rules pm-lab/process-rules.tsv | 26 |
| 작업 시작 날짜로 로그를 나누려면 | 실습 26의 awk 두 번 읽기 | 26 |
| 바꾸기 전후는 어떻게 다른가 | bash github-pm-starter-kit/compare.sh pm-lab/orbit-event-log-clean.csv --split 2026-06-01 | 27 |
| 어떤 활동이 있었던 업무는 무엇이 다른가 | bash github-pm-starter-kit/compare.sh pm-lab/orbit-event-log-clean.csv --has "결정 기록" | 27 |
| 업무 종류마다 흐름이 다른가 | bash github-pm-starter-kit/compare.sh pm-lab/orbit-event-log-clean.csv --by area | 27 |
| 개선안을 적용하면 얼마나 줄어드는가 | bash github-pm-starter-kit/whatif.sh pm-lab/orbit-event-log-clean.csv --from 2026-06-01 --blocked-cap 4 | 28 |
| 프로세스 보고를 지금 만들려면 | gh workflow run process-report.yml -R "$PM_REPO" | 29 |
용어
| 용어 | 영문 | 이 과정에서의 뜻 |
|---|---|---|
| 마일스톤 | Milestone | 출시 목표와 마감일. 저장소에 속한다. |
| 반복, 스프린트 | Iteration | 일정한 작업 기간. Project 필드다. |
| 업무 키 | Key | LP-03처럼 제목 앞에 붙이는 고정 이름. 이슈 번호와 다르다. |
| 의존성 | Issue dependency | 먼저 끝나야 하는 업무와의 연결. Blocked by, Blocking. |
| 풀 리퀘스트 | Pull Request, PR | 브랜치의 변경을 기본 브랜치에 합쳐 달라는 요청 |
| 닫는 키워드 | Closing keyword | PR 본문의 Closes #번호. 병합 시 이슈를 닫는다. |
| 검사 | Check | PR마다 자동으로 실행되는 테스트 등의 확인 작업 |
| 운영 이슈 | - | 스프린트의 목표, 결정, 범위 변경, 종료 기록을 모은 kind:meeting 이슈 |
| 사전 리포트 | Pre-read | 회의 전날 운영 이슈에 올리는 조회 결과와 안건 |
| 이월 | Carry over | 미완료 업무의 Iteration을 다음 스프린트로 옮기는 것 |
| 작업 분해 구조 | Work Breakdown Structure, WBS | 결과물에 필요한 일을 계층으로 나눈 목록. 상위·하위 이슈로 표현 |
| 주경로 | Critical path | 여유가 0인 업무를 이은 가장 긴 경로. 하루 늦으면 완료일도 하루 늦다 |
| 계획가치 | Planned Value, PV | 기준일까지 계획상 끝났어야 할 일의 추정 공수 |
| 획득가치 | Earned Value, EV | 실제로 끝낸 일의 추정 공수 (추정 × 진척률) |
| 실제 투입 | Actual Cost, AC | 기준일까지 실제로 쓴 시간 |
| 획득 일정 | Earned Schedule, ES | EV만큼의 PV가 계획상 쌓이는 시점. 지연을 작업일로 표시 |
| 처리량 | Throughput | 주마다 완료로 닫힌 업무 수 |
| 리드 타임 | Lead time | 업무 생성부터 완료까지 걸린 시간 |
| 위키 | Wiki | 저장소와 따로 있는 Git 저장소(OWNER/REPO.wiki)의 문서 페이지 |
| 토론 | Discussions | 저장소 단위의 의견 수렴 공간. Q&A 형식 분류에서는 답을 채택한다 |
| orphan 브랜치 | Orphan branch | 기본 브랜치와 이력을 공유하지 않는 브랜치. 이 과정의 pm-data |
| 누적 흐름도 | Cumulative Flow Diagram, CFD | 날짜별 Status 업무 수를 쌓은 그림 |
| 선후행 관계 유형 | FS, SS, FF, SF | 끝-시작, 시작-시작, 끝-끝, 시작-끝으로 선행과 후행을 잇는 방식 |
| 리드 · 래그 | Lead, Lag | 후행을 앞당기는 시간과 늦추는 시간. 리드는 음수 래그다 |
| 이벤트 로그 | Event log | 사례, 활동, 시각(필요하면 수행자)을 한 줄에 적은 사건 목록 |
| 프로세스 마이닝 | Process mining | 이벤트 로그로 실제 흐름을 발견하고, 정한 절차와 비교하고, 대기 구간을 찾는 분석 |
| 직접 이어짐 그래프 | Directly-Follows Graph, DFG | 한 사례에서 활동 A 바로 다음에 B가 나온 횟수와 시간을 화살표로 그린 그림 |
| 변형 | Variant | 같은 활동 순서로 흐른 사례의 묶음 |
| 적합성 검사 | Conformance checking | 정해 둔 절차와 이벤트 로그를 비교해 어긋난 사례를 찾는 것 |
| 사례 정의 | Case notion | 무엇을 사례 하나로 볼 것인가. 2단계는 업무 이슈 하나 |
| 점 도표 | Dotted chart | 사례마다 한 줄, 사건마다 점 하나를 찍은 그림 |
| 업무 시간 | Business hours | 평일 09~18시와 겹치는 시간만 센 시간. 달력 시간과 구분한다 |
| 병목 | Bottleneck | 흐름 전체의 속도를 정하는 가장 느린 구간. 기다린 시간의 합, 85%, 집중도로 고른다 |
| 프로세스 모델 | Process model | 순서, 선택, 병행, 반복을 구분해 그린 절차. 페트리넷, BPMN, 프로세스 트리 |
| 적합도 · 정밀도 | Fitness, Precision | 모델이 로그를 재현하는 정도와, 로그에 없는 순서를 허용하지 않는 정도 |
| 정렬 | Alignment | 사례의 사건열과 모델의 실행을 한 걸음씩 짝지어 어긋난 위치를 찾는 방법 |
| 로그 이동 · 모델 이동 | Log move, Model move | 로그에만 있는 걸음과 모델에만 있는 걸음 |
| 대조군 | Negative control | 개선과 무관한 묶음. 기간 사이의 자연스러운 흔들림 폭을 가늠한다 |
| 효과 어림 | What-if analysis | 대기 하나가 줄었다고 가정하고 처리 시간 분포를 다시 계산하는 것 |
| PM² | Process Mining Project Methodology | 계획, 추출, 데이터 처리, 마이닝과 분석, 평가, 개선과 지원의 여섯 단계 |