project-auto-wizard 0.15.0 → 0.15.1

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 (59) hide show
  1. package/README.ja.md +1 -1
  2. package/README.ko.md +1 -1
  3. package/README.md +2 -2
  4. package/README.zh-CN.md +1 -1
  5. package/package.json +1 -1
  6. package/payload/config/breaking-changes.json +31 -5
  7. package/payload/config/wizard-prompts.yml +0 -4
  8. package/payload/scripts/messages.py +156 -26
  9. package/payload/scripts/version_manager.py +69 -40
  10. package/payload/version.yml.template +2 -2
  11. package/payload/workflows/common/PROJECT-COMMON-AI-PR-SUMMARY.yaml +3 -0
  12. package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +15 -1
  13. package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +61 -12
  14. package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +46 -10
  15. package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +40 -11
  16. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-FIREBASE-CICD.yaml +24 -8
  17. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +29 -10
  18. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-SELFHOSTED-CICD.yaml +57 -23
  19. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +155 -72
  20. package/payload/workflows/flutter/PROJECT-FLUTTER-APP-BUILD-TRIGGER.yaml +49 -20
  21. package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +162 -62
  22. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +184 -87
  23. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +38 -15
  24. package/payload/workflows/go/PROJECT-GO-CI.yaml +14 -5
  25. package/payload/workflows/go/PROJECT-GO-PR-PREVIEW.yaml +375 -120
  26. package/payload/workflows/go/PROJECT-GO-SIMPLE-CICD.yaml +9 -4
  27. package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +12 -4
  28. package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +375 -120
  29. package/payload/workflows/python/PROJECT-PYTHON-SIMPLE-CICD.yaml +9 -4
  30. package/payload/workflows/react/PROJECT-REACT-CI.yaml +38 -9
  31. package/payload/workflows/react/PROJECT-REACT-CICD.yaml +19 -5
  32. package/payload/workflows/spring/PROJECT-SPRING-CI.yml +71 -35
  33. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-NGINX-CICD.yaml +9 -6
  34. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-TRAEFIK-CICD.yaml +7 -4
  35. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +425 -144
  36. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-SIMPLE-CICD.yaml +7 -4
  37. package/src/cli/args.js +17 -7
  38. package/src/commands/doctor.js +11 -0
  39. package/src/commands/dry-run.js +9 -1
  40. package/src/commands/full.js +5 -2
  41. package/src/commands/interactive.js +4 -1
  42. package/src/commands/status.js +14 -1
  43. package/src/core/copy/simple.js +31 -0
  44. package/src/core/copy/workflows.js +2 -2
  45. package/src/core/deploy-style.js +1 -1
  46. package/src/core/detect.js +3 -2
  47. package/src/core/types.js +15 -8
  48. package/src/core/version-yml.js +52 -6
  49. package/src/i18n/catalog/en/cli.js +1 -0
  50. package/src/i18n/catalog/en/commands.js +8 -0
  51. package/src/i18n/catalog/en/core2.js +3 -0
  52. package/src/i18n/catalog/ko/cli.js +1 -0
  53. package/src/i18n/catalog/ko/commands.js +8 -0
  54. package/src/i18n/catalog/ko/core2.js +3 -0
  55. package/src/index.js +4 -1
  56. package/src/ui/env-plan.js +1 -1
  57. package/src/ui/prompts.js +7 -3
  58. package/payload/workflows/next/PROJECT-NEXT-CI.yaml +0 -241
  59. package/payload/workflows/next/PROJECT-NEXT-CICD.yaml +0 -330
@@ -114,6 +114,7 @@ jobs:
114
114
  APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }}
115
115
  APP_STORE_CONNECT_API_KEY_BASE64: ${{ secrets.APP_STORE_CONNECT_API_KEY_BASE64 }}
116
116
  run: |
117
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
117
118
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
118
119
  FAILED=0
119
120
  MISSING=""
@@ -147,22 +148,26 @@ jobs:
147
148
  env:
148
149
  ENV_CONTENT: ${{ secrets.ENV_FILE || secrets.ENV }}
149
150
  run: |
151
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
152
+ m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
150
153
  if [ "$ENV_MODE" = "dotenv" ]; then
151
154
  printf '%s\n' "$ENV_CONTENT" > "$ENV_FILE_PATH"
