project-auto-wizard 0.13.2 → 0.14.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 (112) hide show
  1. package/README.md +1 -1
  2. package/bin/project-auto-wizard.js +18 -4
  3. package/package.json +2 -2
  4. package/payload/config/breaking-changes.json +28 -14
  5. package/payload/config/wizard-prompts.yml +102 -46
  6. package/payload/flutter-app/android/fastlane/Fastfile.playstore +44 -32
  7. package/payload/flutter-app/ios/ExportOptions.plist +8 -8
  8. package/payload/flutter-app/ios/fastlane/Fastfile +57 -43
  9. package/payload/scripts/changelog_manager.py +296 -257
  10. package/payload/scripts/issue_helper.py +54 -50
  11. package/payload/scripts/messages.py +2279 -0
  12. package/payload/scripts/truncate_release_notes.py +7 -6
  13. package/payload/scripts/version_manager.py +64 -61
  14. package/payload/version.yml.template +2 -1
  15. package/payload/workflows/common/PROJECT-COMMON-AI-PR-SUMMARY.yaml +17 -12
  16. package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +59 -34
  17. package/payload/workflows/common/PROJECT-COMMON-ISSUE-HELPER.yaml +17 -15
  18. package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +17 -10
  19. package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +54 -44
  20. package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +24 -17
  21. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-FIREBASE-CICD.yaml +194 -184
  22. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +226 -213
  23. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-SELFHOSTED-CICD.yaml +46 -42
  24. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +334 -241
  25. package/payload/workflows/flutter/PROJECT-FLUTTER-APP-BUILD-TRIGGER.yaml +152 -128
  26. package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +246 -188
  27. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +353 -238
  28. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +96 -85
  29. package/payload/workflows/go/PROJECT-GO-CI.yaml +47 -36
  30. package/payload/workflows/go/PROJECT-GO-PR-PREVIEW.yaml +945 -508
  31. package/payload/workflows/go/PROJECT-GO-SIMPLE-CICD.yaml +155 -133
  32. package/payload/workflows/next/PROJECT-NEXT-CI.yaml +76 -60
  33. package/payload/workflows/next/PROJECT-NEXT-CICD.yaml +97 -77
  34. package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +62 -47
  35. package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +942 -505
  36. package/payload/workflows/python/PROJECT-PYTHON-SIMPLE-CICD.yaml +148 -126
  37. package/payload/workflows/react/PROJECT-REACT-CI.yaml +86 -70
  38. package/payload/workflows/react/PROJECT-REACT-CICD.yaml +112 -92
  39. package/payload/workflows/spring/PROJECT-SPRING-CI.yml +112 -82
  40. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-NGINX-CICD.yaml +180 -150
  41. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-TRAEFIK-CICD.yaml +161 -131
  42. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +970 -549
  43. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-SIMPLE-CICD.yaml +193 -162
  44. package/src/cli/args.js +98 -52
  45. package/src/cli/help.js +8 -41
  46. package/src/commands/doctor.js +85 -89
  47. package/src/commands/dry-run.js +63 -43
  48. package/src/commands/full.js +79 -77
  49. package/src/commands/install-settings.js +16 -15
  50. package/src/commands/interactive-flutter.js +20 -19
  51. package/src/commands/interactive.js +135 -132
  52. package/src/commands/purge.js +47 -42
  53. package/src/commands/status.js +36 -36
  54. package/src/commands/uninstall.js +43 -41
  55. package/src/context.js +12 -11
  56. package/src/core/assets.js +12 -11
  57. package/src/core/baseline.js +27 -27
  58. package/src/core/branches.js +29 -27
  59. package/src/core/branding.js +7 -6
  60. package/src/core/breaking-check.js +22 -21
  61. package/src/core/breaking.js +15 -8
  62. package/src/core/copy/app-files.js +5 -4
  63. package/src/core/copy/flutter-app.js +8 -8
  64. package/src/core/copy/gitignore.js +58 -50
  65. package/src/core/copy/readme.js +45 -35
  66. package/src/core/copy/simple.js +16 -15
  67. package/src/core/copy/workflows.js +131 -124
  68. package/src/core/deploy-style.js +51 -48
  69. package/src/core/detect-fs.js +57 -57
  70. package/src/core/detect.js +67 -65
  71. package/src/core/errors.js +2 -2
  72. package/src/core/flutter-doctor.js +17 -16
  73. package/src/core/flutter-hooks.js +33 -32
  74. package/src/core/flutter-options.js +34 -33
  75. package/src/core/fsutil.js +12 -12
  76. package/src/core/installed-stores.js +4 -4
  77. package/src/core/logger.js +42 -40
  78. package/src/core/paths-resolve.js +88 -86
  79. package/src/core/paths.js +10 -10
  80. package/src/core/release-options.js +8 -8
  81. package/src/core/removal-exec.js +14 -13
  82. package/src/core/removal-plan.js +37 -37
  83. package/src/core/types.js +47 -47
  84. package/src/core/verify.js +44 -38
  85. package/src/core/version-yml.js +76 -68
  86. package/src/core/wizard-env.js +46 -46
  87. package/src/core/wizard-labels.js +63 -41
  88. package/src/i18n/catalog/en/cli.js +50 -0
  89. package/src/i18n/catalog/en/commands.js +187 -0
  90. package/src/i18n/catalog/en/copy.js +19 -0
  91. package/src/i18n/catalog/en/core.js +74 -0
  92. package/src/i18n/catalog/en/core2.js +15 -0
  93. package/src/i18n/catalog/en/ui.js +221 -0
  94. package/src/i18n/catalog/en.js +12 -0
  95. package/src/i18n/catalog/index.js +5 -0
  96. package/src/i18n/catalog/ko/cli.js +50 -0
  97. package/src/i18n/catalog/ko/commands.js +187 -0
  98. package/src/i18n/catalog/ko/copy.js +19 -0
  99. package/src/i18n/catalog/ko/core.js +74 -0
  100. package/src/i18n/catalog/ko/core2.js +15 -0
  101. package/src/i18n/catalog/ko/ui.js +221 -0
  102. package/src/i18n/catalog/ko.js +10 -0
  103. package/src/i18n/index.js +44 -0
  104. package/src/i18n/languages.js +9 -0
  105. package/src/index.js +128 -94
  106. package/src/ui/ansi.js +7 -7
  107. package/src/ui/banner.js +7 -6
  108. package/src/ui/env-plan.js +82 -81
  109. package/src/ui/prompts.js +97 -122
  110. package/src/ui/readline-engine.js +59 -58
  111. package/src/ui/status-cards.js +37 -31
  112. package/src/ui/summary.js +89 -88
