project-auto-wizard 0.9.1 β†’ 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +83 -4
  2. package/package.json +1 -1
  3. package/payload/config/breaking-changes.json +24 -1
  4. package/payload/flutter-app/android/fastlane/Fastfile.playstore +86 -0
  5. package/payload/flutter-app/ios/ExportOptions.plist +31 -0
  6. package/payload/flutter-app/ios/fastlane/Fastfile +117 -0
  7. package/payload/scripts/__pycache__/changelog_manager.cpython-314.pyc +0 -0
  8. package/payload/scripts/__pycache__/issue_helper.cpython-314.pyc +0 -0
  9. package/payload/scripts/__pycache__/version_manager.cpython-314.pyc +0 -0
  10. package/payload/scripts/changelog_manager.py +2 -2
  11. package/payload/scripts/version_manager.py +2 -2
  12. package/payload/version.yml.template +1 -0
  13. package/payload/workflows/common/secret-backup/PROJECT-COMMON-SECRET-FILE-UPLOAD.yaml +12 -12
  14. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-FIREBASE-CICD.yaml +48 -20
  15. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +44 -19
  16. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-SELFHOSTED-CICD.yaml +28 -36
  17. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +33 -46
  18. package/payload/workflows/flutter/{PROJECT-FLUTTER-SUH-LAB-APP-BUILD-TRIGGER.yaml β†’ PROJECT-FLUTTER-APP-BUILD-TRIGGER.yaml} +38 -38
  19. package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +123 -32
  20. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +57 -42
  21. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +61 -40
  22. package/payload/workflows/go/PROJECT-GO-CI.yaml +47 -0
  23. package/payload/workflows/go/PROJECT-GO-PR-PREVIEW.yaml +40 -40
  24. package/payload/workflows/next/PROJECT-NEXT-CI.yaml +47 -0
  25. package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +47 -0
  26. package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +40 -40
  27. package/payload/workflows/react/PROJECT-REACT-CI.yaml +47 -0
  28. package/payload/workflows/spring/nexus/PROJECT-SPRING-GITHUB-PACKAGES-PUBLISH.yml +1 -0
  29. package/payload/workflows/spring/nexus/PROJECT-SPRING-NEXUS-CI.yml +47 -0
  30. package/payload/workflows/spring/nexus/PROJECT-SPRING-NEXUS-PUBLISH.yml +1 -0
  31. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +39 -39
  32. package/src/cli/args.js +37 -0
  33. package/src/cli/help.js +4 -0
  34. package/src/commands/doctor.js +55 -2
  35. package/src/commands/dry-run.js +10 -0
  36. package/src/commands/full.js +28 -3
  37. package/src/commands/interactive-flutter.js +95 -0
  38. package/src/commands/interactive.js +51 -5
  39. package/src/commands/status.js +20 -2
  40. package/src/context.js +6 -0
  41. package/src/core/breaking.js +7 -3
  42. package/src/core/copy/flutter-app.js +42 -0
  43. package/src/core/copy/workflows.js +21 -9
  44. package/src/core/detect-fs.js +9 -1
  45. package/src/core/flutter-options.js +118 -0
  46. package/src/core/installed-stores.js +12 -0
  47. package/src/core/verify.js +2 -2
  48. package/src/core/version-yml.js +40 -5
  49. package/src/core/wizard-env.js +26 -4
  50. package/src/index.js +32 -1
  51. package/src/ui/env-plan.js +8 -5
  52. package/src/ui/prompts.js +88 -3
  53. package/src/ui/status-cards.js +13 -1
  54. package/src/ui/summary.js +24 -5
@@ -19,9 +19,9 @@
19
19
  # ===================================================================
20
20
  #
21
21
  # πŸš€ μ‚¬μš©λ²•:
22
- # @suh-lab server build - Preview λΉŒλ“œ 및 배포
23
- # @suh-lab server destroy - Preview ν™˜κ²½ μ‚­μ œ
24
- # @suh-lab server status - ν˜„μž¬ μƒνƒœ 확인
22
+ # /wizard server build - Preview λΉŒλ“œ 및 배포
23
+ # /wizard server destroy - Preview ν™˜κ²½ μ‚­μ œ
24
+ # /wizard server status - ν˜„μž¬ μƒνƒœ 확인
25
25
  #
26
26
  # πŸ“Š λ¦¬μ†ŒμŠ€ 넀이밍:
27
27
  # - μ»¨ν…Œμ΄λ„ˆ: {PROJECT_NAME}-pr-{번호}
@@ -64,7 +64,7 @@ env:
64
64
 
65
65
  # Issue Helper λŒ“κΈ€ 마컀 (ν”„λ‘œμ νŠΈλ³„ μˆ˜μ • ν•„μš”)
66
66
  # Issue λŒ“κΈ€μ—μ„œ 브랜치λͺ…을 μΆ”μΆœν•  λ•Œ μ‚¬μš©
67
- ISSUE_HELPER_MARKER: 'Guide by SUH-LAB'
67
+ ISSUE_HELPER_MARKER: '<!-- project-auto-wizard issue helper -->'
68
68
 
69
69
  # Health Check μ„€μ • (ν”„λ‘œμ νŠΈλ³„ μˆ˜μ • ν•„μš”)
70
70
  # - HEALTH_CHECK_PATH: HTTP Health Check 경둜 (λΉˆκ°’μ΄λ©΄ HTTP 체크 κ±΄λ„ˆλœ€)
@@ -115,7 +115,7 @@ jobs:
115
115
  is_custom_branch: ${{ steps.parse.outputs.is_custom_branch }}