152
- echo "✅ $ENV_FILE_PATH file created"
155
+ m wf_flutter.env_file_created file="$ENV_FILE_PATH"
153
156
  elif [ -n "$ENV_CONTENT" ]; then
154
157
  DART_DEFINE_FILE="$RUNNER_TEMP/dart-define.env"
155
158
  printf '%s\n' "$ENV_CONTENT" > "$DART_DEFINE_FILE"
156
159
  echo "DART_DEFINE_FILE=$DART_DEFINE_FILE" >> "$GITHUB_ENV"
157
- echo "dart-define file prepared"
160
+ m wf_flutter.dart_define_prepared
158
161
  fi
159
162
 
160
163
  - name: Create Secrets.xcconfig file
161
164
  run: |
165
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
166
+ m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
162
167
  mkdir -p ios/Flutter
163
168
  if [ -n "${{ secrets.SECRETS_XCCONFIG }}" ]; then
164
169
  echo "${{ secrets.SECRETS_XCCONFIG }}" > ios/Flutter/Secrets.xcconfig
165
- echo "Secrets.xcconfig created"
170
+ m wf_flutter.secrets_xcconfig_created
166
171
  else
167
172
  echo "// No secrets provided" > ios/Flutter/Secrets.xcconfig
168
173
  fi
@@ -196,6 +201,7 @@ jobs:
196
201
 
197
202
  - name: Install CocoaPods
198
203
  run: |
204
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
199
205
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
200
206
  # A default project without plugins has no Podfile — flutter build creates one once a plugin is added
201
207
  if [ -f ios/Podfile ]; then
@@ -209,6 +215,7 @@ jobs:
209
215
  id: current_version
210
216
  working-directory: ${{ github.workspace }} # version_manager.py must read version.yml at the repo root
211
217
  run: |
218
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
212
219
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
213
220
  VERSION=$(python3 .github/scripts/version_manager.py get | tail -n 1)
214
221
  BUILD_NUMBER=$(python3 .github/scripts/version_manager.py get-code | tail -n 1)
@@ -223,6 +230,7 @@ jobs:
223
230
  id: release_notes
224
231
  working-directory: ${{ github.workspace }} # CHANGELOG.json, changelog_manager.py and final_release_notes.txt (paired with the upload step) are relative to the repo root
225
232
  run: |
233
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
226
234
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
227
235
  VERSION="${{ steps.current_version.outputs.version }}"
228
236
 
@@ -288,16 +296,22 @@ jobs:
288
296
  # xcode-select alone does not propagate to subprocesses, so set it explicitly
289
297
  DEVELOPER_DIR: /Applications/Xcode_${{ env.XCODE_VERSION }}.app/Contents/Developer
290
298
  run: |
291
- echo "=== iPhoneOS.platform check ==="
292
- ls "$DEVELOPER_DIR/Platforms/iPhoneOS.platform/" 2>/dev/null && echo "iPhoneOS.platform EXISTS" || echo "iPhoneOS.platform NOT FOUND"
293
- echo "=== Installing MobileDevice packages ==="
299
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
300
+ m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
301
+ m wf_flutter.xcode_platform_check
302
+ if ls "$DEVELOPER_DIR/Platforms/iPhoneOS.platform/" 2>/dev/null; then
303
+ m wf_flutter.xcode_platform_exists
304
+ else
305
+ m wf_flutter.xcode_platform_missing
306
+ fi
307
+ m wf_flutter.xcode_install_pkgs
294
308
  sudo installer -pkg /Applications/Xcode_${{ env.XCODE_VERSION }}.app/Contents/Resources/Packages/MobileDevice.pkg -target /
295
309
  sudo installer -pkg /Applications/Xcode_${{ env.XCODE_VERSION }}.app/Contents/Resources/Packages/MobileDeviceDevelopment.pkg -target /
296
- echo "=== Accepting Xcode license ==="
310
+ m wf_flutter.xcode_license
297
311
  sudo xcodebuild -license accept
298
- echo "=== Initializing Xcode components ==="
312
+ m wf_flutter.xcode_init
299
313
  xcrun simctl list >/dev/null 2>&1 || true
300
- echo "=== Downloading iOS platform ==="
314
+ m wf_flutter.xcode_download
301
315
  xcodebuild -downloadPlatform iOS
