2회차실습 70–35분

상태 변경과 PM 조회

회의 직전에 알고 싶은 것은 세 가지다. 이번 스프린트에서 아직 열린 일은 무엇인가. 담당자가 없는 일은 무엇인가. 진행을 막는 일은 무엇인가. 업무가 6개일 때는 보드를 눈으로 훑어 답할 수 있지만 60개가 되면 빠뜨리는 항목이 생긴다. 이 실습은 업무의 Project 값을 명령으로 바꾸고, 세 질문에 답하는 조회 명령을 파일로 저장한다.

진행
복구 10분, 설명 5분, 실습 20분
결과
진행 중인 LP-01, 진행 댓글, pm-lab/precheck.sh
명령
gh project item-edit, item-list --query, gh issue list --search

02회차 시작: 변수 복구

1회차와 다른 날이면 터미널을 새로 열었으므로 변수가 비어 있다. 작업 폴더로 이동해 변수 파일을 불러온다.

cd ~/gh-pm-lab
source pm-lab/env.sh
echo "$PM_REPO / Project $PM_PROJECT / $PM_POLICY_URL"
gh auth status
gildong/launchpad-pm-lab / Project 3 / https://github.com/gildong/launchpad-pm-lab/issues/1

값 중 하나라도 비어 있으면 실습 1의 변수 복구 도구로 pm-lab/env.sh를 다시 만들고, PM_POLICY_URL은 awk -F'\t' '$1=="LP-01"{print $3}' pm-lab/backlog-map.tsv로 찾는다.

1Project 값 바꾸기

LP-01의 담당자가 작업을 시작했다고 가정한다. 이 과정의 규칙에서 Status를 In Progress로 바꾸는 사람은 실행 담당자다.

gh project item-edit "$PM_PROJECT" --owner "$PM_OWNER" \
  --url "$PM_POLICY_URL" --field Status --value "In Progress"

gh project item-edit "$PM_PROJECT" --owner "$PM_OWNER" \
  --url "$PM_POLICY_URL" --field "Target date" --date 2026-10-14
Edited item "[LP-01] 사전신청 정책을 확정한다"
Edited item "[LP-01] 사전신청 정책을 확정한다"
옵션뜻
"$PM_PROJECT" --owner "$PM_OWNER"어느 Project인가. 번호와 소유자를 함께 쓴다.
--url어느 업무인가. Project 주소가 아니라 이슈 주소를 쓴다.
--field어느 필드인가. 대소문자는 구분하지 않지만 공백은 정확히 같아야 한다.
--value선택지 필드(Status, Priority)와 텍스트·숫자·날짜 필드의 새 값.
--date날짜 필드 전용 옵션. YYYY-MM-DD 형식이다.

한 번의 명령은 필드 하나만 바꾼다. Status와 Priority를 함께 바꾸려면 명령을 두 번 실행한다. Iteration은 이 방식으로 바꿀 수 없으며, 웹 화면에서 바꾼다.

진행 댓글

상태 값만 바꾸면 무엇이 진행 중인지는 남지 않는다. 댓글에 지금 하는 일과 다음 확인일을 적는다.

gh issue comment "$PM_POLICY_URL" \
  --body "중복 신청 처리 정책을 검토 중이다. 다음 확인일은 10월 14일이다."

Target date는 이 Project에서 정한 개별 업무의 목표일이며, 마일스톤의 출시 마감일과는 별개의 값이다.

2회의 전 세 질문

# 질문 1. 이번 스프린트에서 아직 열린 일
gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 \
  --query 'iteration:"Sprint 1" is:issue is:open' \
  --field Status --field Priority

# 질문 2. 담당자가 없는 열린 일
gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 \
  --query 'is:issue is:open no:assignee'

# 질문 3. 막힌 일
gh issue list -R "$PM_REPO" --state open --label blocked --limit 100