116
116
  steps:
117
117
  - name: λŒ“κΈ€μ— πŸ‘€ λ¦¬μ•‘μ…˜ μΆ”κ°€
118
- if: contains(github.event.comment.body, '@suh-lab') && contains(github.event.comment.body, 'server')
118
+ if: contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server')
119
119
  uses: actions/github-script@v9
120
120
  with:
121
121
  github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -143,8 +143,8 @@ jobs:
143
143
  fi
144
144
 
145
145
  # λͺ…λ Ήμ–΄ νŒŒμ‹± (브랜치 νŒŒλΌλ―Έν„° 지원)
146
- # ν˜•μ‹: @suh-lab server <command> [브랜치λͺ…]
147
- if [[ "$COMMENT" =~ @suh-lab[[:space:]]+server[[:space:]]+build([[:space:]]+([^[:space:]]+))? ]]; then
146
+ # ν˜•μ‹: /wizard server <command> [브랜치λͺ…]
147
+ if [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+build([[:space:]]+([^[:space:]]+))? ]]; then
148
148
  echo "command=build" >> $GITHUB_OUTPUT
149
149
  echo "is_valid=true" >> $GITHUB_OUTPUT
150
150
  if [[ -n "${BASH_REMATCH[2]}" ]]; then
@@ -155,7 +155,7 @@ jobs:
155
155
  echo "is_custom_branch=false" >> $GITHUB_OUTPUT
156
156
  echo "βœ… λͺ…λ Ήμ–΄ 감지: build"
157
157
  fi
158
- elif [[ "$COMMENT" =~ @suh-lab[[:space:]]+server[[:space:]]+destroy([[:space:]]+([^[:space:]]+))? ]]; then
158
+ elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+destroy([[:space:]]+([^[:space:]]+))? ]]; then
159
159
  echo "command=destroy" >> $GITHUB_OUTPUT
160
160
  echo "is_valid=true" >> $GITHUB_OUTPUT
161
161
  if [[ -n "${BASH_REMATCH[2]}" ]]; then
@@ -166,7 +166,7 @@ jobs:
166
166
  echo "is_custom_branch=false" >> $GITHUB_OUTPUT
167
167
  echo "βœ… λͺ…λ Ήμ–΄ 감지: destroy"
168
168
  fi
169
- elif [[ "$COMMENT" =~ @suh-lab[[:space:]]+server[[:space:]]+status([[:space:]]+([^[:space:]]+))? ]]; then
169
+ elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+status([[:space:]]+([^[:space:]]+))? ]]; then
170
170
  echo "command=status" >> $GITHUB_OUTPUT
171
171
  echo "is_valid=true" >> $GITHUB_OUTPUT
172
172
  if [[ -n "${BASH_REMATCH[2]}" ]]; then
@@ -179,7 +179,7 @@ jobs:
179
179
  fi
180
180
  else
181
181
  echo "is_valid=false" >> $GITHUB_OUTPUT
182
- echo "ℹ️ @suh-lab server λͺ…λ Ήμ–΄κ°€ μ•„λ‹˜"
182
+ echo "ℹ️ /wizard server λͺ…λ Ήμ–΄κ°€ μ•„λ‹˜"
183
183
  fi
184
184
 
185
185
  # -----------------------------------------------------------------
@@ -519,17 +519,17 @@ jobs:
519
519
  '### πŸ“‹ λͺ…λ Ήμ–΄',
520
520
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
521
521
  '|--------|------|',
522
- '| `@suh-lab server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
523
- '| `@suh-lab server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
524
- '| `@suh-lab server status` | ν˜„μž¬ μƒνƒœ 확인 |',
522
+ '| `/wizard server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
523
+ '| `/wizard server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
524
+ '| `/wizard server status` | ν˜„μž¬ μƒνƒœ 확인 |',
525
525
  '',
526
526
  '<details>',
527
527
  '<summary>πŸ”§ κ³ κΈ‰ λͺ…λ Ήμ–΄ (λ‹€λ₯Έ Issue/PRμ—μ„œ μ œμ–΄)</summary>',
528
528
  '',
529
529
  '```',
530
- `@suh-lab server build ${branchName}`,
531
- `@suh-lab server destroy ${branchName}`,
532
- `@suh-lab server status ${branchName}`,
530
+ `/wizard server build ${branchName}`,
531
+ `/wizard server destroy ${branchName}`,
532
+ `/wizard server status ${branchName}`,
533
533
  '```',
534
534
  '</details>',
535
535
  '',
@@ -594,7 +594,7 @@ jobs:
594
594
  '',
595
595
  '### πŸ’‘ λ‹€μŒ 단계',
596
596
  '1. μœ„ λ§ν¬μ—μ„œ λΉŒλ“œ/배포 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”',
597
- '2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `@suh-lab server build`',
597
+ '2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `/wizard server build`',
598
598
  '',
599
599
  '---',
600
600
  '*πŸ€– 이 λŒ“κΈ€μ€ PR Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -1115,17 +1115,17 @@ jobs:
1115
1115
  '### πŸ“‹ λͺ…λ Ήμ–΄',
1116
1116
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
1117
1117
  '|--------|------|',
1118
- '| `@suh-lab server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1119
- '| `@suh-lab server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1120
- '| `@suh-lab server status` | ν˜„μž¬ μƒνƒœ 확인 |',
1118
+ '| `/wizard server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1119
+ '| `/wizard server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1120
+ '| `/wizard server status` | ν˜„μž¬ μƒνƒœ 확인 |',
1121
1121
  '',
