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
@@ -82,6 +82,7 @@ jobs:
82
82
  issue_number: ${{ steps.issue_info.outputs.issue_number }}
83
83
  branch_name: ${{ steps.issue_info.outputs.branch_name }}
84
84
  commit_hash: ${{ steps.build_info.outputs.commit_hash }}
85
+ commit_sha: ${{ steps.build_info.outputs.commit_sha }}
85
86
  pr_number: ${{ steps.build_info.outputs.pr_number }}
86
87
  build_number: ${{ steps.build_info.outputs.build_number }}
87
88
  progress_comment_id: ${{ steps.progress_comment.outputs.comment_id }}
@@ -102,6 +103,7 @@ jobs:
102
103
  - name: Load messages
103
104
  working-directory: ${{ github.workspace }}
104
105
  run: |
106
+ [ -f .paw-msg/.github/scripts/messages.py ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
105
107
  cp .paw-msg/.github/scripts/messages.py "$RUNNER_TEMP/paw_messages.py"
106
108
  LANG_CODE=$(cd .paw-msg && python3 "$RUNNER_TEMP/paw_messages.py" lang)
107
109
  rm -rf .paw-msg
@@ -113,14 +115,18 @@ jobs:
113
115
  id: verify_branch
114
116
  if: github.event_name == 'repository_dispatch'
115
117
  uses: actions/github-script@v9
118
+ env:
119
+ PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_BRANCH_NAME: ${{ github.event.client_payload.branch_name }}
120
+ PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER: ${{ github.event.client_payload.pr_number }}
121
+ PAW_IN_GITHUB_RUN_ID: ${{ github.run_id }}
116
122
  with:
117
123
  github-token: ${{ secrets.GITHUB_TOKEN }}
118
124
  script: |
119
125
  const M = JSON.parse(process.env.PAW_MSG);
120
126
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
121
- const branchName = '${{ github.event.client_payload.branch_name }}';
122
- const prNumber = '${{ github.event.client_payload.pr_number }}';
123
- const runId = '${{ github.run_id }}';
127
+ const branchName = process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_BRANCH_NAME;
128
+ const prNumber = process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER;
129
+ const runId = process.env.PAW_IN_GITHUB_RUN_ID;
124
130
  const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
125
131
 
126
132
  console.log(msg('apk_test.branch_check_log', { branch: branchName }));
@@ -184,17 +190,21 @@ jobs:
184
190
  id: progress_comment
185
191
  if: github.event_name == 'repository_dispatch' && github.event.client_payload.pr_number != ''
186
192
  uses: actions/github-script@v9
193
+ env:
194
+ PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER: ${{ github.event.client_payload.pr_number }}
195
+ PAW_IN_GITHUB_RUN_ID: ${{ github.run_id }}
196
+ PAW_IN_STEPS_FIREBASE_CHECK_OUTPUTS_AVAILABLE: ${{ steps.firebase_check.outputs.available }}
187
197
  with:
188
198
  github-token: ${{ secrets.GITHUB_TOKEN }}
189
199
  script: |
190
200
  const M = JSON.parse(process.env.PAW_MSG);
191
201
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
192
202
  const row = (name, status, elapsed = '-') => `| ${msg('apk_test.step_' + name)} | ${msg('apk_test.st_' + status)} | ${elapsed} |`;
193
- const prNumber = parseInt('${{ github.event.client_payload.pr_number }}');
194
- const runId = '${{ github.run_id }}';
203
+ const prNumber = parseInt(process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER);
204
+ const runId = process.env.PAW_IN_GITHUB_RUN_ID;
195
205
  const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
196
206
  const startTime = Date.now();
197
- const firebaseAvailable = '${{ steps.firebase_check.outputs.available }}' === 'true';
207
+ const firebaseAvailable = process.env.PAW_IN_STEPS_FIREBASE_CHECK_OUTPUTS_AVAILABLE === 'true';
198
208
 
199
209
  const rows = [
200
210
  row('prepare', 'running'),
@@ -233,22 +243,28 @@ jobs:
233
243
  ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref }}
234
244
 
235
245
  - name: Pull latest changes
246
+ env:
247
+ PAW_BRANCH_NAME: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}
236
248
  run: |
237
249
  m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
238
- BRANCH_NAME="${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}"
250
+ BRANCH_NAME="$PAW_BRANCH_NAME"
239
251
  m apk_test.pull_branch branch="$BRANCH_NAME"
240
252
  git pull origin "$BRANCH_NAME" || m apk_test.pull_failed
241
253
 
242
254
  - name: Extract issue info from the branch name
243
255
  id: issue_info