# 참고. 출시 목표에 남은 일
gh issue list -R "$PM_REPO" --state open --milestone "$PM_MILESTONE" --limit 100
TYPE   TITLE                                      NUMBER  ...  STATUS       PRIORITY
Issue  [LP-01] 사전신청 정책을 확정한다           1       ...  In Progress  P0
Issue  [LP-02] 랜딩 페이지에서 서비스 안내와...   2       ...  Todo         P1
Issue  [LP-03] 방문자가 이메일로 사전신청을...    3       ...  Todo         P0

Project 3 for owner gildong has no items

no issues match your search in gildong/launchpad-pm-lab

질문 2는 모든 업무에 담당자가 있으므로 “has no items”가 나온다. 질문 3도 아직 막힌 일이 없으므로 “no issues match your search”가 나온다. 결과가 없다는 것도 회의 전에 확인한 사실이다.

두 가지 검색 문법

item-list --query는 Project 필터 문법을, gh issue list --search는 이슈 검색 문법을 쓴다. 겹치는 부분이 있지만 같은 문자열을 서로 바꾸어 쓸 수 있다고 가정하지 않는다.

알고 싶은 것Project 필터 --query이슈 검색 --search
스프린트iteration:"Sprint 1"없음
Status, Prioritystatus:"In Progress", priority:P0없음
완료 제외-status:Done없음 (--state open으로 열린 이슈만)
담당자 없음no:assigneeno:assignee
라벨label:blockedlabel:blocked 또는 --label blocked
오래 갱신되지 않음없음updated:<2026-10-10

조회 기본 개수는 30개다. 전체 업무가 30개를 넘으면 결과가 잘리므로 이 교안은 항상 --limit 100을 붙인다. 100개를 넘는 Project에서는 결과 줄 수와 웹 화면의 항목 수를 대조한다.

3조회 명령을 파일로 저장

매주 같은 명령을 입력하지 않도록 세 질문을 파일 하나에 저장한다. 파일 첫 줄에서 변수 파일을 불러오므로 새 터미널에서도 바로 실행된다.

cat > pm-lab/precheck.sh <<'EOF'
# 회의 전 세 질문. 작업 폴더에서 실행한다: bash pm-lab/precheck.sh "Sprint 1"
source pm-lab/env.sh
SPRINT=${1:-Sprint 1}

echo "## 1. $SPRINT 에서 열린 일"
gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 \
  --query "iteration:\"$SPRINT\" is:issue is:open" --field Status --field Priority

echo "## 2. 담당자가 없는 열린 일"
gh project item-list "$PM_PROJECT" --owner "$PM_OWNER" --limit 100 \
  --query 'is:issue is:open no:assignee'

echo "## 3. 막힌 일"
gh issue list -R "$PM_REPO" --state open --label blocked --limit 100
EOF
bash pm-lab/precheck.sh "Sprint 1"

결과가 없는 질문에서는 gh가 오류 상태로 끝나지만, 다음 질문은 이어서 실행된다.

  • Sprint 1 보드에서 LP-01이 In Progress 열에 있다.
  • LP-01에 진행 댓글이 있다.
  • 질문 1의 결과에 STATUS와 PRIORITY 열이 보인다.
  • bash pm-lab/precheck.sh "Sprint 1"이 세 절을 모두 출력한다.
  • --query와 --search 중 스프린트로 거를 수 있는 쪽을 말할 수 있다.
막히면
증상확인과 해결
unknown flag: --fieldgh가 2.97.0보다 낮다. 수업 전 준비의 업그레이드 명령을 실행한다.
field "Satus" not found in project; available fields: ...필드 이름이 틀렸다. 오류 메시지 끝의 목록에서 실제 이름을 확인한다.
option "InProgress" not found on field "Status"; available options: ...선택지 이름이 틀렸다. 공백까지 같게 "In Progress"로 쓴다.
error: no changes to make--value나 --date가 빠졌다.
Project 3 for owner gildong has no items--query 조건에 맞는 항목이 없다. 따옴표, 스프린트 이름을 확인한다.

마치며...

LP-01의 Status와 목표일을 명령으로 바꾸고 진행 댓글을 남겼으며, 회의 전 세 질문을 한 번에 조회하는 pm-lab/precheck.sh를 만들었다. 실습 8에서는 세 번째 질문인 막힌 일을 원인과 함께 기록한다.