1122
1122
  '<details>',
1123
1123
  '<summary>πŸ”§ κ³ κΈ‰ λͺ…λ Ήμ–΄ (λ‹€λ₯Έ Issue/PRμ—μ„œ μ œμ–΄)</summary>',
1124
1124
  '',
1125
1125
  '```',
1126
- `@suh-lab server build ${branchName}`,
1127
- `@suh-lab server destroy ${branchName}`,
1128
- `@suh-lab server status ${branchName}`,
1126
+ `/wizard server build ${branchName}`,
1127
+ `/wizard server destroy ${branchName}`,
1128
+ `/wizard server status ${branchName}`,
1129
1129
  '```',
1130
1130
  '</details>',
1131
1131
  '',
@@ -1188,7 +1188,7 @@ jobs:
1188
1188
  '',
1189
1189
  '### πŸ’‘ λ‹€μŒ 단계',
1190
1190
  '1. μœ„ λ§ν¬μ—μ„œ λΉŒλ“œ/배포 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”',
1191
- '2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `@suh-lab server build`',
1191
+ '2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `/wizard server build`',
1192
1192
  '',
1193
1193
  '---',
1194
1194
  '*πŸ€– 이 λŒ“κΈ€μ€ Issue Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -1219,7 +1219,7 @@ jobs:
1219
1219
  if: |
1220
1220
  (github.event_name == 'pull_request' && github.event.action == 'closed') ||
1221
1221
  (github.event_name == 'issues' && github.event.action == 'closed') ||