302
316
 
303
317
  - name: Download project files
@@ -310,14 +324,16 @@ jobs:
310
324
  env:
311
325
  ENV_CONTENT: ${{ secrets.ENV_FILE || secrets.ENV }}
312
326
  run: |
327
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
328
+ m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
313
329
  if [ "$ENV_MODE" = "dotenv" ]; then
314
330
  printf '%s\n' "$ENV_CONTENT" > "$ENV_FILE_PATH"
315
- echo "✅ $ENV_FILE_PATH file created"
331
+ m wf_flutter.env_file_created file="$ENV_FILE_PATH"
316
332
  elif [ -n "$ENV_CONTENT" ]; then
317
333
  DART_DEFINE_FILE="$RUNNER_TEMP/dart-define.env"
318
334
  printf '%s\n' "$ENV_CONTENT" > "$DART_DEFINE_FILE"
319
335
  echo "DART_DEFINE_FILE=$DART_DEFINE_FILE" >> "$GITHUB_ENV"
320
- echo "dart-define file prepared"
336
+ m wf_flutter.dart_define_prepared
321
337
  fi
322
338
 
323
339
  - name: Set up Flutter
@@ -349,6 +365,7 @@ jobs:
349
365
 
350
366
  - name: Install CocoaPods
351
367
  run: |
368
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
352
369
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
353
370
  # A default project without plugins has no Podfile — flutter build creates one once a plugin is added
354
371
  if [ -f ios/Podfile ]; then
@@ -359,7 +376,7 @@ jobs:
359
376
  fi
360
377
 
361
378
  - name: Import Code-Signing Certificates
362
- uses: Apple-Actions/import-codesign-certs@v2
379
+ uses: Apple-Actions/import-codesign-certs@v7
363
380
  with:
364
381
  p12-file-base64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
365
382
  p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
@@ -374,6 +391,7 @@ jobs:
374
391
 
375
392
  - name: Verify ExportOptions.plist
376
393
  run: |
394
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
377
395
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
378
396
  cd ios
379
397
  if [ ! -f "ExportOptions.plist" ]; then
@@ -464,6 +482,7 @@ jobs:
464
482
 
465
483
  - name: Verify Fastfile exists
466
484
  run: |
485
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
467
486
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
468
487
  if [ ! -f "ios/fastlane/Fastfile" ]; then
469
488
  m ios_testflight.fastfile_missing
@@ -475,6 +494,7 @@ jobs:
475
494
  - name: Install Fastlane
476
495
  working-directory: ${{ env.FLUTTER_PROJECT_DIR }}/ios
477
496
  run: |
497
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
478
498
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
479
499
  # Use the repository's Gemfile as-is if it lists fastlane (committing Gemfile.lock is recommended). Otherwise generate one.
480
500
  if [ -f Gemfile ] && grep -Eq "['\"]fastlane['\"]" Gemfile; then
@@ -484,7 +504,7 @@ jobs:
484
504
  printf 'source "https://rubygems.org"\ngem "fastlane"\ngem "multi_json"\n' > Gemfile
485
505
  fi
486
506
  bundle install
487
- echo "✅ Fastlane installed (Bundler)"
507
+ m flutter_a.fastlane_installed_bundler
488
508
 
489
509
  - name: Upload to TestFlight (+ App Store Submit if store_submit)
490
510
  env:
@@ -492,10 +512,11 @@ jobs:
492
512
  APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }}
493
513
  SKIP_WAITING_FOR_BUILD_PROCESSING: ${{ env.SKIP_WAITING_FOR_BUILD_PROCESSING }}
494
514
  run: |
515
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
495
516
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
496
517
  # Find the IPA by absolute path
497
518
  IPA_PATH=$(find "$GITHUB_WORKSPACE/${FLUTTER_PROJECT_DIR}/ios/build/ipa" -name "*.ipa" | head -1)
498
- echo "📦 Found IPA at: $IPA_PATH"
519
+ m wf_flutter.ipa_found path="$IPA_PATH"
499
520
 
500
521
  if [ ! -f "$IPA_PATH" ]; then
501
522
  m ios_testflight.ipa_missing; ls -la ios/build/ipa/ || true; exit 1
