project-auto-wizard 0.16.0 → 0.16.2

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 (47) 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/scripts/messages.py +48 -6
  7. package/payload/scripts/version_manager.py +76 -3
  8. package/payload/version.yml.template +3 -2
  9. package/payload/workflows/common/PROJECT-COMMON-AI-PR-SUMMARY.yaml +7 -7
  10. package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +111 -46
  11. package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +10 -1
  12. package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +13 -3
  13. package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +10 -1
  14. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +2 -2
  15. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +10 -10
  16. package/payload/workflows/flutter/PROJECT-FLUTTER-APP-BUILD-TRIGGER.yaml +10 -10
  17. package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +14 -12
  18. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +35 -18
  19. package/payload/workflows/go/PROJECT-GO-CI.yaml +3 -1
  20. package/payload/workflows/go/PROJECT-GO-PR-PREVIEW.yaml +81 -61
  21. package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +3 -1
  22. package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +81 -61
  23. package/payload/workflows/react/PROJECT-REACT-CI.yaml +3 -2
  24. package/payload/workflows/spring/PROJECT-SPRING-CI.yml +4 -4
  25. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +86 -68
  26. package/src/commands/doctor.js +17 -23
  27. package/src/commands/dry-run.js +4 -3
  28. package/src/commands/full.js +6 -6
  29. package/src/commands/interactive.js +5 -1
  30. package/src/commands/status.js +9 -2
  31. package/src/core/copy/gitignore.js +3 -3
  32. package/src/core/copy/readme.js +11 -10
  33. package/src/core/detect-fs.js +9 -4
  34. package/src/core/options.js +36 -0
  35. package/src/core/version-yml.js +37 -13
  36. package/src/i18n/catalog/en/cli.js +1 -0
  37. package/src/i18n/catalog/en/commands.js +4 -1
  38. package/src/i18n/catalog/en/core.js +1 -0
  39. package/src/i18n/catalog/en/core2.js +2 -0
  40. package/src/i18n/catalog/en/ui.js +3 -0
  41. package/src/i18n/catalog/ko/cli.js +1 -0
  42. package/src/i18n/catalog/ko/commands.js +4 -1
  43. package/src/i18n/catalog/ko/core.js +1 -0
  44. package/src/i18n/catalog/ko/core2.js +2 -0
  45. package/src/i18n/catalog/ko/ui.js +3 -0
  46. package/src/index.js +19 -7
  47. package/src/ui/summary.js +15 -6
@@ -151,7 +151,7 @@ jobs:
151
151
  - name: Load messages
152
152
  run: |