@@ -1,46 +1,46 @@
1
1
  # project-auto-wizard:managed-workflow
2
- # Flutter Android 자체 서버(SMB) 배포 워크플로우
2
+ # Flutter Android self-hosted server (SMB) deploy workflow
3
3
  #
4
- # {{MAIN_BRANCH}} 브랜치 푸시 시 Android APK를 빌드하고
5
- # 자체 서버(예: Synology NAS·NAS·Linux)의 SMB 공유에 APK를 배포합니다.
4
+ # On a push to the {{MAIN_BRANCH}} branch, builds the Android APK and
5
+ # deploys it to an SMB share on your own server (e.g. Synology NAS, Linux).
6
6
  #
7
- # 필수 GitHub Secrets
8
- # ENV_FILE 또는 ENV: .env 파일 내용 (둘 중 하나, ENV_FILE 우선)
9
- # DEBUG_KEYSTORE (선택): 서명용 keystore (base64, 비밀번호 android · alias androiddebugkey) — 없으면 빌드마다 새 debug 키로 서명
10
- # GOOGLE_SERVICES_JSON (선택): Firebase google-services.json
11
- # SERVER_HOST: 서버 호스트(SMB 접속 주소)
12
- # SERVER_USER: SMB 사용자명
13
- # SERVER_PASSWORD: SMB 비밀번호
7
+ # Required GitHub Secrets
8
+ # ENV_FILE or ENV: contents of the .env file (either one; ENV_FILE takes precedence)
9
+ # DEBUG_KEYSTORE (optional): signing keystore (base64, password android, alias androiddebugkey) - if missing, each build is signed with a fresh debug key
10
+ # GOOGLE_SERVICES_JSON (optional): Firebase google-services.json
11
+ # SERVER_HOST: server host (SMB address)
12
+ # SERVER_USER: SMB user name
13
+ # SERVER_PASSWORD: SMB password
14
14
 