1222
- (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@suh-lab') && contains(github.event.comment.body, 'server destroy'))
1222
+ (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server destroy'))
1223
1223
  runs-on: ubuntu-latest
1224
1224
  steps:
1225
1225
  - name: PR/Issue 번호 κ°€μ Έμ˜€κΈ°
@@ -1302,7 +1302,7 @@ jobs:
1302
1302
  `| **μ»¨ν…Œμ΄λ„ˆ** | \`${projectName}-pr-${number}\` |`,
1303
1303
  '| **μƒνƒœ** | μ‚­μ œλ¨ |',
1304
1304
  '',
1305
- 'λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: `@suh-lab server build`',
1305
+ 'λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: `/wizard server build`',
1306
1306
  '',
1307
1307
  '---',
1308
1308
  '*πŸ€– 이 λŒ“κΈ€μ€ PR/Issue Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -1401,8 +1401,8 @@ jobs:
1401
1401
  '### πŸ“‹ λͺ…λ Ήμ–΄',
1402
1402
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
1403
1403
  '|--------|------|',
1404
- '| `@suh-lab server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1405
- '| `@suh-lab server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1404
+ '| `/wizard server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1405
+ '| `/wizard server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1406
1406
  '',
1407
1407
  '---',
1408
1408
  `*πŸ€– 이 λŒ“κΈ€μ€ ${contextType} Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*`
@@ -1416,7 +1416,7 @@ jobs:
1416
1416
  `| **μ»¨ν…Œμ΄λ„ˆ** | \`${projectName}-pr-${number}\` |`,
1417
1417
  '| **μƒνƒœ** | πŸ”΄ Not Found |',
1418
1418
  '',
1419
- 'λ°°ν¬ν•˜λ €λ©΄: `@suh-lab server build`',
1419
+ 'λ°°ν¬ν•˜λ €λ©΄: `/wizard server build`',
1420
1420
  '',
1421
1421
  '---',
1422
1422
  `*πŸ€– 이 λŒ“κΈ€μ€ ${contextType} Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*`
@@ -1850,17 +1850,17 @@ jobs:
1850
1850
  '### πŸ“‹ λͺ…λ Ήμ–΄',
1851
1851
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
1852
1852
  '|--------|------|',
1853
- '| `@suh-lab server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1854
- '| `@suh-lab server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1855
- '| `@suh-lab server status` | ν˜„μž¬ μƒνƒœ 확인 |',
1853
+ '| `/wizard server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1854
+ '| `/wizard server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1855
+ '| `/wizard server status` | ν˜„μž¬ μƒνƒœ 확인 |',
1856
1856
  '',
1857
1857
  '<details>',
1858
1858
  '<summary>πŸ”§ κ³ κΈ‰ λͺ…λ Ήμ–΄ (λ‹€λ₯Έ Issue/PRμ—μ„œ μ œμ–΄)</summary>',
1859
1859
  '',
1860
1860
  '```',
1861
- `@suh-lab server build ${branchName}`,
1862
- `@suh-lab server destroy ${branchName}`,
1863
- `@suh-lab server status ${branchName}`,
1861
+ `/wizard server build ${branchName}`,
1862
+ `/wizard server destroy ${branchName}`,
1863
+ `/wizard server status ${branchName}`,
1864
1864
  '```',
1865
1865
  '</details>',
1866
1866
  '',
@@ -1921,7 +1921,7 @@ jobs:
1921
1921
  '',
1922
1922
  '### πŸ’‘ λ‹€μŒ 단계',
1923
1923
  '1. μœ„ λ§ν¬μ—μ„œ λΉŒλ“œ/배포 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”',
1924
- `2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: \`@suh-lab server build ${branchName}\``,
1924
+ `2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: \`/wizard server build ${branchName}\``,
1925
1925
  '',
1926
1926
  '---',
1927
1927
  '*πŸ€– 이 λŒ“κΈ€μ€ Custom Branch Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -2051,7 +2051,7 @@ jobs:
2051
2051
  `| **μ»¨ν…Œμ΄λ„ˆ** | \`${containerName}\` |`,
2052
2052
  '| **μƒνƒœ** | μ‚­μ œλ¨ |',
2053
2053
  '',
2054
- `λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: \`@suh-lab server build ${branchName}\``,
2054
+ `λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: \`/wizard server build ${branchName}\``,
2055
2055
  '',
2056
2056
  '---',
2057
2057
  '*πŸ€– 이 λŒ“κΈ€μ€ Custom Branch Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -2162,8 +2162,8 @@ jobs:
2162
2162
  '### πŸ“‹ λͺ…λ Ήμ–΄',
2163
2163
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
2164
2164
  '|--------|------|',
2165
- `| \`@suh-lab server build ${branchName}\` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |`,
2166
- `| \`@suh-lab server destroy ${branchName}\` | Preview ν™˜κ²½ μ‚­μ œ |`,
2165
+ `| \`/wizard server build ${branchName}\` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |`,
2166
+ `| \`/wizard server destroy ${branchName}\` | Preview ν™˜κ²½ μ‚­μ œ |`,
2167
2167
  '',
2168
2168
  '---',
2169
2169
  '*πŸ€– 이 λŒ“κΈ€μ€ Custom Branch Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -2178,7 +2178,7 @@ jobs:
2178
2178
  `| **μ»¨ν…Œμ΄λ„ˆ** | \`${containerName}\` |`,
2179
2179
  '| **μƒνƒœ** | πŸ”΄ Not Found |',
2180
2180
  '',
2181
- `λ°°ν¬ν•˜λ €λ©΄: \`@suh-lab server build ${branchName}\``,
2181
+ `λ°°ν¬ν•˜λ €λ©΄: \`/wizard server build ${branchName}\``,
2182
2182
  '',
2183
2183
  '---',
2184
2184
  '*πŸ€– 이 λŒ“κΈ€μ€ Custom Branch Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -37,6 +37,8 @@ env:
37
37
  PROJECT_NAME: "__PROJECT_NAME__" # @wizard ask:@repo
38
38
  NODE_VERSION: "20.15.0"
39
39
  ENV_FILE: ".env"
40
+ # λͺ¨λ…Έλ ˆν¬μ—μ„œ 이 ν”„λ‘œμ νŠΈκ°€ μžˆλŠ” ν•˜μœ„ 경둜 ('.'이면 항상 검증)
41
+ PROJECT_PATH: "." # @wizard auto:project-path
40
42
 
41
43
  permissions:
42
44
  contents: read
@@ -44,9 +46,35 @@ permissions:
44
46
  issues: write
45
47
 
46
48
  jobs:
49
+ # ===================================================================
50
+ # λ³€κ²½ 감지 (λͺ¨λ…Έλ ˆν¬μ—μ„œ 이 ν”„λ‘œμ νŠΈ κ²½λ‘œκ°€ λ°”λ€Œμ—ˆλŠ”μ§€ νŒλ³„)
51
+ # ===================================================================
52
+ changes:
53
+ name: λ³€κ²½ 감지
54
+ runs-on: ubuntu-latest
55
+ permissions:
56
+ contents: read
57
+ pull-requests: read
58
+ outputs:
59
+ project: ${{ steps.filter.outputs.project }}
60
+ steps:
61
+ - name: Checkout repository
62
+ uses: actions/checkout@v7
63
+
64
+ - name: ν”„λ‘œμ νŠΈ 경둜 λ³€κ²½ μ—¬λΆ€ νŒλ³„
65
+ id: filter
66
+ if: ${{ github.event_name != 'workflow_dispatch' }}
67
+ uses: dorny/paths-filter@v4
68
+ with:
69
+ filters: |
70
+ project:
71
+ - '${{ env.PROJECT_PATH == '.' && '**' || format('{0}/**', env.PROJECT_PATH) }}'
72
+
47
73
  build:
48
74
  name: Next.js μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λΉŒλ“œ
49
75
  runs-on: ubuntu-latest
76
+ needs: changes
77
+ if: ${{ github.event_name == 'workflow_dispatch' || needs.changes.outputs.project == 'true' }}
50
78
 
51
79
  steps:
52
80
  # 1. μ†ŒμŠ€μ½”λ“œ 체크아웃
@@ -184,3 +212,22 @@ jobs:
184
212
  echo " πŸ• μ‹œκ°„: $(date '+%Y-%m-%d %H:%M:%S UTC')"
185
213
  echo ""
186
214
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
215
+
216
+ # ===================================================================
217
+ # CI Gate (required check둜 등둝할 단일 job)
218
+ # ===================================================================
219
+ ci-gate:
220
+ name: CI Gate
221
+ if: ${{ always() }}
222
+ needs: [changes, build]
223
+ runs-on: ubuntu-latest
224
+ steps:
225
+ - name: κ²°κ³Ό 집계
226
+ env:
227
+ RESULTS: ${{ toJSON(needs.*.result) }}
228
+ run: |
229
+ echo "needs κ²°κ³Ό: $RESULTS"
230
+ if echo "$RESULTS" | grep -Eq '"(failure|cancelled)"'; then
231
+ echo "μ‹€νŒ¨ν•˜κ±°λ‚˜ μ·¨μ†Œλœ job이 μžˆμŠ΅λ‹ˆλ‹€."
232
+ exit 1
233
+ fi
@@ -29,14 +29,42 @@ on:
29
29
  env:
30
30
  # ν”„λ‘œμ νŠΈ 고유 μ‹λ³„μž (μ»¨ν…Œμ΄λ„ˆλͺ…, 이미지λͺ…, 도메인에 μ‚¬μš©)
31
31
  PROJECT_NAME: "__PROJECT_NAME__" # @wizard ask:@repo
32
+ # λͺ¨λ…Έλ ˆν¬μ—μ„œ 이 ν”„λ‘œμ νŠΈκ°€ μžˆλŠ” ν•˜μœ„ 경둜 ('.'이면 항상 검증)
33
+ PROJECT_PATH: "." # @wizard auto:project-path
32
34
 
33
35
  jobs:
36
+ # ===================================================================
37
+ # λ³€κ²½ 감지 (λͺ¨λ…Έλ ˆν¬μ—μ„œ 이 ν”„λ‘œμ νŠΈ κ²½λ‘œκ°€ λ°”λ€Œμ—ˆλŠ”μ§€ νŒλ³„)
38
+ # ===================================================================
39
+ changes:
40
+ name: λ³€κ²½ 감지
41
+ runs-on: ubuntu-latest
42
+ permissions:
43
+ contents: read
44
+ pull-requests: read
45
+ outputs:
46
+ project: ${{ steps.filter.outputs.project }}
47
+ steps:
48
+ - name: Checkout repository
49
+ uses: actions/checkout@v7
50
+
51
+ - name: ν”„λ‘œμ νŠΈ 경둜 λ³€κ²½ μ—¬λΆ€ νŒλ³„
52
+ id: filter
53
+ if: ${{ github.event_name != 'workflow_dispatch' }}
54
+ uses: dorny/paths-filter@v4
55
+ with:
56
+ filters: |
57
+ project:
58
+ - '${{ env.PROJECT_PATH == '.' && '**' || format('{0}/**', env.PROJECT_PATH) }}'
59
+
34
60
  # ===================================================================
35
61
  # λΉŒλ“œ 검증 μž‘μ—…
36
62
  # ===================================================================
37
63
  build-check:
38
64
  name: Python FastAPI λΉŒλ“œ 검증
39
65
  runs-on: ubuntu-latest
66
+ needs: changes
67
+ if: ${{ github.event_name == 'workflow_dispatch' || needs.changes.outputs.project == 'true' }}
40
68
 
41
69
  steps:
42
70
  # 1. μ†ŒμŠ€μ½”λ“œ 체크아웃
@@ -77,3 +105,22 @@ jobs:
77
105
  echo " 🌿 브랜치: ${{ github.ref_name }}"
78
106
  echo " πŸ“ 컀밋: ${{ github.sha }}"
79
107
  echo " ⏰ 검증 μ‹œκ°„: $(date '+%Y-%m-%d %H:%M:%S')"
108
+
109
+ # ===================================================================
110
+ # CI Gate (required check둜 등둝할 단일 job)
111
+ # ===================================================================
112
+ ci-gate:
113
+ name: CI Gate
114
+ if: ${{ always() }}
115
+ needs: [changes, build-check]
116
+ runs-on: ubuntu-latest
117
+ steps:
118
+ - name: κ²°κ³Ό 집계
119
+ env:
120
+ RESULTS: ${{ toJSON(needs.*.result) }}
121
+ run: |
122
+ echo "needs κ²°κ³Ό: $RESULTS"
123
+ if echo "$RESULTS" | grep -Eq '"(failure|cancelled)"'; then
124
+ echo "μ‹€νŒ¨ν•˜κ±°λ‚˜ μ·¨μ†Œλœ job이 μžˆμŠ΅λ‹ˆλ‹€."
125
+ exit 1
126
+ fi
@@ -19,9 +19,9 @@
19
19
  # ===================================================================
20
20
  #
21
21
  # πŸš€ μ‚¬μš©λ²•:
22
- # @suh-lab server build - Preview λΉŒλ“œ 및 배포
23
- # @suh-lab server destroy - Preview ν™˜κ²½ μ‚­μ œ
24
- # @suh-lab server status - ν˜„μž¬ μƒνƒœ 확인
22
+ # /wizard server build - Preview λΉŒλ“œ 및 배포
23
+ # /wizard server destroy - Preview ν™˜κ²½ μ‚­μ œ
24
+ # /wizard server status - ν˜„μž¬ μƒνƒœ 확인
25
25
  #
26
26
  # πŸ“Š λ¦¬μ†ŒμŠ€ 넀이밍:
27
27
  # - μ»¨ν…Œμ΄λ„ˆ: {PROJECT_NAME}-pr-{번호}
@@ -64,7 +64,7 @@ env:
64
64
 
65
65
  # Issue Helper λŒ“κΈ€ 마컀 (ν”„λ‘œμ νŠΈλ³„ μˆ˜μ • ν•„μš”)
66
66
  # Issue λŒ“κΈ€μ—μ„œ 브랜치λͺ…을 μΆ”μΆœν•  λ•Œ μ‚¬μš©
67
- ISSUE_HELPER_MARKER: 'Guide by SUH-LAB'
67
+ ISSUE_HELPER_MARKER: '<!-- project-auto-wizard issue helper -->'
68
68
 
69
69
  # Health Check μ„€μ • (ν”„λ‘œμ νŠΈλ³„ μˆ˜μ • ν•„μš”)
70
70
  # - HEALTH_CHECK_PATH: HTTP Health Check 경둜 (λΉˆκ°’μ΄λ©΄ HTTP 체크 κ±΄λ„ˆλœ€)
@@ -114,7 +114,7 @@ jobs:
114
114
  is_custom_branch: ${{ steps.parse.outputs.is_custom_branch }}
115
115
  steps:
116
116
  - name: λŒ“κΈ€μ— πŸ‘€ λ¦¬μ•‘μ…˜ μΆ”κ°€
117
- if: contains(github.event.comment.body, '@suh-lab') && contains(github.event.comment.body, 'server')
117
+ if: contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server')
118
118
  uses: actions/github-script@v9
119
119
  with:
120
120
  github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -142,8 +142,8 @@ jobs:
142
142
  fi
143
143
 
144
144
  # λͺ…λ Ήμ–΄ νŒŒμ‹± (브랜치 νŒŒλΌλ―Έν„° 지원)
145
- # ν˜•μ‹: @suh-lab server <command> [브랜치λͺ…]
146
- if [[ "$COMMENT" =~ @suh-lab[[:space:]]+server[[:space:]]+build([[:space:]]+([^[:space:]]+))? ]]; then
145
+ # ν˜•μ‹: /wizard server <command> [브랜치λͺ…]
146
+ if [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+build([[:space:]]+([^[:space:]]+))? ]]; then
147
147
  echo "command=build" >> $GITHUB_OUTPUT
148
148
  echo "is_valid=true" >> $GITHUB_OUTPUT
149
149
  if [[ -n "${BASH_REMATCH[2]}" ]]; then
@@ -154,7 +154,7 @@ jobs:
154
154
  echo "is_custom_branch=false" >> $GITHUB_OUTPUT
155
155
  echo "βœ… λͺ…λ Ήμ–΄ 감지: build"
156
156
  fi
157
- elif [[ "$COMMENT" =~ @suh-lab[[:space:]]+server[[:space:]]+destroy([[:space:]]+([^[:space:]]+))? ]]; then
157
+ elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+destroy([[:space:]]+([^[:space:]]+))? ]]; then
158
158
  echo "command=destroy" >> $GITHUB_OUTPUT
159
159
  echo "is_valid=true" >> $GITHUB_OUTPUT
160
160
  if [[ -n "${BASH_REMATCH[2]}" ]]; then
@@ -165,7 +165,7 @@ jobs:
165
165
  echo "is_custom_branch=false" >> $GITHUB_OUTPUT
166
166
  echo "βœ… λͺ…λ Ήμ–΄ 감지: destroy"
167
167
  fi
168
- elif [[ "$COMMENT" =~ @suh-lab[[:space:]]+server[[:space:]]+status([[:space:]]+([^[:space:]]+))? ]]; then
168
+ elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+status([[:space:]]+([^[:space:]]+))? ]]; then
169
169
  echo "command=status" >> $GITHUB_OUTPUT
170
170
  echo "is_valid=true" >> $GITHUB_OUTPUT
171
171
  if [[ -n "${BASH_REMATCH[2]}" ]]; then
@@ -178,7 +178,7 @@ jobs:
178
178
  fi
179
179
  else
180
180
  echo "is_valid=false" >> $GITHUB_OUTPUT
181
- echo "ℹ️ @suh-lab server λͺ…λ Ήμ–΄κ°€ μ•„λ‹˜"
181
+ echo "ℹ️ /wizard server λͺ…λ Ήμ–΄κ°€ μ•„λ‹˜"
182
182
  fi
183
183
 
184
184
  # -----------------------------------------------------------------
@@ -518,17 +518,17 @@ jobs:
518
518
  '### πŸ“‹ λͺ…λ Ήμ–΄',
519
519
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
520
520
  '|--------|------|',
521
- '| `@suh-lab server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
522
- '| `@suh-lab server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
523
- '| `@suh-lab server status` | ν˜„μž¬ μƒνƒœ 확인 |',
521
+ '| `/wizard server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
522
+ '| `/wizard server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
523
+ '| `/wizard server status` | ν˜„μž¬ μƒνƒœ 확인 |',
524
524
  '',
525
525
  '<details>',
526
526
  '<summary>πŸ”§ κ³ κΈ‰ λͺ…λ Ήμ–΄ (λ‹€λ₯Έ Issue/PRμ—μ„œ μ œμ–΄)</summary>',
527
527
  '',
528
528
  '```',
529
- `@suh-lab server build ${branchName}`,
530
- `@suh-lab server destroy ${branchName}`,
531
- `@suh-lab server status ${branchName}`,
529
+ `/wizard server build ${branchName}`,
530
+ `/wizard server destroy ${branchName}`,
531
+ `/wizard server status ${branchName}`,
532
532
  '```',
533
533
  '</details>',
534
534
  '',
@@ -593,7 +593,7 @@ jobs:
593
593
  '',
594
594
  '### πŸ’‘ λ‹€μŒ 단계',
595
595
  '1. μœ„ λ§ν¬μ—μ„œ λΉŒλ“œ/배포 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”',
596
- '2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `@suh-lab server build`',
596
+ '2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `/wizard server build`',
597
597
  '',
598
598
  '---',
599
599
  '*πŸ€– 이 λŒ“κΈ€μ€ PR Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -1114,17 +1114,17 @@ jobs:
1114
1114
  '### πŸ“‹ λͺ…λ Ήμ–΄',
1115
1115
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
1116
1116
  '|--------|------|',
1117
- '| `@suh-lab server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1118
- '| `@suh-lab server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1119
- '| `@suh-lab server status` | ν˜„μž¬ μƒνƒœ 확인 |',
1117
+ '| `/wizard server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1118
+ '| `/wizard server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1119
+ '| `/wizard server status` | ν˜„μž¬ μƒνƒœ 확인 |',
1120
1120
  '',
1121
1121
  '<details>',
1122
1122
  '<summary>πŸ”§ κ³ κΈ‰ λͺ…λ Ήμ–΄ (λ‹€λ₯Έ Issue/PRμ—μ„œ μ œμ–΄)</summary>',
1123
1123
  '',
1124
1124
  '```',
1125
- `@suh-lab server build ${branchName}`,
1126
- `@suh-lab server destroy ${branchName}`,
1127
- `@suh-lab server status ${branchName}`,
1125
+ `/wizard server build ${branchName}`,
1126
+ `/wizard server destroy ${branchName}`,
1127
+ `/wizard server status ${branchName}`,
1128
1128
  '```',
1129
1129
  '</details>',
1130
1130
  '',
@@ -1187,7 +1187,7 @@ jobs:
1187
1187
  '',
1188
1188
  '### πŸ’‘ λ‹€μŒ 단계',
1189
1189
  '1. μœ„ λ§ν¬μ—μ„œ λΉŒλ“œ/배포 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”',
1190
- '2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `@suh-lab server build`',
1190
+ '2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `/wizard server build`',
1191
1191
  '',
1192
1192
  '---',
1193
1193
  '*πŸ€– 이 λŒ“κΈ€μ€ Issue Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -1218,7 +1218,7 @@ jobs:
1218
1218
  if: |
1219
1219
  (github.event_name == 'pull_request' && github.event.action == 'closed') ||
1220
1220
  (github.event_name == 'issues' && github.event.action == 'closed') ||
1221
- (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@suh-lab') && contains(github.event.comment.body, 'server destroy'))
1221
+ (github.event_name == 'issue_comment' && contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server destroy'))
1222
1222
  runs-on: ubuntu-latest
1223
1223
  steps:
1224
1224
  - name: PR/Issue 번호 κ°€μ Έμ˜€κΈ°
@@ -1301,7 +1301,7 @@ jobs:
1301
1301
  `| **μ»¨ν…Œμ΄λ„ˆ** | \`${projectName}-pr-${number}\` |`,
1302
1302
  '| **μƒνƒœ** | μ‚­μ œλ¨ |',
1303
1303
  '',
1304
- 'λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: `@suh-lab server build`',
1304
+ 'λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: `/wizard server build`',
1305
1305
  '',
1306
1306
  '---',
1307
1307
  '*πŸ€– 이 λŒ“κΈ€μ€ PR/Issue Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -1400,8 +1400,8 @@ jobs:
1400
1400
  '### πŸ“‹ λͺ…λ Ήμ–΄',
1401
1401
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
1402
1402
  '|--------|------|',
1403
- '| `@suh-lab server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1404
- '| `@suh-lab server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1403
+ '| `/wizard server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1404
+ '| `/wizard server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1405
1405
  '',
1406
1406
  '---',
1407
1407
  `*πŸ€– 이 λŒ“κΈ€μ€ ${contextType} Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*`
@@ -1415,7 +1415,7 @@ jobs:
1415
1415
  `| **μ»¨ν…Œμ΄λ„ˆ** | \`${projectName}-pr-${number}\` |`,
1416
1416
  '| **μƒνƒœ** | πŸ”΄ Not Found |',
1417
1417
  '',
1418
- 'λ°°ν¬ν•˜λ €λ©΄: `@suh-lab server build`',
1418
+ 'λ°°ν¬ν•˜λ €λ©΄: `/wizard server build`',
1419
1419
  '',
1420
1420
  '---',
1421
1421
  `*πŸ€– 이 λŒ“κΈ€μ€ ${contextType} Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*`
@@ -1849,17 +1849,17 @@ jobs:
1849
1849
  '### πŸ“‹ λͺ…λ Ήμ–΄',
1850
1850
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
1851
1851
  '|--------|------|',
1852
- '| `@suh-lab server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1853
- '| `@suh-lab server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1854
- '| `@suh-lab server status` | ν˜„μž¬ μƒνƒœ 확인 |',
1852
+ '| `/wizard server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |',
1853
+ '| `/wizard server destroy` | Preview ν™˜κ²½ μ‚­μ œ |',
1854
+ '| `/wizard server status` | ν˜„μž¬ μƒνƒœ 확인 |',
1855
1855
  '',
1856
1856
  '<details>',
1857
1857
  '<summary>πŸ”§ κ³ κΈ‰ λͺ…λ Ήμ–΄ (λ‹€λ₯Έ Issue/PRμ—μ„œ μ œμ–΄)</summary>',
1858
1858
  '',
1859
1859
  '```',
1860
- `@suh-lab server build ${branchName}`,
1861
- `@suh-lab server destroy ${branchName}`,
1862
- `@suh-lab server status ${branchName}`,
1860
+ `/wizard server build ${branchName}`,
1861
+ `/wizard server destroy ${branchName}`,
1862
+ `/wizard server status ${branchName}`,
1863
1863
  '```',
1864
1864
  '</details>',
1865
1865
  '',
@@ -1920,7 +1920,7 @@ jobs:
1920
1920
  '',
1921
1921
  '### πŸ’‘ λ‹€μŒ 단계',
1922
1922
  '1. μœ„ λ§ν¬μ—μ„œ λΉŒλ“œ/배포 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”',
1923
- `2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: \`@suh-lab server build ${branchName}\``,
1923
+ `2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: \`/wizard server build ${branchName}\``,
1924
1924
  '',
1925
1925
  '---',
1926
1926
  '*πŸ€– 이 λŒ“κΈ€μ€ Custom Branch Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -2050,7 +2050,7 @@ jobs:
2050
2050
  `| **μ»¨ν…Œμ΄λ„ˆ** | \`${containerName}\` |`,
2051
2051
  '| **μƒνƒœ** | μ‚­μ œλ¨ |',
2052
2052
  '',
2053
- `λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: \`@suh-lab server build ${branchName}\``,
2053
+ `λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: \`/wizard server build ${branchName}\``,
2054
2054
  '',
2055
2055
  '---',
2056
2056
  '*πŸ€– 이 λŒ“κΈ€μ€ Custom Branch Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -2161,8 +2161,8 @@ jobs:
2161
2161
  '### πŸ“‹ λͺ…λ Ήμ–΄',
2162
2162
  '| λͺ…λ Ήμ–΄ | μ„€λͺ… |',
2163
2163
  '|--------|------|',
2164
- `| \`@suh-lab server build ${branchName}\` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |`,
2165
- `| \`@suh-lab server destroy ${branchName}\` | Preview ν™˜κ²½ μ‚­μ œ |`,
2164
+ `| \`/wizard server build ${branchName}\` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |`,
2165
+ `| \`/wizard server destroy ${branchName}\` | Preview ν™˜κ²½ μ‚­μ œ |`,
2166
2166
  '',
2167
2167
  '---',
2168
2168
  '*πŸ€– 이 λŒ“κΈ€μ€ Custom Branch Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -2177,7 +2177,7 @@ jobs:
2177
2177
  `| **μ»¨ν…Œμ΄λ„ˆ** | \`${containerName}\` |`,
2178
2178
  '| **μƒνƒœ** | πŸ”΄ Not Found |',
2179
2179
  '',
2180
- `λ°°ν¬ν•˜λ €λ©΄: \`@suh-lab server build ${branchName}\``,
2180
+ `λ°°ν¬ν•˜λ €λ©΄: \`/wizard server build ${branchName}\``,
2181
2181
  '',
2182
2182
  '---',
2183
2183
  '*πŸ€– 이 λŒ“κΈ€μ€ Custom Branch Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*'
@@ -36,6 +36,8 @@ env:
36
36
  PROJECT_NAME: "__PROJECT_NAME__" # @wizard ask:@repo
37
37
  NODE_VERSION: "20.15.0"
38
38
  ENV_FILE: ".env"
39
+ # λͺ¨λ…Έλ ˆν¬μ—μ„œ 이 ν”„λ‘œμ νŠΈκ°€ μžˆλŠ” ν•˜μœ„ 경둜 ('.'이면 항상 검증)
40
+ PROJECT_PATH: "." # @wizard auto:project-path
39
41
 
40
42
  permissions:
41
43
  contents: read
@@ -43,9 +45,35 @@ permissions:
43
45
  issues: write
44
46
 
45
47
  jobs:
48
+ # ===================================================================
49
+ # λ³€κ²½ 감지 (λͺ¨λ…Έλ ˆν¬μ—μ„œ 이 ν”„λ‘œμ νŠΈ κ²½λ‘œκ°€ λ°”λ€Œμ—ˆλŠ”μ§€ νŒλ³„)
50
+ # ===================================================================
51
+ changes:
52
+ name: λ³€κ²½ 감지
53
+ runs-on: ubuntu-latest
54
+ permissions:
55
+ contents: read
56
+ pull-requests: read
57
+ outputs:
58
+ project: ${{ steps.filter.outputs.project }}
59
+ steps:
60
+ - name: Checkout repository
61
+ uses: actions/checkout@v7
62
+
63
+ - name: ν”„λ‘œμ νŠΈ 경둜 λ³€κ²½ μ—¬λΆ€ νŒλ³„
64
+ id: filter
65
+ if: ${{ github.event_name != 'workflow_dispatch' }}
66
+ uses: dorny/paths-filter@v4
67
+ with:
68
+ filters: |
69
+ project:
70
+ - '${{ env.PROJECT_PATH == '.' && '**' || format('{0}/**', env.PROJECT_PATH) }}'
71
+
46
72
  build:
47
73
  name: React/Next.js μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λΉŒλ“œ
48
74
  runs-on: ubuntu-latest
75
+ needs: changes
76
+ if: ${{ github.event_name == 'workflow_dispatch' || needs.changes.outputs.project == 'true' }}
49
77
 
50
78
  steps:
51
79
  # 1. μ†ŒμŠ€μ½”λ“œ 체크아웃
@@ -193,3 +221,22 @@ jobs:
193
221
  echo "❌ λΉŒλ“œ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€."
194
222
  echo "πŸ’‘ Actions νƒ­μ—μ„œ 'build-log' μ•„ν‹°νŒ©νŠΈλ₯Ό λ‹€μš΄λ‘œλ“œν•˜μ—¬ 전체 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”."
195
223
  fi
224
+
225
+ # ===================================================================
226
+ # CI Gate (required check둜 등둝할 단일 job)
227
+ # ===================================================================
228
+ ci-gate:
229
+ name: CI Gate
230
+ if: ${{ always() }}
231
+ needs: [changes, build]
232
+ runs-on: ubuntu-latest
233
+ steps:
234
+ - name: κ²°κ³Ό 집계
235
+ env:
236
+ RESULTS: ${{ toJSON(needs.*.result) }}
237
+ run: |
238
+ echo "needs κ²°κ³Ό: $RESULTS"
239
+ if echo "$RESULTS" | grep -Eq '"(failure|cancelled)"'; then
240
+ echo "μ‹€νŒ¨ν•˜κ±°λ‚˜ μ·¨μ†Œλœ job이 μžˆμŠ΅λ‹ˆλ‹€."
241
+ exit 1
242
+ fi