Commit 9b8e083
authored
chore(workflow): Enhanced GitHub Flow 공식 채택 + 릴리스 자동화 인프라 (#706)
* chore(workflow): Enhanced GitHub Flow 공식 채택 + 릴리스 자동화 인프라
v2.14.0 릴리스 후 git workflow 분석 결과 Gitflow 대신 Enhanced GitHub Flow (기존 de-facto 패턴 + formalization + automation) 공식 채택. 1-2명 팀 + 2일/릴리스 cadence + 단일 CLI 배포 환경에서 develop 브랜치 이중 관리 부담이 이점을 초과.
## 주요 변경
### CLAUDE.local.md §18 신설 (Enhanced GitHub Flow 전체 정책, 247 lines)
- §18.1 브랜치 구조 다이어그램
- §18.2 [HARD] 브랜치 명명 규칙 (11 prefix: feat/fix/docs/chore/ci/refactor/audit/release/hotfix/plan)
- §18.3 [HARD] Merge Strategy (squash vs merge commit 기준)
- feature/fix/chore/docs/plan → squash
- release/*/hotfix/* → merge commit (SPEC history 보존)
- §18.4 Release Cadence 표 (patch/minor/major/hotfix)
- §18.5 Hotfix Workflow 실행 예시
- §18.6 Label 3축 체계 (type:/priority:/area:/status:)
- §18.7 Branch Protection Rule gh api 명령어
- §18.8 Release 프로세스 (scripts/release.sh 경유)
- §18.9 자동화 도구 목록 (GoReleaser/Dependabot/Auto-merge/Labeler)
- §18.10 [HARD] 공식 위반 금지 사항
- §18.11 v2.14.0 Case Study (squash merge history 손실 등 4건 교훈)
### 로컬 릴리스 도구
- scripts/release.sh 신규 (278 lines)
- SemVer v 접두사 검증
- 작업 트리 clean / main 브랜치 / origin 동기화 확인
- CHANGELOG.md 해당 버전 섹션 존재 확인
- CI 상태 조회 (gh api)
- SPEC draft count 경고
- CHANGELOG 섹션 자동 추출 → annotated tag annotation
- 확인 prompt → tag 생성 + push (GoReleaser trigger)
- Workflow run watch + release 생성 확인
- --dry-run / --hotfix / --skip-ci-check 플래그
- Makefile targets: release / release-dry / release-hotfix
- 사용법: `make release V=v2.15.0` 또는 `./scripts/release.sh v2.15.0`
### GitHub 인프라
- .github/PULL_REQUEST_TEMPLATE.md 확장:
- type 선택 (8 종류) + Breaking change 표시
- Merge Strategy 체크박스 (--squash / --merge / dependabot)
- Quality Gates 섹션 (CI + @mx 규율 + SPEC status + wire format)
- AI Collaboration 섹션 (Co-Authored-By 명시)
- Post-Merge Actions (release PR 전용)
- .github/ISSUE_TEMPLATE/release.md 신규 (92 lines)
- Pre-Release Checklist (Code Quality / Documentation / Git State / Branch Protection)
- Release Execution 명령어 예시 (Minor/Major + Hotfix)
- Post-Release Checklist (docs-site sync, announcement)
- .github/labels.yml 25 신규 labels 추가:
- type: (feature/fix/docs/chore/ci/refactor/security/test)
- priority: (P0/P1/P2/P3/P4)
- area: (mx/astgrep/lsp/hooks/docs-site/templates/cli/config/workflow/ci/security/deps)
- status: (in-progress/review/blocked/needs-info)
- .moai/config/sections/git-strategy.yaml 확장:
- workflow_model: enhanced-github-flow
- merge_strategies: {feature/release/hotfix/dependabot}
- branch_types: 10 prefix mapping
- release_cadence: patch/minor/major 정의
- release_tools: scripts/release.sh + Makefile + goreleaser
## Non-breaking
- 기존 labels 모두 유지 (25 신규 추가만)
- 기존 workflows (release.yml, auto-merge.yml, ci.yml) unchanged
- GoReleaser config unchanged
- ISSUE_TEMPLATE/config.yml 및 bug/feature/question templates unchanged
## Branch Protection (admin 수동 적용 필요)
CLAUDE.local.md §18.7에 gh api 명령어 예시 포함. main + release/* 패턴 보호 설정 권장.
## Validation
- bash -n scripts/release.sh: OK
- make -n release V=v2.15.0: OK
- python yaml.safe_load(labels.yml): OK
- python yaml.safe_load(git-strategy.yaml): OK
## 근거 문서
Gitflow vs Enhanced GitHub Flow 분석은 세션 대화 기록 참조 (30일간 15 릴리스 cadence, Open 이슈 0, 단일 배포 환경, 1-2명 팀 특성 고려).
🗿 MoAI <email@mo.ai.kr>
* feat(workflow): Release Drafter 통합 + §18.0 운영 원칙 + /99-release 동기화
CLAUDE.local.md §18 Enhanced GitHub Flow 5가지 즉시 개선 중 유일 미구현이었던 Release Drafter를 공식 인프라로 통합. /99-release.md 지침을 Enhanced GitHub Flow에 맞게 동기화하여 정책 일관성 확보.
## 5 Improvements 구현 상태 (CLAUDE.local.md §18.0)
| # | 항목 | 상태 | 참조 |
|---|------|------|------|
| 1 | Branch protection rule | ⏳ gh api 준비 (admin 적용 대기) | §18.7 |
| 2 | Label 3축 체계 | ✅ labels.yml | §18.6 |
| 3 | Merge strategy 명시 | ✅ PR template + git-strategy.yaml | §18.3 |
| 4 | Release Drafter | ✅ release-drafter.yml + workflow (이 commit) | §18.9 |
| 5 | Hotfix 브랜치 | ✅ scripts/release.sh --hotfix | §18.5 |
## Changes
### CLAUDE.local.md §18.0 "운영 원칙" 섹션 추가 (75 lines)
- 5가지 즉시 개선 Framework 공식 선언 + 구현 상태 표
- 운영 방침 per role: PR 작성자 / 릴리스 담당자 / 리뷰어
- §18.0.1 금지 사항 재확인 (main 직접 push, develop 브랜치, release squash 등)
### CLAUDE.local.md §18.9 자동화 도구 업데이트
- Release Drafter "구성 완료" 상태로 전환 (이전 "v2.15 이후")
- GoReleaser ↔ Release Drafter 역할 분담 표
- Version Resolver 매핑 (label → SemVer bump)
### .github/release-drafter.yml 신규 (149 lines)
- 9 categories (Features/Fixes/Security/Performance/Refactoring/Docs/Tests/CI/Chores)
- type:* label 기반 분류 (§18.6 축 1)
- Version Resolver: breaking → major, type:feature → minor, 기타 → patch
- autolabeler (PR title + branch + files 기반 type 축 자동 추론)
- template: draft notes + CHANGELOG 작성 가이드 주석
### .github/workflows/release-drafter.yml 신규 (30 lines)
- trigger: push main + PR opened/reopened/synchronize/edited
- release-drafter/release-drafter@v6 Action
- permissions: contents: write + pull-requests: write
### .claude/commands/99-release.md 동기화 (v4.0.0 → v5.0.0)
- frontmatter: workflow_model + merge_strategy + reference_policy metadata 추가
- Release Configuration 섹션: "GitHub Flow" → "Enhanced GitHub Flow (CLAUDE.local.md §18)"
- Tool Selection Guide 추가 (scripts/release.sh 자동 경로 vs /99-release 수동 경로)
- Phase 6 git operation 업데이트:
- [HARD] gh pr merge --squash → **--merge** (이유 명시: v2.14.0 Case Study)
- 수동 tag 생성 → **./scripts/release.sh vX.Y.Z** 권장 + 수동 fallback 유지
- Key Rules 전면 업데이트:
- Enhanced GitHub Flow 참조
- Release PR은 --merge 강제 (HARD)
- Tag push via scripts/release.sh only (HARD)
- Label 3축 필수 부착 (HARD)
- Release Drafter draft 활용 (HARD)
- Hotfix flow 추가 (§18.5)
## Release Drafter ↔ GoReleaser 역할 분담
- **Release Drafter** = PR merge 시 "next release draft" 자동 축적 → CHANGELOG 작성 preview
- **GoReleaser** = tag push 시 final release (binary + auto changelog) 생성
- **실제 workflow**: PR merge → RD가 draft 업데이트 → 릴리스 시 draft 확인 → CHANGELOG.md 수동 편집 → ./scripts/release.sh → GoReleaser
## Non-breaking
- 99-release.md 기본 구조 유지 (Phase 0-8 흐름)
- Phase 4 CHANGELOG bilingual 형식 유지
- Phase 7 GitHub Release 수동 편집 유지
- GoReleaser config 불변
- 기존 PR template / labels.yml / workflows (ci, auto-merge, release, claude-review) 불변
## Validation
- python yaml.safe_load('.github/release-drafter.yml'): OK
- python yaml.safe_load('.github/workflows/release-drafter.yml'): OK
## Post-merge
Admin이 §18.7 gh api 명령어로 main + release/* branch protection 활성화 시 5가지 즉시 개선 완결 상태 달성.
🗿 MoAI <email@mo.ai.kr>1 parent d6698ae commit 9b8e083
10 files changed
Lines changed: 1136 additions & 49 deletions
File tree
- .claude/commands
- .github
- ISSUE_TEMPLATE
- workflows
- .moai/config/sections
- scripts
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
3 | | - | |
| 2 | + | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
16 | 19 | | |
17 | 20 | | |
18 | | - | |
| 21 | + | |
19 | 22 | | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
25 | 31 | | |
26 | | - | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
27 | 42 | | |
28 | 43 | | |
29 | 44 | | |
| |||
349 | 364 | | |
350 | 365 | | |
351 | 366 | | |
352 | | - | |
353 | | - | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
354 | 371 | | |
355 | 372 | | |
356 | 373 | | |
357 | 374 | | |
358 | 375 | | |
359 | 376 | | |
360 | 377 | | |
361 | | - | |
362 | | - | |
363 | | - | |
364 | | - | |
365 | | - | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
366 | 396 | | |
367 | | - | |
368 | | - | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
369 | 406 | | |
370 | 407 | | |
371 | | - | |
| 408 | + | |
| 409 | + | |
372 | 410 | | |
373 | 411 | | |
374 | 412 | | |
| |||
670 | 708 | | |
671 | 709 | | |
672 | 710 | | |
673 | | - | |
| 711 | + | |
674 | 712 | | |
675 | 713 | | |
676 | | - | |
677 | | - | |
678 | | - | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
679 | 718 | | |
680 | 719 | | |
681 | | - | |
| 720 | + | |
682 | 721 | | |
| 722 | + | |
| 723 | + | |
683 | 724 | | |
684 | 725 | | |
685 | 726 | | |
| 727 | + | |
| 728 | + | |
686 | 729 | | |
687 | 730 | | |
688 | 731 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
19 | | - | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
20 | 34 | | |
21 | 35 | | |
22 | 36 | | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
28 | 49 | | |
29 | 50 | | |
30 | 51 | | |
31 | | - | |
32 | | - | |
33 | | - | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
34 | 55 | | |
35 | 56 | | |
36 | 57 | | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
42 | 64 | | |
43 | 65 | | |
44 | 66 | | |
45 | 67 | | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
0 commit comments