256
+ env:
257
+ PAW_BRANCH_NAME: ${{ github.event.client_payload.branch_name }}
258
+ PAW_ISSUE_NUMBER: ${{ github.event.client_payload.issue_number }}
259
+ PAW_REF_NAME: ${{ github.ref_name }}
244
260
  run: |
245
261
  m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
246
262
  # For repository_dispatch, take the branch name from client_payload
247
263
  if [ "${{ github.event_name }}" == "repository_dispatch" ]; then
248
- BRANCH_NAME="${{ github.event.client_payload.branch_name }}"
249
- ISSUE_NUMBER="${{ github.event.client_payload.issue_number }}"
264
+ BRANCH_NAME="$PAW_BRANCH_NAME"
265
+ ISSUE_NUMBER="$PAW_ISSUE_NUMBER"
250
266
  else
251
- BRANCH_NAME="${{ github.ref_name }}"
267
+ BRANCH_NAME="$PAW_REF_NAME"
252
268
  # Extract the issue number from the branch name (`<date>_#<number>_...` format)
253
269
  ISSUE_NUMBER=$(echo "$BRANCH_NAME" | sed -n 's/.*#\([0-9]*\).*/\1/p')
254
270
  fi
@@ -288,20 +304,24 @@ jobs:
288
304
 
289
305
  - name: Generate build info
290
306
  id: build_info
307
+ env:
308
+ PAW_BUILD_NUMBER: ${{ github.event.client_payload.build_number }}
309
+ PAW_PR_NUMBER: ${{ github.event.client_payload.pr_number }}
291
310
  run: |
292
311
  m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
293
312
  # Get the version through version_manager.py (same approach as the production workflow)
294
313
  VERSION=$(python3 .github/scripts/version_manager.py get | tail -n 1)
295
314
  echo "version=$VERSION" >> $GITHUB_OUTPUT
296
315
 
297
- COMMIT_SHA="${{ github.sha }}"
316
+ # github.sha is the default-branch commit for repository_dispatch; report the commit actually checked out
317
+ COMMIT_SHA=$(git rev-parse HEAD)
298
318
  COMMIT_SHORT=$(echo "$COMMIT_SHA" | cut -c1-7)
299
- BUILD_DATE=$(date '+%Y-%m-%d %H:%M:%S')
319
+ BUILD_DATE=$(date -u '+%Y-%m-%d %H:%M:%S UTC')
300
320
 
301
321
  # For repository_dispatch events, use the PR number as the build number
302
322
  if [ "${{ github.event_name }}" == "repository_dispatch" ]; then
303
- BUILD_NUMBER="${{ github.event.client_payload.build_number }}"
304
- PR_NUMBER="${{ github.event.client_payload.pr_number }}"
323
+ BUILD_NUMBER="$PAW_BUILD_NUMBER"
324
+ PR_NUMBER="$PAW_PR_NUMBER"
305
325
  m apk_test.event_dispatch
306
326
  m apk_test.event_pr_number pr="$PR_NUMBER"
307
327
  m apk_test.event_build_number_pr build="$BUILD_NUMBER"
@@ -313,6 +333,7 @@ jobs:
313
333
  fi
314
334
 
315
335
  echo "commit_hash=$COMMIT_SHORT" >> $GITHUB_OUTPUT
336
+ echo "commit_sha=$COMMIT_SHA" >> $GITHUB_OUTPUT
316
337
  echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT
317
338
  echo "pr_number=$PR_NUMBER" >> $GITHUB_OUTPUT
318
339
  echo "build_date=$BUILD_DATE" >> $GITHUB_OUTPUT
@@ -345,8 +366,10 @@ jobs:
345
366
  sparse-checkout-cone-mode: false
346
367
 
347
368
  - name: Load messages
369
+ id: load_messages
348
370
  working-directory: ${{ github.workspace }}
349
371
  run: |
372
+ [ -f .paw-msg/.github/scripts/messages.py ] || { echo "::error::messages.py is missing; rerun \`npx project-auto-wizard --mode full --force\`"; exit 1; }
350
373
  cp .paw-msg/.github/scripts/messages.py "$RUNNER_TEMP/paw_messages.py"
351
374
  LANG_CODE=$(cd .paw-msg && python3 "$RUNNER_TEMP/paw_messages.py" lang)
352
375
  rm -rf .paw-msg
@@ -361,21 +384,24 @@ jobs:
361
384
  ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref }}
362
385
 
363
386
  - name: Pull latest changes
364
- run: git pull origin ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}
387
+ env:
388
+ PAW_BRANCH_NAME: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}
389
+ run: git pull origin "$PAW_BRANCH_NAME"
365
390
 