@@ -506,7 +527,7 @@ jobs:
506
527
  # Truncate to the App Store Connect "What to Test" limit (4000 bytes), with a margin (3800 bytes)
507
528
  python3 "$GITHUB_WORKSPACE/.github/scripts/truncate_release_notes.py" "$GITHUB_WORKSPACE/final_release_notes.txt" 3800 byte
508
529
  RELEASE_NOTES=$(cat "$GITHUB_WORKSPACE/final_release_notes.txt")
509
- echo "📝 Release Notes:"
530
+ m wf_flutter.release_notes_heading
510
531
  echo "$RELEASE_NOTES"
511
532
  else
512
533
  RELEASE_NOTES="$(m ios_testflight.default_notes version="${{ needs.prepare-build.outputs.version }}")"
@@ -530,6 +551,7 @@ jobs:
530
551
  - name: Notify TestFlight Upload Success
531
552
  if: success()
532
553
  run: |
554
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
533
555
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
534
556
  m ios_testflight.upload_ok
535
557
  m ios_testflight.upload_version version="${{ needs.prepare-build.outputs.version }}"
@@ -539,6 +561,7 @@ jobs:
539
561
  - name: Notify on Failure
540
562
  if: failure()
541
563
  run: |
564
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
542
565
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
543
566
  m ios_testflight.upload_failed
544
567
  m ios_testflight.check_logs
@@ -62,13 +62,18 @@ jobs:
62
62
  - name: Checkout repository
63
63
  uses: actions/checkout@v7
64
64
 
65
+ # A module without dependencies has no go.sum; caching against a missing file only makes setup-go warn
66
+ - name: Check for go.sum
67
+ id: gosum
68
+ run: echo "exists=$([ -f go.sum ] && echo true || echo false)" >> "$GITHUB_OUTPUT"
69
+
65
70
  # Automatically use the go directive version from go.mod
66
71
  - name: Set up Go
67
72
  uses: actions/setup-go@v7
68
73
  with:
69
74
  go-version-file: ${{ env.PROJECT_PATH }}/go.mod
70
75
  cache-dependency-path: ${{ env.PROJECT_PATH }}/go.sum
71
- cache: true
76
+ cache: ${{ steps.gosum.outputs.exists == 'true' }}
72
77
 
73
78
  - name: Verify go build
74
79
  run: go build ./...
@@ -79,24 +84,27 @@ jobs:
79
84
  - name: Run go test
80
85
  run: go test ./...
81
86
 
82
- # golangci-lint-action v8 requires golangci-lint v2; if .golangci.yml is in the v1 format
87
+ # golangci-lint-action v7+ requires golangci-lint v2; if .golangci.yml is in the v1 format
83
88
  # the project has to adjust it. version: latest picks up the newest v2 patch automatically
84
89
  - name: golangci-lint
85
- uses: golangci/golangci-lint-action@v8
90
+ uses: golangci/golangci-lint-action@v9
86
91
  with:
87
92
  version: latest
88
93
  working-directory: ${{ env.PROJECT_PATH }}
89
94
 
90
95
  - name: Build verification complete
96
+ env:
97
+ PAW_REF_NAME: ${{ github.ref_name }}
91
98
  run: |
99
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
92
100
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
93
101
  m cibuild.go_done
94
102
  echo ""
95
103
  m cibuild.info_title
96
104
  m cibuild.info_project project="${{ env.PROJECT_NAME }}"
97
- m cibuild.info_branch branch="${{ github.ref_name }}"
105
+ m cibuild.info_branch branch="$PAW_REF_NAME"
98
106
  m cibuild.info_commit sha="${{ github.sha }}"
99
- m cibuild.info_time time="$(date '+%Y-%m-%d %H:%M:%S')"
107
+ m cibuild.info_time time="$(date -u '+%Y-%m-%d %H:%M:%S UTC')"
100
108
 
101
109
  # Job: CI Gate (the single job to register as a required check)
102
110
  ci-gate:
@@ -118,6 +126,7 @@ jobs:
118
126
  env:
119
127
  RESULTS: ${{ toJSON(needs.*.result) }}
120
128
  run: |
129
+ [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
121
130
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
122
131
  m cibuild.gate_results results="$RESULTS"
123
132
  if echo "$RESULTS" | grep -Eq '"(failure|cancelled)"'; then