15
15
  name: PROJECT-Android-SelfHosted-CICD
16
16
 
17
17
  on:
18
18
  push:
19
19
  branches: ["{{MAIN_BRANCH}}"]
20
- # @wizard paths-anchor (모노레포일 때 integrator가 paths 필터를 여기 주입)
21
- workflow_dispatch: # 수동 실행 옵션 추가
20
+ # @wizard paths-anchor (in a monorepo the installer injects a paths filter here)
21
+ workflow_dispatch: # add a manual run option
22
22
 
23
- # 프로젝트별 설정 (아래 값들을 수정하세요)
23
+ # Project settings (edit the values below)
24
24
  env:
25
- # 프로젝트 이름 (APK 파일명, 아티팩트명, 히스토리 파일명에 사용)
25
+ # Project name (used in the APK file name, artifact name, and history file name)
26
26
  APP_ARTIFACT_NAME: "__APP_ARTIFACT_NAME__" # @wizard ask:@repo
27
- # Flutter SDK 버전 — 비워 두면 stable 채널 최신을 쓴다(최신 flutter create 프로젝트의 SDK 제약과 맞음).
28
- # 특정 버전에 고정하려면 "3.38.9"처럼 적는다. pubspec.yaml의 environment.sdk 범위를 만족해야 한다.
27
+ # Flutter SDK version - leave empty to use the latest stable channel (matches the SDK constraint of a fresh flutter create project).
28
+ # To pin a version, write it like "3.38.9". It must satisfy the environment.sdk range in pubspec.yaml.
29
29
  FLUTTER_VERSION: ""
30
30
  JAVA_VERSION: "__JAVA_VERSION__" # @wizard ask:17
31
- # Flutter 루트 경로(레포 루트 기준). 단일레포면 ".", 모노레포면 "app" 등 — 설치 시 자동 설정
31
+ # Flutter root path (relative to the repo root): "." for a single repo, "app" etc. for a monorepo - set automatically at install
32
32
  FLUTTER_PROJECT_DIR: "." # @wizard auto:flutter-root
33
- # 환경변수 전달 방식 (dart-define | dotenv) — 설치 시 선택값으로 자동 설정
33
+ # How env vars are passed (dart-define | dotenv) - set automatically from the install-time choice
34
34
  ENV_MODE: "dart-define" # @wizard auto:flutter-env-mode
35
- # SMB 서버 설정 (자체 서버 — Synology NAS·Linux 등)
36
- SMB_PORT: "44445" # 기본 445
35
+ # SMB server settings (your own server - Synology NAS, Linux, etc.)
36
+ SMB_PORT: "44445" # default 445
37
37
  SMB_SHARE: "web"
38
- SMB_PATH_IOS: "/your-project/ios/download" # SMB 경로: /{APP_ARTIFACT_NAME}/ios/download 형식으로 사용
38
+ SMB_PATH_IOS: "/your-project/ios/download" # SMB path: used in the form /{APP_ARTIFACT_NAME}/ios/download
39
39
  jobs:
40
40
  build-android:
41
41
  name: Build Android APK
42
42
  runs-on: ubuntu-latest
43
- # CHANGELOG 워크플로우가 성공한 경우에만 실행
43
+ # Run only when the CHANGELOG workflow succeeded
44
44
  if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name != 'workflow_run' }}
45
45
  defaults:
46
46
  run:
@@ -52,52 +52,54 @@ jobs:
52
52
  with:
53
53
  fetch-depth: 0
54
54
 
55
- # 업로드 Secret이 없으면 빌드를 다 마친 뒤 SMB 업로드에서야 실패하므로, 빠진 이름을 먼저 알려 주고 멈춘다
56
- # 배포 job과 같은 조건 — 배포하지 않는 브랜치의 수동 실행은 빌드만 한다
57
- # DEBUG_KEYSTORE·GOOGLE_SERVICES_JSON은 선택이라 점검하지 않는다
58
- - name: 배포 사전 점검 (Secret)
55
+ # Without the upload Secrets the run would only fail at the SMB upload after the whole build, so report the missing names first and stop
56
+ # Same condition as the deploy job - a manual run on a non-deploy branch only builds
57
+ # DEBUG_KEYSTORE and GOOGLE_SERVICES_JSON are optional, so they are not checked
58
+ - name: Pre-deploy check (Secrets)
59
59
  if: github.ref == 'refs/heads/{{MAIN_BRANCH}}'
60
60
  env:
61
61
  SERVER_HOST: ${{ secrets.SERVER_HOST }}
62
62
  SERVER_USER: ${{ secrets.SERVER_USER }}
63
63
  SERVER_PASSWORD: ${{ secrets.SERVER_PASSWORD }}
64
64
  run: |
65
+ m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
65
66
  MISSING=""
66
67
  for NAME in SERVER_HOST SERVER_USER SERVER_PASSWORD; do
67
68
  [ -n "${!NAME}" ] || MISSING="$MISSING $NAME"
68
69
  done
69
70
  if [ -n "$MISSING" ]; then
70
- echo "::error title=필수 Secret 누락::등록되지 않은 GitHub Secret:$MISSING — Settings → Secrets and variables → Actions에서 등록하세요"
71
+ echo "::error title=$(m flutter_a.precheck_missing_title)::$(m flutter_a.precheck_missing_body missing="$MISSING")"
71
72
  exit 1
72
73
  fi
73
- echo "✅ 사전 점검 통과: 필수 Secret이 모두 있습니다"
74
+ m flutter_a.precheck_passed
74
75
 
75
76
  - name: List repository contents
76
77
  run: |
77
78
  echo "Repository checked out"
78
79
  ls -la
79
80
 
80
- # Debug Keystore 설정 — 이 워크플로우는 DEBUG_KEYSTORE(비밀번호 android, alias androiddebugkey)로 서명한다
81
+ # Debug keystore setup - this workflow signs with DEBUG_KEYSTORE (password android, alias androiddebugkey)
81
82
  - name: Setup Debug Keystore
82
83
  id: signing
83
84
  env:
84
85
  DEBUG_KEYSTORE: ${{ secrets.DEBUG_KEYSTORE }}
85
86
  run: |
86
- # 내부 배포용이라 Secret이 없어도 빌드는 진행한다 — 러너가 새로 만든 debug 키로 서명되므로
87
- # 빌드마다 서명이 달라져 기존 설치본 위에 업데이트할 수 없다는 점을 경고로 남긴다.
87
+ m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
88
+ # This is for internal distribution, so the build proceeds even without the Secret - the runner signs with a freshly created debug key,
89
+ # so the signature differs per build and cannot update an existing install; leave that as a warning.
88
90
  if [ -z "$DEBUG_KEYSTORE" ]; then
89
- echo "::warning::DEBUG_KEYSTORE Secret이 비어 있어 러너 기본 debug 키로 서명합니다 (빌드마다 서명이 달라집니다)"
91
+ echo "::warning::$(m flutter_a.debug_keystore_empty)"
90
92
  echo "mode=default" >> "$GITHUB_OUTPUT"
91
93
  exit 0
92
94
  fi
93
- # 값이 있는데 깨진 keystore는 조용히 넘기지 않고 여기서 실패한다
95
+ # A keystore that is set but broken is not skipped silently; fail here
94
96
  mkdir -p ~/.android
95
97
  printf '%s' "$DEBUG_KEYSTORE" | base64 -d > ~/.android/debug.keystore