366
391
  # Prepare env vars — a .env file when ENV_MODE=dotenv, otherwise a temp file outside the project (--dart-define-from-file)
367
392
  - name: Prepare env file
368
393
  env:
369
394
  ENV_CONTENT: ${{ secrets.ENV_FILE || secrets.ENV }}
370
395
  run: |
396
+ m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
371
397
  if [ "$ENV_MODE" = "dotenv" ]; then
372
398
  printf '%s\n' "$ENV_CONTENT" > "$ENV_FILE_PATH"
373
- echo "✅ $ENV_FILE_PATH file created"
399
+ m wf_flutter.env_file_created file="$ENV_FILE_PATH"
374
400
  elif [ -n "$ENV_CONTENT" ]; then
375
401
  DART_DEFINE_FILE="$RUNNER_TEMP/dart-define.env"
376
402
  printf '%s\n' "$ENV_CONTENT" > "$DART_DEFINE_FILE"
377
403
  echo "DART_DEFINE_FILE=$DART_DEFINE_FILE" >> "$GITHUB_ENV"
378
- echo "dart-define file prepared"
404
+ m wf_flutter.dart_define_prepared
379
405
  fi
380
406
 
381
407
  - name: Setup Release Keystore
@@ -433,12 +459,13 @@ jobs:
433
459
  env:
434
460
  GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
435
461
  run: |
462
+ m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
436
463
  if [ -n "$GOOGLE_SERVICES_JSON" ]; then
437
464
  mkdir -p android/app
438
465
  printf '%s' "$GOOGLE_SERVICES_JSON" > android/app/google-services.json
439
- echo "✅ google-services.json created"
466
+ m wf_flutter.google_services_created
440
467
  else
441
- echo "ℹ️ GOOGLE_SERVICES_JSON secret not provided, skipping"
468
+ m wf_flutter.google_services_skipped
442
469
  fi
443
470
 
444
471
  - name: Set up Flutter
@@ -450,7 +477,8 @@ jobs:
450
477
 
451
478
  - name: Verify Flutter version
452
479
  run: |
453
- echo "✅ Flutter setup completed"
480
+ m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
481
+ m wf_flutter.flutter_setup_done_ok
454
482
  flutter --version
455
483
 
456
484
  - name: Cache Flutter dependencies
@@ -472,11 +500,12 @@ jobs:
472
500
 
473
501
  - name: Install dependencies
474
502
  run: |
503
+ m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
475
504
  flutter pub get
476
505
  if grep -q "build_runner" pubspec.yaml; then
477
506
  dart run build_runner build --delete-conflicting-outputs
478
507
  fi
479
- echo "✅ Dependencies installed"
508
+ m wf_flutter.deps_installed_ok
480
509
 
481
510
  - name: Setup Gradle
482
511
  working-directory: ${{ env.FLUTTER_PROJECT_DIR }}/android
@@ -485,7 +514,7 @@ jobs:
485
514
  # The default flutter create .gitignore does not commit gradlew — flutter build creates it when missing
486
515
  if [ -f gradlew ]; then
487
516
  chmod +x gradlew
488
- echo "✅ Gradle wrapper permissions set"
517
+ m wf_flutter.gradle_perm_ok
489
518
  else
490
519
  m apk_test.gradlew_missing
491
520
  fi
@@ -498,22 +527,28 @@ jobs:
498
527
 
499
528
  - name: Verify Java version
500
529
  run: |
501
- echo "✅ Java setup completed"
530
+ m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
531
+ m wf_flutter.java_setup_done_ok
502
532
  java -version
503
533
 
504
534
  - name: Progress - prepare done
505
535
  id: progress_step1
506
536
  if: github.event_name == 'repository_dispatch' && needs.prepare-test-build.outputs.progress_comment_id != ''
507
537
  uses: actions/github-script@v9
538
+ env:
539
+ PAW_IN_GITHUB_RUN_ID: ${{ github.run_id }}
540
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_FIREBASE_AVAILABLE: ${{ needs.prepare-test-build.outputs.firebase_available }}
541
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_COMMENT_ID: ${{ needs.prepare-test-build.outputs.progress_comment_id }}
542
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_START_TIME: ${{ needs.prepare-test-build.outputs.progress_start_time }}
508
543
  with:
509
544
  github-token: ${{ secrets.GITHUB_TOKEN }}
510
545
  script: |
511
546
  const M = JSON.parse(process.env.PAW_MSG);
512
547
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
513
548
  const row = (name, status, elapsed = '-') => `| ${msg('apk_test.step_' + name)} | ${msg('apk_test.st_' + status)} | ${elapsed} |`;