153
153
  [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
154
- echo "PAW_MSG=$(cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_)" >> "$GITHUB_ENV"
154
+ (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_) > "$RUNNER_TEMP/paw-msg.json"
155
155
 
156
156
  # Pass the settings on as outputs
157
157
  - name: Pass settings
@@ -186,6 +186,8 @@ jobs:
186
186
  PAW_EVENT_NAME: ${{ github.event_name }}
187
187
  PAW_HEAD_REF: ${{ github.head_ref }}
188
188
  PAW_REF_NAME: ${{ github.ref_name }}
189
+ # On a PR, github.sha is the temporary merge commit; show the PR head commit instead
190
+ PAW_COMMIT_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
189
191
  run: |
190
192
  [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
191
193
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
@@ -194,7 +196,7 @@ jobs:
194
196
  else
195
197
  BRANCH_NAME="$PAW_REF_NAME"
196
198
  fi
197
- COMMIT_HASH=$(echo "${{ github.sha }}" | cut -c1-7)
199
+ COMMIT_HASH=$(echo "$PAW_COMMIT_SHA" | cut -c1-7)
198
200
 
199
201
  echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
200
202
  echo "commit_hash=$COMMIT_HASH" >> $GITHUB_OUTPUT
@@ -217,7 +219,7 @@ jobs:
217
219
  with:
218
220
  github-token: ${{ secrets.GITHUB_TOKEN }}
219
221
  script: |
220
- const M = JSON.parse(process.env.PAW_MSG);
222
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
221
223
  const m = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
222
224
  const prNumber = context.payload.pull_request.number;
223
225
  const branchName = process.env.PAW_IN_STEPS_INFO_OUTPUTS_BRANCH_NAME;
@@ -315,7 +317,7 @@ jobs:
315
317
  id: load_messages
316
318
  run: |
317
319
  [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
318
- echo "PAW_MSG=$(cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_)" >> "$GITHUB_ENV"
320
+ (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_) > "$RUNNER_TEMP/paw-msg.json"
319
321
 
320
322
  # Prepare env vars - a .env file when ENV_MODE=dotenv, a temp file outside the project (--dart-define-from-file) for dart-define
321
323
  - name: Prepare env file
@@ -407,7 +409,7 @@ jobs:
407
409
  PAW_IN_STEPS_TEST_OUTPUTS_SECONDS: ${{ steps.test.outputs.seconds }}
408
410
  with:
409
411
  script: |
410
- const M = JSON.parse(process.env.PAW_MSG);
412
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
411
413
  const m = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
412
414
  const analyzeStart = parseInt(process.env.PAW_IN_STEPS_ANALYZE_START_OUTPUTS_TIME);
413
415
  const now = Date.now();
@@ -467,7 +469,7 @@ jobs:
467
469
  id: load_messages
468
470
  run: |
469
471
  [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
470
- echo "PAW_MSG=$(cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_)" >> "$GITHUB_ENV"
472
+ (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_) > "$RUNNER_TEMP/paw-msg.json"
471
473
 
472
474
  # Prepare env vars - a .env file when ENV_MODE=dotenv, a temp file outside the project (--dart-define-from-file) for dart-define
473
475
  - name: Prepare env file
@@ -573,7 +575,7 @@ jobs:
573
575
  PAW_IN_STEPS_BUILD_START_OUTPUTS_TIME: ${{ steps.build_start.outputs.time }}
574
576
  with:
575
577
  script: |
576
- const M = JSON.parse(process.env.PAW_MSG);
578
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
577
579
  const m = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
578
580
  const buildStart = parseInt(process.env.PAW_IN_STEPS_BUILD_START_OUTPUTS_TIME);
579
581
  const now = Date.now();
@@ -620,7 +622,7 @@ jobs:
620
622
  id: load_messages
621
623
  run: |
622
624
  [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
623
- echo "PAW_MSG=$(cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_)" >> "$GITHUB_ENV"
625
+ (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_) > "$RUNNER_TEMP/paw-msg.json"
624
626
 
625
627
  - name: Select Xcode version
626
628
  run: sudo xcode-select -s /Applications/Xcode_${{ env.XCODE_VERSION }}.app/Contents/Developer
@@ -710,7 +712,7 @@ jobs:
710
712
  if [ -f ios/Podfile ]; then
711
713
  gem install cocoapods
712
714
  (cd ios && (pod install --repo-update || pod install))
713
- echo "✅ CocoaPods installed"
715
+ m flutter_a.ci_pods_installed
714
716
  else
715
717
  m flutter_a.ci_podfile_missing
716
718
  fi
@@ -733,7 +735,7 @@ jobs:
733
735
  PAW_IN_STEPS_BUILD_START_OUTPUTS_TIME: ${{ steps.build_start.outputs.time }}
734
736
  with:
735
737
  script: |
736
- const M = JSON.parse(process.env.PAW_MSG);
738
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
737
739
  const m = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
738
740
  const buildStart = parseInt(process.env.PAW_IN_STEPS_BUILD_START_OUTPUTS_TIME);
739
741
  const now = Date.now();
@@ -767,7 +769,7 @@ jobs:
767
769
  - name: Load messages
768
770
  run: |
769
771
  [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
770
- echo "PAW_MSG=$(cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_)" >> "$GITHUB_ENV"
772
+ (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py dump flutter_a.ci_) > "$RUNNER_TEMP/paw-msg.json"
771
773
 
772
774
  - name: Update final result comment
773
775
  uses: actions/github-script@v9
@@ -791,7 +793,7 @@ jobs:
791
793
  with:
792
794
  github-token: ${{ secrets.GITHUB_TOKEN }}
793
795
  script: |
794
- const M = JSON.parse(process.env.PAW_MSG);
796
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
795
797
  const m = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
796
798
  const commentId = parseInt(process.env.PAW_IN_NEEDS_PREPARE_OUTPUTS_COMMENT_ID);
797
799
  const startTime = parseInt(process.env.PAW_IN_NEEDS_PREPARE_OUTPUTS_START_TIME);
@@ -100,7 +100,7 @@ jobs:
100
100
  rm -rf .paw-msg
101
101
  echo "PROJECT_AUTO_WIZARD_LANG=$LANG_CODE" >> "$GITHUB_ENV"
102
102
  echo "PAW_MESSAGES_PY=$RUNNER_TEMP/paw_messages.py" >> "$GITHUB_ENV"
103
- echo "PAW_MSG=$(PROJECT_AUTO_WIZARD_LANG=$LANG_CODE python3 "$RUNNER_TEMP/paw_messages.py" dump ios_test_tf.)" >> "$GITHUB_ENV"
103
+ PROJECT_AUTO_WIZARD_LANG=$LANG_CODE python3 "$RUNNER_TEMP/paw_messages.py" dump ios_test_tf. > "$RUNNER_TEMP/paw-msg.json"
104
104
 
105
105
  - name: Verify the branch exists up front
106
106
  id: verify_branch
@@ -112,7 +112,7 @@ jobs:
112
112
  with:
113
113
  github-token: ${{ secrets.GITHUB_TOKEN }}
114
114
  script: |
115
- const M = JSON.parse(process.env.PAW_MSG);
115
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
116
116
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
117
117
  const branchName = process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_BRANCH_NAME;
118
118
  const prNumber = process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER;
@@ -175,7 +175,7 @@ jobs:
175
175
  with:
176
176
  github-token: ${{ secrets.GITHUB_TOKEN }}
177
177
  script: |
178
- const M = JSON.parse(process.env.PAW_MSG);
178
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
179
179
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
180
180
  const row = (name, status, elapsed = '-') => `| ${msg('ios_test_tf.step_' + name)} | ${msg('ios_test_tf.st_' + status)} | ${elapsed} |`;
181
181
  const prNumber = parseInt(process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER);
@@ -260,7 +260,7 @@ jobs:
260
260
  rm -rf .paw-msg
261
261
  echo "PROJECT_AUTO_WIZARD_LANG=$LANG_CODE" >> "$GITHUB_ENV"
262
262
  echo "PAW_MESSAGES_PY=$RUNNER_TEMP/paw_messages.py" >> "$GITHUB_ENV"
263
- echo "PAW_MSG=$(PROJECT_AUTO_WIZARD_LANG=$LANG_CODE python3 "$RUNNER_TEMP/paw_messages.py" dump ios_test_tf.)" >> "$GITHUB_ENV"
263
+ PROJECT_AUTO_WIZARD_LANG=$LANG_CODE python3 "$RUNNER_TEMP/paw_messages.py" dump ios_test_tf. > "$RUNNER_TEMP/paw-msg.json"
264
264
 
265
265
  - name: Checkout repository
266
266
  uses: actions/checkout@v7
@@ -275,6 +275,7 @@ jobs:
275
275
 
276
276
  # Report every missing setting up front, before importing certificates or building — otherwise the macOS runner builds for a long time and fails at an unrelated step
277
277
  - name: Validate deploy settings
278
+ id: validate
278
279
  env:
279
280
  APPLE_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
280
281
  APPLE_PROVISIONING_PROFILE_BASE64: ${{ secrets.APPLE_PROVISIONING_PROFILE_BASE64 }}
@@ -286,27 +287,37 @@ jobs:
286
287
  m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
287
288
  FAILED=0
288
289
  MISSING=""
290
+ ITEMS=""
289
291
  for name in APPLE_CERTIFICATE_BASE64 APPLE_PROVISIONING_PROFILE_BASE64 IOS_PROVISIONING_PROFILE_NAME \
290
292
  APP_STORE_CONNECT_API_KEY_ID APP_STORE_CONNECT_ISSUER_ID APP_STORE_CONNECT_API_KEY_BASE64; do
291
293
  [ -n "${!name}" ] || MISSING="$MISSING $name"
292
294
  done
293
295
  if [ -n "$MISSING" ]; then
294
296
  echo "::error::$(m ios_test_tf.secrets_missing missing="$MISSING")"
297
+ ITEMS="${MISSING# }"
298
+ ITEMS="${ITEMS// /, }"
295
299
  FAILED=1
296
300
  fi
297
301
  if [ ! -f ios/ExportOptions.plist ]; then
298
302
  echo "::error::$(m ios_test_tf.export_options_missing)"
303
+ ITEMS="${ITEMS:+$ITEMS, }ios/ExportOptions.plist"
299
304
  FAILED=1
300
305
  elif grep -Eq '__[A-Z][A-Z0-9_]*__' ios/ExportOptions.plist; then
301
306
  echo "::error::$(m ios_test_tf.export_options_placeholders)"
302
307
  grep -En '__[A-Z][A-Z0-9_]*__' ios/ExportOptions.plist
308
+ ITEMS="${ITEMS:+$ITEMS, }ios/ExportOptions.plist"
303
309
  FAILED=1
304
310
  fi
305
311
  if [ ! -f ios/fastlane/Fastfile ]; then
306
312
  echo "::error::$(m ios_test_tf.fastfile_missing_error)"
313
+ ITEMS="${ITEMS:+$ITEMS, }ios/fastlane/Fastfile"
307
314
  FAILED=1
308
315
  fi
309
- [ "$FAILED" -eq 0 ] || exit 1
316
+ if [ "$FAILED" -ne 0 ]; then
317
+ # The progress comment names what blocked the build and deploy steps
318
+ echo "missing=$ITEMS" >> "$GITHUB_OUTPUT"
319
+ exit 1
320
+ fi
310
321
  m ios_test_tf.preflight_ok
311
322
 
312
323
  - name: Select Xcode version
@@ -480,14 +491,20 @@ jobs:
480
491
  PAW_IN_GITHUB_RUN_ID: ${{ github.run_id }}
481
492
  PAW_IN_NEEDS_NOTIFY_START_OUTPUTS_COMMENT_ID: ${{ needs.notify-start.outputs.comment_id }}
482
493
  PAW_IN_NEEDS_NOTIFY_START_OUTPUTS_START_TIME: ${{ needs.notify-start.outputs.start_time }}
494
+ PAW_IN_STEPS_VALIDATE_OUTCOME: ${{ steps.validate.outcome }}
495
+ PAW_IN_STEPS_VALIDATE_OUTPUTS_MISSING: ${{ steps.validate.outputs.missing }}
483
496
  with:
484
497
  github-token: ${{ secrets.GITHUB_TOKEN }}
485
498
  script: |
486
- const M = JSON.parse(process.env.PAW_MSG);
499
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
487
500
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
488
- const row = (name, status, elapsed = '-') => `| ${msg('ios_test_tf.step_' + name)} | ${msg('ios_test_tf.st_' + status)} | ${elapsed} |`;
501
+ const row = (name, status, elapsed = '-', p = {}) => `| ${msg('ios_test_tf.step_' + name)} | ${msg('ios_test_tf.st_' + status, p)} | ${elapsed} |`;
489
502
  const commentId = parseInt(process.env.PAW_IN_NEEDS_NOTIFY_START_OUTPUTS_COMMENT_ID);
490
503
  const startTime = parseInt(process.env.PAW_IN_NEEDS_NOTIFY_START_OUTPUTS_START_TIME);
504
+ // When the deploy-settings check failed, later steps did not run because of it: say what was missing
505
+ const blocked = process.env.PAW_IN_STEPS_VALIDATE_OUTCOME === 'failure';
506
+ const notRun = blocked ? 'precheck_blocked' : 'not_run';
507
+ const notRunParams = { missing: process.env.PAW_IN_STEPS_VALIDATE_OUTPUTS_MISSING || '-' };
491
508
  const branchName = process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_BRANCH_NAME;
492
509
  const buildNumber = process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_BUILD_NUMBER;
493
510
  const runId = process.env.PAW_IN_GITHUB_RUN_ID;
@@ -505,15 +522,15 @@ jobs:
505
522
  msg('ios_test_tf.table_header'),
506
523
  '|------|------|----------|',
507
524
  row('prepare', 'failed', duration),
508
- row('build', 'canceled'),
509
- row('deploy', 'canceled'),
525
+ row('build', notRun, '-', notRunParams),
526
+ row('deploy', notRun, '-', notRunParams),
510
527
  '',
511
528
  msg('ios_test_tf.kv_head'),
512
529
  '|------|-----|',
513
530
  msg('ios_test_tf.row_build_number', { build: buildNumber }),
514
531
  msg('ios_test_tf.row_branch', { branch: branchName }),
515
532
  '',
516
- msg('ios_test_tf.prepare_error'),
533
+ blocked ? msg('ios_test_tf.prepare_precheck_error', notRunParams) : msg('ios_test_tf.prepare_error'),
517
534
  '',
518
535
  msg('ios_test_tf.run_log_check_link', { url: runUrl })
519
536
  ].join('\n');
@@ -566,7 +583,7 @@ jobs:
566
583
  rm -rf .paw-msg
567
584
  echo "PROJECT_AUTO_WIZARD_LANG=$LANG_CODE" >> "$GITHUB_ENV"
568
585
  echo "PAW_MESSAGES_PY=$RUNNER_TEMP/paw_messages.py" >> "$GITHUB_ENV"
569
- echo "PAW_MSG=$(PROJECT_AUTO_WIZARD_LANG=$LANG_CODE python3 "$RUNNER_TEMP/paw_messages.py" dump ios_test_tf.)" >> "$GITHUB_ENV"
586
+ PROJECT_AUTO_WIZARD_LANG=$LANG_CODE python3 "$RUNNER_TEMP/paw_messages.py" dump ios_test_tf. > "$RUNNER_TEMP/paw-msg.json"
570
587
 
571
588
  # Progress update - prepare done (must be updated when the build job starts so the prepare time is shown accurately)
572
589
  - name: Progress update - prepare done
@@ -583,7 +600,7 @@ jobs:
583
600
  with:
584
601
  github-token: ${{ secrets.GITHUB_TOKEN }}
585
602
  script: |
586
- const M = JSON.parse(process.env.PAW_MSG);
603
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
587
604
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
588
605
  const row = (name, status, elapsed = '-') => `| ${msg('ios_test_tf.step_' + name)} | ${msg('ios_test_tf.st_' + status)} | ${elapsed} |`;
589
606
  const commentId = parseInt(process.env.PAW_IN_NEEDS_NOTIFY_START_OUTPUTS_COMMENT_ID);
@@ -825,7 +842,7 @@ jobs:
825
842
  with:
826
843
  github-token: ${{ secrets.GITHUB_TOKEN }}
827
844
  script: |
828
- const M = JSON.parse(process.env.PAW_MSG);
845
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
829
846
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
830
847
  const row = (name, status, elapsed = '-') => `| ${msg('ios_test_tf.step_' + name)} | ${msg('ios_test_tf.st_' + status)} | ${elapsed} |`;
831
848
  const commentId = parseInt(process.env.PAW_IN_NEEDS_NOTIFY_START_OUTPUTS_COMMENT_ID);
@@ -892,7 +909,7 @@ jobs:
892
909
  with:
893
910
  github-token: ${{ secrets.GITHUB_TOKEN }}
894
911
  script: |
895
- const M = JSON.parse(process.env.PAW_MSG);
912
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
896
913
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
897
914
  const row = (name, status, elapsed = '-') => `| ${msg('ios_test_tf.step_' + name)} | ${msg('ios_test_tf.st_' + status)} | ${elapsed} |`;
898
915
  const commentId = parseInt(process.env.PAW_IN_NEEDS_NOTIFY_START_OUTPUTS_COMMENT_ID);
@@ -924,7 +941,7 @@ jobs:
924
941
  '|------|------|----------|',
925
942
  row('prepare', 'done', step1Elapsed || '-'),
926
943
  row('build', 'failed', step2ElapsedStr),
927
- row('deploy', 'canceled'),
944
+ row('deploy', 'not_run'),
928
945
  '',
929
946
  msg('ios_test_tf.kv_head'),
930
947
  '|------|-----|',
@@ -979,7 +996,7 @@ jobs:
979
996
  rm -rf .paw-msg
980
997
  echo "PROJECT_AUTO_WIZARD_LANG=$LANG_CODE" >> "$GITHUB_ENV"
981
998
  echo "PAW_MESSAGES_PY=$RUNNER_TEMP/paw_messages.py" >> "$GITHUB_ENV"
982
- echo "PAW_MSG=$(PROJECT_AUTO_WIZARD_LANG=$LANG_CODE python3 "$RUNNER_TEMP/paw_messages.py" dump ios_test_tf.)" >> "$GITHUB_ENV"
999
+ PROJECT_AUTO_WIZARD_LANG=$LANG_CODE python3 "$RUNNER_TEMP/paw_messages.py" dump ios_test_tf. > "$RUNNER_TEMP/paw-msg.json"
983
1000
 
984
1001
  - name: Checkout repository
985
1002
  uses: actions/checkout@v7
@@ -1112,7 +1129,7 @@ jobs:
1112
1129
  with:
1113
1130
  github-token: ${{ secrets.GITHUB_TOKEN }}
1114
1131
  script: |
1115
- const M = JSON.parse(process.env.PAW_MSG);
1132
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
1116
1133
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
1117
1134
  const row = (name, status, elapsed = '-') => `| ${msg('ios_test_tf.step_' + name)} | ${msg('ios_test_tf.st_' + status)} | ${elapsed} |`;
1118
1135
  const commentId = parseInt(process.env.PAW_IN_NEEDS_NOTIFY_START_OUTPUTS_COMMENT_ID);
@@ -1188,7 +1205,7 @@ jobs:
1188
1205
  with:
1189
1206
  github-token: ${{ secrets.GITHUB_TOKEN }}
1190
1207
  script: |
1191
- const M = JSON.parse(process.env.PAW_MSG);
1208
+ const M = JSON.parse(require('fs').readFileSync(`${process.env.RUNNER_TEMP}/paw-msg.json`, 'utf8'));
1192
1209
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
1193
1210
  const row = (name, status, elapsed = '-') => `| ${msg('ios_test_tf.step_' + name)} | ${msg('ios_test_tf.st_' + status)} | ${elapsed} |`;
1194
1211
  const commentId = parseInt(process.env.PAW_IN_NEEDS_NOTIFY_START_OUTPUTS_COMMENT_ID);
@@ -95,6 +95,8 @@ jobs:
95
95
  - name: Build verification complete
96
96
  env:
97
97
  PAW_REF_NAME: ${{ github.ref_name }}
98
+ # On a PR, github.sha is the temporary merge commit; show the PR head commit instead
99
+ PAW_COMMIT_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
98
100
  run: |
99
101
  [ -f "$GITHUB_WORKSPACE/.github/scripts/messages.py" ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
100
102
  m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
@@ -103,7 +105,7 @@ jobs:
103
105
  m cibuild.info_title
104
106
  m cibuild.info_project project="${{ env.PROJECT_NAME }}"
105
107
  m cibuild.info_branch branch="$PAW_REF_NAME"
106
- m cibuild.info_commit sha="${{ github.sha }}"
108
+ m cibuild.info_commit sha="$(echo "$PAW_COMMIT_SHA" | cut -c1-7)"
107
109
  m cibuild.info_time time="$(date -u '+%Y-%m-%d %H:%M:%S UTC')"
108
110
 
109
111
  # Job: CI Gate (the single job to register as a required check)