96
98
  keytool -list -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
97
99
  echo "mode=keystore" >> "$GITHUB_OUTPUT"
98
- echo "Debug Keystore created (DEBUG_KEYSTORE로 서명)"
100
+ m flutter_a.debug_keystore_created
99
101
 
100
- # 환경변수 준비 — ENV_MODE=dotenv면 .env 파일, dart-define이면 프로젝트 밖 임시 파일(--dart-define-from-file)
102
+ # Prepare env vars - a .env file when ENV_MODE=dotenv, a temp file outside the project (--dart-define-from-file) for dart-define
101
103
  - name: Prepare env file
102
104
  env:
103
105
  ENV_CONTENT: ${{ secrets.ENV_FILE || secrets.ENV }}
@@ -116,7 +118,7 @@ jobs:
116
118
  if: steps.signing.outputs.mode == 'keystore'
117
119
  run: |
118
120
  mkdir -p android/app/keystore
119
- # 앞 단계에서 검증한 keystore를 그대로 쓴다
121
+ # Reuse the keystore validated in the previous step
120
122
  cp ~/.android/debug.keystore android/app/keystore/key.jks
121
123
  echo "Keystore created from DEBUG_KEYSTORE"
122
124
  ls -la android/app/keystore
@@ -127,7 +129,7 @@ jobs:
127
129
  echo "key.properties created"
128
130
  ls -la android/
129
131
 
130
- # google-services.json 생성 (선택) — 비어 있으면 빈 파일을 만들지 않는다
132
+ # Create google-services.json (optional) - no empty file is written when the Secret is empty
131
133
  - name: Create google-services.json
132
134
  env:
133
135
  GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
@@ -181,12 +183,13 @@ jobs:
181
183
  - name: Setup Gradle
182
184
  working-directory: ${{ env.FLUTTER_PROJECT_DIR }}/android
183
185
  run: |
184
- # flutter create 기본 .gitignore는 gradlew를 커밋하지 않는다 — 없으면 flutter build가 만든다
186
+ m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
187
+ # The default flutter create .gitignore does not commit gradlew - flutter build creates it when missing
185
188
  if [ -f gradlew ]; then
186
189
  chmod +x gradlew
187
190
  echo "Gradle wrapper permissions set"
188
191
  else
189
- echo "ℹ️ gradlew가 저장소에 없습니다 — flutter build가 생성합니다"
192
+ m flutter_a.gradlew_missing
190
193
  fi
191
194
 
192
195
  - name: Set up Java
@@ -203,6 +206,7 @@ jobs:
203
206
  - name: Get version info and calculate short commit hash
204
207
  id: version_info
205
208
  run: |
209
+ m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
206
210
  CURRENT_VERSION=$(grep 'version:' pubspec.yaml | sed 's/version: //' | tr -d ' ')
207
211
  VERSION=$(echo $CURRENT_VERSION | cut -d'+' -f1)
208
212
  BUILD_NUMBER=$(echo $CURRENT_VERSION | cut -d'+' -f2)
@@ -213,10 +217,10 @@ jobs:
213
217
  echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITHUB_ENV
214
218
  echo "SHORT_COMMIT_HASH=$SHORT_COMMIT_HASH" >> $GITHUB_ENV
215
219
 
216
- echo "현재 버전: $CURRENT_VERSION"
217
- echo "짧은 커밋 해시: $SHORT_COMMIT_HASH"
220
+ m flutter_a.current_version current_version="$CURRENT_VERSION"
221
+ m flutter_a.short_commit_hash short_commit_hash="$SHORT_COMMIT_HASH"
218
222
 
219
- # APK 빌드 (릴리스 빌드 유지 — flutter로 직접 빌드)
223
+ # APK build (keeps the release build - built directly with flutter)
220
224
  - name: Build APK
221
225
  run: |
222
226
  flutter build apk --release ${DART_DEFINE_FILE:+--dart-define-from-file="$DART_DEFINE_FILE"}