514
- const commentId = parseInt('${{ needs.prepare-test-build.outputs.progress_comment_id }}');
515
- const startTime = parseInt('${{ needs.prepare-test-build.outputs.progress_start_time }}');
516
- const runId = '${{ github.run_id }}';
549
+ const commentId = parseInt(process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_COMMENT_ID);
550
+ const startTime = parseInt(process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_START_TIME);
551
+ const runId = process.env.PAW_IN_GITHUB_RUN_ID;
517
552
  const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
518
553
 
519
554
  const now = Date.now();
@@ -521,7 +556,7 @@ jobs:
521
556
  const minutes = Math.floor(elapsed / 60);
522
557
  const seconds = elapsed % 60;
523
558
  const elapsedStr = minutes > 0 ? msg('apk_test.elapsed_min_sec', { m: minutes, s: seconds }) : msg('apk_test.elapsed_sec', { s: seconds });
524
- const firebaseAvailable = '${{ needs.prepare-test-build.outputs.firebase_available }}' === 'true';
559
+ const firebaseAvailable = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_FIREBASE_AVAILABLE === 'true';
525
560
 
526
561
  const rows = [
527
562
  row('prepare', 'done', elapsedStr),
@@ -555,13 +590,15 @@ jobs:
555
590
 
556
591
  - name: Generate APK filename
557
592
  id: apk_filename
593
+ env:
594
+ PAW_ISSUE_TITLE: ${{ needs.prepare-test-build.outputs.issue_title }}
558
595
  run: |
559
596
  m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
560
597
  REPO_NAME="${{ github.event.repository.name }}"
561
598
  COMMIT_SHORT="${{ needs.prepare-test-build.outputs.commit_hash }}"
562
599
  BUILD_NUMBER="${{ needs.prepare-test-build.outputs.build_number }}"
563
600
  ISSUE_NUMBER="${{ needs.prepare-test-build.outputs.issue_number }}"
564
- ISSUE_TITLE="${{ needs.prepare-test-build.outputs.issue_title }}"
601
+ ISSUE_TITLE="$PAW_ISSUE_TITLE"
565
602
 
566
603
  # Clean up the issue title
567
604
  CLEAN_TITLE=""
@@ -617,7 +654,7 @@ jobs:
617
654
  m apk_test.flutter_build_log
618
655
  flutter build apk --release ${DART_DEFINE_FILE:+--dart-define-from-file="$DART_DEFINE_FILE"}
619
656
  ls -la ./build/app/outputs/flutter-apk/ || true
620
- echo "✅ APK built"
657
+ m wf_flutter.apk_built_ok
621
658
 
622
659
  - name: Rename and Prepare APK
623
660
  run: |
@@ -625,7 +662,7 @@ jobs:
625
662
  mkdir -p ./android/app/build/outputs/apk/release/
626
663
  APK_NAME="${{ steps.apk_filename.outputs.apk_name }}"
627
664
  mv ./build/app/outputs/flutter-apk/app-release.apk ./android/app/build/outputs/apk/release/${APK_NAME}
628
- echo "✅ APK renamed to ${APK_NAME}"
665
+ m wf_flutter.apk_renamed_ok name="${APK_NAME}"
629
666
  ls -la ./android/app/build/outputs/apk/release/
630
667
 
631
668
  # Check the APK file size
@@ -644,16 +681,22 @@ jobs:
644
681
  id: progress_step2
645
682
  if: github.event_name == 'repository_dispatch' && needs.prepare-test-build.outputs.progress_comment_id != ''
646
683
  uses: actions/github-script@v9
684
+ env:
685
+ PAW_IN_GITHUB_RUN_ID: ${{ github.run_id }}
686
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_FIREBASE_AVAILABLE: ${{ needs.prepare-test-build.outputs.firebase_available }}
687
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_COMMENT_ID: ${{ needs.prepare-test-build.outputs.progress_comment_id }}
688
+ PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_ELAPSED: ${{ steps.progress_step1.outputs.elapsed }}
689
+ PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_END_TIME: ${{ steps.progress_step1.outputs.end_time }}
647
690
  with:
648
691
  github-token: ${{ secrets.GITHUB_TOKEN }}
649
692
  script: |
650
693
  const M = JSON.parse(process.env.PAW_MSG);
651
694
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
652
695
  const row = (name, status, elapsed = '-') => `| ${msg('apk_test.step_' + name)} | ${msg('apk_test.st_' + status)} | ${elapsed} |`;
653
- const commentId = parseInt('${{ needs.prepare-test-build.outputs.progress_comment_id }}');
654
- const step1EndTime = parseInt('${{ steps.progress_step1.outputs.end_time }}');
655
- const step1Elapsed = '${{ steps.progress_step1.outputs.elapsed }}';
656
- const runId = '${{ github.run_id }}';
696
+ const commentId = parseInt(process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_COMMENT_ID);
697
+ const step1EndTime = parseInt(process.env.PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_END_TIME);
698
+ const step1Elapsed = process.env.PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_ELAPSED;
699
+ const runId = process.env.PAW_IN_GITHUB_RUN_ID;
657
700
  const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
658
701
 
659
702
  const now = Date.now();
@@ -661,7 +704,7 @@ jobs:
661
704
  const minutes = Math.floor(elapsed / 60);
662
705
  const seconds = elapsed % 60;
663
706
  const elapsedStr = minutes > 0 ? msg('apk_test.elapsed_min_sec', { m: minutes, s: seconds }) : msg('apk_test.elapsed_sec', { s: seconds });
664
- const firebaseAvailable = '${{ needs.prepare-test-build.outputs.firebase_available }}' === 'true';
707
+ const firebaseAvailable = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_FIREBASE_AVAILABLE === 'true';
665
708
 
666
709
  const rows = [
667
710
  row('prepare', 'done', step1Elapsed || '-'),
@@ -694,14 +737,17 @@ jobs:
694
737
  core.setOutput('end_time', now.toString());
695
738
 
696
739
  - name: Create build info file
740
+ env:
741
+ PAW_BRANCH_NAME: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}
742
+ PAW_ISSUE_TITLE: ${{ needs.prepare-test-build.outputs.issue_title }}
697
743
  run: |
698
744
  m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
699
745
  BUILD_NUMBER="${{ needs.prepare-test-build.outputs.build_number }}"
700
746
  PR_NUMBER="${{ needs.prepare-test-build.outputs.pr_number }}"
701
- BRANCH_NAME="${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}"
702
- COMMIT_SHA="${{ github.sha }}"
747
+ BRANCH_NAME="$PAW_BRANCH_NAME"
748
+ COMMIT_SHA="${{ needs.prepare-test-build.outputs.commit_sha }}"
703
749
  COMMIT_SHORT="${{ needs.prepare-test-build.outputs.commit_hash }}"
704
- BUILD_DATE=$(date '+%Y-%m-%d %H:%M:%S')
750
+ BUILD_DATE=$(date -u '+%Y-%m-%d %H:%M:%S UTC')
705
751
 
706
752
  {
707
753
  m apk_test.info_title
@@ -724,7 +770,7 @@ jobs:
724
770
  # Add the issue info when available
725
771
  if [ -n "${{ needs.prepare-test-build.outputs.issue_number }}" ]; then
726
772
  ISSUE_NUMBER="${{ needs.prepare-test-build.outputs.issue_number }}"
727
- ISSUE_TITLE="${{ needs.prepare-test-build.outputs.issue_title }}"
773
+ ISSUE_TITLE="$PAW_ISSUE_TITLE"
728
774
  ISSUE_URL="${{ needs.prepare-test-build.outputs.issue_url }}"
729
775
 
730
776
  {
@@ -740,13 +786,15 @@ jobs:
740
786
 
741
787
  # Create the build metadata file (for the comment-posting workflow)
742
788
  - name: Create build metadata file
789
+ env:
790
+ PAW_BRANCH_NAME: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}
743
791
  run: |
744
792
  cat > build-metadata.json << EOF
745
793
  {
746
794
  "pr_number": "${{ needs.prepare-test-build.outputs.pr_number }}",
747
795
  "build_number": "${{ needs.prepare-test-build.outputs.build_number }}",
748
796
  "issue_number": "${{ needs.prepare-test-build.outputs.issue_number }}",
749
- "branch_name": "${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}"
797
+ "branch_name": "$PAW_BRANCH_NAME"
750
798
  }
751
799
  EOF
752
800
  cat build-metadata.json
@@ -768,11 +816,13 @@ jobs:
768
816
  id: artifact_time
769
817
  if: github.event_name == 'repository_dispatch' && needs.prepare-test-build.outputs.progress_comment_id != ''
770
818
  uses: actions/github-script@v9
819
+ env:
820
+ PAW_IN_STEPS_PROGRESS_STEP2_OUTPUTS_END_TIME: ${{ steps.progress_step2.outputs.end_time }}
771
821
  with:
772
822
  script: |
773
823
  const M = JSON.parse(process.env.PAW_MSG);
774
824
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
775
- const step2EndTime = parseInt('${{ steps.progress_step2.outputs.end_time }}');
825
+ const step2EndTime = parseInt(process.env.PAW_IN_STEPS_PROGRESS_STEP2_OUTPUTS_END_TIME);
776
826
  const now = Date.now();
777
827
  const elapsed = Math.round((now - step2EndTime) / 1000);
778
828
  const minutes = Math.floor(elapsed / 60);
@@ -845,11 +895,13 @@ jobs:
845
895
  id: firebase_time
846
896
  if: needs.prepare-test-build.outputs.firebase_available == 'true' && github.event_name == 'repository_dispatch' && needs.prepare-test-build.outputs.progress_comment_id != ''
847
897
  uses: actions/github-script@v9
898
+ env:
899
+ PAW_IN_STEPS_ARTIFACT_TIME_OUTPUTS_END_TIME: ${{ steps.artifact_time.outputs.end_time }}
848
900
  with:
849
901
  script: |
850
902
  const M = JSON.parse(process.env.PAW_MSG);
851
903
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
852
- const artifactEndTime = parseInt('${{ steps.artifact_time.outputs.end_time }}');
904
+ const artifactEndTime = parseInt(process.env.PAW_IN_STEPS_ARTIFACT_TIME_OUTPUTS_END_TIME);
853
905
  const now = Date.now();
854
906
  const elapsed = Math.round((now - artifactEndTime) / 1000);
855
907
  const minutes = Math.floor(elapsed / 60);
@@ -860,27 +912,44 @@ jobs:
860
912
  - name: Final progress update - success
861
913
  if: success() && github.event_name == 'repository_dispatch' && github.event.client_payload.pr_number != '' && needs.prepare-test-build.outputs.progress_comment_id != ''
862
914
  uses: actions/github-script@v9
915
+ env:
916
+ PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER: ${{ github.event.client_payload.pr_number }}
917
+ PAW_IN_GITHUB_RUN_ID: ${{ github.run_id }}
918
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_BRANCH_NAME: ${{ needs.prepare-test-build.outputs.branch_name }}
919
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_BUILD_NUMBER: ${{ needs.prepare-test-build.outputs.build_number }}
920
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_COMMIT_HASH: ${{ needs.prepare-test-build.outputs.commit_hash }}
921
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_FIREBASE_AVAILABLE: ${{ needs.prepare-test-build.outputs.firebase_available }}
922
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_ISSUE_NUMBER: ${{ needs.prepare-test-build.outputs.issue_number }}
923
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_COMMENT_ID: ${{ needs.prepare-test-build.outputs.progress_comment_id }}
924
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_START_TIME: ${{ needs.prepare-test-build.outputs.progress_start_time }}
925
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_VERSION: ${{ needs.prepare-test-build.outputs.version }}
926
+ PAW_IN_STEPS_ARTIFACT_TIME_OUTPUTS_ELAPSED: ${{ steps.artifact_time.outputs.elapsed }}
927
+ PAW_IN_STEPS_FIREBASE_RESULT_OUTPUTS_STATUS: ${{ steps.firebase_result.outputs.status }}
928
+ PAW_IN_STEPS_FIREBASE_TIME_OUTPUTS_ELAPSED: ${{ steps.firebase_time.outputs.elapsed }}
929
+ PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_ELAPSED: ${{ steps.progress_step1.outputs.elapsed }}
930
+ PAW_IN_STEPS_PROGRESS_STEP2_OUTPUTS_ELAPSED: ${{ steps.progress_step2.outputs.elapsed }}
931
+ PAW_IN_STEPS_UPLOAD_ARTIFACT_OUTPUTS_ARTIFACT_URL: ${{ steps.upload_artifact.outputs.artifact-url }}
863
932
  with:
864
933
  github-token: ${{ secrets.GITHUB_TOKEN }}
865
934
  script: |
866
935
  const M = JSON.parse(process.env.PAW_MSG);
867
936
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
868
937
  const row = (name, status, elapsed = '-') => `| ${msg('apk_test.step_' + name)} | ${msg('apk_test.st_' + status)} | ${elapsed} |`;
869
- const commentId = parseInt('${{ needs.prepare-test-build.outputs.progress_comment_id }}');
870
- const startTime = parseInt('${{ needs.prepare-test-build.outputs.progress_start_time }}');
871
- const step1Elapsed = '${{ steps.progress_step1.outputs.elapsed }}';
872
- const step2Elapsed = '${{ steps.progress_step2.outputs.elapsed }}';
873
- const step3Elapsed = '${{ steps.artifact_time.outputs.elapsed }}';
874
- const step4Elapsed = '${{ steps.firebase_time.outputs.elapsed }}';
875
- const prNumber = parseInt('${{ github.event.client_payload.pr_number }}');
876
- const buildNumber = '${{ needs.prepare-test-build.outputs.build_number }}';
877
- const branchName = '${{ needs.prepare-test-build.outputs.branch_name }}';
878
- const commitHash = '${{ needs.prepare-test-build.outputs.commit_hash }}';
879
- const issueNumber = '${{ needs.prepare-test-build.outputs.issue_number }}';
880
- const runId = '${{ github.run_id }}';
938
+ const commentId = parseInt(process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_COMMENT_ID);
939
+ const startTime = parseInt(process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_START_TIME);
940
+ const step1Elapsed = process.env.PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_ELAPSED;
941
+ const step2Elapsed = process.env.PAW_IN_STEPS_PROGRESS_STEP2_OUTPUTS_ELAPSED;
942
+ const step3Elapsed = process.env.PAW_IN_STEPS_ARTIFACT_TIME_OUTPUTS_ELAPSED;
943
+ const step4Elapsed = process.env.PAW_IN_STEPS_FIREBASE_TIME_OUTPUTS_ELAPSED;
944
+ const prNumber = parseInt(process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER);
945
+ const buildNumber = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_BUILD_NUMBER;
946
+ const branchName = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_BRANCH_NAME;
947
+ const commitHash = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_COMMIT_HASH;
948
+ const issueNumber = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_ISSUE_NUMBER;
949
+ const runId = process.env.PAW_IN_GITHUB_RUN_ID;
881
950
  const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
882
951
 
883
- const artifactUrl = '${{ steps.upload_artifact.outputs.artifact-url }}' || `${runUrl}#artifacts`;
952
+ const artifactUrl = process.env.PAW_IN_STEPS_UPLOAD_ARTIFACT_OUTPUTS_ARTIFACT_URL || `${runUrl}#artifacts`;
884
953
 
885
954
  const now = Date.now();
886
955
  const totalElapsed_s = Math.round((now - startTime) / 1000);
@@ -888,8 +957,8 @@ jobs:
888
957
  const totalSec = totalElapsed_s % 60;
889
958
  const totalElapsed = totalMin > 0 ? msg('apk_test.elapsed_min_sec', { m: totalMin, s: totalSec }) : msg('apk_test.elapsed_sec', { s: totalSec });
890
959
 
891
- const firebaseAvailable = '${{ needs.prepare-test-build.outputs.firebase_available }}' === 'true';
892
- const firebaseSuccess = '${{ steps.firebase_result.outputs.status }}' === 'success';
960
+ const firebaseAvailable = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_FIREBASE_AVAILABLE === 'true';
961
+ const firebaseSuccess = process.env.PAW_IN_STEPS_FIREBASE_RESULT_OUTPUTS_STATUS === 'success';
893
962
 
894
963
  const lines = [
895
964
  msg('apk_test.title_done'),
@@ -909,7 +978,7 @@ jobs:
909
978
  }
910
979
  }
911
980
 
912
- const version = '${{ needs.prepare-test-build.outputs.version }}';
981
+ const version = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_VERSION;
913
982
 
914
983
  lines.push(
915
984
  '',
@@ -973,24 +1042,36 @@ jobs:
973
1042
  }
974
1043
 
975
1044
  - name: Final progress update - failure
976
- if: failure() && github.event_name == 'repository_dispatch' && github.event.client_payload.pr_number != '' && needs.prepare-test-build.outputs.progress_comment_id != ''
1045
+ if: failure() && steps.load_messages.outcome == 'success' && github.event_name == 'repository_dispatch' && github.event.client_payload.pr_number != '' && needs.prepare-test-build.outputs.progress_comment_id != ''
977
1046
  uses: actions/github-script@v9
1047
+ env:
1048
+ PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER: ${{ github.event.client_payload.pr_number }}
1049
+ PAW_IN_GITHUB_RUN_ID: ${{ github.run_id }}
1050
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_BRANCH_NAME: ${{ needs.prepare-test-build.outputs.branch_name }}
1051
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_BUILD_NUMBER: ${{ needs.prepare-test-build.outputs.build_number }}
1052
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_FIREBASE_AVAILABLE: ${{ needs.prepare-test-build.outputs.firebase_available }}
1053
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_ISSUE_NUMBER: ${{ needs.prepare-test-build.outputs.issue_number }}
1054
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_COMMENT_ID: ${{ needs.prepare-test-build.outputs.progress_comment_id }}
1055
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_START_TIME: ${{ needs.prepare-test-build.outputs.progress_start_time }}
1056
+ PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_VERSION: ${{ needs.prepare-test-build.outputs.version }}
1057
+ PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_ELAPSED: ${{ steps.progress_step1.outputs.elapsed }}
1058
+ PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_END_TIME: ${{ steps.progress_step1.outputs.end_time }}
978
1059
  with:
979
1060
  github-token: ${{ secrets.GITHUB_TOKEN }}
980
1061
  script: |
981
1062
  const M = JSON.parse(process.env.PAW_MSG);
982
1063
  const msg = (k, p = {}) => M[k].replace(/\{(\w+)\}/g, (s, n) => (n in p ? p[n] : s));
983
1064
  const row = (name, status, elapsed = '-') => `| ${msg('apk_test.step_' + name)} | ${msg('apk_test.st_' + status)} | ${elapsed} |`;
984
- const commentId = parseInt('${{ needs.prepare-test-build.outputs.progress_comment_id }}');
985
- const startTime = parseInt('${{ needs.prepare-test-build.outputs.progress_start_time }}');
986
- const step1EndTime = parseInt('${{ steps.progress_step1.outputs.end_time }}') || 0;
987
- const step1Elapsed = '${{ steps.progress_step1.outputs.elapsed }}';
988
- const prNumber = parseInt('${{ github.event.client_payload.pr_number }}');
989
- const buildNumber = '${{ needs.prepare-test-build.outputs.build_number }}';
990
- const version = '${{ needs.prepare-test-build.outputs.version }}';
991
- const branchName = '${{ needs.prepare-test-build.outputs.branch_name }}';
992
- const issueNumber = '${{ needs.prepare-test-build.outputs.issue_number }}';
993
- const runId = '${{ github.run_id }}';
1065
+ const commentId = parseInt(process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_COMMENT_ID);
1066
+ const startTime = parseInt(process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_PROGRESS_START_TIME);
1067
+ const step1EndTime = parseInt(process.env.PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_END_TIME) || 0;
1068
+ const step1Elapsed = process.env.PAW_IN_STEPS_PROGRESS_STEP1_OUTPUTS_ELAPSED;
1069
+ const prNumber = parseInt(process.env.PAW_IN_GITHUB_EVENT_CLIENT_PAYLOAD_PR_NUMBER);
1070
+ const buildNumber = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_BUILD_NUMBER;
1071
+ const version = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_VERSION;
1072
+ const branchName = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_BRANCH_NAME;
1073
+ const issueNumber = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_ISSUE_NUMBER;
1074
+ const runId = process.env.PAW_IN_GITHUB_RUN_ID;
994
1075
  const runUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
995
1076
 
996
1077
  const now = Date.now();
@@ -1008,7 +1089,7 @@ jobs:
1008
1089
  const tSec = total_s % 60;
1009
1090
  const totalElapsed = tMin > 0 ? msg('apk_test.elapsed_min_sec', { m: tMin, s: tSec }) : msg('apk_test.elapsed_sec', { s: tSec });
1010
1091
 
1011
- const firebaseAvailable = '${{ needs.prepare-test-build.outputs.firebase_available }}' === 'true';
1092
+ const firebaseAvailable = process.env.PAW_IN_NEEDS_PREPARE_TEST_BUILD_OUTPUTS_FIREBASE_AVAILABLE === 'true';
1012
1093
 
1013
1094
  const rows = [
1014
1095
  row('prepare', 'done', step1Elapsed || '-'),
@@ -1066,6 +1147,8 @@ jobs:
1066
1147
 
1067
1148
  - name: Notify Build Success
1068
1149
  if: success()
1150
+ env:
1151
+ PAW_BRANCH_NAME: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}
1069
1152
  run: |
1070
1153
  m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
1071
1154
  m apk_test.notify_ok
@@ -1073,7 +1156,7 @@ jobs:
1073
1156
  if [ -n "${{ needs.prepare-test-build.outputs.pr_number }}" ]; then
1074
1157
  m apk_test.notify_pr pr="${{ needs.prepare-test-build.outputs.pr_number }}"
1075
1158
  fi
1076
- m apk_test.notify_branch branch="${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch_name || github.ref_name }}"
1159
+ m apk_test.notify_branch branch="$PAW_BRANCH_NAME"
1077
1160
  m apk_test.notify_commit commit="${{ needs.prepare-test-build.outputs.commit_hash }}"
1078
1161
  if [ -n "${{ needs.prepare-test-build.outputs.issue_url }}" ]; then
1079
1162
  m apk_test.notify_issue url="${{ needs.prepare-test-build.outputs.issue_url }}"
@@ -1082,7 +1165,7 @@ jobs:
1082
1165
  m apk_test.notify_artifact_hint
1083
1166
 
1084
1167
  - name: Notify on Failure
1085
- if: failure()
1168
+ if: failure() && steps.load_messages.outcome == 'success'
1086
1169
  run: |
1087
1170
  m() { python3 "$PAW_MESSAGES_PY" get "$@"; }
1088
1171
  m apk_test.notify_fail