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
@@ -0,0 +1,2279 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ messages.py β€” message catalog and language lookup shared by the installed
4
+ workflow scripts (stdlib only).
5
+
6
+ This script is copied into user repos (.github/scripts/) by project-auto-wizard.
7
+ Everything a workflow or script prints for people to read (PR comments, release
8
+ summaries, log lines, AI prompts) is looked up here by key, so the wording
9
+ follows the `language` value in version.yml (en | ko, default en).
10
+
11
+ Language resolution (first match wins):
12
+ 1. env PROJECT_AUTO_WIZARD_LANG (same variable the installer honors)
13
+ 2. `language:` in the first version.yml that has it, looking in: ./version.yml, the repo root
14
+ relative to this script (../../version.yml), $GITHUB_WORKSPACE/version.yml
15
+ (steps with a working-directory in a monorepo do not run at the repo root)
16
+ 3. "en"
17
+
18
+ Python usage:
19
+ from messages import t
20
+ t("issue_helper.branch_title")
21
+ t("changelog.count", n=3) # {n} placeholders are replaced
22
+
23
+ Command line (used from bash and actions/github-script):
24
+ messages.py get KEY [name=value ...] print one message (trailing newline)
25
+ messages.py dump PREFIX print {key: template} JSON for keys with the prefix
26
+ messages.py lang print the resolved language
27
+
28
+ A key missing from the selected language falls back to English; a key missing
29
+ everywhere is returned as-is so the gap is visible instead of crashing a run.
30
+ Placeholders are `{name}`; unknown placeholders and any other braces stay as written.
31
+ """
32
+
33
+ import json
34
+ import os
35
+ import re
36
+ import sys
37
+
38
+ SUPPORTED = ("en", "ko")
39
+ DEFAULT = "en"
40
+ LANG_ENV = "PROJECT_AUTO_WIZARD_LANG"
41
+
42
+ _PLACEHOLDER = re.compile(r"\{(\w+)\}")
43
+ _LANG_LINE = re.compile(r"^language:\s*(.+)")
44
+
45
+
46
+ def normalize_language(value):
47
+ """Trim and lowercase, like the CLI's normalizeLanguage (so ' KO ' == 'ko')."""
48
+ return str(value if value is not None else "").strip().lower()
49
+
50
+
51
+ def parse_saved_language(text):
52
+ """`language:` value from version.yml text, normalized ('' when absent).
53
+
54
+ Mirrors the CLI's parseExisting(): top-level line only, `#` comment lines skipped,
55
+ first match wins, trailing ` # comment` and quotes removed. The whole value is kept,
56
+ so 'ko_KR' is unsupported here exactly as it is in the CLI."""
57
+ for line in str(text or "").split("\n"):
58
+ if line.startswith("#"):
59
+ continue
60
+ m = _LANG_LINE.match(line)
61
+ if m:
62
+ return normalize_language(re.sub(r"\s+#.*$", "", m.group(1)).replace('"', "").replace("'", ""))
63
+ return ""
64
+
65
+
66
+ def _version_yml_candidates(version_yml):
67
+ """Where to look for version.yml: cwd, then the repo root relative to this script, then $GITHUB_WORKSPACE.
68
+
69
+ Steps with a working-directory (monorepo) or a scripts run from a subfolder are not at the repo root;
70
+ the installed script lives in <root>/.github/scripts, so the root is two levels up."""
71
+ candidates = [version_yml, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "version.yml")]
72
+ workspace = os.environ.get("GITHUB_WORKSPACE", "")
73
+ if workspace:
74
+ candidates.append(os.path.join(workspace, "version.yml"))
75
+ return candidates
76
+
77
+
78
+ def get_language(version_yml="version.yml"):
79
+ """Resolve the message language: env -> version.yml -> default.
80
+
81
+ Same rules as the CLI (src/i18n): values are normalized and only supported ones count.
82
+ Unlike the CLI, an unsupported env value is ignored instead of aborting, because a
83
+ failing message lookup must never break a workflow step. An unreadable or
84
+ non-UTF-8 version.yml is skipped; the first file that has a `language:` line decides."""
85
+ env = normalize_language(os.environ.get(LANG_ENV))
86
+ if env in SUPPORTED:
87
+ return env
88
+ saved = ""
89
+ for path in _version_yml_candidates(version_yml):
90
+ try:
91
+ # errors="replace" keeps ASCII keys readable in a cp949/latin-1 file, as the CLI's utf8 read does
92
+ with open(path, encoding="utf-8", errors="replace") as f:
93
+ saved = parse_saved_language(f.read())
94
+ except (OSError, ValueError):
95
+ continue
96
+ # A file without a language line says nothing; keep looking (monorepo subfolder copies etc.)
97
+ if saved:
98
+ break
99
+ return saved if saved in SUPPORTED else DEFAULT
100
+
101
+
102
+ def template(key, lang=None):
103
+ """Raw template for `key` in `lang` (English fallback, then the key itself)."""
104
+ lang = lang or get_language()
105
+ return CATALOG.get(lang, {}).get(key) or CATALOG[DEFAULT].get(key) or key
106
+
107
+
108
+ def render(text, params):
109
+ """Replace `{name}` placeholders from params; leave unknown ones untouched."""
110
+ return _PLACEHOLDER.sub(lambda m: str(params[m.group(1)]) if m.group(1) in params else m.group(0), text)
111
+
112
+
113
+ def t(key, lang=None, **params):
114
+ """Look up `key` and fill placeholders."""
115
+ return render(template(key, lang), params)
116
+
117
+
118
+ def tn(key, n, lang=None, **params):
119
+ """Like t(), but uses `<key>_one` when n == 1 and that key exists (English singular).
120
+ {n} is always filled in, so languages without plural forms just define `<key>` alone."""
121
+ if n == 1 and f"{key}_one" in CATALOG[DEFAULT]:
122
+ key = f"{key}_one"
123
+ return t(key, lang, n=n, **params)
124
+
125
+
126
+ def dump(prefix, lang=None):
127
+ """{key: raw template} for every key starting with `prefix`, English-filled."""
128
+ lang = lang or get_language()
129
+ keys = [k for k in CATALOG[DEFAULT] if k.startswith(prefix)]
130
+ return {k: template(k, lang) for k in keys}
131
+
132
+
133
+ def use_utf8_output():
134
+ """Print UTF-8 regardless of the console code page (Windows defaults to cp1252) and never crash on it."""
135
+ for stream in (sys.stdout, sys.stderr):
136
+ if hasattr(stream, "reconfigure"):
137
+ stream.reconfigure(encoding="utf-8", errors="replace")
138
+
139
+
140
+ def main(argv):
141
+ use_utf8_output()
142
+ if len(argv) >= 2 and argv[0] == "get":
143
+ params = dict(a.split("=", 1) for a in argv[2:] if "=" in a)
144
+ print(t(argv[1], **params))
145
+ return 0
146
+ if len(argv) == 2 and argv[0] == "dump":
147
+ print(json.dumps(dump(argv[1]), ensure_ascii=False))
148
+ return 0
149
+ if argv == ["lang"]:
150
+ print(get_language())
151
+ return 0
152
+ print("usage: messages.py get KEY [name=value ...] | dump PREFIX | lang", file=sys.stderr)
153
+ return 2
154
+
155
+
156
+ # Catalogs are grouped by area (`<area>.<name>` keys). Keep the English and
157
+ # Korean sections in the same order and with the same placeholders.
158
+
159
+ EN = {
160
+ # --- apk_test ---
161
+ "apk_test.branch_check_log": "πŸ” Checking that the branch exists: {branch}",
162
+ "apk_test.branch_exists_log": "βœ… Branch exists: {branch}",
163
+ "apk_test.branch_not_found_log": "❌ Branch not found: {branch}",
164
+ "apk_test.branch_missing_title": "πŸ€– ❌ **Android test APK build failed - branch not found**",
165
+ "apk_test.kv_head": "| Item | Value |",
166
+ "apk_test.row_requested_branch": "| **Requested branch** | `{branch}` |",
167
+ "apk_test.row_issue_pr": "| **Issue/PR** | #{number} |",
168
+ "apk_test.hint_title": "### πŸ’‘ Things to check",
169
+ "apk_test.hint_pushed": "1. Make sure the branch has been pushed to the remote repository",
170
+ "apk_test.hint_helper_branch": "2. Make sure the branch name in the \"Issue Helper\" comment is correct",
171
+ "apk_test.hint_typo": "3. Make sure the branch name has no typos",
172
+ "apk_test.workflow_log_link": "πŸ”— [Workflow log]({url})",
173
+ "apk_test.branch_not_found_fail": "Branch not found: {branch}",
174
+ "apk_test.branch_check_error_fail": "Error while checking the branch: {error}",
175
+ "apk_test.firebase_detected": "βœ… Firebase service account detected - App Distribution upload scheduled",
176
+ "apk_test.firebase_missing": "⚠️ No Firebase service account - skipping the App Distribution upload",
177
+ "apk_test.title_running": "## πŸ€– Building the Android APK...",
178
+ "apk_test.title_done": "## πŸ€– βœ… Android APK build complete!",
179
+ "apk_test.title_failed": "## πŸ€– ❌ Android APK build failed",
180
+ "apk_test.table_header": "| Step | Status | Duration |",
181
+ "apk_test.step_prepare": "πŸ”§ Prepare",
182
+ "apk_test.step_build": "πŸ”¨ APK build",
183
+ "apk_test.step_upload": "πŸ“€ GitHub artifact upload",
184
+ "apk_test.step_firebase": "πŸ”₯ Firebase App Distribution",
185
+ "apk_test.st_running": "⏳ In progress...",
186
+ "apk_test.st_waiting": "⏸️ Waiting",
187
+ "apk_test.st_done": "βœ… Done",
188
+ "apk_test.st_failed": "❌ Failed",
189
+ "apk_test.st_skipped": "⏸️ Skipped",
190
+ "apk_test.live_log": "πŸ“‹ **[View live log]({url})**",
191
+ "apk_test.log_progress_created": "βœ… Progress comment created (ID: {id})",
192
+ "apk_test.pull_branch": "🌿 Branch: {branch}",
193
+ "apk_test.pull_failed": "⚠️ Pull failed (the branch may already be up to date)",
194
+ "apk_test.branch_name_log": "🌿 Branch name: {branch}",
195
+ "apk_test.issue_number_missing": "⚠️ Could not find an issue number in the branch name.",
196
+ "apk_test.issue_number_extracted": "βœ… Extracted issue number: #{number}",
197
+ "apk_test.issue_fetching": "πŸ” Fetching issue info from the GitHub API...",
198
+ "apk_test.issue_title_default": "Issue info not available",
199
+ "apk_test.issue_not_found": "⚠️ Issue #{number} not found.",
200
+ "apk_test.issue_title_log": "πŸ“‹ Issue title: {title}",
201
+ "apk_test.issue_state_log": "πŸ“Œ Issue state: {state}",
202
+ "apk_test.event_dispatch": "πŸ“‹ repository_dispatch event detected",
203
+ "apk_test.event_pr_number": " PR number: #{pr}",
204
+ "apk_test.event_build_number_pr": " Build number: {build} (from the PR number)",
205
+ "apk_test.event_workflow_dispatch": "πŸ“‹ workflow_dispatch event detected",
206
+ "apk_test.event_build_number_default": " Build number: {build} (default)",
207
+ "apk_test.build_info_header": "πŸ“‹ Build info:",
208
+ "apk_test.build_info_build": " Build number: #{build}",
209
+ "apk_test.build_info_pr": " PR number: #{pr}",
210
+ "apk_test.build_info_commit": " Commit hash: {commit}",
211
+ "apk_test.build_info_date": " Build date: {date}",
212
+ "apk_test.sign_debug_warning": "Signing secrets are empty, signing with the debug key:{missing} (this is not a store-upload key)",
213
+ "apk_test.sign_keystore_empty": "The keystore decoded from RELEASE_KEYSTORE_BASE64 is empty",
214
+ "apk_test.sign_release_ok": "βœ… Release keystore created (signing with the release key)",
215
+ "apk_test.key_properties_ok": "βœ… key.properties created",
216
+ "apk_test.gradlew_missing": "ℹ️ gradlew is not in the repository β€” flutter build will generate it",
217
+ "apk_test.elapsed_min_sec": "{m}m {s}s",
218
+ "apk_test.elapsed_sec": "{s}s",
219
+ "apk_test.log_prepare_done": "βœ… Progress updated: prepare done ({elapsed})",
220
+ "apk_test.log_build_done": "βœ… Progress updated: APK build done ({elapsed})",
221
+ "apk_test.apk_filename_log": "πŸ“¦ APK file name: {name}",
222
+ "apk_test.version_set_log": "πŸ“‹ Setting the test build version: {version}",
223
+ "apk_test.pubspec_updated": "βœ… pubspec.yaml version updated:",
224
+ "apk_test.flutter_build_log": "πŸ“¦ Building directly with Flutter...",
225
+ "apk_test.apk_size_log": "πŸ“¦ APK file size: {size}MB",
226
+ "apk_test.apk_size_over": "⚠️ Warning: the APK file size exceeds 500MB ({size}MB)",
227
+ "apk_test.apk_size_ok": "βœ… The APK file size is within the artifact limit ({size}MB / 500MB)",
228
+ "apk_test.info_title": "Test APK build info",
229
+ "apk_test.info_build_number": "Build number: #{build}",
230
+ "apk_test.info_pr_number": "PR number: #{pr}",
231
+ "apk_test.info_branch": "Branch: {branch}",
232
+ "apk_test.info_commit": "Commit: {commit}",
233
+ "apk_test.info_full_commit": "Full commit hash: {sha}",
234
+ "apk_test.info_date": "Build date: {date}",
235
+ "apk_test.info_issue_header": "Related issue:",
236
+ "apk_test.info_file_created": "πŸ“‹ Build info file created:",
237
+ "apk_test.firebase_creds_ok": "βœ… Firebase service account JSON file created",
238
+ "apk_test.fb_notes_build": "Test build #{build}",
239
+ "apk_test.fb_notes_branch": "Branch: {branch}",
240
+ "apk_test.fb_notes_commit": "Commit: {commit}",
241
+ "apk_test.fb_notes_issue": "Issue: #{number} {title}",
242
+ "apk_test.firebase_upload_ok": "βœ… Firebase App Distribution upload succeeded",
243
+ "apk_test.firebase_upload_failed": "❌ Firebase App Distribution upload failed - the APK artifact was uploaded normally",
244
+ "apk_test.result_title": "### πŸ“¦ Build result",
245
+ "apk_test.row_app_version": "| **App version** | `{version}({build})` |",
246
+ "apk_test.row_branch": "| **Branch** | `{branch}` |",
247
+ "apk_test.row_commit": "| **Commit** | `{commit}` |",
248
+ "apk_test.row_total": "| **Total duration** | {elapsed} |",
249
+ "apk_test.firebase_installable": "πŸ”₯ **Install it from the Firebase App Tester app**",
250
+ "apk_test.firebase_failed_hint": "⚠️ **Firebase upload failed - download the APK from the artifact**",
251
+ "apk_test.artifact_link": "πŸ“¦ **[Download artifact]({url})**",
252
+ "apk_test.run_log_link": "πŸ”— **[Workflow run log]({url})**",
253
+ "apk_test.log_success": "βœ… Progress updated: build succeeded (total {elapsed})",
254
+ "apk_test.issue_done_title": "πŸ€– βœ… **Android APK build complete**",
255
+ "apk_test.issue_line_version": "- App version: `{version}({build})`",
256
+ "apk_test.issue_line_commit": "- Commit: `{commit}`",
257
+ "apk_test.log_issue_success": "βœ… Build success comment also posted on issue #{number}",
258
+ "apk_test.fail_line_branch": "- Branch: `{branch}`",
259
+ "apk_test.fail_line_total": "- Total duration: {elapsed}",
260
+ "apk_test.build_error": "❌ An error occurred during the build.",
261
+ "apk_test.run_log_check_link": "πŸ”— **[Check the workflow run log]({url})**",
262
+ "apk_test.log_failed": "❌ Progress updated: build failed ({elapsed})",
263
+ "apk_test.issue_failed_title": "πŸ€– ❌ **Android APK build failed**",
264
+ "apk_test.log_issue_failed": "❌ Build failure comment also posted on issue #{number}",
265
+ "apk_test.notify_ok": "βœ… Android test APK build succeeded!",
266
+ "apk_test.notify_build_number": "Build number: {build}",
267
+ "apk_test.notify_pr": "PR number: {pr}",
268
+ "apk_test.notify_branch": "Branch: {branch}",
269
+ "apk_test.notify_commit": "Commit: {commit}",
270
+ "apk_test.notify_issue": "Related issue: {url}",
271
+ "apk_test.notify_artifact_hint": "πŸ“¦ You can download the APK file from the artifact.",
272
+ "apk_test.notify_fail": "❌ Android test APK build failed!",
273
+ "apk_test.check_logs": "Please check the logs.",
274
+ # --- app_trigger ---
275
+ "app_trigger.reaction_done": "πŸ‘€ Confirmation reaction added to the comment",
276
+ "app_trigger.build_type": "πŸ“± Build type: {type} (Android={android}, iOS={ios})",
277
+ "app_trigger.branch_from_comment": "🌿 Branch specified in the comment: {branch}",
278
+ "app_trigger.branch_override": "🌿 Branch from the comment takes precedence: {branch} (PR head={head})",
279
+ "app_trigger.pr_confirmed": "βœ… PR confirmed: #{number}",
280
+ "app_trigger.branch_name": "🌿 Branch name: {branch}",
281
+ "app_trigger.commit_sha": "πŸ“ Commit hash: {sha}",
282
+ "app_trigger.issue_extracted": "πŸ“Œ Extracted issue number: #{number}",
283
+ "app_trigger.not_pr": "ℹ️ Not a PR. Looking for the branch info in the issue...",
284
+ "app_trigger.custom_branch_used": "🌿 Using the branch from the comment (skipping the Guide comment): {branch}",
285
+ "app_trigger.related_issue": "πŸ“Œ Related issue number: #{number}",
286
+ "app_trigger.helper_missing_log": "❌ \"Issue Helper\" comment not found.",
287
+ "app_trigger.helper_missing_error": "Could not find an \"Issue Helper\" comment on the issue. A comment containing the branch info is required.",
288
+ "app_trigger.helper_found": "βœ… \"Issue Helper\" comment found",
289
+ "app_trigger.branch_parse_log": "❌ Could not parse the branch info.",
290
+ "app_trigger.branch_parse_error": "Could not parse the branch info from the \"Issue Helper\" comment. Please check the comment format.",
291
+ "app_trigger.branch_extracted": "🌿 Extracted branch name: {branch}",
292
+ "app_trigger.build_info_extracted": "βœ… Build info extracted from issue #{number}",
293
+ "app_trigger.comments_error_log": "❌ Error while fetching the issue comments:",
294
+ "app_trigger.comments_error": "An error occurred while fetching the issue comments: {error}",
295
+ "app_trigger.trigger_failed_body": "❌ **App build trigger failed**\n\n{error}\n\n**How to fix:**\n- Building from a PR: post the comment on the PR page.\n- Building from an issue: an \"Issue Helper\" comment must exist.\n - The comment must contain a `### Branch name` section with the branch name.\n- Or specify the branch name directly in the comment: `/wizard app build <branch-name>`",
296
+ "app_trigger.branch_check_log": "πŸ” Checking that the branch exists: {branch}",
297
+ "app_trigger.branch_exists_log": "βœ… Branch exists: {branch}",
298
+ "app_trigger.branch_not_found_log": "❌ Branch not found: {branch}",
299
+ "app_trigger.branch_not_found_error": "Branch `{branch}` not found.",
300
+ "app_trigger.branch_check_error_log": "❌ Error while checking the branch: {error}",
301
+ "app_trigger.branch_check_error": "An error occurred while checking the branch: {error}",
302
+ "app_trigger.branch_missing_title": "❌ **App build trigger failed - branch not found**",
303
+ "app_trigger.table_head": "| Item | Value |",
304
+ "app_trigger.row_requested_branch": "| **Requested branch** | `{branch}` |",
305
+ "app_trigger.row_issue_pr": "| **Issue/PR** | #{number} |",
306
+ "app_trigger.hint_title": "### πŸ’‘ Things to check",
307
+ "app_trigger.hint_pushed": "1. Make sure the branch has been pushed to the remote repository",
308
+ "app_trigger.hint_helper_branch": "2. Make sure the branch name in the \"Issue Helper\" comment is correct",
309
+ "app_trigger.hint_typo": "3. Make sure the branch name has no typos",
310
+ "app_trigger.workflow_log_link": "πŸ”— [Workflow log]({url})",
311
+ "app_trigger.branch_not_found_fail": "Branch not found: {branch}",
312
+ "app_trigger.count_lookup": "πŸ“Š Looking up the build count for {type} #{number}...",
313
+ "app_trigger.count_build_type": "πŸ“± Build type: {type}",
314
+ "app_trigger.count_ios": "πŸ“Š iOS build count: ios + app (shared) combined",
315
+ "app_trigger.count_android": "πŸ“Š Android build count: apk + app (shared) combined",
316
+ "app_trigger.count_app": "πŸ“Š Full app build count: all build commands combined",
317
+ "app_trigger.count_result": "πŸ“Š {type} #{number}: build #{count} for {build_type}",
318
+ "app_trigger.build_number_generated": "πŸ“¦ Generated build number: {number}",
319
+ "app_trigger.dispatch_start": "πŸš€ Triggering the {platform} build workflow...",
320
+ "app_trigger.dispatch_source_number": " {type} number: #{number}",
321
+ "app_trigger.dispatch_build_number": " Build number: {number}",
322
+ "app_trigger.dispatch_branch": " Branch: {branch}",
323
+ "app_trigger.dispatch_related_issue": " Related issue number: {issue}",
324
+ "app_trigger.none": "none",
325
+ "app_trigger.dispatch_done": "βœ… {platform} build workflow triggered",
326
+ "app_trigger.done_log": "βœ… Android and iOS build workflows triggered",
327
+ "app_trigger.done_build_number": "πŸ“¦ Build number: {number}",
328
+ "app_trigger.done_branch": "🌿 Branch: {branch}",
329
+ "app_trigger.done_progress_note": "πŸ“‹ A progress comment is created automatically for each platform.",
330
+ # --- changelog ---
331
+ "changelog.parser_section_ok": " β†’ section parser succeeded",
332
+ "changelog.parser_lenient_ok": " β†’ lenient parser succeeded",
333
+ "changelog.parser_heuristic_ok": " β†’ heuristic parser succeeded",
334
+ "changelog.section_breaking": "### ⚠️ Breaking changes",
335
+ "changelog.section_feat": "### ✨ Features",
336
+ "changelog.section_fix": "### πŸ› Fixes",
337
+ "changelog.section_perf": "### ⚑ Performance",
338
+ "changelog.section_docs": "### πŸ“ Documentation",
339
+ "changelog.section_refactor": "### ♻️ Refactoring",
340
+ "changelog.section_test": "### βœ… Tests",
341
+ "changelog.section_deps": "### πŸ“¦ Dependencies",
342
+ "changelog.section_changes": "### πŸ”§ Changes",
343
+ "changelog.section_wip": "### 🚧 Work in progress",
344
+ "changelog.bump_prompt_prefix": "The following are free-form commit messages that do not follow the agreed commit convention.\nIf any of them looks like a new user-facing feature, answer with exactly MINOR and nothing else,\notherwise answer with exactly PATCH. Never add anything else.\nCommit list:\n",
345
+ "changelog.err_no_input": "❌ Input file not found (pr_body.md or summary_section.html)",
346
+ "changelog.input_file": "πŸ“„ Input file: {input_file}",
347
+ "changelog.file_size": "πŸ“ File size: {size} bytes",
348
+ "changelog.parse_start": "\nπŸ” Starting Markdown parsing...",
349
+ "changelog.parse_ok": "βœ… Parsed successfully: {n} categories",
350
+ "changelog.parse_ok_one": "βœ… Parsed successfully: {n} category",
351
+ "changelog.parse_failed": "⚠️ Parsing failed, saving raw_summary only",
352
+ "changelog.result_header": "\nπŸ“Š Parse result:",
353
+ "changelog.result_method": " - parse method: {method}",
354
+ "changelog.result_raw_len": " - raw_summary length: {n} characters",
355
+ "changelog.result_categories": " - parsed categories: {n}",
356
+ "changelog.result_category_item": " β€’ {title}: {n} items",
357
+ "changelog.result_category_item_one": " β€’ {title}: {n} item",
358
+ "changelog.err_json_unreadable": "❌ Cannot parse CHANGELOG.json, aborting the update (protecting existing history): {error}",
359
+ "changelog.err_json_annotation": "::error::CHANGELOG.json is not valid JSON: {error}",
360
+ "changelog.json_updated": "\nβœ… CHANGELOG.json updated!",
361
+ "changelog.err_update_failed": "❌ update-from-summary failed: {error}",
362
+ "changelog.md_current_version": "**Current version:** {version}",
363
+ "changelog.md_last_updated": "**Last updated:** {updated}",
364
+ "changelog.md_no_changes": "*No change information*",
365
+ "changelog.md_regenerated": "βœ… CHANGELOG.md regenerated!",
366
+ "changelog.err_md_failed": "❌ Failed to generate CHANGELOG.md: {error}",
367
+ "changelog.export_header": "Version {version} update",
368
+ "changelog.export_fallback": "Version {version} update\nApp stability and user experience have been improved.",
369
+ "changelog.warn_json_notes": "::warning::Could not read the notes for {version} from CHANGELOG.json: {error}",
370
+ "changelog.warn_md_notes": "::warning::Could not read the notes for {version} from CHANGELOG.md: {error}",
371
+ "changelog.warn_missing_key": "::warning::AI_API_BASE_URL/AI_MODEL are set but the AI_API_KEY secret is missing, skipping the user API tier",
372
+ "changelog.warn_missing_url_model": "::warning::AI_API_KEY is set but AI_API_BASE_URL/AI_MODEL are missing, skipping the user API tier",
373
+ "changelog.prompt_intro": "Write an English release summary based on the commit list below.",
374
+ "changelog.prompt_format": "Output format: start the first line with the '## [{version}]' heading,",
375
+ "changelog.prompt_sections_intro": "then write only the sections that have entries, using these names:",
376
+ "changelog.prompt_names_1": "'{breaking}', '{feat}', '{fix}', '{perf}', '{docs}', '{refactor}',",
377
+ "changelog.prompt_names_2": "'{test}', '{deps}', '{changes}', '{wip}'.",
378
+ "changelog.prompt_breaking": "Commits with '!' after the type or with BREAKING CHANGE must go under '{breaking}'.",
379
+ "changelog.prompt_bullets": "Write each entry as a bullet starting with '- '.",
380
+ "changelog.prompt_pr_title": "PR title: {title}",
381
+ "changelog.prompt_diff_stat": "Per-file change summary:",
382
+ "changelog.prompt_commits": "Commit list:",
383
+ "changelog.warn_commits_unreadable": "::warning::Could not read the commit list file, summarizing an empty list: {error}",
384
+ "changelog.cli_description": "Unified changelog manager",
385
+ "changelog.cli_update_help": "update CHANGELOG.json from the PR body",
386
+ "changelog.cli_generate_help": "generate CHANGELOG.md from CHANGELOG.json",
387
+ "changelog.cli_classify_help": "decide the semver bump level (major/minor/patch) from a commit list",
388
+ "changelog.cli_commits_file_help": "file with commit subjects (one per line)",
389
+ "changelog.cli_export_help": "extract the release notes of a version",
390
+ "changelog.cli_version_help": "version number",
391
+ "changelog.cli_output_help": "output file path (stdout if omitted)",
392
+ "changelog.cli_ai_summary_help": "build a release summary from a commit list (model-generated or rule-based)",
393
+ "changelog.cli_summary_output_help": "file path to save the summary to",
394
+ "changelog.cli_pr_title_help": "PR title (used as prompt context, optional)",
395
+ "changelog.cli_diff_stat_help": "git diff --stat output file (extra prompt context, optional)",
396
+ "changelog.cli_collect_help": "extract the issue numbers included in this release from PRs merged into develop",
397
+ "changelog.cli_shas_help": "file with the commit SHAs included in this release (one per line)",
398
+ "changelog.cli_prs_help": "JSON file with the output of gh pr list --json number,headRefName,mergeCommit",
399
+ # --- cibuild ---
400
+ "cibuild.go_done": "βœ… Go build verification completed successfully!",
401
+ "cibuild.python_done": "βœ… Python build verification completed successfully!",
402
+ "cibuild.info_title": "πŸ“‹ Build info:",
403
+ "cibuild.info_project": " 🎯 Project: {project}",
404
+ "cibuild.info_branch": " 🌿 Branch: {branch}",
405
+ "cibuild.info_commit": " πŸ“ Commit: {sha}",
406
+ "cibuild.info_time": " ⏰ Verified at: {time}",
407
+ "cibuild.py_no_deps": "::notice::requirements.txt, pyproject.toml and setup.py not found, skipping dependency install",
408
+ "cibuild.py_no_tests_collected": "::notice::No tests collected, skipping pytest",
409
+ "cibuild.py_no_test_files": "::notice::No test files (tests/, test_*.py, ...) found, skipping pytest",
410
+ "cibuild.py_no_dockerfile": "::notice::{path}/Dockerfile not found, skipping Docker build verification",
411
+ "cibuild.node_deps_installing": "πŸ“¦ Installing dependencies...",
412
+ "cibuild.node_deps_done": "βœ… Dependencies installed",
413
+ "cibuild.node_no_test_script": "::notice::No test script in package.json, skipping tests",
414
+ "cibuild.node_test_run": "πŸ§ͺ Running npm test: {script}",
415
+ "cibuild.node_build_start_next": "πŸ”¨ Starting Next.js build...",
416
+ "cibuild.node_build_start": "πŸ”¨ Starting build...",
417
+ "cibuild.node_build_project": "Project: {project}",
418
+ "cibuild.node_build_node": "Node.js: {node}",
419
+ "cibuild.node_build_failed": "❌ Build failed",
420
+ "cibuild.node_build_ok": "βœ… Build complete",
421
+ "cibuild.node_build_output": "πŸ“ Build output:",
422
+ "cibuild.node_build_next_dir": " - .next/ folder created",
423
+ "cibuild.node_errlog_title": "❌ Build failed - error log",
424
+ "cibuild.node_errlog_missing": "Error log file not found.",
425
+ "cibuild.node_result_next_ok": "πŸŽ‰ Next.js build complete!",
426
+ "cibuild.node_result_next_fail": "❌ Next.js build failed",
427
+ "cibuild.node_result_ok": "πŸŽ‰ Build workflow complete!",
428
+ "cibuild.node_result_fail": "❌ Build workflow failed",
429
+ "cibuild.node_result_title": "πŸ“Š Build result:",
430
+ "cibuild.node_result_project": " πŸ“¦ Project: {project}",
431
+ "cibuild.node_result_node": " πŸ“Œ Node.js version: {node}",
432
+ "cibuild.node_result_status": " πŸ†™ Build status: {status}",
433
+ "cibuild.node_result_branch": " 🌿 Branch: {branch}",
434
+ "cibuild.node_result_commit": " πŸ“ Commit: {sha}",
435
+ "cibuild.node_result_time": " πŸ• Time: {time}",
436
+ "cibuild.node_all_ok": "βœ… All steps completed successfully.",
437
+ "cibuild.node_error_occurred": "❌ An error occurred during the build.",
438
+ "cibuild.node_log_hint": "πŸ’‘ Download the 'build-log' artifact from the Actions tab to see the full log.",
439
+ "cibuild.gate_results": "needs results: {results}",
440
+ "cibuild.gate_failed": "Some jobs failed or were cancelled.",
441
+ # --- cicd ---
442
+ "cicd.precheck_secret_title": "Missing required Secret",
443
+ "cicd.precheck_secret_body": "GitHub Secrets not registered:{missing} β€” add them under Settings β†’ Secrets and variables β†’ Actions",
444
+ "cicd.precheck_dockerfile_title": "Dockerfile not found",
445
+ "cicd.precheck_dockerfile_body": "{path} does not exist. This workflow deploys a Docker image, so a Dockerfile is required (delete this workflow file if you do not deploy to a server)",
446
+ "cicd.precheck_ok": "βœ… Pre-check passed: all required Secrets and the Dockerfile are present",
447
+ "cicd.env_file_created": "βœ… {file} created",
448
+ "cicd.dotenv_created": "βœ… .env file created",
449
+ "cicd.disk_before": "πŸ“Š Disk usage before build:",
450
+ "cicd.disk_cleaning": "🧹 Cleaning up unneeded files...",
451
+ "cicd.disk_docker_prune": "🐳 Pruning Docker system...",
452
+ "cicd.disk_after_cleanup": "πŸ“Š Disk usage after cleanup:",
453
+ "cicd.post_build_cleanup": "🧹 Cleaning up after build...",
454
+ "cicd.disk_final": "πŸ“Š Final disk usage:",
455
+ "cicd.setup_env": "πŸ”§ Setting up environment variables..",
456
+ "cicd.ssh_auth": "πŸ” SSH auth method: {method}",
457
+ "cicd.deploy_start": "πŸš€ Deploying to the production environment (branch: {branch})",
458
+ "cicd.branch_unsupported": "⚠️ Unsupported branch: {branch}",
459
+ "cicd.branch_only": "This workflow only supports the {branch} branch.",
460
+ "cicd.branch_hint": "Set the branches to support under on.push.branches.",
461
+ "cicd.container_default": "ℹ️ CONTAINER_NAME is not set, using PROJECT_NAME: {container}",
462
+ "cicd.container_custom": "ℹ️ Using custom CONTAINER_NAME: {container}",
463
+ "cicd.config_title": "πŸ“‹ Deployment settings:",
464
+ "cicd.config_branch": " - Branch: {branch}",
465
+ "cicd.config_project": " - Project: {project}",
466
+ "cicd.config_container": " - Container name: {container}",
467
+ "cicd.config_port": " - Port: {port}",
468
+ "cicd.config_image": " - Docker image: {image}",
469
+ "cicd.pull_image": "⬇️ Pulling Docker image: {image}",
470
+ "cicd.pull_image_short": "⬇️ Pulling Docker image...",
471
+ "cicd.container_check": "🧹 Checking whether container {container} exists...",
472
+ "cicd.container_exists": "⚠️ Container {container} exists. Stopping and removing it...",
473
+ "cicd.container_removed": "βœ… Container {container} removed.",
474
+ "cicd.container_none": "ℹ️ No existing container {container}.",
475
+ "cicd.container_run": "πŸš€ Starting new container {container}...",
476
+ "cicd.volume_mkdir": "πŸ“ Creating volume mount directory: {path}",
477
+ "cicd.volume_on": "πŸ“¦ Volume mount enabled: {opts}",
478
+ "cicd.volume_off": "ℹ️ Volume mount disabled",
479
+ "cicd.health_wait": "⏳ Waiting for the container to initialize... ({seconds}s)",
480
+ "cicd.health_check": "πŸ₯ Checking container health...",
481
+ "cicd.health_no_process": "❌ Container {container} process is not running",
482
+ "cicd.health_process_ok": "βœ… Container process is running",
483
+ "cicd.http_start": "🌐 Starting HTTP health check: {url}",
484
+ "cicd.http_try": " Attempt {i}/{max}...",
485
+ "cicd.http_ok": "βœ… HTTP health check passed (status code: {code})",
486
+ "cicd.http_fail": "⚠️ HTTP health check failed (status code: {code})",
487
+ "cicd.http_retry": " Retrying in {interval}s...",
488
+ "cicd.http_final_fail": "⚠️ HTTP health check finally failed, falling back to log pattern matching...",
489
+ "cicd.http_skipped": "ℹ️ HEALTHCHECK_PATH is not set, using log pattern matching only",
490
+ "cicd.log_start": "πŸ“‹ Starting log pattern matching: '{pattern}'",
491
+ "cicd.log_ok": "βœ… Log pattern matched: the application started normally",
492
+ "cicd.log_fail": "❌ Log pattern not matched: could not find the application start log",
493
+ "cicd.debug_title": "πŸ“‹ Debug info:",
494
+ "cicd.debug_pattern": " - Search pattern: {pattern}",
495
+ "cicd.debug_container": " - Container: {container}",
496
+ "cicd.debug_image": " - Image: {image}",
497
+ "cicd.debug_port": " - Port: {port}",
498
+ "cicd.debug_volume": " - Volume: {volume}",
499
+ "cicd.debug_logs": "πŸ“‹ Container logs (last 50 lines):",
500
+ "cicd.health_done": "βœ… Health check complete: container {container} is running normally",
501
+ "cicd.deploy_done": "βœ… Deployment completed successfully!",
502
+ "cicd.summary_title": "πŸ“‹ Deployment summary:",
503
+ "cicd.summary_project": " 🎯 Project: {project}",
504
+ "cicd.summary_branch": " 🌿 Branch: {branch}",
505
+ "cicd.summary_container": " 🐳 Container: {container}",
506
+ "cicd.summary_port": " 🌐 Port: {port}",
507
+ "cicd.summary_time": " ⏰ Deployed at: {time}",
508
+ "cicd.summary_url": "πŸ”— URL: {url}",
509
+ # --- fastlane ---
510
+ "fastlane.env_empty": "The {name} environment variable is empty. Check that the workflow passes the value.",
511
+ "fastlane.ios_prepare_wait": "DEPLOY_MODE={deploy_mode}: waiting for build processing to finish, then preparing the App Store version.",
512
+ "fastlane.deploy_mode_unknown": "Unknown DEPLOY_MODE '{deploy_mode}'. Treating it as store_only.",
513
+ "fastlane.package_name_empty": "PACKAGE_NAME is empty. Register the ANDROID_PACKAGE_NAME secret or variable. (e.g. com.example.app)",
514
+ "fastlane.android_env_required": "AAB_PATH, GOOGLE_PLAY_JSON_KEY, VERSION_NAME and VERSION_CODE environment variables are all required. Check that the workflow passes them.",
515
+ "fastlane.changelog_missing": "Changelog file not found: {file}",
516
+ "fastlane.play_deploy": "Play deploy: DEPLOY_MODE={deploy_mode} -> track={track}, release_status={release_status}",
517
+ # --- flutter_a ---
518
+ "flutter_a.precheck_missing_title": "Missing required Secret",
519
+ "flutter_a.precheck_missing_body": "GitHub Secrets not registered:{missing} - register them under Settings β†’ Secrets and variables β†’ Actions",
520
+ "flutter_a.precheck_passed": "βœ… Pre-check passed: all required Secrets are present",
521
+ "flutter_a.debug_keystore_empty": "The DEBUG_KEYSTORE Secret is empty, so the build is signed with the runner's default debug key (the signature differs per build)",
522
+ "flutter_a.debug_keystore_created": "Debug Keystore created (signed with DEBUG_KEYSTORE)",
523
+ "flutter_a.gradlew_missing": "ℹ️ gradlew is not in the repository - flutter build will generate it",
524
+ "flutter_a.current_version": "Current version: {current_version}",
525
+ "flutter_a.short_commit_hash": "Short commit hash: {short_commit_hash}",
526
+ "flutter_a.project_type": "πŸ”§ Project type: {project_type}",
527
+ "flutter_a.extracting_v_release_notes_changelog": "πŸ“„ Extracting the v{version} release notes from CHANGELOG.json...",
528
+ "flutter_a.release_notes_extracted": "βœ… Release notes extracted!",
529
+ "flutter_a.extracted_release_notes": "πŸ“‹ Extracted release notes:",
530
+ "flutter_a.failed_extract_release_notes": "❌ Failed to extract release notes",
531
+ "flutter_a.default_release_note": "v{version} update",
532
+ "flutter_a.changelog_json_not_found_using": "⚠️ CHANGELOG.json not found. Using the default release notes.",
533
+ "flutter_a.signing_secrets_empty": "The signing Secrets are empty:{missing} (see the comments at the top of the workflow)",
534
+ "flutter_a.keystore_decoded_empty": "The keystore decoded from RELEASE_KEYSTORE_BASE64 is empty",
535
+ "flutter_a.release_keystore_created": "βœ… Release keystore created",
536
+ "flutter_a.key_properties_created": "βœ… key.properties created",
537
+ "flutter_a.signing_config_must_added_build": "⚠️ A signing config must be added to build.gradle.kts",
538
+ "flutter_a.android_build_config_check_complete": "βœ… Android build config check complete",
539
+ "flutter_a.starting_aab_build": "πŸš€ Starting the AAB build",
540
+ "flutter_a.build_version": "🎯 Build version: {version_name}",
541
+ "flutter_a.build_code": "🎯 Build code: {version_code}",
542
+ "flutter_a.version_name_or_version_code": "❌ VERSION_NAME or VERSION_CODE is empty!",
543
+ "flutter_a.flutter_environment_info": "πŸ” Flutter environment info:",
544
+ "flutter_a.cleaning_previous_build_output": "🧹 Cleaning previous build output...",
545
+ "flutter_a.running_flutter_clean_reinstalling_dependencies": "πŸ”„ Running flutter clean and reinstalling dependencies...",
546
+ "flutter_a.setting_version_info_local_properties": "πŸ”§ Setting version info in local.properties...",
547
+ "flutter_a.local_properties_updated": "βœ… local.properties updated",
548
+ "flutter_a.version_info_version_name_version": "πŸ“‹ Version info: VERSION_NAME={version_name}, VERSION_CODE={version_code}",
549
+ "flutter_a.gradle_tuning_applied": "βœ… Gradle tuning applied",
550
+ "flutter_a.running_flutter_build": "πŸ”¨ Running flutter build...",
551
+ "flutter_a.command_flutter_build_appbundle_release": "πŸ“‹ Command: flutter build appbundle --release --build-name={version_name} --build-number={version_code} --verbose",
552
+ "flutter_a.build_start_time": "⏱️ Build start time: {cmd1}",
553
+ "flutter_a.flutter_build_failed_exit_code": "❌ Flutter build failed! Exit code: {build_exit_code}",
554
+ "flutter_a.build_directory_state": "πŸ” Build directory state:",
555
+ "flutter_a.aab_apk_not_found": "No AAB/APK file found",
556
+ "flutter_a.flutter_build_succeeded": "βœ… Flutter build succeeded!",
557
+ "flutter_a.checking_build_result": "πŸ” Checking the build result:",
558
+ "flutter_a.aab_file_not_created": "❌ The AAB file was not created!",
559
+ "flutter_a.full_build_directory_contents": "πŸ” Full build directory contents:",
560
+ "flutter_a.outputs_directory_structure": "πŸ” outputs directory structure:",
561
+ "flutter_a.outputs_directory_does_not_exist": "The outputs directory does not exist",
562
+ "flutter_a.aab_file_creation_confirmed": "βœ… AAB file creation confirmed",
563
+ "flutter_a.aab_file_size": "πŸ“± AAB file size: {cmd1}",
564
+ "flutter_a.aab_file_info": "πŸ“‹ AAB file info: {cmd1}",
565
+ "flutter_a.downloading_bundletool": "πŸ“¦ Downloading bundletool...",
566
+ "flutter_a.download_url": "πŸ“‹ Download URL: {bundletool_url}",
567
+ "flutter_a.bundletool_download_failed": "❌ bundletool download failed",
568
+ "flutter_a.retrying_fallback_url": "πŸ”„ Retrying with the fallback URL...",
569
+ "flutter_a.bundletool_download_failed_completely": "❌ bundletool download failed completely",
570
+ "flutter_a.bundletool_downloaded": "βœ… bundletool downloaded",
571
+ "flutter_a.bundletool_file_size": "πŸ“‹ bundletool file size: {cmd1}",
572
+ "flutter_a.checking_java_environment": "πŸ” Checking the Java environment:",
573
+ "flutter_a.verifying_version_info_inside_aab": "πŸ” Verifying the version info inside the AAB file",
574
+ "flutter_a.extracting_actual_version_info_aab": "πŸ“‹ Extracting the actual version info from the AAB...",
575
+ "flutter_a.command_run_java_jar_bundletool": "πŸ“‹ Command to run: java -jar bundletool.jar dump manifest --bundle='{aab_file}'",
576
+ "flutter_a.bundletool_result_exit_code": "πŸ“‹ bundletool result (Exit code: {manifest_exit_code}):",
577
+ "flutter_a.manifest_extracted": "βœ… Manifest extracted",
578
+ "flutter_a.version_info_comparison": "🎯 Version info comparison:",
579
+ "flutter_a.expected_version_code": " Expected VERSION_CODE: '{version_code}'",
580
+ "flutter_a.actual_version_code": " Actual VERSION_CODE: '{actual_version_code}'",
581
+ "flutter_a.expected_version_name": " Expected VERSION_NAME: '{version_name}'",
582
+ "flutter_a.actual_version_name": " Actual VERSION_NAME: '{actual_version_name}'",
583
+ "flutter_a.fatal_error_version_code_could": "❌ Fatal error: VERSION_CODE could not be extracted from the AAB!",
584
+ "flutter_a.full_manifest_contents": "πŸ” Full Manifest contents:",
585
+ "flutter_a.fatal_error_version_code_aab": "❌ Fatal error: the VERSION_CODE in the AAB is not what was expected!",
586
+ "flutter_a.google_play_would_reject_version": " Google Play would reject this with a 'version code already used' error.",
587
+ "flutter_a.debugging_info": "πŸ” Debugging info:",
588
+ "flutter_a.version_code_version_yml": " VERSION_CODE in version.yml: {version_code}",
589
+ "flutter_a.version_code_inside_aab_file": " VERSION_CODE inside the AAB file: {actual_version_code}",
590
+ "flutter_a.flags_passed_flutter_build_command": " Flags passed to the flutter build command:",
591
+ "flutter_a.full_manifest_contents_2": " Full Manifest contents:",
592
+ "flutter_a.version_code_check_passed": "βœ… VERSION_CODE check passed: {actual_version_code}",
593
+ "flutter_a.warning_version_name_could_not": "⚠️ Warning: VERSION_NAME could not be extracted from the AAB",
594
+ "flutter_a.warning_version_name_differs_expected": "⚠️ Warning: VERSION_NAME differs from the expected value (not fatal)",
595
+ "flutter_a.expected_actual": " Expected: '{version_name}', actual: '{actual_version_name}'",
596
+ "flutter_a.version_name_check_passed": "βœ… VERSION_NAME check passed: {actual_version_name}",
597
+ "flutter_a.failed_extract_manifest_bundletool": "❌ Failed to extract the Manifest with bundletool",
598
+ "flutter_a.trying_verify_another_way": "πŸ”„ Trying to verify another way...",
599
+ "flutter_a.trying_direct_extraction_unzip": "πŸ“‹ Trying direct extraction with unzip...",
600
+ "flutter_a.version_info_extracted_unzip": "βœ… Version info extracted with unzip:",
601
+ "flutter_a.direct_extraction_unzip_failed_too": "❌ Direct extraction with unzip failed too",
602
+ "flutter_a.skipping_aab_verification_continuing": "⚠️ Skipping the AAB verification and continuing.",
603
+ "flutter_a.aab_build_verification_complete": "βœ… AAB build and verification complete",
604
+ "flutter_a.final_aab": "🎯 Final AAB: {aab_file}",
605
+ "flutter_a.file_size": "πŸ“± File size: {cmd1}",
606
+ "flutter_a.google_play_service_account_json": "The GOOGLE_PLAY_SERVICE_ACCOUNT_JSON_BASE64 Secret is empty",
607
+ "flutter_a.service_account_json_configured": "βœ… Service Account JSON configured",
608
+ "flutter_a.using_repository_gemfile": "ℹ️ Using the repository Gemfile",
609
+ "flutter_a.fastlane_installed_bundler": "βœ… Fastlane installed (Bundler)",
610
+ "flutter_a.fastfile_copied_fastfile_playstore_fastfile": "βœ… Fastfile copied (Fastfile.playstore β†’ Fastfile)",
611
+ "flutter_a.fastfile_contents": "πŸ“‹ Fastfile contents:",
612
+ "flutter_a.starting_play_store_deployment": "πŸš€ Starting the Play Store deployment",
613
+ "flutter_a.deploy_start_time": "πŸ• Deploy start time: {cmd1}",
614
+ "flutter_a.version_info_deploy": "πŸ“‹ Version info to deploy:",
615
+ "flutter_a.fatal_error_version_name_or": "❌ Fatal error: VERSION_NAME or VERSION_CODE is empty!",
616
+ "flutter_a.means_prepare_build_job_did": "This means the prepare-build job did not pass its outputs correctly.",
617
+ "flutter_a.aab_file_path": "πŸ“¦ AAB file path: {aab_path}",
618
+ "flutter_a.aab_file_not_found": "❌ AAB file not found!",
619
+ "flutter_a.build_directory_contents": "πŸ” Build directory contents:",
620
+ "flutter_a.directory_does_not_exist": "The directory does not exist",
621
+ "flutter_a.full_build_directory_structure": "πŸ” Full build directory structure:",
622
+ "flutter_a.aab_file_exists": "βœ… AAB file exists",
623
+ "flutter_a.verifying_aab_version": "πŸ” Verifying the AAB version...",
624
+ "flutter_a.aab_version_code": "πŸ“‹ AAB version: {final_version_name} (code: {final_version_code})",
625
+ "flutter_a.error_aab_version_code_not": "❌ Error: the AAB version code is not what was expected! (expected: {version_code}, actual: {final_version_code})",
626
+ "flutter_a.version_check_passed": "βœ… Version check passed",
627
+ "flutter_a.version_check_failed_continuing_deployment": "⚠️ Version check failed, continuing with the deployment",
628
+ "flutter_a.changelog_ready_version_code": "βœ… Changelog ready (version code: {version_code})",
629
+ "flutter_a.default_release_note_name": "v{version_name} update",
630
+ "flutter_a.created_default_changelog_version_code": "⚠️ Created a default changelog (version code: {version_code})",
631
+ "flutter_a.service_account_json_file_not": "❌ Service Account JSON file not found",
632
+ "flutter_a.running_play_store_deployment": "πŸš€ Running the Play Store deployment",
633
+ "flutter_a.version_code": "🎯 Version: {version_name} (code: {version_code})",
634
+ "flutter_a.play_store_internal_testing_deployment": "βœ… Play Store internal testing deployment succeeded!",
635
+ "flutter_a.version": "Version: {version} ({version_code})",
636
+ "flutter_a.commit": "Commit: {sha}",
637
+ "flutter_a.how_testers_check_build": "πŸ“± How testers check the build:",
638
+ "flutter_a.play_console_test_release_internal": "1. Play Console β†’ Test and release β†’ Internal testing",
639
+ "flutter_a.share_test_link_your_testers": "2. Share the test link with your testers",
640
+ "flutter_a.play_store_deployment_failed": "❌ Play Store deployment failed!",
641
+ "flutter_a.please_check_logs": "Please check the logs.",
642
+ "flutter_a.precheck_firebase_app_id_title": "FIREBASE_APP_ID not set",
643
+ "flutter_a.precheck_firebase_app_id_body": "Replace FIREBASE_APP_ID in the workflow env section with the app ID from the Firebase Console",
644
+ "flutter_a.precheck_passed_firebase": "βœ… Pre-check passed: all required Secrets and FIREBASE_APP_ID are present",
645
+ "flutter_a.firebase_service_account_json_base64": "The FIREBASE_SERVICE_ACCOUNT_JSON_BASE64 Secret is empty",
646
+ "flutter_a.firebase_service_account_json_file": "βœ… Firebase service account JSON file created",
647
+ "flutter_a.firebase_app_distribution_deployment_succeeded": "βœ… Firebase App Distribution deployment succeeded!",
648
+ "flutter_a.launch_firebase_app_tester_app": "1. Launch the Firebase App Tester app",
649
+ "flutter_a.select_app": "2. Select the app",
650
+ "flutter_a.download_latest_build": "3. Download the latest build",
651
+ "flutter_a.firebase_app_distribution_deployment_failed": "❌ Firebase App Distribution deployment failed!",
652
+ "flutter_a.ci_config_header": "πŸ“‹ CI settings:",
653
+ "flutter_a.ci_config_trigger": " Trigger: {event_name}",
654
+ "flutter_a.ci_info_header": "πŸ“‹ Build info:",
655
+ "flutter_a.ci_info_branch": " Branch: {branch_name}",
656
+ "flutter_a.ci_info_commit": " Commit: {commit_hash}",
657
+ "flutter_a.ci_analyze_start": "πŸ” Starting Flutter code analysis...",
658
+ "flutter_a.ci_analyze_done": "βœ… Code analysis complete",
659
+ "flutter_a.ci_test_start": "πŸ§ͺ Starting Flutter tests...",
660
+ "flutter_a.ci_test_passed": "βœ… Tests passed",
661
+ "flutter_a.ci_test_skipped_title": "Flutter tests skipped",
662
+ "flutter_a.ci_test_skipped_body": "flutter test was not run because test/ has no *_test.dart files",
663
+ "flutter_a.ci_apk_start": "πŸ“¦ Starting the Flutter APK build (debug)...",
664
+ "flutter_a.ci_apk_done": "βœ… APK build complete",
665
+ "flutter_a.ci_podfile_missing": "ℹ️ ios/Podfile not found, skipping pod install (no CocoaPods plugins)",
666
+ "flutter_a.ci_ios_start": "πŸ“¦ Starting the Flutter iOS build...",
667
+ "flutter_a.ci_ios_done": "βœ… iOS build complete",
668
+ "flutter_a.ci_gate_results": "needs results: {results}",
669
+ "flutter_a.ci_gate_failed": "A job failed or was cancelled.",
670
+ "flutter_a.ci_hdr_analyze_running": "## πŸ” Flutter CI (Analyze Only) in progress...",
671
+ "flutter_a.ci_hdr_running": "## πŸ”¨ Flutter CI in progress...",
672
+ "flutter_a.ci_status_skipped": "⏸️ Skipped",
673
+ "flutter_a.ci_status_running": "⏳ In progress...",
674
+ "flutter_a.ci_status_disabled": "⏸️ Disabled",
675
+ "flutter_a.ci_table_head": "| Check | Status | Duration |",
676
+ "flutter_a.ci_row_analyze_running": "| πŸ” Analyze | ⏳ In progress... | - |",
677
+ "flutter_a.ci_row_test_running": "| πŸ§ͺ Test | ⏳ In progress... | - |",
678
+ "flutter_a.ci_row_android_pending": "| πŸ€– Android build | {status} | - |",
679
+ "flutter_a.ci_row_ios_pending": "| 🍎 iOS build | {status} | - |",
680
+ "flutter_a.ci_info_head": "| Item | Value |",
681
+ "flutter_a.ci_row_branch": "| **Branch** | `{branch}` |",
682
+ "flutter_a.ci_row_commit": "| **Commit** | `{commit}` |",
683
+ "flutter_a.ci_note_analyze_only_running": "ℹ️ **Analyze Only mode**: only the code analysis runs, without builds.",
684
+ "flutter_a.ci_link_live_log": "**[πŸ“‹ View live logs]({url})**",
685
+ "flutter_a.ci_footer_auto_update": "*πŸ€– This comment is updated automatically.*",
686
+ "flutter_a.ci_log_comment_created": "βœ… Progress comment created: #{id}",
687
+ "flutter_a.ci_dur_min_sec": "{minutes}m {seconds}s",
688
+ "flutter_a.ci_dur_sec": "{seconds}s",
689
+ "flutter_a.ci_log_analyze_result": "πŸ“‹ Code analysis result: {status}, tests: {test} ({duration})",
690
+ "flutter_a.ci_log_android_result": "πŸ“‹ Android build result: {status} ({duration})",
691
+ "flutter_a.ci_log_ios_result": "πŸ“‹ iOS build result: {status} ({duration})",
692
+ "flutter_a.ci_status_success": "βœ… Success",
693
+ "flutter_a.ci_status_failure": "❌ Failed",
694
+ "flutter_a.ci_status_no_tests": "⏸️ No tests",
695
+ "flutter_a.ci_status_not_run": "⏸️ Not run",
696
+ "flutter_a.ci_hdr_analyze_success": "## βœ… Flutter CI (Analyze Only) succeeded!",
697
+ "flutter_a.ci_hdr_analyze_failure": "## ❌ Flutter CI (Analyze Only) failed",
698
+ "flutter_a.ci_hdr_success": "## βœ… Flutter CI succeeded!",
699
+ "flutter_a.ci_hdr_failure": "## ❌ Flutter CI failed",
700
+ "flutter_a.ci_row_android_result": "| πŸ€– Android build | {status} | {duration} |",
701
+ "flutter_a.ci_row_ios_result": "| 🍎 iOS build | {status} | {duration} |",
702
+ "flutter_a.ci_row_total": "| **Total duration** | {duration} |",
703
+ "flutter_a.ci_note_analyze_only_done": "ℹ️ **Analyze Only mode**: only the code analysis ran, without builds.",
704
+ "flutter_a.ci_hdr_checks": "### πŸ’‘ Things to check",
705
+ "flutter_a.ci_analyze_fail_title": "**If Analyze failed:**",
706
+ "flutter_a.ci_analyze_fail_lint": "- Run `flutter analyze` locally to check the lint errors",
707
+ "flutter_a.ci_analyze_fail_fix": "- Fix code style and type errors",
708
+ "flutter_a.ci_test_fail_title": "**If Test failed:**",
709
+ "flutter_a.ci_test_fail_local": "- Run `flutter test` locally to find the failing tests",
710
+ "flutter_a.ci_android_fail_title": "**If the Android build failed:**",
711
+ "flutter_a.ci_android_fail_gradle": "- Check the errors in the Gradle build log",
712
+ "flutter_a.ci_android_fail_deps": "- Check dependency version compatibility",
713
+ "flutter_a.ci_ios_fail_title": "**If the iOS build failed:**",
714
+ "flutter_a.ci_ios_fail_xcode": "- Check the errors in the Xcode build log",
715
+ "flutter_a.ci_ios_fail_pods": "- Check the CocoaPods dependencies",
716
+ "flutter_a.ci_link_workflow_log": "**[πŸ“‹ Workflow log]({url})**",
717
+ "flutter_a.ci_log_result_updated": "βœ… Result comment updated",
718
+ "flutter_a.ci_log_no_comment_id": "⚠️ No comment ID, skipping the update.",
719
+ # --- ios_test_tf ---
720
+ "ios_test_tf.branch_check_log": "πŸ” Checking that the branch exists: {branch}",
721
+ "ios_test_tf.branch_exists_log": "βœ… Branch exists: {branch}",
722
+ "ios_test_tf.branch_not_found_log": "❌ Branch not found: {branch}",
723
+ "ios_test_tf.branch_missing_title": "🍎 ❌ **iOS TestFlight build failed - branch not found**",
724
+ "ios_test_tf.kv_head": "| Item | Value |",
725
+ "ios_test_tf.row_requested_branch": "| **Requested branch** | `{branch}` |",
726
+ "ios_test_tf.row_issue_pr": "| **Issue/PR** | #{number} |",
727
+ "ios_test_tf.hint_title": "### πŸ’‘ Things to check",
728
+ "ios_test_tf.hint_pushed": "1. Make sure the branch has been pushed to the remote repository",
729
+ "ios_test_tf.hint_helper_branch": "2. Make sure the branch name in the \"Issue Helper\" comment is correct",
730
+ "ios_test_tf.hint_typo": "3. Make sure the branch name has no typos",
731
+ "ios_test_tf.workflow_log_link": "πŸ”— [Workflow log]({url})",
732
+ "ios_test_tf.branch_not_found_fail": "Branch not found: {branch}",
733
+ "ios_test_tf.branch_check_error_fail": "Error while checking the branch: {error}",
734
+ "ios_test_tf.title_running": "## 🍎 iOS TestFlight build in progress...",
735
+ "ios_test_tf.table_header": "| Step | Status | Duration |",
736
+ "ios_test_tf.step_prepare": "πŸ”§ Prepare",
737
+ "ios_test_tf.step_build": "πŸ”¨ IPA build",
738
+ "ios_test_tf.step_deploy": "πŸ“€ TestFlight deploy",
739
+ "ios_test_tf.st_running": "⏳ In progress...",
740
+ "ios_test_tf.st_waiting": "⏸️ Waiting",
741
+ "ios_test_tf.st_done": "βœ… Done",
742
+ "ios_test_tf.st_failed": "❌ Failed",
743
+ "ios_test_tf.st_canceled": "⏸️ Canceled",
744
+ "ios_test_tf.row_build_number": "| **Build number** | `{build}` |",
745
+ "ios_test_tf.row_app_version": "| **App version** | `{version}({build})` |",
746
+ "ios_test_tf.row_branch": "| **Branch** | `{branch}` |",
747
+ "ios_test_tf.row_commit": "| **Commit** | `{commit}` |",
748
+ "ios_test_tf.row_total": "| **Total duration** | {elapsed} |",
749
+ "ios_test_tf.live_log_link": "**[πŸ“‹ View live log]({url})**",
750
+ "ios_test_tf.auto_update_note": "*πŸ€– This comment is updated automatically.*",
751
+ "ios_test_tf.log_progress_created": "βœ… Progress comment created: #{id}",
752
+ "ios_test_tf.elapsed_min_sec": "{m}m {s}s",
753
+ "ios_test_tf.elapsed_sec": "{s}s",
754
+ "ios_test_tf.secrets_missing": "Required GitHub Secrets are empty:{missing} (see the comments at the top of the workflow)",
755
+ "ios_test_tf.export_options_missing": "ios/ExportOptions.plist not found β€” add it to the repository and commit it.",
756
+ "ios_test_tf.export_options_placeholders": "ios/ExportOptions.plist still contains unfilled placeholders β€” replace them with your team ID, bundle ID and provisioning profile name, then commit.",
757
+ "ios_test_tf.fastfile_missing_error": "ios/fastlane/Fastfile not found β€” add it to the repository and commit it.",
758
+ "ios_test_tf.preflight_ok": "βœ… Deploy settings verified",
759
+ "ios_test_tf.event_dispatch": "πŸ“‹ repository_dispatch event detected",
760
+ "ios_test_tf.event_pr_number": " PR number: #{pr}",
761
+ "ios_test_tf.event_build_number_pr": " Build number: {build} (from the PR number)",
762
+ "ios_test_tf.event_workflow_dispatch": "πŸ“‹ workflow_dispatch event detected",
763
+ "ios_test_tf.event_build_number_default": " Build number: {build} (default)",
764
+ "ios_test_tf.test_build_log": "πŸ“‹ Test build: version={version}, build number={build}",
765
+ "ios_test_tf.branch_name_log": "🌿 Branch name: {branch}",
766
+ "ios_test_tf.issue_number_missing": "⚠️ Could not find an issue number in the branch name.",
767
+ "ios_test_tf.issue_number_extracted": "βœ… Extracted issue number: #{number}",
768
+ "ios_test_tf.issue_fetching": "πŸ” Fetching issue info from the GitHub API...",
769
+ "ios_test_tf.issue_title_default": "Issue info not available",
770
+ "ios_test_tf.issue_not_found": "⚠️ Issue #{number} not found.",
771
+ "ios_test_tf.issue_title_log": "πŸ“‹ Issue title: {title}",
772
+ "ios_test_tf.issue_state_log": "πŸ“Œ Issue state: {state}",
773
+ "ios_test_tf.notes_build": "Test build #{build}",
774
+ "ios_test_tf.notes_branch": "Branch: {branch}",
775
+ "ios_test_tf.notes_commit": "Commit: {commit}",
776
+ "ios_test_tf.notes_date": "Date: {date}",
777
+ "ios_test_tf.notes_issue_header": "Related issue:",
778
+ "ios_test_tf.notes_generated": "πŸ“‹ Generated release notes:",
779
+ "ios_test_tf.title_prepare_failed": "## 🍎 ❌ iOS TestFlight build failed",
780
+ "ios_test_tf.prepare_error": "❌ **An error occurred while preparing the environment.**",
781
+ "ios_test_tf.run_log_check_link": "πŸ”— [Check the workflow run log]({url})",
782
+ "ios_test_tf.log_prepare_failed": "❌ Progress update complete: prepare failed",
783
+ "ios_test_tf.log_prepare_done": "βœ… Progress update complete: prepare done ({elapsed})",
784
+ "ios_test_tf.podfile_skip": "ℹ️ ios/Podfile not found, skipping pod install (no CocoaPods plugins)",
785
+ "ios_test_tf.plist_missing": "❌ ios/ExportOptions.plist not found!",
786
+ "ios_test_tf.plist_missing_hint": "Add ios/ExportOptions.plist to the repository and commit it. See the comments at the top of the workflow for the required Secrets.",
787
+ "ios_test_tf.plist_ok": "βœ… ExportOptions.plist verified",
788
+ "ios_test_tf.title_ipa_done": "## 🍎 βœ… iOS build complete",
789
+ "ios_test_tf.log_ipa_done": "βœ… Progress update complete: IPA build done ({elapsed})",
790
+ "ios_test_tf.title_ipa_failed": "## 🍎 ❌ iOS TestFlight build failed",
791
+ "ios_test_tf.ipa_error": "❌ **An error occurred while building the IPA.**",
792
+ "ios_test_tf.log_ipa_failed": "❌ Progress update complete: IPA build failed",
793
+ "ios_test_tf.fastfile_missing": "❌ ios/fastlane/Fastfile not found!",
794
+ "ios_test_tf.fastfile_missing_hint": "Add ios/fastlane/Fastfile to the repository and commit it. See the comments at the top of the workflow for the required Secrets.",
795
+ "ios_test_tf.fastfile_ok": "βœ… Fastfile found: ios/fastlane/Fastfile",
796
+ "ios_test_tf.gemfile_repo": "ℹ️ Using the repository's Gemfile",
797
+ "ios_test_tf.ipa_missing": "❌ IPA file not found!",
798
+ "ios_test_tf.default_notes_echo": "πŸ“ Default Release Notes: {notes}",
799
+ "ios_test_tf.upload_ok": "βœ… TestFlight test build upload succeeded!",
800
+ "ios_test_tf.upload_version": "Version: {version}",
801
+ "ios_test_tf.upload_build": "Build number: {build}",
802
+ "ios_test_tf.upload_pr": "PR number: {pr}",
803
+ "ios_test_tf.upload_branch": "Branch: {branch}",
804
+ "ios_test_tf.upload_commit": "Commit: {sha}",
805
+ "ios_test_tf.upload_issue": "Related issue: {url}",
806
+ "ios_test_tf.upload_failed": "❌ TestFlight test build upload failed!",
807
+ "ios_test_tf.check_logs": "Please check the logs.",
808
+ "ios_test_tf.title_deploy_done": "## 🍎 βœ… iOS TestFlight deploy complete",
809
+ "ios_test_tf.download_hint": "πŸ“± **You can download the test app from TestFlight.**",
810
+ "ios_test_tf.run_log_link": "πŸ”— [Workflow run log]({url})",
811
+ "ios_test_tf.log_all_done": "βœ… Final progress update complete: everything succeeded ({elapsed})",
812
+ "ios_test_tf.title_deploy_failed": "## 🍎 ❌ iOS TestFlight deploy failed",
813
+ "ios_test_tf.deploy_error": "❌ **An error occurred while deploying to TestFlight.**",
814
+ "ios_test_tf.log_deploy_failed": "❌ Final progress update complete: TestFlight deploy failed",
815
+ # --- ios_testflight ---
816
+ "ios_testflight.secrets_missing": "Required GitHub Secrets are empty:{missing} (see the comments at the top of the workflow)",
817
+ "ios_testflight.export_options_missing": "ios/ExportOptions.plist not found β€” add it to the repository and commit it.",
818
+ "ios_testflight.export_options_placeholders": "ios/ExportOptions.plist still contains unfilled placeholders β€” replace them with your team ID, bundle ID and provisioning profile name, then commit.",
819
+ "ios_testflight.fastfile_missing_error": "ios/fastlane/Fastfile not found β€” add it to the repository and commit it.",
820
+ "ios_testflight.preflight_ok": "βœ… Deploy settings verified",
821
+ "ios_testflight.podfile_skip": "ℹ️ ios/Podfile not found, skipping pod install (no CocoaPods plugins)",
822
+ "ios_testflight.version_info": "πŸ“‹ Version: {version} (build number: {build})",
823
+ "ios_testflight.default_notes": "v{version} update",
824
+ "ios_testflight.plist_placeholders": "❌ ios/ExportOptions.plist still contains unfilled placeholders:",
825
+ "ios_testflight.plist_placeholders_hint": "Replace them with your team ID, bundle ID and provisioning profile name, commit, and run again.",
826
+ "ios_testflight.fastfile_missing": "❌ ios/fastlane/Fastfile not found!",
827
+ "ios_testflight.fastfile_missing_hint": "Add ios/fastlane/Fastfile to the repository and commit it. See the comments at the top of the workflow for the required Secrets.",
828
+ "ios_testflight.fastfile_ok": "βœ… Fastfile found: ios/fastlane/Fastfile",
829
+ "ios_testflight.gemfile_repo": "ℹ️ Using the repository's Gemfile",
830
+ "ios_testflight.ipa_missing": "❌ IPA file not found!",
831
+ "ios_testflight.default_notes_echo": "πŸ“ Default Release Notes: {notes}",
832
+ "ios_testflight.upload_ok": "βœ… TestFlight upload succeeded!",
833
+ "ios_testflight.upload_version": "πŸ“± Version: {version}",
834
+ "ios_testflight.upload_build": "πŸ”’ Build number: {build}",
835
+ "ios_testflight.upload_commit": "πŸ“ Commit: {sha}",
836
+ "ios_testflight.upload_failed": "❌ TestFlight upload failed!",
837
+ "ios_testflight.check_logs": "Please check the logs.",
838
+ # --- issue_helper ---
839
+ "issue_helper.err_list_comments": "Failed to list issue comments ({status}): {issue_number}",
840
+ "issue_helper.err_update_comment": "Failed to update comment ({status})",
841
+ "issue_helper.comment_updated": "Updated the existing comment.",
842
+ "issue_helper.err_create_comment": "Failed to create comment ({status})",
843
+ "issue_helper.comment_created": "Created a new comment.",
844
+ "issue_helper.err_repo_info": "Failed to fetch repository info ({status})",
845
+ "issue_helper.err_base_ref": "Failed to fetch base branch ref ({base}, {status})",
846
+ "issue_helper.branch_exists": "Branch already exists, skipping: {branch_name}",
847
+ "issue_helper.err_create_branch": "Failed to create branch ({branch_name}, {status})",
848
+ "issue_helper.branch_created": "Branch created: {branch_name}",
849
+ "issue_helper.warn_issue_missing": "::warning::Issue #{n} does not exist in the repo, excluded from the PR body Closes links",
850
+ "issue_helper.warn_is_pr": "::warning::#{n} is a PR, not an issue, excluded from the Closes links",
851
+ "issue_helper.issue_check_failed": "Could not verify issue #{n} ({status}) β€” linking it as is",
852
+ "issue_helper.no_issue_to_link": "No issues to link β€” skipping (PR #{pr_number})",
853
+ "issue_helper.err_get_pr": "Failed to fetch PR ({status}): {pr_number}",
854
+ "issue_helper.link_unchanged": "No change to issue links β€” skipping (PR #{pr_number})",
855
+ "issue_helper.err_update_pr": "Failed to update PR body ({status}): {pr_number}",
856
+ "issue_helper.link_done": "Issues linked: {numbers} (PR #{pr_number})",
857
+ "issue_helper.err_no_event_path": "ERROR: GITHUB_EVENT_PATH is not set.",
858
+ "issue_helper.err_event_payload": "ERROR: cannot read the event payload: {error}",
859
+ "issue_helper.not_relevant_event": "Not an opened or title-edited event -> exiting",
860
+ "issue_helper.err_repo_format": "ERROR: GITHUB_REPOSITORY has an invalid format: {repo}",
861
+ "issue_helper.err_no_token": "ERROR: GITHUB_TOKEN is not set.",
862
+ "issue_helper.commit_template_default": "${issueTitle} : feat : {description of the change} ${issueUrl}",
863
+ "issue_helper.branch_title": "Branch name",
864
+ "issue_helper.commit_title": "Commit message",
865
+ "issue_helper.no_issue_numbers": "No issue numbers β€” skipping",
866
+ "issue_helper.run_failed": "Run failed: {error}",
867
+ # --- truncate ---
868
+ "truncate.file_missing": "Release notes file not found, skipping: {path}",
869
+ "truncate.within_limit": "Within limit ({length}/{limit} {mode}), not truncating: {path}",
870
+ "truncate.truncated": "Over limit ({length} -> truncated to at most {limit} {mode}): {path}",
871
+ "truncate.limit_positive": "ERROR: limit must be a positive integer: {limit}",
872
+ # --- version ---
873
+ "version.bump_help": "bump level (default patch β€” same as before when not given)",
874
+ # --- wf_aisum ---
875
+ "wf_aisum.no_issue_in_branch": "No issue number found in the branch name β€” skipping: {ref}",
876
+ # --- wf_changelog ---
877
+ "wf_changelog.pr_list_limit": "gh pr list reached --limit 200 β€” older merged PRs may be missing (PRs fetched: {count})",
878
+ "wf_changelog.no_issues": "No issues to link for this release β€” skipping",
879
+ "wf_changelog.issues_linked": "Linked issues: {issues}",
880
+ "wf_changelog.merge_conflict": "The release PR conflicts with {prod} (version files, CHANGELOG, etc.) β€” merge the commits that exist only on {prod} into {dev} and push: git checkout {dev} && git merge origin/{prod} (for a version-line conflict either side is fine, the next run re-confirms it correctly)",
881
+ "wf_changelog.merge_commit_disabled": "Merge commits are disabled in this repo β€” turn on 'Allow merge commits' in Settings; release detection relies on the merge commit subject",
882
+ "wf_changelog.merge_confirmed": "PR #{pr} merge confirmed (elapsed {elapsed}s)",
883
+ "wf_changelog.merge_timeout": "Could not confirm the merge of PR #{pr} within {max}s β€” skipping the automatic RELEASE-PUBLISH trigger. If WORKFLOW_PAT is registered the normal path proceeds; otherwise run RELEASE-PUBLISH manually via workflow_dispatch if needed.",
884
+ "wf_changelog.release_publish_triggered": "RELEASE-PUBLISH workflow_dispatch trigger requested (works without WORKFLOW_PAT)",
885
+ # --- wf_preview ---
886
+ "wf_preview.chk_deleted_3": "3. Check that the branch has not been deleted",
887
+ "wf_preview.chk_helper_exists": "1. Check that the Issue Helper comment exists",
888
+ "wf_preview.chk_helper_marker": "3. Check that the `ISSUE_HELPER_MARKER` environment variable is correct",
889
+ "wf_preview.chk_helper_section": "2. Check that the comment has a `### Branch name` section",
890
+ "wf_preview.chk_name_1": "1. Check that the branch name is correct",
891
+ "wf_preview.chk_name_2": "2. Check that the branch name is correct",
892
+ "wf_preview.chk_pushed_1": "1. Check that the branch has been pushed",
893
+ "wf_preview.chk_pushed_2": "2. Check that the branch has been pushed",
894
+ "wf_preview.cmd_advanced": "<summary>πŸ”§ Advanced commands (control from another issue/PR)</summary>",
895
+ "wf_preview.cmd_build": "| `/wizard server build` | Redeploy with the latest commit |",
896
+ "wf_preview.cmd_build_branch": "| `/wizard server build {branchName}` | Redeploy with the latest commit |",
897
+ "wf_preview.cmd_destroy": "| `/wizard server destroy` | Delete the preview environment |",
898
+ "wf_preview.cmd_destroy_branch": "| `/wizard server destroy {branchName}` | Delete the preview environment |",
899
+ "wf_preview.cmd_detected_build": "βœ… Command detected: build",
900
+ "wf_preview.cmd_detected_build_branch": "βœ… Command detected: build (branch: {branch})",
901
+ "wf_preview.cmd_detected_destroy": "βœ… Command detected: destroy",
902
+ "wf_preview.cmd_detected_destroy_branch": "βœ… Command detected: destroy (branch: {branch})",
903
+ "wf_preview.cmd_detected_status": "βœ… Command detected: status",
904
+ "wf_preview.cmd_detected_status_branch": "βœ… Command detected: status (branch: {branch})",
905
+ "wf_preview.cmd_from_issue": "ℹ️ Command detected in an issue comment",
906
+ "wf_preview.cmd_from_pr": "ℹ️ Command detected in a PR comment",
907
+ "wf_preview.cmd_not_wizard": "ℹ️ Not a /wizard server command",
908
+ "wf_preview.cmd_status": "| `/wizard server status` | Check the current status |",
909
+ "wf_preview.cmd_status_branch": "| `/wizard server status {branchName}` | Check the current status |",
910
+ "wf_preview.deploy_hint": "To deploy: `/wizard server build`",
911
+ "wf_preview.deploy_hint_branch": "To deploy: `/wizard server build {branchName}`",
912
+ "wf_preview.done_label": "Done",
913
+ "wf_preview.dur_min_sec": "{minutes}m {seconds}s",
914
+ "wf_preview.dur_sec": "{seconds}s",
915
+ "wf_preview.env_branch": "| **Branch** | `{branchName}` |",
916
+ "wf_preview.env_commit": "| **Commit** | `{sha}` |",
917
+ "wf_preview.env_container_issue": "| **Container** | `{projectName}-pr-{issueNumber}` |",
918
+ "wf_preview.env_container_name": "| **Container** | `{containerName}` |",
919
+ "wf_preview.env_container_num": "| **Container** | `{projectName}-pr-{number}` |",
920
+ "wf_preview.env_container_pr": "| **Container** | `{projectName}-pr-{prNumber}` |",
921
+ "wf_preview.env_marker": "| **Marker** | `{marker}` |",
922
+ "wf_preview.env_status_absent": "| **Status** | πŸ”΄ Not Found |",
923
+ "wf_preview.env_status_deleted": "| **Status** | Deleted |",
924
+ "wf_preview.env_status_running": "| **Status** | 🟒 Running |",
925
+ "wf_preview.fail_branch_missing": "Branch not found",
926
+ "wf_preview.fail_branch_missing_named": "Branch not found: {branchName}",
927
+ "wf_preview.footer_context": "*πŸ€– This comment was generated automatically by the {contextType} Preview system.*",
928
+ "wf_preview.footer_custom": "*πŸ€– This comment was generated automatically by the Custom Branch Preview system.*",
929
+ "wf_preview.footer_generic": "*πŸ€– This comment was generated automatically by the Preview system.*",
930
+ "wf_preview.footer_issue": "*πŸ€– This comment was generated automatically by the Issue Preview system.*",
931
+ "wf_preview.footer_pr": "*πŸ€– This comment was generated automatically by the PR Preview system.*",
932
+ "wf_preview.footer_pr_issue": "*πŸ€– This comment was generated automatically by the PR/Issue Preview system.*",
933
+ "wf_preview.footer_progress": "*πŸ€– This comment is updated automatically.*",
934
+ "wf_preview.hint_docker": "- Docker image build failed",
935
+ "wf_preview.hint_docker_go": "- Docker image build failed (Go dependency/build problem)",
936
+ "wf_preview.hint_docker_python": "- Docker image build failed (Python dependency problem)",
937
+ "wf_preview.hint_env_missing": "- Missing environment variables (check the .env file)",
938
+ "wf_preview.hint_gradle": "- Gradle build failed",
939
+ "wf_preview.hint_health_timeout": "- Health check timed out (startup did not finish within 120 seconds)",
940
+ "wf_preview.hint_secrets": "- Required secrets (DOCKERHUB_*, SERVER_*) not registered or Dockerfile missing β†’ check the \"Deploy pre-check\" step in the log",
941
+ "wf_preview.hint_server_conn": "- Server connection problem",
942
+ "wf_preview.hint_start": "- Container failed to start",
943
+ "wf_preview.hint_start_go": "- Container failed to start (application startup error)",
944
+ "wf_preview.hint_start_python": "- Container failed to start (FastAPI/Uvicorn startup error)",
945
+ "wf_preview.hint_start_spring": "- Container failed to start (Spring Boot startup error)",
946
+ "wf_preview.line_branch": "**Branch**: `{branchName}`",
947
+ "wf_preview.line_commit": "**Commit**: `{sha}`",
948
+ "wf_preview.link_build_logs": "**[πŸ“‹ View build/deploy logs]({runUrl})**",
949
+ "wf_preview.link_logs": "**[πŸ“‹ View live logs]({runUrl})**",
950
+ "wf_preview.log_branch_exists": "βœ… Branch exists: {branchName}",
951
+ "wf_preview.log_branch_found": "βœ… Branch found: {branchName}",
952
+ "wf_preview.log_branch_missing": "❌ Branch not found: {branchName}",
953
+ "wf_preview.log_check_branch": "πŸ” Checking branch: {branchName}",
954
+ "wf_preview.log_check_exists": "πŸ” Checking that the branch exists: {branchName}",
955
+ "wf_preview.log_hash": "βœ… Hash generated: custom-{hashStr}",
956
+ "wf_preview.log_helper_no_branch": "⚠️ No branch found in the Issue Helper comment.",
957
+ "wf_preview.log_issue_number": "βœ… Issue number extracted: #{n}",
958
+ "wf_preview.log_marker": "πŸ“ Marker: {marker}",
959
+ "wf_preview.log_search_branch": "πŸ” Searching issue #{issueNumber} for a branch...",
960
+ "wf_preview.next_logs": "1. Check the build/deploy logs at the link above",
961
+ "wf_preview.next_retry": "2. Fix the problem and try again: `/wizard server build`",
962
+ "wf_preview.next_retry_branch": "2. Fix the problem and try again: `/wizard server build {branchName}`",
963
+ "wf_preview.precheck_dockerfile_body": "{path} does not exist. This workflow deploys a Docker image, so a Dockerfile is required (delete this workflow file if you do not deploy to a server)",
964
+ "wf_preview.precheck_dockerfile_title": "Dockerfile not found",
965
+ "wf_preview.precheck_ok": "βœ… Pre-check passed: all required Secrets and the Dockerfile are present",
966
+ "wf_preview.precheck_secret_body": "GitHub secrets not registered:{missing} β€” add them under Settings β†’ Secrets and variables β†’ Actions",
967
+ "wf_preview.precheck_secret_title": "Missing required secrets",
968
+ "wf_preview.r_container_absent": "❌ Container not found",
969
+ "wf_preview.r_container_confirmed": "βœ… Container confirmed running",
970
+ "wf_preview.r_container_exited": "❌ Container exited abnormally!",
971
+ "wf_preview.r_container_logs": "πŸ“‹ Container logs (last 100 lines):",
972
+ "wf_preview.r_container_missing_info": "ℹ️ Container does not exist: {container_name}",
973
+ "wf_preview.r_container_name": "πŸ“› Container: {container_name}",
974
+ "wf_preview.r_container_new_named": "🐳 Starting new container: {container_name}",
975
+ "wf_preview.r_container_removing": "🐳 Removing container...",
976
+ "wf_preview.r_container_removing_named": "πŸ—‘οΈ Removing container: {container_name}",
977
+ "wf_preview.r_container_running": "βœ… Container is running",
978
+ "wf_preview.r_container_starting": "🐳 Starting new container...",
979
+ "wf_preview.r_deploy_done": "βœ… Deployment complete!",
980
+ "wf_preview.r_deploy_failed_not_running": "❌ Deployment failed: the container is not running",
981
+ "wf_preview.r_deploy_head_custom": "πŸš€ Custom Branch Preview deployment started",
982
+ "wf_preview.r_deploy_head_custom_short": "πŸš€ Custom Branch Preview deployment",
983
+ "wf_preview.r_deploy_head_issue": "πŸš€ Issue Preview deployment started",
984
+ "wf_preview.r_deploy_head_pr": "πŸš€ PR Preview deployment started",
985
+ "wf_preview.r_destroy_head": "πŸ—‘οΈ Preview removal",
986
+ "wf_preview.r_destroy_head_custom": "πŸ—‘οΈ Custom Branch Preview removal",
987
+ "wf_preview.r_destroy_head_pr": "πŸ—‘οΈ PR Preview removal",
988
+ "wf_preview.r_domain": "🌐 Domain: {domain}",
989
+ "wf_preview.r_existing_cleanup": "πŸ—‘οΈ Cleaning up the existing container...",
990
+ "wf_preview.r_existing_removed": "πŸ—‘οΈ Removing existing container: {container_name}",
991
+ "wf_preview.r_hc_done": "βœ… Deploy and health check complete! (method: {health_check_method})",
992
+ "wf_preview.r_hc_ok_http": "βœ… Startup confirmed! (HTTP response: {health_path})",
993
+ "wf_preview.r_hc_ok_log": "βœ… Startup confirmed! (log pattern)",
994
+ "wf_preview.r_hc_start": "⏳ Starting health check (waiting up to 120s)...",
995
+ "wf_preview.r_hc_timeout": "❌ Health check timed out (120s)",
996
+ "wf_preview.r_hc_wait_60": "⏳ Waiting for health check (up to 60s)...",
997
+ "wf_preview.r_hc_waiting": "⏳ Waiting... ({retry_count}/{max_retries}) - status: {status}",
998
+ "wf_preview.r_image_pulling": "πŸ“₯ Pulling Docker image...",
999
+ "wf_preview.r_image_removing": "πŸ–ΌοΈ Removing image...",
1000
+ "wf_preview.r_num_generic": "πŸ”’ Number: #{pr_number}",
1001
+ "wf_preview.r_num_issue": "πŸ”’ Issue number: #{issue_number}",
1002
+ "wf_preview.r_num_pr": "πŸ”’ PR number: #{pr_number}",
1003
+ "wf_preview.r_project_name": "πŸ“¦ Project: {project_name}",
1004
+ "wf_preview.r_removed": "βœ… Removal complete!",
1005
+ "wf_preview.r_ssh_auth": "πŸ” SSH auth method: {ssh_auth_method}",
1006
+ "wf_preview.r_status_head": "πŸ” Preview status check",
1007
+ "wf_preview.r_status_head_custom": "πŸ” Custom Branch Preview status check",
1008
+ "wf_preview.r_wait_i": "Waiting... ({i}/12)",
1009
+ "wf_preview.redeploy_hint": "To deploy again: `/wizard server build`",
1010
+ "wf_preview.redeploy_hint_branch": "To deploy again: `/wizard server build {branchName}`",
1011
+ "wf_preview.row_build_done": "| πŸ”¨ Project build | βœ… Done | {buildDuration} |",
1012
+ "wf_preview.row_build_progress": "| πŸ”¨ Project build | ⏳ In progress... | - |",
1013
+ "wf_preview.row_build_status": "| πŸ”¨ Project build | {buildStatus} | {buildTime} |",
1014
+ "wf_preview.row_deploy_done": "| πŸš€ Server deploy & health check | βœ… Done | {deployDuration} |",
1015
+ "wf_preview.row_deploy_progress": "| πŸš€ Server deploy & health check | ⏳ In progress... | - |",
1016
+ "wf_preview.row_deploy_status": "| πŸš€ Server deploy & health check | {deployStatus} | - |",
1017
+ "wf_preview.row_deploy_wait": "| πŸš€ Server deploy & health check | ⏸️ Waiting | - |",
1018
+ "wf_preview.row_docker_done": "| 🐳 Docker image build & push | βœ… Done | {dockerDuration} |",
1019
+ "wf_preview.row_docker_progress": "| 🐳 Docker image build & push | ⏳ In progress... | - |",
1020
+ "wf_preview.row_docker_status": "| 🐳 Docker image build & push | {dockerStatus} | {dockerTime} |",
1021
+ "wf_preview.row_image_done": "| 🐳 Docker image creation | βœ… Done | {dockerDuration} |",
1022
+ "wf_preview.row_image_progress": "| 🐳 Docker image creation | ⏳ In progress... | - |",
1023
+ "wf_preview.row_image_status": "| 🐳 Docker image creation | {dockerStatus} | {dockerTime} |",
1024
+ "wf_preview.row_image_wait": "| 🐳 Docker image creation | ⏸️ Waiting | - |",
1025
+ "wf_preview.sec_causes": "### πŸ” Possible causes",
1026
+ "wf_preview.sec_check": "### πŸ’‘ Things to check",
1027
+ "wf_preview.sec_commands": "### πŸ“‹ Commands",
1028
+ "wf_preview.sec_env": "### 🌐 Preview environment",
1029
+ "wf_preview.sec_next": "### πŸ’‘ Next steps",
1030
+ "wf_preview.skip_no_branch": "⚠️ The branch does not exist, skipping the build.",
1031
+ "wf_preview.status_done": "βœ… Done",
1032
+ "wf_preview.status_failed": "❌ Failed",
1033
+ "wf_preview.status_init_failed": "⚠️ Initialization failed",
1034
+ "wf_preview.status_waiting": "⏸️ Waiting",
1035
+ "wf_preview.tbl_commands": "| Command | Description |",
1036
+ "wf_preview.tbl_items": "| Item | Value |",
1037
+ "wf_preview.tbl_steps": "| Step | Status | Duration |",
1038
+ "wf_preview.title_absent": "## ❌ Preview environment not found",
1039
+ "wf_preview.title_branch_missing": "## ❌ Branch not found",
1040
+ "wf_preview.title_branch_missing_warn": "## ⚠️ Branch not found",
1041
+ "wf_preview.title_custom_absent": "## ❌ Custom Branch Preview environment not found",
1042
+ "wf_preview.title_custom_building": "## πŸš€ Custom Branch Preview building...",
1043
+ "wf_preview.title_custom_deployed": "## βœ… Custom Branch Preview deployed!",
1044
+ "wf_preview.title_custom_destroyed": "## πŸ—‘οΈ Custom Branch Preview environment destroyed!",
1045
+ "wf_preview.title_custom_destroyed_short": "## πŸ—‘οΈ Custom Branch Preview destroyed",
1046
+ "wf_preview.title_custom_failed": "## ❌ Custom Branch Preview deployment failed!",
1047
+ "wf_preview.title_custom_running": "## βœ… Custom Branch Preview environment is running",
1048
+ "wf_preview.title_custom_started": "## πŸš€ Custom Branch Preview deployment started",
1049
+ "wf_preview.title_destroyed": "## πŸ—‘οΈ Preview environment destroyed!",
1050
+ "wf_preview.title_issue_building": "## πŸš€ Issue Preview building...",
1051
+ "wf_preview.title_issue_deployed": "## βœ… Issue Preview deployed!",
1052
+ "wf_preview.title_issue_failed": "## ❌ Issue Preview deployment failed!",
1053
+ "wf_preview.title_pr_building": "## πŸš€ PR Preview building...",
1054
+ "wf_preview.title_pr_deployed": "## βœ… PR Preview deployed!",
1055
+ "wf_preview.title_pr_failed": "## ❌ PR Preview deployment failed!",
1056
+ "wf_preview.title_running": "## βœ… Preview environment is running",
1057
+ # --- wf_readme ---
1058
+ "wf_readme.hint_first_example": "## Latest Version : v1.0.0 (2025-08-15)",
1059
+ "wf_readme.default_heading": "Latest Version",
1060
+ # --- wf_release ---
1061
+ "wf_release.drift_heading": "### ⚠️ Missing release detected",
1062
+ "wf_release.drift_version_line": "- version.yml: `{version}`",
1063
+ "wf_release.drift_tag_line": "- Latest tag: `{tag}`",
1064
+ "wf_release.drift_body": "The version was bumped without a release being confirmed. This version will not be published to npm.",
1065
+ "wf_release.drift_recover": "Recovery: Actions β†’ PROJECT-RELEASE-PUBLISH β†’ Run workflow",
1066
+ "wf_release.readme_dispatch_ok": "README-VERSION-UPDATE workflow_dispatch trigger requested",
1067
+ "wf_release.readme_dispatch_skip": "Could not wake the README-VERSION-UPDATE workflow (deleted or disabled) β€” skipping the README version update",
1068
+ "wf_release.not_merge_release": "v{version} did not arrive through a release PR merge β€” the push event handles the deploy",
1069
+ "wf_release.bot_merged": "PR #{pr} was merged with the bot token β€” the push event could not wake the deploys",
1070
+ "wf_release.merger_unknown_pat": "Could not determine who merged and WORKFLOW_PAT exists β€” assuming the push event ran the deploys and skipping",
1071
+ "wf_release.merger_unknown_nopat": "Could not determine who merged and WORKFLOW_PAT is missing β€” treating it as a bot-token merge",
1072
+ "wf_release.human_merged": "PR #{pr} was merged by {user} β€” the push event already ran the deploys, skipping",
1073
+ "wf_release.no_targets": "No deploy workflow runs on a {branch} push β€” skipping",
1074
+ "wf_release.deploy_trigger_ok": "{wf} workflow_dispatch trigger requested",
1075
+ "wf_release.deploy_trigger_warn": "Could not wake the {wf} deploy workflow β€” run it manually with Run workflow in the Actions tab",
1076
+ # --- wf_spring_ci ---
1077
+ "wf_spring_ci.status_ok": "βœ… Success",
1078
+ "wf_spring_ci.status_fail": "❌ Failed",
1079
+ "wf_spring_ci.err_compile_header": "## 🚨 Compile errors",
1080
+ "wf_spring_ci.err_compile_missing": "Could not find the error log.",
1081
+ "wf_spring_ci.err_test_header": "## πŸ§ͺ Test failures",
1082
+ "wf_spring_ci.err_test_missing": "Could not find the test error log.",
1083
+ "wf_spring_ci.err_build_header": "## πŸ“¦ Build errors",
1084
+ "wf_spring_ci.err_build_missing": "Could not find the build error log.",
1085
+ "wf_spring_ci.comment_title": "## πŸ”§ CI Build Check Results",
1086
+ "wf_spring_ci.comment_success": "### βœ… Build succeeded!",
1087
+ "wf_spring_ci.comment_failure": "### ❌ Build failed!",
1088
+ "wf_spring_ci.table_header": "| Step | Status |",
1089
+ "wf_spring_ci.row_compile": "| Compile | {status} |",
1090
+ "wf_spring_ci.row_test": "| Test | {status} |",
1091
+ "wf_spring_ci.row_build": "| Build | {status} |",
1092
+ "wf_spring_ci.overall": "**Overall status**: {status}",
1093
+ "wf_spring_ci.details_header": "### πŸ“‹ Error details",
1094
+ "wf_spring_ci.fix_header": "### πŸ”§ How to fix",
1095
+ "wf_spring_ci.fix_build": "- Run `./gradlew clean build` locally to check the build",
1096
+ "wf_spring_ci.fix_error": "- Fix the code based on the error messages",
1097
+ "wf_spring_ci.fix_test": "- If tests failed, run `./gradlew test` to run them locally",
1098
+ "wf_spring_ci.footer": "*πŸ€– Generated automatically by GitHub Actions - {time}*",
1099
+ "wf_spring_ci.date_locale": "en-US",
1100
+ "wf_spring_ci.check_summary_success": "The build verification succeeded.",
1101
+ "wf_spring_ci.check_summary_failure": "The build verification failed.",
1102
+ "wf_spring_ci.check_compile": "Compile: {status}",
1103
+ "wf_spring_ci.check_test": "Test: {status}",
1104
+ "wf_spring_ci.check_build": "Build: {status}",
1105
+ "wf_spring_ci.build_failed": "❌ The build failed. Check the error messages above.",
1106
+ "wf_spring_ci.gate_results": "needs results: {results}",
1107
+ "wf_spring_ci.gate_failed": "At least one job failed or was cancelled.",
1108
+ # --- wf_spring_deploy ---
1109
+ "wf_spring_deploy.prod_yml_created": "βœ… application-prod.yml created ({dir})",
1110
+ "wf_spring_deploy.ssh_auth_method": "πŸ” SSH auth method: {method}",
1111
+ "wf_spring_deploy.image_pull": "πŸ“₯ Pulling image: {image}",
1112
+ "wf_spring_deploy.volume_mkdir": "πŸ“ Creating volume mount directory: {path}",
1113
+ "wf_spring_deploy.volume_disabled": "ℹ️ Volume mount disabled",
1114
+ "wf_spring_deploy.volume_enabled": "πŸ“¦ Volume mount enabled: {host} β†’ {container}",
1115
+ "wf_spring_deploy.idle_slot_cleanup": "πŸ—‘οΈ Cleaning up idle slot: {name}",
1116
+ "wf_spring_deploy.banner_project": "πŸ“¦ Project: {name}",
1117
+ "wf_spring_deploy.banner_domain": "🌐 Domain: {domain}",
1118
+ "wf_spring_deploy.banner_image": "πŸ–ΌοΈ Image: {image}",
1119
+ "wf_spring_deploy.old_removed": "πŸ—‘οΈ Removing old={name}",
1120
+ "wf_spring_deploy.old_absent": "ℹ️ old={name} not found β€” skipping cleanup",
1121
+ "wf_spring_deploy.inflight_wait": "⏱️ Waiting for in-flight requests to finish ({sec}s)",
1122
+ "wf_spring_deploy.prune_dangling": "🧹 Cleaning up dangling (<none>) images...",
1123
+ "wf_spring_deploy.new_container_start": "🐳 Starting new container: {name}",
1124
+ "wf_spring_deploy.simple_env_setup": "πŸ”§ Setting up environment variables..",
1125
+ "wf_spring_deploy.simple_container_name_default": "ℹ️ CONTAINER_NAME is not set, using PROJECT_NAME: {name}",
1126
+ "wf_spring_deploy.simple_container_name_custom": "ℹ️ Using custom CONTAINER_NAME: {name}",
1127
+ "wf_spring_deploy.simple_deploy_start": "πŸš€ Deploying to the deploy environment (branch: {branch})",
1128
+ "wf_spring_deploy.simple_config_header": "πŸ“‹ Deployment settings:",
1129
+ "wf_spring_deploy.simple_config_branch": " - Branch: {branch}",
1130
+ "wf_spring_deploy.simple_config_project": " - Project: {name}",
1131
+ "wf_spring_deploy.simple_config_container": " - Container name: {name}",
1132
+ "wf_spring_deploy.simple_config_port": " - Port: {port}",
1133
+ "wf_spring_deploy.simple_config_image": " - Docker image: {image}",
1134
+ "wf_spring_deploy.simple_image_pull": "⬇️ Pulling Docker image: {image}",
1135
+ "wf_spring_deploy.simple_container_check": "🧹 Checking whether container {name} exists...",
1136
+ "wf_spring_deploy.simple_container_exists": "⚠️ Container {name} exists. Stopping and removing it...",
1137
+ "wf_spring_deploy.simple_container_removed": "βœ… Container {name} was removed.",
1138
+ "wf_spring_deploy.simple_container_missing": "ℹ️ No existing container {name}.",
1139
+ "wf_spring_deploy.simple_container_starting": "πŸš€ Starting new container {name}...",
1140
+ "wf_spring_deploy.simple_volume_enabled": "πŸ“¦ Volume mount enabled: {option}",
1141
+ "wf_spring_deploy.simple_init_wait": "⏳ Waiting for the container to initialize... ({sec}s)",
1142
+ "wf_spring_deploy.simple_hc_check": "πŸ₯ Running container health check...",
1143
+ "wf_spring_deploy.simple_hc_process_missing": "❌ Container {name} process is not running",
1144
+ "wf_spring_deploy.simple_hc_process_ok": "βœ… Container process is running",
1145
+ "wf_spring_deploy.simple_http_start": "🌐 Starting HTTP health check: {url}",
1146
+ "wf_spring_deploy.simple_http_attempt": " Attempt {i}/{max}...",
1147
+ "wf_spring_deploy.simple_http_ok": "βœ… HTTP health check succeeded (response code: {code})",
1148
+ "wf_spring_deploy.simple_http_fail": "⚠️ HTTP health check failed (response code: {code})",
1149
+ "wf_spring_deploy.simple_http_retry": " Retrying in {sec}s...",
1150
+ "wf_spring_deploy.simple_http_fallback": "⚠️ HTTP health check ultimately failed, falling back to log pattern matching...",
1151
+ "wf_spring_deploy.simple_hc_path_unset": "ℹ️ HEALTHCHECK_PATH is not set, using log pattern matching only",
1152
+ "wf_spring_deploy.simple_log_match_start": "πŸ“‹ Starting log pattern matching: '{pattern}'",
1153
+ "wf_spring_deploy.simple_log_match_ok": "βœ… Log pattern matched: the application started successfully",
1154
+ "wf_spring_deploy.simple_log_match_fail": "❌ Log pattern did not match: application startup log not found",
1155
+ "wf_spring_deploy.simple_debug_header": "πŸ“‹ Debug info:",
1156
+ "wf_spring_deploy.simple_debug_pattern": " - Search pattern: {pattern}",
1157
+ "wf_spring_deploy.simple_debug_container": " - Container: {name}",
1158
+ "wf_spring_deploy.simple_debug_image": " - Image: {image}",
1159
+ "wf_spring_deploy.simple_debug_port": " - Port: {port}",
1160
+ "wf_spring_deploy.simple_debug_volume": " - Volume: {volume}",
1161
+ "wf_spring_deploy.simple_debug_profile": " - Profile: {profile}",
1162
+ "wf_spring_deploy.simple_logs_tail": "πŸ“‹ Container logs (last 50 lines):",
1163
+ "wf_spring_deploy.simple_hc_done": "βœ… Health check complete: container {name} is running normally",
1164
+ "wf_spring_deploy.simple_deploy_done": "βœ… Deployment completed successfully!",
1165
+ "wf_spring_deploy.simple_summary_header": "πŸ“‹ Deployment summary:",
1166
+ "wf_spring_deploy.simple_summary_project": " 🎯 Project: {name}",
1167
+ "wf_spring_deploy.simple_summary_branch": " 🌿 Branch: {branch}",
1168
+ "wf_spring_deploy.simple_summary_container": " 🐳 Container: {name}",
1169
+ "wf_spring_deploy.simple_summary_port": " 🌐 Port: {port}",
1170
+ "wf_spring_deploy.simple_summary_time": " ⏰ Deployed at: {time}",
1171
+ "wf_spring_deploy.simple_access_url": "πŸ”— URL: {url}",
1172
+ "wf_spring_deploy.nginx_deploy_start": "πŸš€ Starting Nginx Blue-Green zero-downtime deploy",
1173
+ "wf_spring_deploy.nginx_backup_dir": "πŸ“ Creating nginx backup directory: {dir}",
1174
+ "wf_spring_deploy.nginx_backup_file": "πŸ’Ύ Backing up nginx config: {file}",
1175
+ "wf_spring_deploy.nginx_find_active": "πŸ” Looking up the active port in the nginx config",
1176
+ "wf_spring_deploy.nginx_active_missing": "⚠️ Active port not found β†’ assuming the default (BLUE={blue}) is active",
1177
+ "wf_spring_deploy.nginx_active_port": "🎨 Current active port: {port}",
1178
+ "wf_spring_deploy.nginx_new_deploy": "🐳 New deploy β†’ port={port} container={name}",
1179
+ "wf_spring_deploy.nginx_old_container": "πŸ—‘οΈ Previous container (to be removed) = {name}",
1180
+ "wf_spring_deploy.nginx_new_container_start": "🐳 Starting new container: {name} (port {port})",
1181
+ "wf_spring_deploy.nginx_hc_start": "⏳ Starting health check (up to {retries} Γ— {interval}s)",
1182
+ "wf_spring_deploy.nginx_hc_ok": "βœ… Health check succeeded (attempt {i})",
1183
+ "wf_spring_deploy.nginx_hc_progress": "⏳ Health check in progress... ({i}/{max})",
1184
+ "wf_spring_deploy.nginx_hc_fail": "❌ Health check failed β†’ aborting deploy",
1185
+ "wf_spring_deploy.nginx_new_cleanup": "πŸ—‘οΈ Cleaning up new container: {name}",
1186
+ "wf_spring_deploy.nginx_toggle": "πŸ”§ Toggling nginx config port: {old} β†’ {new}",
1187
+ "wf_spring_deploy.nginx_apply": "πŸ”§ Applying and validating nginx config",
1188
+ "wf_spring_deploy.nginx_test_fail": "❌ nginx config validation failed β†’ restoring from backup",
1189
+ "wf_spring_deploy.nginx_test_ok": "βœ… nginx config validation succeeded",
1190
+ "wf_spring_deploy.nginx_reload_fail": "⚠️ reload failed β†’ trying restart",
1191
+ "wf_spring_deploy.nginx_restart_fail": "❌ nginx reload/restart failed β†’ restoring backup",
1192
+ "wf_spring_deploy.nginx_domain_check": "🌐 Verifying domain access ({domain})",
1193
+ "wf_spring_deploy.nginx_domain_ok": "βœ… Domain access verified (attempt {i})",
1194
+ "wf_spring_deploy.nginx_domain_progress": "⏳ Verifying domain access... ({i}/{max})",
1195
+ "wf_spring_deploy.nginx_domain_fail": "⚠️ Domain access verification failed: continuing the deploy (DNS propagation may be delayed)",
1196
+ "wf_spring_deploy.nginx_backup_keep": "🧹 Keeping the latest {keep} backup files",
1197
+ "wf_spring_deploy.nginx_done": "βœ… Zero-downtime deploy complete. active={name} (port {port})",
1198
+ "wf_spring_deploy.traefik_deploy_start": "πŸš€ Starting Blue-Green zero-downtime deploy",
1199
+ "wf_spring_deploy.traefik_entry": "πŸ”§ Traefik entry: localhost:{port} (entrypoint={entrypoint})",
1200
+ "wf_spring_deploy.traefik_extra_network": "πŸ”— Connecting extra network: {net}",
1201
+ "wf_spring_deploy.traefik_labels": "πŸ” Checking Traefik labels:",
1202
+ "wf_spring_deploy.traefik_hc_start": "⏳ Starting health check (up to {max_wait}s, {retries} Γ— {interval}s)",
1203
+ "wf_spring_deploy.traefik_exited": "❌ Container exited unexpectedly (exited). Last 200 log lines:",
1204
+ "wf_spring_deploy.traefik_kept": "ℹ️ Keeping container {name} (not deleted automatically) β€” inspect and debug manually",
1205
+ "wf_spring_deploy.traefik_rollback_note": "ℹ️ If old={name} exists it stays as is β†’ effectively an automatic rollback",
1206
+ "wf_spring_deploy.traefik_hc_pass": "βœ… Health check passed ({n}/{max}) HTTP={code}",
1207
+ "wf_spring_deploy.traefik_waiting": "⏳ Waiting ({n}/{max}) status={status} http={http}",
1208
+ "wf_spring_deploy.traefik_hc_timeout": "❌ Health check timed out ({sec}s)",
1209
+ "wf_spring_deploy.traefik_logs_header": "πŸ” Last 200 log lines of {name}:",
1210
+ "wf_spring_deploy.traefik_done": "βœ… Zero-downtime deploy complete. active={name}",
1211
+ # --- wf_version ---
1212
+ "wf_version.release_publish_triggered": "RELEASE-PUBLISH workflow_dispatch trigger requested (works without WORKFLOW_PAT, recovers version drift automatically)",
1213
+ "wf_version.backmerge_conflict": "Could not automatically merge {prod} into {dev} (conflict). Merge it manually before the next release PR: {manual}",
1214
+ "wf_version.backmerge_push_failed": "Could not push to {dev} (branch protection, etc.). Merge it manually before the next release PR: {manual}",
1215
+ }
1216
+
1217
+ KO = {
1218
+ # --- apk_test ---
1219
+ "apk_test.branch_check_log": "πŸ” 브랜치 쑴재 μ—¬λΆ€ 확인: {branch}",
1220
+ "apk_test.branch_exists_log": "βœ… 브랜치 쑴재 확인됨: {branch}",
1221
+ "apk_test.branch_not_found_log": "❌ 브랜치λ₯Ό 찾을 수 μ—†μŒ: {branch}",
1222
+ "apk_test.branch_missing_title": "πŸ€– ❌ **Android ν…ŒμŠ€νŠΈ APK λΉŒλ“œ μ‹€νŒ¨ - 브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€**",
1223
+ "apk_test.kv_head": "| ν•­λͺ© | κ°’ |",
1224
+ "apk_test.row_requested_branch": "| **μš”μ²­λœ 브랜치** | `{branch}` |",
1225
+ "apk_test.row_issue_pr": "| **이슈/PR** | #{number} |",
1226
+ "apk_test.hint_title": "### πŸ’‘ 확인 사항",
1227
+ "apk_test.hint_pushed": "1. λΈŒλžœμΉ˜κ°€ 원격 μ €μž₯μ†Œμ— pushλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1228
+ "apk_test.hint_helper_branch": "2. \"Issue Helper\" λŒ“κΈ€μ˜ 브랜치λͺ…이 μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•˜μ„Έμš”",
1229
+ "apk_test.hint_typo": "3. 브랜치λͺ…에 μ˜€νƒ€κ°€ μ—†λŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1230
+ "apk_test.workflow_log_link": "πŸ”— [μ›Œν¬ν”Œλ‘œμš° 둜그]({url})",
1231
+ "apk_test.branch_not_found_fail": "브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€: {branch}",
1232
+ "apk_test.branch_check_error_fail": "브랜치 확인 쀑 였λ₯˜: {error}",
1233
+ "apk_test.firebase_detected": "βœ… Firebase μ„œλΉ„μŠ€ 계정 감지 - App Distribution μ—…λ‘œλ“œ μ˜ˆμ •",
1234
+ "apk_test.firebase_missing": "⚠️ Firebase μ„œλΉ„μŠ€ 계정 μ—†μŒ - App Distribution μ—…λ‘œλ“œ κ±΄λ„ˆλœ€",
1235
+ "apk_test.title_running": "## πŸ€– Android APK λΉŒλ“œ 쀑...",
1236
+ "apk_test.title_done": "## πŸ€– βœ… Android APK λΉŒλ“œ μ™„λ£Œ!",
1237
+ "apk_test.title_failed": "## πŸ€– ❌ Android APK λΉŒλ“œ μ‹€νŒ¨",
1238
+ "apk_test.table_header": "| 단계 | μƒνƒœ | μ†Œμš” μ‹œκ°„ |",
1239
+ "apk_test.step_prepare": "πŸ”§ μ€€λΉ„",
1240
+ "apk_test.step_build": "πŸ”¨ APK λΉŒλ“œ",
1241
+ "apk_test.step_upload": "πŸ“€ GitHub μ•„ν‹°νŒ©νŠΈ μ—…λ‘œλ“œ",
1242
+ "apk_test.step_firebase": "πŸ”₯ Firebase App Distribution",
1243
+ "apk_test.st_running": "⏳ μ§„ν–‰ 쀑...",
1244
+ "apk_test.st_waiting": "⏸️ λŒ€κΈ°",
1245
+ "apk_test.st_done": "βœ… μ™„λ£Œ",
1246
+ "apk_test.st_failed": "❌ μ‹€νŒ¨",
1247
+ "apk_test.st_skipped": "⏸️ κ±΄λ„ˆλœ€",
1248
+ "apk_test.live_log": "πŸ“‹ **[μ‹€μ‹œκ°„ 둜그 보기]({url})**",
1249
+ "apk_test.log_progress_created": "βœ… 진행상황 λŒ“κΈ€ 생성 μ™„λ£Œ (ID: {id})",
1250
+ "apk_test.pull_branch": "🌿 브랜치: {branch}",
1251
+ "apk_test.pull_failed": "⚠️ Pull μ‹€νŒ¨ (이미 μ΅œμ‹  μƒνƒœμΌ 수 있음)",
1252
+ "apk_test.branch_name_log": "🌿 브랜치λͺ…: {branch}",
1253
+ "apk_test.issue_number_missing": "⚠️ 브랜치λͺ…μ—μ„œ 이슈 번호λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
1254
+ "apk_test.issue_number_extracted": "βœ… μΆ”μΆœλœ 이슈 번호: #{number}",
1255
+ "apk_test.issue_fetching": "πŸ” GitHub API둜 이슈 정보 쑰회 쀑...",
1256
+ "apk_test.issue_title_default": "이슈 정보 μ—†μŒ",
1257
+ "apk_test.issue_not_found": "⚠️ 이슈 #{number}λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
1258
+ "apk_test.issue_title_log": "πŸ“‹ 이슈 제λͺ©: {title}",
1259
+ "apk_test.issue_state_log": "πŸ“Œ 이슈 μƒνƒœ: {state}",
1260
+ "apk_test.event_dispatch": "πŸ“‹ repository_dispatch 이벀트 감지",
1261
+ "apk_test.event_pr_number": " PR 번호: #{pr}",
1262
+ "apk_test.event_build_number_pr": " λΉŒλ“œ 번호: {build} (PR 번호 μ‚¬μš©)",
1263
+ "apk_test.event_workflow_dispatch": "πŸ“‹ workflow_dispatch 이벀트 감지",
1264
+ "apk_test.event_build_number_default": " λΉŒλ“œ 번호: {build} (κΈ°λ³Έκ°’)",
1265
+ "apk_test.build_info_header": "πŸ“‹ λΉŒλ“œ 정보:",
1266
+ "apk_test.build_info_build": " λΉŒλ“œ 번호: #{build}",
1267
+ "apk_test.build_info_pr": " PR 번호: #{pr}",
1268
+ "apk_test.build_info_commit": " 컀밋 ν•΄μ‹œ: {commit}",
1269
+ "apk_test.build_info_date": " λΉŒλ“œ λ‚ μ§œ: {date}",
1270
+ "apk_test.sign_debug_warning": "μ„œλͺ… Secret이 λΉ„μ–΄ μžˆμ–΄ debug ν‚€λ‘œ μ„œλͺ…ν•©λ‹ˆλ‹€:{missing} (μŠ€ν† μ–΄ μ—…λ‘œλ“œμš© ν‚€κ°€ μ•„λ‹™λ‹ˆλ‹€)",
1271
+ "apk_test.sign_keystore_empty": "RELEASE_KEYSTORE_BASE64λ₯Ό λ””μ½”λ”©ν•œ keystoreκ°€ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€",
1272
+ "apk_test.sign_release_ok": "βœ… Release Keystore 생성 μ™„λ£Œ (release ν‚€λ‘œ μ„œλͺ…)",
1273
+ "apk_test.key_properties_ok": "βœ… key.properties 생성 μ™„λ£Œ",
1274
+ "apk_test.gradlew_missing": "ℹ️ gradlewκ°€ μ €μž₯μ†Œμ— μ—†μŠ΅λ‹ˆλ‹€ β€” flutter buildκ°€ μƒμ„±ν•©λ‹ˆλ‹€",
1275
+ "apk_test.elapsed_min_sec": "{m}λΆ„ {s}초",
1276
+ "apk_test.elapsed_sec": "{s}초",
1277
+ "apk_test.log_prepare_done": "βœ… 진행상황 μ—…λ°μ΄νŠΈ: μ€€λΉ„ μ™„λ£Œ ({elapsed})",
1278
+ "apk_test.log_build_done": "βœ… 진행상황 μ—…λ°μ΄νŠΈ: APK λΉŒλ“œ μ™„λ£Œ ({elapsed})",
1279
+ "apk_test.apk_filename_log": "πŸ“¦ APK 파일λͺ…: {name}",
1280
+ "apk_test.version_set_log": "πŸ“‹ ν…ŒμŠ€νŠΈ λΉŒλ“œ 버전 μ„€μ •: {version}",
1281
+ "apk_test.pubspec_updated": "βœ… pubspec.yaml 버전 λ³€κ²½ μ™„λ£Œ:",
1282
+ "apk_test.flutter_build_log": "πŸ“¦ Flutter 직접 λΉŒλ“œ...",
1283
+ "apk_test.apk_size_log": "πŸ“¦ APK 파일 크기: {size}MB",
1284
+ "apk_test.apk_size_over": "⚠️ κ²½κ³ : APK 파일 크기가 500MBλ₯Ό μ΄ˆκ³Όν•©λ‹ˆλ‹€ ({size}MB)",
1285
+ "apk_test.apk_size_ok": "βœ… APK 파일 크기가 μ•„ν‹°νŒ©νŠΈ μ œν•œ λ‚΄μž…λ‹ˆλ‹€ ({size}MB / 500MB)",
1286
+ "apk_test.info_title": "ν…ŒμŠ€νŠΈ APK λΉŒλ“œ 정보",
1287
+ "apk_test.info_build_number": "λΉŒλ“œ 번호: #{build}",
1288
+ "apk_test.info_pr_number": "PR 번호: #{pr}",
1289
+ "apk_test.info_branch": "브랜치: {branch}",
1290
+ "apk_test.info_commit": "컀밋: {commit}",
1291
+ "apk_test.info_full_commit": "전체 컀밋 ν•΄μ‹œ: {sha}",
1292
+ "apk_test.info_date": "λΉŒλ“œ λ‚ μ§œ: {date}",
1293
+ "apk_test.info_issue_header": "κ΄€λ ¨ 이슈:",
1294
+ "apk_test.info_file_created": "πŸ“‹ λΉŒλ“œ 정보 파일 생성 μ™„λ£Œ:",
1295
+ "apk_test.firebase_creds_ok": "βœ… Firebase μ„œλΉ„μŠ€ 계정 JSON 파일 생성 μ™„λ£Œ",
1296
+ "apk_test.fb_notes_build": "ν…ŒμŠ€νŠΈ λΉŒλ“œ #{build}",
1297
+ "apk_test.fb_notes_branch": "브랜치: {branch}",
1298
+ "apk_test.fb_notes_commit": "컀밋: {commit}",
1299
+ "apk_test.fb_notes_issue": "이슈: #{number} {title}",
1300
+ "apk_test.firebase_upload_ok": "βœ… Firebase App Distribution μ—…λ‘œλ“œ 성곡",
1301
+ "apk_test.firebase_upload_failed": "❌ Firebase App Distribution μ—…λ‘œλ“œ μ‹€νŒ¨ - APK μ•„ν‹°νŒ©νŠΈλŠ” 정상 μ—…λ‘œλ“œλ¨",
1302
+ "apk_test.result_title": "### πŸ“¦ λΉŒλ“œ κ²°κ³Ό",
1303
+ "apk_test.row_app_version": "| **μ•± 버전** | `{version}({build})` |",
1304
+ "apk_test.row_branch": "| **브랜치** | `{branch}` |",
1305
+ "apk_test.row_commit": "| **컀밋** | `{commit}` |",
1306
+ "apk_test.row_total": "| **총 μ†Œμš” μ‹œκ°„** | {elapsed} |",
1307
+ "apk_test.firebase_installable": "πŸ”₯ **Firebase App Tester μ•±μ—μ„œ μ„€μΉ˜ κ°€λŠ₯ν•©λ‹ˆλ‹€**",
1308
+ "apk_test.firebase_failed_hint": "⚠️ **Firebase μ—…λ‘œλ“œ μ‹€νŒ¨ - μ•„ν‹°νŒ©νŠΈμ—μ„œ APKλ₯Ό λ‹€μš΄λ‘œλ“œν•΄μ£Όμ„Έμš”**",
1309
+ "apk_test.artifact_link": "πŸ“¦ **[μ•„ν‹°νŒ©νŠΈ λ‹€μš΄λ‘œλ“œ]({url})**",
1310
+ "apk_test.run_log_link": "πŸ”— **[μ›Œν¬ν”Œλ‘œμš° μ‹€ν–‰ 둜그]({url})**",
1311
+ "apk_test.log_success": "βœ… 진행상황 μ—…λ°μ΄νŠΈ: λΉŒλ“œ 성곡 (총 {elapsed})",
1312
+ "apk_test.issue_done_title": "πŸ€– βœ… **Android APK λΉŒλ“œ μ™„λ£Œ**",
1313
+ "apk_test.issue_line_version": "- μ•± 버전: `{version}({build})`",
1314
+ "apk_test.issue_line_commit": "- 컀밋: `{commit}`",
1315
+ "apk_test.log_issue_success": "βœ… 이슈 #{number}에도 λΉŒλ“œ 성곡 λŒ“κΈ€ μž‘μ„± μ™„λ£Œ",
1316
+ "apk_test.fail_line_branch": "- 브랜치: `{branch}`",
1317
+ "apk_test.fail_line_total": "- 총 μ†Œμš” μ‹œκ°„: {elapsed}",
1318
+ "apk_test.build_error": "❌ λΉŒλ“œ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.",
1319
+ "apk_test.run_log_check_link": "πŸ”— **[μ›Œν¬ν”Œλ‘œμš° μ‹€ν–‰ 둜그 확인]({url})**",
1320
+ "apk_test.log_failed": "❌ 진행상황 μ—…λ°μ΄νŠΈ: λΉŒλ“œ μ‹€νŒ¨ ({elapsed})",
1321
+ "apk_test.issue_failed_title": "πŸ€– ❌ **Android APK λΉŒλ“œ μ‹€νŒ¨**",
1322
+ "apk_test.log_issue_failed": "❌ 이슈 #{number}에도 λΉŒλ“œ μ‹€νŒ¨ λŒ“κΈ€ μž‘μ„± μ™„λ£Œ",
1323
+ "apk_test.notify_ok": "βœ… Android ν…ŒμŠ€νŠΈ APK λΉŒλ“œ 성곡!",
1324
+ "apk_test.notify_build_number": "λΉŒλ“œ 번호: {build}",
1325
+ "apk_test.notify_pr": "PR 번호: {pr}",
1326
+ "apk_test.notify_branch": "브랜치: {branch}",
1327
+ "apk_test.notify_commit": "컀밋: {commit}",
1328
+ "apk_test.notify_issue": "κ΄€λ ¨ 이슈: {url}",
1329
+ "apk_test.notify_artifact_hint": "πŸ“¦ μ•„ν‹°νŒ©νŠΈμ—μ„œ APK νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.",
1330
+ "apk_test.notify_fail": "❌ Android ν…ŒμŠ€νŠΈ APK λΉŒλ“œ μ‹€νŒ¨!",
1331
+ "apk_test.check_logs": "둜그λ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”.",
1332
+ # --- app_trigger ---
1333
+ "app_trigger.reaction_done": "πŸ‘€ λŒ“κΈ€μ— 확인 λ¦¬μ•‘μ…˜ μΆ”κ°€ μ™„λ£Œ",
1334
+ "app_trigger.build_type": "πŸ“± λΉŒλ“œ νƒ€μž…: {type} (Android={android}, iOS={ios})",
1335
+ "app_trigger.branch_from_comment": "🌿 λŒ“κΈ€μ—μ„œ μ§€μ •λœ 브랜치: {branch}",
1336
+ "app_trigger.branch_override": "🌿 λŒ“κΈ€ μ§€μ • 브랜치 μš°μ„  적용: {branch} (PR head={head})",
1337
+ "app_trigger.pr_confirmed": "βœ… PR 확인: #{number}",
1338
+ "app_trigger.branch_name": "🌿 브랜치λͺ…: {branch}",
1339
+ "app_trigger.commit_sha": "πŸ“ 컀밋 ν•΄μ‹œ: {sha}",
1340
+ "app_trigger.issue_extracted": "πŸ“Œ μΆ”μΆœλœ 이슈 번호: #{number}",
1341
+ "app_trigger.not_pr": "ℹ️ PR이 μ•„λ‹™λ‹ˆλ‹€. μ΄μŠˆμ—μ„œ 브랜치 정보λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€...",
1342
+ "app_trigger.custom_branch_used": "🌿 λŒ“κΈ€ μ§€μ • 브랜치 μ‚¬μš© (Guide λŒ“κΈ€ κ±΄λ„ˆλœ€): {branch}",
1343
+ "app_trigger.related_issue": "πŸ“Œ κ΄€λ ¨ 이슈 번호: #{number}",
1344
+ "app_trigger.helper_missing_log": "❌ \"Issue Helper\" λŒ“κΈ€μ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
1345
+ "app_trigger.helper_missing_error": "μ΄μŠˆμ—μ„œ \"Issue Helper\" λŒ“κΈ€μ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€. 브랜치 정보가 ν¬ν•¨λœ λŒ“κΈ€μ΄ ν•„μš”ν•©λ‹ˆλ‹€.",
1346
+ "app_trigger.helper_found": "βœ… \"Issue Helper\" λŒ“κΈ€ 발견",
1347
+ "app_trigger.branch_parse_log": "❌ 브랜치 정보λ₯Ό νŒŒμ‹±ν•  수 μ—†μŠ΅λ‹ˆλ‹€.",
1348
+ "app_trigger.branch_parse_error": "\"Issue Helper\" λŒ“κΈ€μ—μ„œ 브랜치 정보λ₯Ό νŒŒμ‹±ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λŒ“κΈ€ ν˜•μ‹μ„ ν™•μΈν•΄μ£Όμ„Έμš”.",
1349
+ "app_trigger.branch_extracted": "🌿 μΆ”μΆœλœ 브랜치λͺ…: {branch}",
1350
+ "app_trigger.build_info_extracted": "βœ… 이슈 #{number}μ—μ„œ λΉŒλ“œ 정보 μΆ”μΆœ μ™„λ£Œ",
1351
+ "app_trigger.comments_error_log": "❌ 이슈 λŒ“κΈ€ 쑰회 쀑 였λ₯˜ λ°œμƒ:",
1352
+ "app_trigger.comments_error": "이슈 λŒ“κΈ€ 쑰회 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {error}",
1353
+ "app_trigger.trigger_failed_body": "❌ **μ•± λΉŒλ“œ 트리거 μ‹€νŒ¨**\n\n{error}\n\n**ν•΄κ²° 방법:**\n- PRμ—μ„œ λΉŒλ“œν•˜λŠ” 경우: PR νŽ˜μ΄μ§€μ—μ„œ λŒ“κΈ€μ„ μž‘μ„±ν•΄μ£Όμ„Έμš”.\n- μ΄μŠˆμ—μ„œ λΉŒλ“œν•˜λŠ” 경우: \"Issue Helper\" λŒ“κΈ€μ΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.\n - λŒ“κΈ€μ— `### 브랜치` μ„Ήμ…˜κ³Ό 브랜치λͺ…이 ν¬ν•¨λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.\n- λ˜λŠ” λŒ“κΈ€μ— 브랜치λͺ…을 직접 μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€: `/wizard app build <브랜치λͺ…>`",
1354
+ "app_trigger.branch_check_log": "πŸ” 브랜치 쑴재 μ—¬λΆ€ 확인: {branch}",
1355
+ "app_trigger.branch_exists_log": "βœ… 브랜치 쑴재 확인됨: {branch}",
1356
+ "app_trigger.branch_not_found_log": "❌ 브랜치λ₯Ό 찾을 수 μ—†μŒ: {branch}",
1357
+ "app_trigger.branch_not_found_error": "브랜치 `{branch}`λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
1358
+ "app_trigger.branch_check_error_log": "❌ 브랜치 확인 쀑 였λ₯˜: {error}",
1359
+ "app_trigger.branch_check_error": "브랜치 확인 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {error}",
1360
+ "app_trigger.branch_missing_title": "❌ **μ•± λΉŒλ“œ 트리거 μ‹€νŒ¨ - 브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€**",
1361
+ "app_trigger.table_head": "| ν•­λͺ© | κ°’ |",
1362
+ "app_trigger.row_requested_branch": "| **μš”μ²­λœ 브랜치** | `{branch}` |",
1363
+ "app_trigger.row_issue_pr": "| **이슈/PR** | #{number} |",
1364
+ "app_trigger.hint_title": "### πŸ’‘ 확인 사항",
1365
+ "app_trigger.hint_pushed": "1. λΈŒλžœμΉ˜κ°€ 원격 μ €μž₯μ†Œμ— pushλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1366
+ "app_trigger.hint_helper_branch": "2. \"Issue Helper\" λŒ“κΈ€μ˜ 브랜치λͺ…이 μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•˜μ„Έμš”",
1367
+ "app_trigger.hint_typo": "3. 브랜치λͺ…에 μ˜€νƒ€κ°€ μ—†λŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1368
+ "app_trigger.workflow_log_link": "πŸ”— [μ›Œν¬ν”Œλ‘œμš° 둜그]({url})",
1369
+ "app_trigger.branch_not_found_fail": "브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€: {branch}",
1370
+ "app_trigger.count_lookup": "πŸ“Š {type} #{number}의 λΉŒλ“œ 횟수 쑰회 쀑...",
1371
+ "app_trigger.count_build_type": "πŸ“± λΉŒλ“œ νƒ€μž…: {type}",
1372
+ "app_trigger.count_ios": "πŸ“Š iOS λΉŒλ“œ 카운트: ios + app(곡용) 톡합",
1373
+ "app_trigger.count_android": "πŸ“Š Android λΉŒλ“œ 카운트: apk + app(곡용) 톡합",
1374
+ "app_trigger.count_app": "πŸ“Š 전체 μ•± λΉŒλ“œ 카운트: λͺ¨λ“  λΉŒλ“œ λͺ…λ Ήμ–΄ 톡합",
1375
+ "app_trigger.count_result": "πŸ“Š {type} #{number}: {build_type} {count}번째 λΉŒλ“œ",
1376
+ "app_trigger.build_number_generated": "πŸ“¦ μƒμ„±λœ λΉŒλ“œ 번호: {number}",
1377
+ "app_trigger.dispatch_start": "πŸš€ {platform} λΉŒλ“œ μ›Œν¬ν”Œλ‘œμš° 트리거 μ‹œμž‘...",
1378
+ "app_trigger.dispatch_source_number": " {type} 번호: #{number}",
1379
+ "app_trigger.dispatch_build_number": " λΉŒλ“œ 번호: {number}",
1380
+ "app_trigger.dispatch_branch": " 브랜치: {branch}",
1381
+ "app_trigger.dispatch_related_issue": " κ΄€λ ¨ 이슈 번호: {issue}",
1382
+ "app_trigger.none": "μ—†μŒ",
1383
+ "app_trigger.dispatch_done": "βœ… {platform} λΉŒλ“œ μ›Œν¬ν”Œλ‘œμš° 트리거 μ™„λ£Œ",
1384
+ "app_trigger.done_log": "βœ… Android 및 iOS λΉŒλ“œ μ›Œν¬ν”Œλ‘œμš° 트리거 μ™„λ£Œ",
1385
+ "app_trigger.done_build_number": "πŸ“¦ λΉŒλ“œ 번호: {number}",
1386
+ "app_trigger.done_branch": "🌿 브랜치: {branch}",
1387
+ "app_trigger.done_progress_note": "πŸ“‹ 각 ν”Œλž«νΌλ³„ 진행상황 λŒ“κΈ€μ΄ μžλ™μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€.",
1388
+ # --- changelog ---
1389
+ "changelog.parser_section_ok": " β†’ μ„Ήμ…˜ νŒŒμ„œ 성곡",
1390
+ "changelog.parser_lenient_ok": " β†’ κ΄€λŒ€ν•œ νŒŒμ„œ 성곡",
1391
+ "changelog.parser_heuristic_ok": " β†’ νœ΄λ¦¬μŠ€ν‹± νŒŒμ„œ 성곡",
1392
+ "changelog.section_breaking": "### ⚠️ ν˜Έν™˜μ„± 깨짐",
1393
+ "changelog.section_feat": "### ✨ κΈ°λŠ₯",
1394
+ "changelog.section_fix": "### πŸ› μˆ˜μ •",
1395
+ "changelog.section_perf": "### ⚑ μ„±λŠ₯",
1396
+ "changelog.section_docs": "### πŸ“ λ¬Έμ„œ",
1397
+ "changelog.section_refactor": "### ♻️ λ¦¬νŒ©ν† λ§",
1398
+ "changelog.section_test": "### βœ… ν…ŒμŠ€νŠΈ",
1399
+ "changelog.section_deps": "### πŸ“¦ μ˜μ‘΄μ„±",
1400
+ "changelog.section_changes": "### πŸ”§ 변경사항",
1401
+ "changelog.section_wip": "### 🚧 μž‘μ—… 쀑",
1402
+ "changelog.bump_prompt_prefix": "λ‹€μŒμ€ μ •ν•΄μ§„ 컀밋 μ»¨λ²€μ…˜μ„ λ”°λ₯΄μ§€ μ•ŠλŠ” μžμœ ν˜•μ‹ 컀밋 λ©”μ‹œμ§€λ“€μ΄λ‹€.\n이 쀑 μ‚¬μš©μž λŒ€μƒ μƒˆλ‘œμš΄ κΈ°λŠ₯(feature) μΆ”κ°€λ‘œ λ³΄μ΄λŠ” 것이 ν•˜λ‚˜λΌλ„ 있으면 μ •ν™•νžˆ MINOR라고만 λ‹΅ν•˜κ³ ,\nμ—†μœΌλ©΄ μ •ν™•νžˆ PATCH라고만 닡해라. λ‹€λ₯Έ 말은 μ ˆλŒ€ 덧뢙이지 마라.\n컀밋 λͺ©λ‘:\n",
1403
+ "changelog.err_no_input": "❌ μž…λ ₯ νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€ (pr_body.md λ˜λŠ” summary_section.html)",
1404
+ "changelog.input_file": "πŸ“„ μž…λ ₯ 파일: {input_file}",
1405
+ "changelog.file_size": "πŸ“ 파일 크기: {size} bytes",
1406
+ "changelog.parse_start": "\nπŸ” Markdown νŒŒμ‹± μ‹œμž‘...",
1407
+ "changelog.parse_ok": "βœ… νŒŒμ‹± 성곡: {n}개 μΉ΄ν…Œκ³ λ¦¬",
1408
+ "changelog.parse_ok_one": "βœ… νŒŒμ‹± 성곡: {n}개 μΉ΄ν…Œκ³ λ¦¬",
1409
+ "changelog.parse_failed": "⚠️ νŒŒμ‹± μ‹€νŒ¨, raw_summary만 μ €μž₯",
1410
+ "changelog.result_header": "\nπŸ“Š νŒŒμ‹± κ²°κ³Ό:",
1411
+ "changelog.result_method": " - νŒŒμ‹± 방식: {method}",
1412
+ "changelog.result_raw_len": " - raw_summary 길이: {n} 문자",
1413
+ "changelog.result_categories": " - νŒŒμ‹±λœ μΉ΄ν…Œκ³ λ¦¬: {n}개",
1414
+ "changelog.result_category_item": " β€’ {title}: {n}개 ν•­λͺ©",
1415
+ "changelog.result_category_item_one": " β€’ {title}: {n}개 ν•­λͺ©",
1416
+ "changelog.err_json_unreadable": "❌ CHANGELOG.json을 해석할 수 μ—†μ–΄ 갱신을 μ€‘λ‹¨ν•©λ‹ˆλ‹€ (κΈ°μ‘΄ 이λ ₯ 보호): {error}",
1417
+ "changelog.err_json_annotation": "::error::CHANGELOG.json이 μ˜¬λ°”λ₯Έ JSON이 μ•„λ‹™λ‹ˆλ‹€: {error}",
1418
+ "changelog.json_updated": "\nβœ… CHANGELOG.json μ—…λ°μ΄νŠΈ μ™„λ£Œ!",
1419
+ "changelog.err_update_failed": "❌ update-from-summary μ‹€νŒ¨: {error}",
1420
+ "changelog.md_current_version": "**ν˜„μž¬ 버전:** {version}",
1421
+ "changelog.md_last_updated": "**λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ:** {updated}",
1422
+ "changelog.md_no_changes": "*변경사항 정보 μ—†μŒ*",
1423
+ "changelog.md_regenerated": "βœ… CHANGELOG.md μž¬μƒμ„± μ™„λ£Œ!",
1424
+ "changelog.err_md_failed": "❌ CHANGELOG.md 생성 μ‹€νŒ¨: {error}",
1425
+ "changelog.export_header": "버전 {version} μ—…λ°μ΄νŠΈ",
1426
+ "changelog.export_fallback": "버전 {version} μ—…λ°μ΄νŠΈ\nμ•± μ•ˆμ •μ„± 및 μ‚¬μš©μž κ²½ν—˜μ΄ κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
1427
+ "changelog.warn_json_notes": "::warning::CHANGELOG.jsonμ—μ„œ {version} λ…ΈνŠΈλ₯Ό 읽지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€: {error}",
1428
+ "changelog.warn_md_notes": "::warning::CHANGELOG.mdμ—μ„œ {version} λ…ΈνŠΈλ₯Ό 읽지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€: {error}",
1429
+ "changelog.warn_missing_key": "::warning::AI_API_BASE_URL/AI_MODEL이 μ„€μ •λμ§€λ§Œ AI_API_KEY secret이 μ—†μ–΄ μ‚¬μš©μž API ν‹°μ–΄λ₯Ό κ±΄λ„ˆλœλ‹ˆλ‹€",
1430
+ "changelog.warn_missing_url_model": "::warning::AI_API_KEYκ°€ μ„€μ •λμ§€λ§Œ AI_API_BASE_URL/AI_MODEL이 μ—†μ–΄ μ‚¬μš©μž API ν‹°μ–΄λ₯Ό κ±΄λ„ˆλœλ‹ˆλ‹€",
1431
+ "changelog.prompt_intro": "μ•„λž˜ 컀밋 λͺ©λ‘μ„ λ°”νƒ•μœΌλ‘œ ν•œκ΅­μ–΄ 릴리즈 μš”μ•½μ„ μž‘μ„±ν•΄μ€˜.",
1432
+ "changelog.prompt_format": "좜λ ₯ ν˜•μ‹: 첫 쀄은 '## [{version}]' ν—€λ”λ‘œ μ‹œμž‘ν•˜κ³ ,",
1433
+ "changelog.prompt_sections_intro": "ν•΄λ‹Ή ν•­λͺ©μ΄ μžˆλŠ” μ„Ήμ…˜λ§Œ λ‹€μŒ μ΄λ¦„μœΌλ‘œ μž‘μ„±ν•΄μ€˜:",
1434
+ "changelog.prompt_names_1": "'{breaking}', '{feat}', '{fix}', '{perf}', '{docs}', '{refactor}',",
1435
+ "changelog.prompt_names_2": "'{test}', '{deps}', '{changes}', '{wip}'.",
1436
+ "changelog.prompt_breaking": "νƒ€μž… 뒀에 '!'κ°€ λΆ™μ—ˆκ±°λ‚˜ BREAKING CHANGE인 컀밋은 λ°˜λ“œμ‹œ '{breaking}'에 λ„£μ–΄μ€˜.",
1437
+ "changelog.prompt_bullets": "각 ν•­λͺ©μ€ '- '둜 μ‹œμž‘ν•˜λŠ” 뢈릿으둜 μž‘μ„±ν•΄μ€˜.",
1438
+ "changelog.prompt_pr_title": "PR 제λͺ©: {title}",
1439
+ "changelog.prompt_diff_stat": "νŒŒμΌλ³„ λ³€κ²½ μš”μ•½:",
1440
+ "changelog.prompt_commits": "컀밋 λͺ©λ‘:",
1441
+ "changelog.warn_commits_unreadable": "::warning::컀밋 λͺ©λ‘ νŒŒμΌμ„ 읽지 λͺ»ν•΄ 빈 λͺ©λ‘μœΌλ‘œ μš”μ•½ν•©λ‹ˆλ‹€: {error}",
1442
+ "changelog.cli_description": "톡합 μ²΄μΈμ§€λ‘œκ·Έ λ§€λ‹ˆμ €",
1443
+ "changelog.cli_update_help": "PR bodyμ—μ„œ CHANGELOG.json κ°±μ‹ ",
1444
+ "changelog.cli_generate_help": "CHANGELOG.json β†’ CHANGELOG.md 생성",
1445
+ "changelog.cli_classify_help": "컀밋 λͺ©λ‘μœΌλ‘œ semver 승격 폭(major/minor/patch) νŒλ‹¨",
1446
+ "changelog.cli_commits_file_help": "컀밋 제λͺ© λͺ©λ‘ 파일 (ν•œ 쀄당 1개)",
1447
+ "changelog.cli_export_help": "νŠΉμ • 버전 릴리즈 λ…ΈνŠΈ μΆ”μΆœ",
1448
+ "changelog.cli_version_help": "버전 번호",
1449
+ "changelog.cli_output_help": "좜λ ₯ 파일 경둜 (μ—†μœΌλ©΄ stdout)",
1450
+ "changelog.cli_ai_summary_help": "컀밋 λͺ©λ‘μœΌλ‘œ AI/κ·œμΉ™ 기반 릴리즈 μš”μ•½ 생성",
1451
+ "changelog.cli_summary_output_help": "μš”μ•½ κ²°κ³Όλ₯Ό μ €μž₯ν•  파일 경둜",
1452
+ "changelog.cli_pr_title_help": "PR 제λͺ© (ν”„λ‘¬ν”„νŠΈ μ»¨ν…μŠ€νŠΈλ‘œ μ‚¬μš©, 선택)",
1453
+ "changelog.cli_diff_stat_help": "git diff --stat 좜λ ₯ 파일 (ν”„λ‘¬ν”„νŠΈ μ»¨ν…μŠ€νŠΈ ν™•μž₯, 선택)",
1454
+ "changelog.cli_collect_help": "develop에 λ¨Έμ§€λœ PR 쀑 이번 λ¦΄λ¦¬μŠ€μ— ν¬ν•¨λœ 이슈 번호 λͺ©λ‘ μΆ”μΆœ",
1455
+ "changelog.cli_shas_help": "이번 λ¦΄λ¦¬μŠ€μ— ν¬ν•¨λœ 컀밋 SHA λͺ©λ‘ 파일 (ν•œ 쀄당 1개)",
1456
+ "changelog.cli_prs_help": "gh pr list --json number,headRefName,mergeCommit 좜λ ₯ JSON 파일",
1457
+ # --- cibuild ---
1458
+ "cibuild.go_done": "βœ… Go λΉŒλ“œ 검증이 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!",
1459
+ "cibuild.python_done": "βœ… Python λΉŒλ“œ 검증이 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!",
1460
+ "cibuild.info_title": "πŸ“‹ λΉŒλ“œ 정보:",
1461
+ "cibuild.info_project": " 🎯 ν”„λ‘œμ νŠΈ: {project}",
1462
+ "cibuild.info_branch": " 🌿 브랜치: {branch}",
1463
+ "cibuild.info_commit": " πŸ“ 컀밋: {sha}",
1464
+ "cibuild.info_time": " ⏰ 검증 μ‹œκ°„: {time}",
1465
+ "cibuild.py_no_deps": "::notice::requirements.txtΒ·pyproject.tomlΒ·setup.pyκ°€ μ—†μ–΄ μ˜μ‘΄μ„± μ„€μΉ˜λ₯Ό κ±΄λ„ˆλœλ‹ˆλ‹€",
1466
+ "cibuild.py_no_tests_collected": "::notice::μˆ˜μ§‘λœ ν…ŒμŠ€νŠΈκ°€ μ—†μ–΄ pytestλ₯Ό κ±΄λ„ˆλœλ‹ˆλ‹€",
1467
+ "cibuild.py_no_test_files": "::notice::ν…ŒμŠ€νŠΈ 파일(tests/, test_*.py λ“±)이 μ—†μ–΄ pytestλ₯Ό κ±΄λ„ˆλœλ‹ˆλ‹€",
1468
+ "cibuild.py_no_dockerfile": "::notice::{path}/Dockerfile이 μ—†μ–΄ Docker λΉŒλ“œ 검증을 κ±΄λ„ˆλœλ‹ˆλ‹€",
1469
+ "cibuild.node_deps_installing": "πŸ“¦ μ˜μ‘΄μ„± μ„€μΉ˜ 쀑...",
1470
+ "cibuild.node_deps_done": "βœ… μ˜μ‘΄μ„± μ„€μΉ˜ μ™„λ£Œ",
1471
+ "cibuild.node_no_test_script": "::notice::package.json에 test μŠ€ν¬λ¦½νŠΈκ°€ μ—†μ–΄ ν…ŒμŠ€νŠΈλ₯Ό κ±΄λ„ˆλœλ‹ˆλ‹€",
1472
+ "cibuild.node_test_run": "πŸ§ͺ npm test μ‹€ν–‰: {script}",
1473
+ "cibuild.node_build_start_next": "πŸ”¨ Next.js λΉŒλ“œ μ‹œμž‘...",
1474
+ "cibuild.node_build_start": "πŸ”¨ λΉŒλ“œ μ‹œμž‘...",
1475
+ "cibuild.node_build_project": "ν”„λ‘œμ νŠΈ: {project}",
1476
+ "cibuild.node_build_node": "Node.js: {node}",
1477
+ "cibuild.node_build_failed": "❌ λΉŒλ“œ μ‹€νŒ¨",
1478
+ "cibuild.node_build_ok": "βœ… λΉŒλ“œ μ™„λ£Œ",
1479
+ "cibuild.node_build_output": "πŸ“ λΉŒλ“œ κ²°κ³Όλ¬Ό:",
1480
+ "cibuild.node_build_next_dir": " - .next/ 폴더 생성됨",
1481
+ "cibuild.node_errlog_title": "❌ λΉŒλ“œ μ‹€νŒ¨ - μ—λŸ¬ 둜그",
1482
+ "cibuild.node_errlog_missing": "μ—λŸ¬ 둜그 νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
1483
+ "cibuild.node_result_next_ok": "πŸŽ‰ Next.js λΉŒλ“œ μ™„λ£Œ!",
1484
+ "cibuild.node_result_next_fail": "❌ Next.js λΉŒλ“œ μ‹€νŒ¨",
1485
+ "cibuild.node_result_ok": "πŸŽ‰ λΉŒλ“œ μ›Œν¬ν”Œλ‘œμš° μ™„λ£Œ!",
1486
+ "cibuild.node_result_fail": "❌ λΉŒλ“œ μ›Œν¬ν”Œλ‘œμš° μ‹€νŒ¨",
1487
+ "cibuild.node_result_title": "πŸ“Š λΉŒλ“œ κ²°κ³Ό:",
1488
+ "cibuild.node_result_project": " πŸ“¦ ν”„λ‘œμ νŠΈ: {project}",
1489
+ "cibuild.node_result_node": " πŸ“Œ Node.js 버전: {node}",
1490
+ "cibuild.node_result_status": " πŸ†™ λΉŒλ“œ μƒνƒœ: {status}",
1491
+ "cibuild.node_result_branch": " 🌿 브랜치: {branch}",
1492
+ "cibuild.node_result_commit": " πŸ“ 컀밋: {sha}",
1493
+ "cibuild.node_result_time": " πŸ• μ‹œκ°„: {time}",
1494
+ "cibuild.node_all_ok": "βœ… λͺ¨λ“  단계가 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
1495
+ "cibuild.node_error_occurred": "❌ λΉŒλ“œ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.",
1496
+ "cibuild.node_log_hint": "πŸ’‘ Actions νƒ­μ—μ„œ 'build-log' μ•„ν‹°νŒ©νŠΈλ₯Ό λ‹€μš΄λ‘œλ“œν•˜μ—¬ 전체 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”.",
1497
+ "cibuild.gate_results": "needs κ²°κ³Ό: {results}",
1498
+ "cibuild.gate_failed": "μ‹€νŒ¨ν•˜κ±°λ‚˜ μ·¨μ†Œλœ job이 μžˆμŠ΅λ‹ˆλ‹€.",
1499
+ # --- cicd ---
1500
+ "cicd.precheck_secret_title": "ν•„μˆ˜ Secret λˆ„λ½",
1501
+ "cicd.precheck_secret_body": "λ“±λ‘λ˜μ§€ μ•Šμ€ GitHub Secret:{missing} β€” Settings β†’ Secrets and variables β†’ Actionsμ—μ„œ λ“±λ‘ν•˜μ„Έμš”",
1502
+ "cicd.precheck_dockerfile_title": "Dockerfile μ—†μŒ",
1503
+ "cicd.precheck_dockerfile_body": "{path} 파일이 μ—†μŠ΅λ‹ˆλ‹€. 이 μ›Œν¬ν”Œλ‘œμš°λŠ” Docker μ΄λ―Έμ§€λ‘œ λ°°ν¬ν•˜λ―€λ‘œ Dockerfile이 ν•„μš”ν•©λ‹ˆλ‹€ (μ„œλ²„ 배포λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 이 μ›Œν¬ν”Œλ‘œμš° νŒŒμΌμ„ μ‚­μ œν•˜μ„Έμš”)",
1504
+ "cicd.precheck_ok": "βœ… 사전 점검 톡과: ν•„μˆ˜ Secretκ³Ό Dockerfile이 λͺ¨λ‘ μžˆμŠ΅λ‹ˆλ‹€",
1505
+ "cicd.env_file_created": "βœ… {file} 파일 생성 μ™„λ£Œ",
1506
+ "cicd.dotenv_created": "βœ… .env 파일이 μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€",
1507
+ "cicd.disk_before": "πŸ“Š λΉŒλ“œ μ „ λ””μŠ€ν¬ μ‚¬μš©λŸ‰:",
1508
+ "cicd.disk_cleaning": "🧹 λΆˆν•„μš”ν•œ 파일 정리 쀑...",
1509
+ "cicd.disk_docker_prune": "🐳 Docker μ‹œμŠ€ν…œ 정리 쀑...",
1510
+ "cicd.disk_after_cleanup": "πŸ“Š 정리 ν›„ λ””μŠ€ν¬ μ‚¬μš©λŸ‰:",
1511
+ "cicd.post_build_cleanup": "🧹 λΉŒλ“œ ν›„ 정리 쀑...",
1512
+ "cicd.disk_final": "πŸ“Š μ΅œμ’… λ””μŠ€ν¬ μ‚¬μš©λŸ‰:",
1513
+ "cicd.setup_env": "πŸ”§ ν™˜κ²½λ³€μˆ˜ μ„€μ •..",
1514
+ "cicd.ssh_auth": "πŸ” SSH 인증 방식: {method}",
1515
+ "cicd.deploy_start": "πŸš€ 배포 ν™˜κ²½μœΌλ‘œ λ°°ν¬ν•©λ‹ˆλ‹€ (브랜치: {branch})",
1516
+ "cicd.branch_unsupported": "⚠️ μ§€μ›ν•˜μ§€ μ•ŠλŠ” λΈŒλžœμΉ˜μž…λ‹ˆλ‹€: {branch}",
1517
+ "cicd.branch_only": "이 μ›Œν¬ν”Œλ‘œμš°λŠ” {branch} 브랜치만 μ§€μ›ν•©λ‹ˆλ‹€.",
1518
+ "cicd.branch_hint": "on.push.branchesμ—μ„œ 지원할 브랜치λ₯Ό μ„€μ •ν•˜μ„Έμš”.",
1519
+ "cicd.container_default": "ℹ️ CONTAINER_NAME이 μ„€μ •λ˜μ§€ μ•Šμ•„ PROJECT_NAME을 μ‚¬μš©ν•©λ‹ˆλ‹€: {container}",
1520
+ "cicd.container_custom": "ℹ️ μ‚¬μš©μž μ§€μ • CONTAINER_NAME μ‚¬μš©: {container}",
1521
+ "cicd.config_title": "πŸ“‹ 배포 μ„€μ • 정보:",
1522
+ "cicd.config_branch": " - 브랜치: {branch}",
1523
+ "cicd.config_project": " - ν”„λ‘œμ νŠΈ: {project}",
1524
+ "cicd.config_container": " - μ»¨ν…Œμ΄λ„ˆ 이름: {container}",
1525
+ "cicd.config_port": " - 포트: {port}",
1526
+ "cicd.config_image": " - Docker 이미지: {image}",
1527
+ "cicd.pull_image": "⬇️ Docker 이미지 ν’€: {image}",
1528
+ "cicd.pull_image_short": "⬇️ Docker 이미지 ν’€...",
1529
+ "cicd.container_check": "🧹 μ»¨ν…Œμ΄λ„ˆ {container} 쑴재 μ—¬λΆ€ 확인 쀑...",
1530
+ "cicd.container_exists": "⚠️ μ»¨ν…Œμ΄λ„ˆ {container} 이(κ°€) μ‘΄μž¬ν•©λ‹ˆλ‹€. 쀑지 및 μ‚­μ œ 쀑...",
1531
+ "cicd.container_removed": "βœ… μ»¨ν…Œμ΄λ„ˆ {container} 이(κ°€) μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
1532
+ "cicd.container_none": "ℹ️ μ‘΄μž¬ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ {container} 이(κ°€) μ—†μŠ΅λ‹ˆλ‹€.",
1533
+ "cicd.container_run": "πŸš€ μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆ {container} μ‹€ν–‰ 쀑...",
1534
+ "cicd.volume_mkdir": "πŸ“ λ³Όλ₯¨ 마운트 디렉토리 생성: {path}",
1535
+ "cicd.volume_on": "πŸ“¦ λ³Όλ₯¨ 마운트 ν™œμ„±ν™”: {opts}",
1536
+ "cicd.volume_off": "ℹ️ λ³Όλ₯¨ 마운트 λΉ„ν™œμ„±ν™”λ¨",
1537
+ "cicd.health_wait": "⏳ μ»¨ν…Œμ΄λ„ˆ μ΄ˆκΈ°ν™” λŒ€κΈ° 쀑... ({seconds}초)",
1538
+ "cicd.health_check": "πŸ₯ μ»¨ν…Œμ΄λ„ˆ ν—¬μŠ€μ²΄ν¬ 쀑...",
1539
+ "cicd.health_no_process": "❌ μ»¨ν…Œμ΄λ„ˆ {container} ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€",
1540
+ "cicd.health_process_ok": "βœ… μ»¨ν…Œμ΄λ„ˆ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ 확인 μ™„λ£Œ",
1541
+ "cicd.http_start": "🌐 HTTP ν—¬μŠ€μ²΄ν¬ μ‹œμž‘: {url}",
1542
+ "cicd.http_try": " μ‹œλ„ {i}/{max}...",
1543
+ "cicd.http_ok": "βœ… HTTP ν—¬μŠ€μ²΄ν¬ 성곡 (응닡 μ½”λ“œ: {code})",
1544
+ "cicd.http_fail": "⚠️ HTTP ν—¬μŠ€μ²΄ν¬ μ‹€νŒ¨ (응닡 μ½”λ“œ: {code})",
1545
+ "cicd.http_retry": " {interval}초 ν›„ μž¬μ‹œλ„...",
1546
+ "cicd.http_final_fail": "⚠️ HTTP ν—¬μŠ€μ²΄ν¬ μ΅œμ’… μ‹€νŒ¨, 둜그 νŒ¨ν„΄ 맀칭으둜 fallback...",
1547
+ "cicd.http_skipped": "ℹ️ HEALTHCHECK_PATHκ°€ μ„€μ •λ˜μ§€ μ•Šμ•„ 둜그 νŒ¨ν„΄ 맀칭만 μ‚¬μš©ν•©λ‹ˆλ‹€",
1548
+ "cicd.log_start": "πŸ“‹ 둜그 νŒ¨ν„΄ λ§€μΉ­ μ‹œμž‘: '{pattern}'",
1549
+ "cicd.log_ok": "βœ… 둜그 νŒ¨ν„΄ λ§€μΉ­ 성곡: μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ‹œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€",
1550
+ "cicd.log_fail": "❌ 둜그 νŒ¨ν„΄ λ§€μΉ­ μ‹€νŒ¨: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘ 둜그λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€",
1551
+ "cicd.debug_title": "πŸ“‹ 디버깅 정보:",
1552
+ "cicd.debug_pattern": " - 검색 νŒ¨ν„΄: {pattern}",
1553
+ "cicd.debug_container": " - μ»¨ν…Œμ΄λ„ˆ: {container}",
1554
+ "cicd.debug_image": " - 이미지: {image}",
1555
+ "cicd.debug_port": " - 포트: {port}",
1556
+ "cicd.debug_volume": " - λ³Όλ₯¨: {volume}",
1557
+ "cicd.debug_logs": "πŸ“‹ μ»¨ν…Œμ΄λ„ˆ 둜그 (졜근 50쀄):",
1558
+ "cicd.health_done": "βœ… ν—¬μŠ€μ²΄ν¬ μ™„λ£Œ: μ»¨ν…Œμ΄λ„ˆ {container} 이(κ°€) μ •μƒμ μœΌλ‘œ μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€",
1559
+ "cicd.deploy_done": "βœ… 배포가 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!",
1560
+ "cicd.summary_title": "πŸ“‹ 배포 κ²°κ³Ό μš”μ•½:",
1561
+ "cicd.summary_project": " 🎯 ν”„λ‘œμ νŠΈ: {project}",
1562
+ "cicd.summary_branch": " 🌿 브랜치: {branch}",
1563
+ "cicd.summary_container": " 🐳 μ»¨ν…Œμ΄λ„ˆ: {container}",
1564
+ "cicd.summary_port": " 🌐 포트: {port}",
1565
+ "cicd.summary_time": " ⏰ 배포 μ‹œκ°„: {time}",
1566
+ "cicd.summary_url": "πŸ”— 접속 URL: {url}",
1567
+ # --- fastlane ---
1568
+ "fastlane.env_empty": "{name} ν™˜κ²½λ³€μˆ˜κ°€ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ›Œν¬ν”Œλ‘œμš°μ—μ„œ 값을 μ „λ‹¬ν•˜λŠ”μ§€ ν™•μΈν•˜μ„Έμš”.",
1569
+ "fastlane.ios_prepare_wait": "DEPLOY_MODE={deploy_mode}: λΉŒλ“œ 처리 μ™„λ£ŒκΉŒμ§€ κΈ°λ‹€λ¦° λ’€ App Store 버전을 μ€€λΉ„ν•©λ‹ˆλ‹€.",
1570
+ "fastlane.deploy_mode_unknown": "μ•Œ 수 μ—†λŠ” DEPLOY_MODE '{deploy_mode}' μž…λ‹ˆλ‹€. store_only둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.",
1571
+ "fastlane.package_name_empty": "PACKAGE_NAME이 λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ANDROID_PACKAGE_NAME secrets/variablesλ₯Ό λ“±λ‘ν•˜μ„Έμš”. (예: com.example.app)",
1572
+ "fastlane.android_env_required": "AAB_PATH, GOOGLE_PLAY_JSON_KEY, VERSION_NAME, VERSION_CODE ν™˜κ²½λ³€μˆ˜κ°€ λͺ¨λ‘ ν•„μš”ν•©λ‹ˆλ‹€. μ›Œν¬ν”Œλ‘œμš°μ—μ„œ μ „λ‹¬ν•˜λŠ”μ§€ ν™•μΈν•˜μ„Έμš”.",
1573
+ "fastlane.changelog_missing": "λ³€κ²½ 이λ ₯ 파일이 μ—†μŠ΅λ‹ˆλ‹€: {file}",
1574
+ "fastlane.play_deploy": "Play 배포: DEPLOY_MODE={deploy_mode} β†’ track={track}, release_status={release_status}",
1575
+ # --- flutter_a ---
1576
+ "flutter_a.precheck_missing_title": "ν•„μˆ˜ Secret λˆ„λ½",
1577
+ "flutter_a.precheck_missing_body": "λ“±λ‘λ˜μ§€ μ•Šμ€ GitHub Secret:{missing} β€” Settings β†’ Secrets and variables β†’ Actionsμ—μ„œ λ“±λ‘ν•˜μ„Έμš”",
1578
+ "flutter_a.precheck_passed": "βœ… 사전 점검 톡과: ν•„μˆ˜ Secret이 λͺ¨λ‘ μžˆμŠ΅λ‹ˆλ‹€",
1579
+ "flutter_a.debug_keystore_empty": "DEBUG_KEYSTORE Secret이 λΉ„μ–΄ μžˆμ–΄ λŸ¬λ„ˆ κΈ°λ³Έ debug ν‚€λ‘œ μ„œλͺ…ν•©λ‹ˆλ‹€ (λΉŒλ“œλ§ˆλ‹€ μ„œλͺ…이 λ‹¬λΌμ§‘λ‹ˆλ‹€)",
1580
+ "flutter_a.debug_keystore_created": "Debug Keystore created (DEBUG_KEYSTORE둜 μ„œλͺ…)",
1581
+ "flutter_a.gradlew_missing": "ℹ️ gradlewκ°€ μ €μž₯μ†Œμ— μ—†μŠ΅λ‹ˆλ‹€ β€” flutter buildκ°€ μƒμ„±ν•©λ‹ˆλ‹€",
1582
+ "flutter_a.current_version": "ν˜„μž¬ 버전: {current_version}",
1583
+ "flutter_a.short_commit_hash": "짧은 컀밋 ν•΄μ‹œ: {short_commit_hash}",
1584
+ "flutter_a.project_type": "πŸ”§ ν”„λ‘œμ νŠΈ νƒ€μž…: {project_type}",
1585
+ "flutter_a.extracting_v_release_notes_changelog": "πŸ“„ CHANGELOG.jsonμ—μ„œ v{version} 릴리즈 λ…ΈνŠΈ μΆ”μΆœ 쀑...",
1586
+ "flutter_a.release_notes_extracted": "βœ… 릴리즈 λ…ΈνŠΈ μΆ”μΆœ 성곡!",
1587
+ "flutter_a.extracted_release_notes": "πŸ“‹ μΆ”μΆœλœ 릴리즈 λ…ΈνŠΈ:",
1588
+ "flutter_a.failed_extract_release_notes": "❌ 릴리즈 λ…ΈνŠΈ μΆ”μΆœ μ‹€νŒ¨",
1589
+ "flutter_a.default_release_note": "v{version} μ—…λ°μ΄νŠΈ",
1590
+ "flutter_a.changelog_json_not_found_using": "⚠️ CHANGELOG.json 파일이 μ—†μŠ΅λ‹ˆλ‹€. κΈ°λ³Έ 릴리즈 λ…ΈνŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.",
1591
+ "flutter_a.signing_secrets_empty": "μ„œλͺ… Secret이 λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€:{missing} (μ›Œν¬ν”Œλ‘œμš° 상단 주석 μ°Έκ³ )",
1592
+ "flutter_a.keystore_decoded_empty": "RELEASE_KEYSTORE_BASE64λ₯Ό λ””μ½”λ”©ν•œ keystoreκ°€ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€",
1593
+ "flutter_a.release_keystore_created": "βœ… Release Keystore 생성 μ™„λ£Œ",
1594
+ "flutter_a.key_properties_created": "βœ… key.properties 생성 μ™„λ£Œ",
1595
+ "flutter_a.signing_config_must_added_build": "⚠️ build.gradle.kts에 μ„œλͺ… μ„€μ • μΆ”κ°€ ν•„μš”",
1596
+ "flutter_a.android_build_config_check_complete": "βœ… Android λΉŒλ“œ μ„€μ • 확인 μ™„λ£Œ",
1597
+ "flutter_a.starting_aab_build": "πŸš€ AAB λΉŒλ“œ μ‹œμž‘",
1598
+ "flutter_a.build_version": "🎯 λΉŒλ“œ 버전: {version_name}",
1599
+ "flutter_a.build_code": "🎯 λΉŒλ“œ μ½”λ“œ: {version_code}",
1600
+ "flutter_a.version_name_or_version_code": "❌ VERSION_NAME λ˜λŠ” VERSION_CODEκ°€ λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€!",
1601
+ "flutter_a.flutter_environment_info": "πŸ” Flutter ν™˜κ²½ 정보:",
1602
+ "flutter_a.cleaning_previous_build_output": "🧹 이전 λΉŒλ“œ κ²°κ³Όλ¬Ό 정리...",
1603
+ "flutter_a.running_flutter_clean_reinstalling_dependencies": "πŸ”„ Flutter clean 및 μ˜μ‘΄μ„± μž¬μ„€μΉ˜...",
1604
+ "flutter_a.setting_version_info_local_properties": "πŸ”§ local.properties에 버전 정보 μ„€μ •...",
1605
+ "flutter_a.local_properties_updated": "βœ… local.properties μ—…λ°μ΄νŠΈ μ™„λ£Œ",
1606
+ "flutter_a.version_info_version_name_version": "πŸ“‹ 버전 정보: VERSION_NAME={version_name}, VERSION_CODE={version_code}",
1607
+ "flutter_a.gradle_tuning_applied": "βœ… Gradle μ΅œμ ν™” μ„€μ • μ™„λ£Œ",
1608
+ "flutter_a.running_flutter_build": "πŸ”¨ Flutter build μ‹€ν–‰...",
1609
+ "flutter_a.command_flutter_build_appbundle_release": "πŸ“‹ λͺ…λ Ήμ–΄: flutter build appbundle --release --build-name={version_name} --build-number={version_code} --verbose",
1610
+ "flutter_a.build_start_time": "⏱️ λΉŒλ“œ μ‹œμž‘ μ‹œκ°„: {cmd1}",
1611
+ "flutter_a.flutter_build_failed_exit_code": "❌ Flutter build μ‹€νŒ¨! Exit code: {build_exit_code}",
1612
+ "flutter_a.build_directory_state": "πŸ” λΉŒλ“œ 디렉토리 μƒνƒœ:",
1613
+ "flutter_a.aab_apk_not_found": "AAB/APK νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€",
1614
+ "flutter_a.flutter_build_succeeded": "βœ… Flutter build 성곡!",
1615
+ "flutter_a.checking_build_result": "πŸ” λΉŒλ“œ κ²°κ³Ό 확인:",
1616
+ "flutter_a.aab_file_not_created": "❌ AAB 파일이 μƒμ„±λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€!",
1617
+ "flutter_a.full_build_directory_contents": "πŸ” 전체 λΉŒλ“œ 디렉토리 λ‚΄μš©:",
1618
+ "flutter_a.outputs_directory_structure": "πŸ” outputs 디렉토리 ꡬ쑰:",
1619
+ "flutter_a.outputs_directory_does_not_exist": "outputs 디렉토리가 μ—†μŠ΅λ‹ˆλ‹€",
1620
+ "flutter_a.aab_file_creation_confirmed": "βœ… AAB 파일 생성 확인",
1621
+ "flutter_a.aab_file_size": "πŸ“± AAB 파일 크기: {cmd1}",
1622
+ "flutter_a.aab_file_info": "πŸ“‹ AAB 파일 정보: {cmd1}",
1623
+ "flutter_a.downloading_bundletool": "πŸ“¦ bundletool λ‹€μš΄λ‘œλ“œ 쀑...",
1624
+ "flutter_a.download_url": "πŸ“‹ λ‹€μš΄λ‘œλ“œ URL: {bundletool_url}",
1625
+ "flutter_a.bundletool_download_failed": "❌ bundletool λ‹€μš΄λ‘œλ“œ μ‹€νŒ¨",
1626
+ "flutter_a.retrying_fallback_url": "πŸ”„ λŒ€μ²΄ URL둜 μž¬μ‹œλ„...",
1627
+ "flutter_a.bundletool_download_failed_completely": "❌ bundletool λ‹€μš΄λ‘œλ“œ μ™„μ „ μ‹€νŒ¨",
1628
+ "flutter_a.bundletool_downloaded": "βœ… bundletool λ‹€μš΄λ‘œλ“œ μ™„λ£Œ",
1629
+ "flutter_a.bundletool_file_size": "πŸ“‹ bundletool 파일 크기: {cmd1}",
1630
+ "flutter_a.checking_java_environment": "πŸ” Java ν™˜κ²½ 확인:",
1631
+ "flutter_a.verifying_version_info_inside_aab": "πŸ” AAB 파일 λ‚΄λΆ€ 버전 정보 검증",
1632
+ "flutter_a.extracting_actual_version_info_aab": "πŸ“‹ AABμ—μ„œ μ‹€μ œ 버전 정보 μΆ”μΆœ 쀑...",
1633
+ "flutter_a.command_run_java_jar_bundletool": "πŸ“‹ μ‹€ν–‰ν•  λͺ…λ Ήμ–΄: java -jar bundletool.jar dump manifest --bundle='{aab_file}'",
1634
+ "flutter_a.bundletool_result_exit_code": "πŸ“‹ bundletool μ‹€ν–‰ κ²°κ³Ό (Exit code: {manifest_exit_code}):",
1635
+ "flutter_a.manifest_extracted": "βœ… Manifest μΆ”μΆœ 성곡",
1636
+ "flutter_a.version_info_comparison": "🎯 버전 정보 비ꡐ:",
1637
+ "flutter_a.expected_version_code": " μ˜ˆμƒ VERSION_CODE: '{version_code}'",
1638
+ "flutter_a.actual_version_code": " μ‹€μ œ VERSION_CODE: '{actual_version_code}'",
1639
+ "flutter_a.expected_version_name": " μ˜ˆμƒ VERSION_NAME: '{version_name}'",
1640
+ "flutter_a.actual_version_name": " μ‹€μ œ VERSION_NAME: '{actual_version_name}'",
1641
+ "flutter_a.fatal_error_version_code_could": "❌ 치λͺ…적 였λ₯˜: AABμ—μ„œ VERSION_CODEλ₯Ό μΆ”μΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€!",
1642
+ "flutter_a.full_manifest_contents": "πŸ” 전체 Manifest λ‚΄μš©:",
1643
+ "flutter_a.fatal_error_version_code_aab": "❌ 치λͺ…적 였λ₯˜: AAB의 VERSION_CODEκ°€ μ˜ˆμƒκ³Ό λ‹€λ¦…λ‹ˆλ‹€!",
1644
+ "flutter_a.google_play_would_reject_version": " μ΄λŠ” Google Playμ—μ„œ '이미 μ‚¬μš©λœ 버전 μ½”λ“œ' 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.",
1645
+ "flutter_a.debugging_info": "πŸ” 디버깅 정보:",
1646
+ "flutter_a.version_code_version_yml": " version.yml의 VERSION_CODE: {version_code}",
1647
+ "flutter_a.version_code_inside_aab_file": " AAB 파일 λ‚΄λΆ€μ˜ VERSION_CODE: {actual_version_code}",
1648
+ "flutter_a.flags_passed_flutter_build_command": " Flutter build λͺ…령어에 μ „λ‹¬λœ ν”Œλž˜κ·Έ:",
1649
+ "flutter_a.full_manifest_contents_2": " 전체 Manifest λ‚΄μš©:",
1650
+ "flutter_a.version_code_check_passed": "βœ… VERSION_CODE 검증 성곡: {actual_version_code}",
1651
+ "flutter_a.warning_version_name_could_not": "⚠️ κ²½κ³ : AABμ—μ„œ VERSION_NAME을 μΆ”μΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€",
1652
+ "flutter_a.warning_version_name_differs_expected": "⚠️ κ²½κ³ : VERSION_NAME이 μ˜ˆμƒκ³Ό λ‹€λ¦…λ‹ˆλ‹€ (치λͺ…적이지 μ•ŠμŒ)",
1653
+ "flutter_a.expected_actual": " μ˜ˆμƒ: '{version_name}', μ‹€μ œ: '{actual_version_name}'",
1654
+ "flutter_a.version_name_check_passed": "βœ… VERSION_NAME 검증 성곡: {actual_version_name}",
1655
+ "flutter_a.failed_extract_manifest_bundletool": "❌ bundletool둜 Manifest μΆ”μΆœ μ‹€νŒ¨",
1656
+ "flutter_a.trying_verify_another_way": "πŸ”„ λŒ€μ²΄ λ°©λ²•μœΌλ‘œ 검증 μ‹œλ„...",
1657
+ "flutter_a.trying_direct_extraction_unzip": "πŸ“‹ unzip을 μ‚¬μš©ν•œ 직접 μΆ”μΆœ μ‹œλ„...",
1658
+ "flutter_a.version_info_extracted_unzip": "βœ… unzip으둜 버전 정보 μΆ”μΆœ 성곡:",
1659
+ "flutter_a.direct_extraction_unzip_failed_too": "❌ unzip을 μ‚¬μš©ν•œ 직접 μΆ”μΆœλ„ μ‹€νŒ¨",
1660
+ "flutter_a.skipping_aab_verification_continuing": "⚠️ AAB 검증을 κ±΄λ„ˆλ›°κ³  계속 μ§„ν–‰ν•©λ‹ˆλ‹€.",
1661
+ "flutter_a.aab_build_verification_complete": "βœ… AAB λΉŒλ“œ 및 검증 μ™„λ£Œ",
1662
+ "flutter_a.final_aab": "🎯 μ΅œμ’… AAB: {aab_file}",
1663
+ "flutter_a.file_size": "πŸ“± 파일 크기: {cmd1}",
1664
+ "flutter_a.google_play_service_account_json": "GOOGLE_PLAY_SERVICE_ACCOUNT_JSON_BASE64 Secret이 λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€",
1665
+ "flutter_a.service_account_json_configured": "βœ… Service Account JSON μ„€μ • μ™„λ£Œ",
1666
+ "flutter_a.using_repository_gemfile": "ℹ️ μ €μž₯μ†Œμ˜ Gemfile을 μ‚¬μš©ν•©λ‹ˆλ‹€",
1667
+ "flutter_a.fastlane_installed_bundler": "βœ… Fastlane μ„€μΉ˜ μ™„λ£Œ (Bundler)",
1668
+ "flutter_a.fastfile_copied_fastfile_playstore_fastfile": "βœ… Fastfile 볡사 μ™„λ£Œ (Fastfile.playstore β†’ Fastfile)",
1669
+ "flutter_a.fastfile_contents": "πŸ“‹ Fastfile λ‚΄μš©:",
1670
+ "flutter_a.starting_play_store_deployment": "πŸš€ Play Store 배포 μ‹œμž‘",
1671
+ "flutter_a.deploy_start_time": "πŸ• 배포 μ‹œμž‘ μ‹œκ°„: {cmd1}",
1672
+ "flutter_a.version_info_deploy": "πŸ“‹ 배포 λŒ€μƒ 버전 정보:",
1673
+ "flutter_a.fatal_error_version_name_or": "❌ 치λͺ…적 였λ₯˜: VERSION_NAME λ˜λŠ” VERSION_CODEκ°€ λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€!",
1674
+ "flutter_a.means_prepare_build_job_did": "μ΄λŠ” prepare-build μž‘μ—…μ—μ„œ 좜λ ₯이 μ œλŒ€λ‘œ μ „λ‹¬λ˜μ§€ μ•Šμ•˜μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.",
1675
+ "flutter_a.aab_file_path": "πŸ“¦ AAB 파일 경둜: {aab_path}",
1676
+ "flutter_a.aab_file_not_found": "❌ AAB νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€!",
1677
+ "flutter_a.build_directory_contents": "πŸ” λΉŒλ“œ 디렉토리 λ‚΄μš©:",
1678
+ "flutter_a.directory_does_not_exist": "디렉토리가 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€",
1679
+ "flutter_a.full_build_directory_structure": "πŸ” 전체 λΉŒλ“œ 디렉토리 ꡬ쑰:",
1680
+ "flutter_a.aab_file_exists": "βœ… AAB 파일 쑴재 확인",
1681
+ "flutter_a.verifying_aab_version": "πŸ” AAB 버전 검증 쀑...",
1682
+ "flutter_a.aab_version_code": "πŸ“‹ AAB 버전: {final_version_name} (μ½”λ“œ: {final_version_code})",
1683
+ "flutter_a.error_aab_version_code_not": "❌ 였λ₯˜: AAB 버전 μ½”λ“œκ°€ μ˜ˆμƒκ³Ό λ‹€λ¦…λ‹ˆλ‹€! (μ˜ˆμƒ: {version_code}, μ‹€μ œ: {final_version_code})",
1684
+ "flutter_a.version_check_passed": "βœ… 버전 검증 성곡",
1685
+ "flutter_a.version_check_failed_continuing_deployment": "⚠️ 버전 검증 μ‹€νŒ¨, 배포 계속 μ§„ν–‰",
1686
+ "flutter_a.changelog_ready_version_code": "βœ… Changelog μ€€λΉ„ μ™„λ£Œ (버전 μ½”λ“œ: {version_code})",
1687
+ "flutter_a.default_release_note_name": "v{version_name} μ—…λ°μ΄νŠΈ",
1688
+ "flutter_a.created_default_changelog_version_code": "⚠️ κΈ°λ³Έ Changelog 생성 (버전 μ½”λ“œ: {version_code})",
1689
+ "flutter_a.service_account_json_file_not": "❌ Service Account JSON νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€",
1690
+ "flutter_a.running_play_store_deployment": "πŸš€ Play Store 배포 μ‹€ν–‰",
1691
+ "flutter_a.version_code": "🎯 버전: {version_name} (μ½”λ“œ: {version_code})",
1692
+ "flutter_a.play_store_internal_testing_deployment": "βœ… Play Store λ‚΄λΆ€ ν…ŒμŠ€νŠΈ 배포 성곡!",
1693
+ "flutter_a.version": "버전: {version} ({version_code})",
1694
+ "flutter_a.commit": "컀밋: {sha}",
1695
+ "flutter_a.how_testers_check_build": "πŸ“± ν…ŒμŠ€ν„° 확인 방법:",
1696
+ "flutter_a.play_console_test_release_internal": "1. Play Console β†’ ν…ŒμŠ€νŠΈ 및 μΆœμ‹œ β†’ λ‚΄λΆ€ ν…ŒμŠ€νŠΈ",
1697
+ "flutter_a.share_test_link_your_testers": "2. ν…ŒμŠ€ν„°μ—κ²Œ ν…ŒμŠ€νŠΈ 링크 곡유",
1698
+ "flutter_a.play_store_deployment_failed": "❌ Play Store 배포 μ‹€νŒ¨!",
1699
+ "flutter_a.please_check_logs": "둜그λ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”.",
1700
+ "flutter_a.precheck_firebase_app_id_title": "FIREBASE_APP_ID λ―Έμ„€μ •",
1701
+ "flutter_a.precheck_firebase_app_id_body": "μ›Œν¬ν”Œλ‘œμš° env μ„Ήμ…˜μ˜ FIREBASE_APP_IDλ₯Ό Firebase Console의 μ•± ID둜 λ°”κΎΈμ„Έμš”",
1702
+ "flutter_a.precheck_passed_firebase": "βœ… 사전 점검 톡과: ν•„μˆ˜ Secretκ³Ό FIREBASE_APP_IDκ°€ λͺ¨λ‘ μžˆμŠ΅λ‹ˆλ‹€",
1703
+ "flutter_a.firebase_service_account_json_base64": "FIREBASE_SERVICE_ACCOUNT_JSON_BASE64 Secret이 λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€",
1704
+ "flutter_a.firebase_service_account_json_file": "βœ… Firebase μ„œλΉ„μŠ€ 계정 JSON 파일 생성 μ™„λ£Œ",
1705
+ "flutter_a.firebase_app_distribution_deployment_succeeded": "βœ… Firebase App Distribution 배포 성곡!",
1706
+ "flutter_a.launch_firebase_app_tester_app": "1. Firebase App Tester μ•± μ‹€ν–‰",
1707
+ "flutter_a.select_app": "2. μ•± 선택",
1708
+ "flutter_a.download_latest_build": "3. μ΅œμ‹  λΉŒλ“œ λ‹€μš΄λ‘œλ“œ",
1709
+ "flutter_a.firebase_app_distribution_deployment_failed": "❌ Firebase App Distribution 배포 μ‹€νŒ¨!",
1710
+ "flutter_a.ci_config_header": "πŸ“‹ CI μ„€μ •:",
1711
+ "flutter_a.ci_config_trigger": " 트리거: {event_name}",
1712
+ "flutter_a.ci_info_header": "πŸ“‹ λΉŒλ“œ 정보:",
1713
+ "flutter_a.ci_info_branch": " 브랜치: {branch_name}",
1714
+ "flutter_a.ci_info_commit": " 컀밋: {commit_hash}",
1715
+ "flutter_a.ci_analyze_start": "πŸ” Flutter μ½”λ“œ 뢄석 μ‹œμž‘...",
1716
+ "flutter_a.ci_analyze_done": "βœ… μ½”λ“œ 뢄석 μ™„λ£Œ",
1717
+ "flutter_a.ci_test_start": "πŸ§ͺ Flutter ν…ŒμŠ€νŠΈ μ‹œμž‘...",
1718
+ "flutter_a.ci_test_passed": "βœ… ν…ŒμŠ€νŠΈ 톡과",
1719
+ "flutter_a.ci_test_skipped_title": "Flutter ν…ŒμŠ€νŠΈ κ±΄λ„ˆλœ€",
1720
+ "flutter_a.ci_test_skipped_body": "test/ 폴더에 *_test.dart 파일이 μ—†μ–΄ flutter testλ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€",
1721
+ "flutter_a.ci_apk_start": "πŸ“¦ Flutter APK λΉŒλ“œ μ‹œμž‘ (debug)...",
1722
+ "flutter_a.ci_apk_done": "βœ… APK λΉŒλ“œ μ™„λ£Œ",
1723
+ "flutter_a.ci_podfile_missing": "ℹ️ ios/Podfile이 μ—†μ–΄ pod install을 κ±΄λ„ˆλœλ‹ˆλ‹€ (CocoaPods ν”ŒλŸ¬κ·ΈμΈ μ—†μŒ)",
1724
+ "flutter_a.ci_ios_start": "πŸ“¦ Flutter iOS λΉŒλ“œ μ‹œμž‘...",
1725
+ "flutter_a.ci_ios_done": "βœ… iOS λΉŒλ“œ μ™„λ£Œ",
1726
+ "flutter_a.ci_gate_results": "needs κ²°κ³Ό: {results}",
1727
+ "flutter_a.ci_gate_failed": "μ‹€νŒ¨ν•˜κ±°λ‚˜ μ·¨μ†Œλœ job이 μžˆμŠ΅λ‹ˆλ‹€.",
1728
+ "flutter_a.ci_hdr_analyze_running": "## πŸ” Flutter CI (Analyze Only) μ§„ν–‰ 쀑...",
1729
+ "flutter_a.ci_hdr_running": "## πŸ”¨ Flutter CI μ§„ν–‰ 쀑...",
1730
+ "flutter_a.ci_status_skipped": "⏸️ μŠ€ν‚΅",
1731
+ "flutter_a.ci_status_running": "⏳ μ§„ν–‰ 쀑...",
1732
+ "flutter_a.ci_status_disabled": "⏸️ λΉ„ν™œμ„±ν™”",
1733
+ "flutter_a.ci_table_head": "| 검사 ν•­λͺ© | μƒνƒœ | μ†Œμš” μ‹œκ°„ |",
1734
+ "flutter_a.ci_row_analyze_running": "| πŸ” Analyze | ⏳ μ§„ν–‰ 쀑... | - |",
1735
+ "flutter_a.ci_row_test_running": "| πŸ§ͺ Test | ⏳ μ§„ν–‰ 쀑... | - |",
1736
+ "flutter_a.ci_row_android_pending": "| πŸ€– Android λΉŒλ“œ | {status} | - |",
1737
+ "flutter_a.ci_row_ios_pending": "| 🍎 iOS λΉŒλ“œ | {status} | - |",
1738
+ "flutter_a.ci_info_head": "| ν•­λͺ© | κ°’ |",
1739
+ "flutter_a.ci_row_branch": "| **브랜치** | `{branch}` |",
1740
+ "flutter_a.ci_row_commit": "| **컀밋** | `{commit}` |",
1741
+ "flutter_a.ci_note_analyze_only_running": "ℹ️ **Analyze Only λͺ¨λ“œ**: λΉŒλ“œ 없이 μ½”λ“œ λΆ„μ„λ§Œ μ‹€ν–‰λ©λ‹ˆλ‹€.",
1742
+ "flutter_a.ci_link_live_log": "**[πŸ“‹ μ‹€μ‹œκ°„ 둜그 보기]({url})**",
1743
+ "flutter_a.ci_footer_auto_update": "*πŸ€– 이 λŒ“κΈ€μ€ μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.*",
1744
+ "flutter_a.ci_log_comment_created": "βœ… μ§„ν–‰ 상황 λŒ“κΈ€ 생성 μ™„λ£Œ: #{id}",
1745
+ "flutter_a.ci_dur_min_sec": "{minutes}λΆ„ {seconds}초",
1746
+ "flutter_a.ci_dur_sec": "{seconds}초",
1747
+ "flutter_a.ci_log_analyze_result": "πŸ“‹ μ½”λ“œ 뢄석 κ²°κ³Ό: {status}, ν…ŒμŠ€νŠΈ: {test} ({duration})",
1748
+ "flutter_a.ci_log_android_result": "πŸ“‹ Android λΉŒλ“œ κ²°κ³Ό: {status} ({duration})",
1749
+ "flutter_a.ci_log_ios_result": "πŸ“‹ iOS λΉŒλ“œ κ²°κ³Ό: {status} ({duration})",
1750
+ "flutter_a.ci_status_success": "βœ… 성곡",
1751
+ "flutter_a.ci_status_failure": "❌ μ‹€νŒ¨",
1752
+ "flutter_a.ci_status_no_tests": "⏸️ ν…ŒμŠ€νŠΈ μ—†μŒ",
1753
+ "flutter_a.ci_status_not_run": "⏸️ μ‹€ν–‰ μ•ˆ 됨",
1754
+ "flutter_a.ci_hdr_analyze_success": "## βœ… Flutter CI (Analyze Only) 성곡!",
1755
+ "flutter_a.ci_hdr_analyze_failure": "## ❌ Flutter CI (Analyze Only) μ‹€νŒ¨",
1756
+ "flutter_a.ci_hdr_success": "## βœ… Flutter CI 성곡!",
1757
+ "flutter_a.ci_hdr_failure": "## ❌ Flutter CI μ‹€νŒ¨",
1758
+ "flutter_a.ci_row_android_result": "| πŸ€– Android λΉŒλ“œ | {status} | {duration} |",
1759
+ "flutter_a.ci_row_ios_result": "| 🍎 iOS λΉŒλ“œ | {status} | {duration} |",
1760
+ "flutter_a.ci_row_total": "| **총 μ†Œμš” μ‹œκ°„** | {duration} |",
1761
+ "flutter_a.ci_note_analyze_only_done": "ℹ️ **Analyze Only λͺ¨λ“œ**: λΉŒλ“œ 없이 μ½”λ“œ λΆ„μ„λ§Œ μ‹€ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
1762
+ "flutter_a.ci_hdr_checks": "### πŸ’‘ 확인 사항",
1763
+ "flutter_a.ci_analyze_fail_title": "**Analyze μ‹€νŒ¨ μ‹œ:**",
1764
+ "flutter_a.ci_analyze_fail_lint": "- `flutter analyze` λ‘œμ»¬μ—μ„œ μ‹€ν–‰ν•˜μ—¬ lint 였λ₯˜ 확인",
1765
+ "flutter_a.ci_analyze_fail_fix": "- μ½”λ“œ μŠ€νƒ€μΌ 및 νƒ€μž… 였λ₯˜ μˆ˜μ •",
1766
+ "flutter_a.ci_test_fail_title": "**Test μ‹€νŒ¨ μ‹œ:**",
1767
+ "flutter_a.ci_test_fail_local": "- `flutter test` λ‘œμ»¬μ—μ„œ μ‹€ν–‰ν•˜μ—¬ μ‹€νŒ¨ν•œ ν…ŒμŠ€νŠΈ 확인",
1768
+ "flutter_a.ci_android_fail_title": "**Android λΉŒλ“œ μ‹€νŒ¨ μ‹œ:**",
1769
+ "flutter_a.ci_android_fail_gradle": "- Gradle λΉŒλ“œ λ‘œκ·Έμ—μ„œ μ—λŸ¬ 확인",
1770
+ "flutter_a.ci_android_fail_deps": "- μ˜μ‘΄μ„± 버전 ν˜Έν™˜μ„± 확인",
1771
+ "flutter_a.ci_ios_fail_title": "**iOS λΉŒλ“œ μ‹€νŒ¨ μ‹œ:**",
1772
+ "flutter_a.ci_ios_fail_xcode": "- Xcode λΉŒλ“œ λ‘œκ·Έμ—μ„œ μ—λŸ¬ 확인",
1773
+ "flutter_a.ci_ios_fail_pods": "- CocoaPods μ˜μ‘΄μ„± 확인",
1774
+ "flutter_a.ci_link_workflow_log": "**[πŸ“‹ μ›Œν¬ν”Œλ‘œμš° 둜그]({url})**",
1775
+ "flutter_a.ci_log_result_updated": "βœ… κ²°κ³Ό λŒ“κΈ€ μ—…λ°μ΄νŠΈ μ™„λ£Œ",
1776
+ "flutter_a.ci_log_no_comment_id": "⚠️ λŒ“κΈ€ IDκ°€ μ—†μ–΄ μ—…λ°μ΄νŠΈλ₯Ό κ±΄λ„ˆλœλ‹ˆλ‹€.",
1777
+ # --- ios_test_tf ---
1778
+ "ios_test_tf.branch_check_log": "πŸ” 브랜치 쑴재 μ—¬λΆ€ 확인: {branch}",
1779
+ "ios_test_tf.branch_exists_log": "βœ… 브랜치 쑴재 확인됨: {branch}",
1780
+ "ios_test_tf.branch_not_found_log": "❌ 브랜치λ₯Ό 찾을 수 μ—†μŒ: {branch}",
1781
+ "ios_test_tf.branch_missing_title": "🍎 ❌ **iOS TestFlight λΉŒλ“œ μ‹€νŒ¨ - 브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€**",
1782
+ "ios_test_tf.kv_head": "| ν•­λͺ© | κ°’ |",
1783
+ "ios_test_tf.row_requested_branch": "| **μš”μ²­λœ 브랜치** | `{branch}` |",
1784
+ "ios_test_tf.row_issue_pr": "| **이슈/PR** | #{number} |",
1785
+ "ios_test_tf.hint_title": "### πŸ’‘ 확인 사항",
1786
+ "ios_test_tf.hint_pushed": "1. λΈŒλžœμΉ˜κ°€ 원격 μ €μž₯μ†Œμ— pushλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1787
+ "ios_test_tf.hint_helper_branch": "2. \"Issue Helper\" λŒ“κΈ€μ˜ 브랜치λͺ…이 μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•˜μ„Έμš”",
1788
+ "ios_test_tf.hint_typo": "3. 브랜치λͺ…에 μ˜€νƒ€κ°€ μ—†λŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1789
+ "ios_test_tf.workflow_log_link": "πŸ”— [μ›Œν¬ν”Œλ‘œμš° 둜그]({url})",
1790
+ "ios_test_tf.branch_not_found_fail": "브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€: {branch}",
1791
+ "ios_test_tf.branch_check_error_fail": "브랜치 확인 쀑 였λ₯˜: {error}",
1792
+ "ios_test_tf.title_running": "## 🍎 iOS TestFlight λΉŒλ“œ μ§„ν–‰ 쀑...",
1793
+ "ios_test_tf.table_header": "| 단계 | μƒνƒœ | μ†Œμš” μ‹œκ°„ |",
1794
+ "ios_test_tf.step_prepare": "πŸ”§ μ€€λΉ„",
1795
+ "ios_test_tf.step_build": "πŸ”¨ IPA λΉŒλ“œ",
1796
+ "ios_test_tf.step_deploy": "πŸ“€ TestFlight 배포",
1797
+ "ios_test_tf.st_running": "⏳ μ§„ν–‰ 쀑...",
1798
+ "ios_test_tf.st_waiting": "⏸️ λŒ€κΈ°",
1799
+ "ios_test_tf.st_done": "βœ… μ™„λ£Œ",
1800
+ "ios_test_tf.st_failed": "❌ μ‹€νŒ¨",
1801
+ "ios_test_tf.st_canceled": "⏸️ μ·¨μ†Œλ¨",
1802
+ "ios_test_tf.row_build_number": "| **λΉŒλ“œ 번호** | `{build}` |",
1803
+ "ios_test_tf.row_app_version": "| **μ•± 버전** | `{version}({build})` |",
1804
+ "ios_test_tf.row_branch": "| **브랜치** | `{branch}` |",
1805
+ "ios_test_tf.row_commit": "| **컀밋** | `{commit}` |",
1806
+ "ios_test_tf.row_total": "| **총 μ†Œμš” μ‹œκ°„** | {elapsed} |",
1807
+ "ios_test_tf.live_log_link": "**[πŸ“‹ μ‹€μ‹œκ°„ 둜그 보기]({url})**",
1808
+ "ios_test_tf.auto_update_note": "*πŸ€– 이 λŒ“κΈ€μ€ μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.*",
1809
+ "ios_test_tf.log_progress_created": "βœ… μ§„ν–‰ 상황 λŒ“κΈ€ 생성 μ™„λ£Œ: #{id}",
1810
+ "ios_test_tf.elapsed_min_sec": "{m}λΆ„ {s}초",
1811
+ "ios_test_tf.elapsed_sec": "{s}초",
1812
+ "ios_test_tf.secrets_missing": "ν•„μˆ˜ GitHub Secret이 λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€:{missing} (μ›Œν¬ν”Œλ‘œμš° 상단 주석 μ°Έκ³ )",
1813
+ "ios_test_tf.export_options_missing": "ios/ExportOptions.plistκ°€ μ—†μŠ΅λ‹ˆλ‹€ β€” μ €μž₯μ†Œμ— μΆ”κ°€(컀밋)ν•˜μ„Έμš”.",
1814
+ "ios_test_tf.export_options_placeholders": "ios/ExportOptions.plist에 μ±„μ›Œμ§€μ§€ μ•Šμ€ ν”Œλ ˆμ΄μŠ€ν™€λ”κ°€ 남아 μžˆμŠ΅λ‹ˆλ‹€ β€” νŒ€ IDΒ·λ²ˆλ“€ IDΒ·ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œνŒŒμΌ μ΄λ¦„μœΌλ‘œ λ°”κΏ” μ»€λ°‹ν•˜μ„Έμš”.",
1815
+ "ios_test_tf.fastfile_missing_error": "ios/fastlane/Fastfile이 μ—†μŠ΅λ‹ˆλ‹€ β€” μ €μž₯μ†Œμ— μΆ”κ°€(컀밋)ν•˜μ„Έμš”.",
1816
+ "ios_test_tf.preflight_ok": "βœ… 배포 μ„€μ • 확인 μ™„λ£Œ",
1817
+ "ios_test_tf.event_dispatch": "πŸ“‹ repository_dispatch 이벀트 감지",
1818
+ "ios_test_tf.event_pr_number": " PR 번호: #{pr}",
1819
+ "ios_test_tf.event_build_number_pr": " λΉŒλ“œ 번호: {build} (PR 번호 μ‚¬μš©)",
1820
+ "ios_test_tf.event_workflow_dispatch": "πŸ“‹ workflow_dispatch 이벀트 감지",
1821
+ "ios_test_tf.event_build_number_default": " λΉŒλ“œ 번호: {build} (κΈ°λ³Έκ°’)",
1822
+ "ios_test_tf.test_build_log": "πŸ“‹ ν…ŒμŠ€νŠΈ λΉŒλ“œ: 버전={version}, λΉŒλ“œλ²ˆν˜Έ={build}",
1823
+ "ios_test_tf.branch_name_log": "🌿 브랜치λͺ…: {branch}",
1824
+ "ios_test_tf.issue_number_missing": "⚠️ 브랜치λͺ…μ—μ„œ 이슈 번호λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
1825
+ "ios_test_tf.issue_number_extracted": "βœ… μΆ”μΆœλœ 이슈 번호: #{number}",
1826
+ "ios_test_tf.issue_fetching": "πŸ” GitHub API둜 이슈 정보 쑰회 쀑...",
1827
+ "ios_test_tf.issue_title_default": "이슈 정보 μ—†μŒ",
1828
+ "ios_test_tf.issue_not_found": "⚠️ 이슈 #{number}λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
1829
+ "ios_test_tf.issue_title_log": "πŸ“‹ 이슈 제λͺ©: {title}",
1830
+ "ios_test_tf.issue_state_log": "πŸ“Œ 이슈 μƒνƒœ: {state}",
1831
+ "ios_test_tf.notes_build": "ν…ŒμŠ€νŠΈ λΉŒλ“œ #{build}",
1832
+ "ios_test_tf.notes_branch": "브랜치: {branch}",
1833
+ "ios_test_tf.notes_commit": "컀밋: {commit}",
1834
+ "ios_test_tf.notes_date": "λ‚ μ§œ: {date}",
1835
+ "ios_test_tf.notes_issue_header": "κ΄€λ ¨ 이슈:",
1836
+ "ios_test_tf.notes_generated": "πŸ“‹ μƒμ„±λœ 릴리즈 λ…ΈνŠΈ:",
1837
+ "ios_test_tf.title_prepare_failed": "## 🍎 ❌ iOS TestFlight λΉŒλ“œ μ‹€νŒ¨",
1838
+ "ios_test_tf.prepare_error": "❌ **ν™˜κ²½ μ€€λΉ„ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.**",
1839
+ "ios_test_tf.run_log_check_link": "πŸ”— [μ›Œν¬ν”Œλ‘œμš° μ‹€ν–‰ 둜그 확인]({url})",
1840
+ "ios_test_tf.log_prepare_failed": "❌ μ§„ν–‰ 상황 μ—…λ°μ΄νŠΈ μ™„λ£Œ: μ€€λΉ„ μ‹€νŒ¨",
1841
+ "ios_test_tf.log_prepare_done": "βœ… μ§„ν–‰ 상황 μ—…λ°μ΄νŠΈ μ™„λ£Œ: μ€€λΉ„ μ™„λ£Œ ({elapsed})",
1842
+ "ios_test_tf.podfile_skip": "ℹ️ ios/Podfile이 μ—†μ–΄ pod install을 κ±΄λ„ˆλœλ‹ˆλ‹€ (CocoaPods ν”ŒλŸ¬κ·ΈμΈ μ—†μŒ)",
1843
+ "ios_test_tf.plist_missing": "❌ ios/ExportOptions.plistκ°€ μ—†μŠ΅λ‹ˆλ‹€!",
1844
+ "ios_test_tf.plist_missing_hint": "ios/ExportOptions.plistλ₯Ό μ €μž₯μ†Œμ— μΆ”κ°€(컀밋)ν•˜μ„Έμš”. ν•„μš”ν•œ SecretsλŠ” μ›Œν¬ν”Œλ‘œμš° 상단 주석을 μ°Έκ³ ν•˜μ„Έμš”.",
1845
+ "ios_test_tf.plist_ok": "βœ… ExportOptions.plist 확인됨",
1846
+ "ios_test_tf.title_ipa_done": "## 🍎 βœ… iOS λΉŒλ“œ μ™„λ£Œ",
1847
+ "ios_test_tf.log_ipa_done": "βœ… μ§„ν–‰ 상황 μ—…λ°μ΄νŠΈ μ™„λ£Œ: IPA λΉŒλ“œ μ™„λ£Œ ({elapsed})",
1848
+ "ios_test_tf.title_ipa_failed": "## 🍎 ❌ iOS TestFlight λΉŒλ“œ μ‹€νŒ¨",
1849
+ "ios_test_tf.ipa_error": "❌ **IPA λΉŒλ“œ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.**",
1850
+ "ios_test_tf.log_ipa_failed": "❌ μ§„ν–‰ 상황 μ—…λ°μ΄νŠΈ μ™„λ£Œ: IPA λΉŒλ“œ μ‹€νŒ¨",
1851
+ "ios_test_tf.fastfile_missing": "❌ ios/fastlane/Fastfile이 μ—†μŠ΅λ‹ˆλ‹€!",
1852
+ "ios_test_tf.fastfile_missing_hint": "ios/fastlane/Fastfile을 μ €μž₯μ†Œμ— μΆ”κ°€(컀밋)ν•˜μ„Έμš”. ν•„μš”ν•œ SecretsλŠ” μ›Œν¬ν”Œλ‘œμš° 상단 주석을 μ°Έκ³ ν•˜μ„Έμš”.",
1853
+ "ios_test_tf.fastfile_ok": "βœ… Fastfile 확인됨: ios/fastlane/Fastfile",
1854
+ "ios_test_tf.gemfile_repo": "ℹ️ μ €μž₯μ†Œμ˜ Gemfile을 μ‚¬μš©ν•©λ‹ˆλ‹€",
1855
+ "ios_test_tf.ipa_missing": "❌ IPA νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€!",
1856
+ "ios_test_tf.default_notes_echo": "πŸ“ κΈ°λ³Έ Release Notes: {notes}",
1857
+ "ios_test_tf.upload_ok": "βœ… TestFlight ν…ŒμŠ€νŠΈ λΉŒλ“œ μ—…λ‘œλ“œ 성곡!",
1858
+ "ios_test_tf.upload_version": "버전: {version}",
1859
+ "ios_test_tf.upload_build": "λΉŒλ“œ 번호: {build}",
1860
+ "ios_test_tf.upload_pr": "PR 번호: {pr}",
1861
+ "ios_test_tf.upload_branch": "브랜치: {branch}",
1862
+ "ios_test_tf.upload_commit": "컀밋: {sha}",
1863
+ "ios_test_tf.upload_issue": "κ΄€λ ¨ 이슈: {url}",
1864
+ "ios_test_tf.upload_failed": "❌ TestFlight ν…ŒμŠ€νŠΈ λΉŒλ“œ μ—…λ‘œλ“œ μ‹€νŒ¨!",
1865
+ "ios_test_tf.check_logs": "둜그λ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”.",
1866
+ "ios_test_tf.title_deploy_done": "## 🍎 βœ… iOS TestFlight 배포 μ™„λ£Œ",
1867
+ "ios_test_tf.download_hint": "πŸ“± **TestFlightμ—μ„œ ν…ŒμŠ€νŠΈ 앱을 λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.**",
1868
+ "ios_test_tf.run_log_link": "πŸ”— [μ›Œν¬ν”Œλ‘œμš° μ‹€ν–‰ 둜그]({url})",
1869
+ "ios_test_tf.log_all_done": "βœ… μ§„ν–‰ 상황 μ΅œμ’… μ—…λ°μ΄νŠΈ μ™„λ£Œ: 전체 성곡 ({elapsed})",
1870
+ "ios_test_tf.title_deploy_failed": "## 🍎 ❌ iOS TestFlight 배포 μ‹€νŒ¨",
1871
+ "ios_test_tf.deploy_error": "❌ **TestFlight 배포 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.**",
1872
+ "ios_test_tf.log_deploy_failed": "❌ μ§„ν–‰ 상황 μ΅œμ’… μ—…λ°μ΄νŠΈ μ™„λ£Œ: TestFlight 배포 μ‹€νŒ¨",
1873
+ # --- ios_testflight ---
1874
+ "ios_testflight.secrets_missing": "ν•„μˆ˜ GitHub Secret이 λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€:{missing} (μ›Œν¬ν”Œλ‘œμš° 상단 주석 μ°Έκ³ )",
1875
+ "ios_testflight.export_options_missing": "ios/ExportOptions.plistκ°€ μ—†μŠ΅λ‹ˆλ‹€ β€” μ €μž₯μ†Œμ— μΆ”κ°€(컀밋)ν•˜μ„Έμš”.",
1876
+ "ios_testflight.export_options_placeholders": "ios/ExportOptions.plist에 μ±„μ›Œμ§€μ§€ μ•Šμ€ ν”Œλ ˆμ΄μŠ€ν™€λ”κ°€ 남아 μžˆμŠ΅λ‹ˆλ‹€ β€” νŒ€ IDΒ·λ²ˆλ“€ IDΒ·ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œνŒŒμΌ μ΄λ¦„μœΌλ‘œ λ°”κΏ” μ»€λ°‹ν•˜μ„Έμš”.",
1877
+ "ios_testflight.fastfile_missing_error": "ios/fastlane/Fastfile이 μ—†μŠ΅λ‹ˆλ‹€ β€” μ €μž₯μ†Œμ— μΆ”κ°€(컀밋)ν•˜μ„Έμš”.",
1878
+ "ios_testflight.preflight_ok": "βœ… 배포 μ„€μ • 확인 μ™„λ£Œ",
1879
+ "ios_testflight.podfile_skip": "ℹ️ ios/Podfile이 μ—†μ–΄ pod install을 κ±΄λ„ˆλœλ‹ˆλ‹€ (CocoaPods ν”ŒλŸ¬κ·ΈμΈ μ—†μŒ)",
1880
+ "ios_testflight.version_info": "πŸ“‹ 버전: {version} (λΉŒλ“œλ²ˆν˜Έ: {build})",
1881
+ "ios_testflight.default_notes": "v{version} μ—…λ°μ΄νŠΈ",
1882
+ "ios_testflight.plist_placeholders": "❌ ios/ExportOptions.plist에 μ±„μ›Œμ§€μ§€ μ•Šμ€ ν”Œλ ˆμ΄μŠ€ν™€λ”κ°€ 남아 μžˆμŠ΅λ‹ˆλ‹€:",
1883
+ "ios_testflight.plist_placeholders_hint": "νŒ€ IDΒ·λ²ˆλ“€ IDΒ·ν”„λ‘œλΉ„μ €λ‹ ν”„λ‘œνŒŒμΌ μ΄λ¦„μœΌλ‘œ λ°”κΏ” μ»€λ°‹ν•œ λ’€ λ‹€μ‹œ μ‹€ν–‰ν•˜μ„Έμš”.",
1884
+ "ios_testflight.fastfile_missing": "❌ ios/fastlane/Fastfile이 μ—†μŠ΅λ‹ˆλ‹€!",
1885
+ "ios_testflight.fastfile_missing_hint": "ios/fastlane/Fastfile을 μ €μž₯μ†Œμ— μΆ”κ°€(컀밋)ν•˜μ„Έμš”. ν•„μš”ν•œ SecretsλŠ” μ›Œν¬ν”Œλ‘œμš° 상단 주석을 μ°Έκ³ ν•˜μ„Έμš”.",
1886
+ "ios_testflight.fastfile_ok": "βœ… Fastfile 확인됨: ios/fastlane/Fastfile",
1887
+ "ios_testflight.gemfile_repo": "ℹ️ μ €μž₯μ†Œμ˜ Gemfile을 μ‚¬μš©ν•©λ‹ˆλ‹€",
1888
+ "ios_testflight.ipa_missing": "❌ IPA νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€!",
1889
+ "ios_testflight.default_notes_echo": "πŸ“ κΈ°λ³Έ Release Notes: {notes}",
1890
+ "ios_testflight.upload_ok": "βœ… TestFlight μ—…λ‘œλ“œ 성곡!",
1891
+ "ios_testflight.upload_version": "πŸ“± 버전: {version}",
1892
+ "ios_testflight.upload_build": "πŸ”’ λΉŒλ“œλ²ˆν˜Έ: {build}",
1893
+ "ios_testflight.upload_commit": "πŸ“ 컀밋: {sha}",
1894
+ "ios_testflight.upload_failed": "❌ TestFlight μ—…λ‘œλ“œ μ‹€νŒ¨!",
1895
+ "ios_testflight.check_logs": "둜그λ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”.",
1896
+ # --- issue_helper ---
1897
+ "issue_helper.err_list_comments": "이슈 μ½”λ©˜νŠΈ 쑰회 μ‹€νŒ¨({status}): {issue_number}",
1898
+ "issue_helper.err_update_comment": "μ½”λ©˜νŠΈ κ°±μ‹  μ‹€νŒ¨({status})",
1899
+ "issue_helper.comment_updated": "κΈ°μ‘΄ μ½”λ©˜νŠΈλ₯Ό κ°±μ‹ ν–ˆμŠ΅λ‹ˆλ‹€.",
1900
+ "issue_helper.err_create_comment": "μ½”λ©˜νŠΈ μž‘μ„± μ‹€νŒ¨({status})",
1901
+ "issue_helper.comment_created": "μƒˆ μ½”λ©˜νŠΈλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.",
1902
+ "issue_helper.err_repo_info": "레포 정보 쑰회 μ‹€νŒ¨({status})",
1903
+ "issue_helper.err_base_ref": "base 브랜치 ref 쑰회 μ‹€νŒ¨({base}, {status})",
1904
+ "issue_helper.branch_exists": "λΈŒλžœμΉ˜κ°€ 이미 μ‘΄μž¬ν•¨, κ±΄λ„ˆλœ€: {branch_name}",
1905
+ "issue_helper.err_create_branch": "브랜치 생성 μ‹€νŒ¨({branch_name}, {status})",
1906
+ "issue_helper.branch_created": "브랜치 생성됨: {branch_name}",
1907
+ "issue_helper.warn_issue_missing": "::warning::이슈 #{n}이 λ ˆν¬μ— μ—†μ–΄ PR λ³Έλ¬Έ Closes μ—°κ²°μ—μ„œ μ œμ™Έν•©λ‹ˆλ‹€",
1908
+ "issue_helper.warn_is_pr": "::warning::#{n}은 μ΄μŠˆκ°€ μ•„λ‹ˆλΌ PR이라 Closes μ—°κ²°μ—μ„œ μ œμ™Έν•©λ‹ˆλ‹€",
1909
+ "issue_helper.issue_check_failed": "이슈 #{n} 확인 μ‹€νŒ¨({status}) β€” ν™•μΈν•˜μ§€ λͺ»ν•΄ κ·ΈλŒ€λ‘œ μ—°κ²°ν•©λ‹ˆλ‹€",
1910
+ "issue_helper.no_issue_to_link": "μ—°κ²°ν•  μ΄μŠˆκ°€ μ—†μŒ β€” κ±΄λ„ˆλœ€ (PR #{pr_number})",
1911
+ "issue_helper.err_get_pr": "PR 쑰회 μ‹€νŒ¨({status}): {pr_number}",
1912
+ "issue_helper.link_unchanged": "이슈 μ—°κ²° λ³€κ²½ μ—†μŒ β€” κ±΄λ„ˆλœ€ (PR #{pr_number})",
1913
+ "issue_helper.err_update_pr": "PR λ³Έλ¬Έ κ°±μ‹  μ‹€νŒ¨({status}): {pr_number}",
1914
+ "issue_helper.link_done": "이슈 μ—°κ²° μ™„λ£Œ: {numbers} (PR #{pr_number})",
1915
+ "issue_helper.err_no_event_path": "ERROR: GITHUB_EVENT_PATHκ°€ μ—†μŠ΅λ‹ˆλ‹€.",
1916
+ "issue_helper.err_event_payload": "ERROR: 이벀트 νŽ˜μ΄λ‘œλ“œλ₯Ό 읽을 수 μ—†μŠ΅λ‹ˆλ‹€: {error}",
1917
+ "issue_helper.not_relevant_event": "μ—΄λ¦Ό λ˜λŠ” 제λͺ© λ³€κ²½ μ΄λ²€νŠΈκ°€ μ•„λ‹˜ β†’ μ’…λ£Œ",
1918
+ "issue_helper.err_repo_format": "ERROR: GITHUB_REPOSITORY ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€: {repo}",
1919
+ "issue_helper.err_no_token": "ERROR: GITHUB_TOKEN이 μ—†μŠ΅λ‹ˆλ‹€.",
1920
+ "issue_helper.commit_template_default": "${issueTitle} : feat : {λ³€κ²½ 사항에 λŒ€ν•œ μ„€λͺ…} ${issueUrl}",
1921
+ "issue_helper.branch_title": "브랜치λͺ…",
1922
+ "issue_helper.commit_title": "컀밋 λ©”μ‹œμ§€",
1923
+ "issue_helper.no_issue_numbers": "이슈 λ²ˆν˜Έκ°€ μ—†μŒ β€” κ±΄λ„ˆλœ€",
1924
+ "issue_helper.run_failed": "μ‹€ν–‰ μ‹€νŒ¨: {error}",
1925
+ # --- truncate ---
1926
+ "truncate.file_missing": "릴리즈 λ…ΈνŠΈ 파일 μ—†μŒ, κ±΄λ„ˆλœ€: {path}",
1927
+ "truncate.within_limit": "ν•œλ„ 이내 ({length}/{limit} {mode}), 자λ₯΄μ§€ μ•ŠμŒ: {path}",
1928
+ "truncate.truncated": "ν•œλ„ 초과 ({length} -> {limit} {mode} μ΄ν•˜λ‘œ μ ˆλ‹¨): {path}",
1929
+ "truncate.limit_positive": "ERROR: limit은 μ–‘μˆ˜μ—¬μ•Ό 함: {limit}",
1930
+ # --- version ---
1931
+ "version.bump_help": "승격 폭 (κΈ°λ³Έ patch β€” μ§€μ • μ•ˆ ν•˜λ©΄ κΈ°μ‘΄ λ™μž‘κ³Ό 동일)",
1932
+ # --- wf_aisum ---
1933
+ "wf_aisum.no_issue_in_branch": "브랜치λͺ…μ—μ„œ 이슈 번호λ₯Ό μ°Ύμ§€ λͺ»ν•¨ β€” κ±΄λ„ˆλœ€: {ref}",
1934
+ # --- wf_changelog ---
1935
+ "wf_changelog.pr_list_limit": "gh pr listκ°€ --limit 200에 λ„λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€ β€” 였래된 병합 PR이 λˆ„λ½λμ„ 수 μžˆμŠ΅λ‹ˆλ‹€ (쑰회된 PR: {count})",
1936
+ "wf_changelog.no_issues": "이번 λ¦΄λ¦¬μŠ€μ— μ—°κ²°ν•  이슈 μ—†μŒ β€” κ±΄λ„ˆλœ€",
1937
+ "wf_changelog.issues_linked": "이슈 μ—°κ²°: {issues}",
1938
+ "wf_changelog.merge_conflict": "릴리슀 PR이 {prod}와 μΆ©λŒν•©λ‹ˆλ‹€ (버전 파일·CHANGELOG λ“±) β€” {prod}μ—λ§Œ μžˆλŠ” 컀밋을 {dev}에 λ³‘ν•©ν•œ λ’€ pushν•˜μ„Έμš”: git checkout {dev} && git merge origin/{prod} (버전 쀄 μΆ©λŒμ€ μ–΄λŠ μͺ½μ„ 택해도 λ‹€μŒ 싀행이 μ•Œλ§žκ²Œ λ‹€μ‹œ ν™•μ •ν•©λ‹ˆλ‹€)",
1939
+ "wf_changelog.merge_commit_disabled": "이 λ ˆν¬λŠ” merge commit이 λΉ„ν™œμ„±ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€ β€” Settingsμ—μ„œ 'Allow merge commits'λ₯Ό μΌœμ„Έμš”; 릴리슀 κ°μ§€λŠ” merge commit subjectλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€",
1940
+ "wf_changelog.merge_confirmed": "PR #{pr} 병합 확인 (κ²½κ³Ό {elapsed}s)",
1941
+ "wf_changelog.merge_timeout": "PR #{pr} 병합을 {max}s 내에 ν™•μΈν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€ β€” RELEASE-PUBLISH μžλ™ 트리거λ₯Ό κ±΄λ„ˆλœλ‹ˆλ‹€. WORKFLOW_PAT이 λ“±λ‘λ˜μ–΄ μžˆλ‹€λ©΄ κΈ°μ‘΄ 경둜둜 정상 μ§„ν–‰λ˜λ©°, μ—†λ‹€λ©΄ ν•„μš” μ‹œ RELEASE-PUBLISHλ₯Ό μˆ˜λ™μœΌλ‘œ workflow_dispatch ν•˜μ„Έμš”.",
1942
+ "wf_changelog.release_publish_triggered": "RELEASE-PUBLISH workflow_dispatch 트리거 μš”μ²­ μ™„λ£Œ (WORKFLOW_PAT 없이도 λ™μž‘)",
1943
+ # --- wf_preview ---
1944
+ "wf_preview.chk_deleted_3": "3. λΈŒλžœμΉ˜κ°€ μ‚­μ œλ˜μ§€ μ•Šμ•˜λŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1945
+ "wf_preview.chk_helper_exists": "1. Issue Helper λŒ“κΈ€μ΄ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1946
+ "wf_preview.chk_helper_marker": "3. `ISSUE_HELPER_MARKER` ν™˜κ²½λ³€μˆ˜κ°€ μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•˜μ„Έμš”",
1947
+ "wf_preview.chk_helper_section": "2. λŒ“κΈ€μ— `### 브랜치` μ„Ήμ…˜μ΄ μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1948
+ "wf_preview.chk_name_1": "1. 브랜치λͺ…이 μ •ν™•ν•œμ§€ ν™•μΈν•˜μ„Έμš”",
1949
+ "wf_preview.chk_name_2": "2. 브랜치λͺ…이 μ •ν™•ν•œμ§€ ν™•μΈν•˜μ„Έμš”",
1950
+ "wf_preview.chk_pushed_1": "1. λΈŒλžœμΉ˜κ°€ pushλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1951
+ "wf_preview.chk_pushed_2": "2. λΈŒλžœμΉ˜κ°€ pushλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”",
1952
+ "wf_preview.cmd_advanced": "<summary>πŸ”§ κ³ κΈ‰ λͺ…λ Ήμ–΄ (λ‹€λ₯Έ Issue/PRμ—μ„œ μ œμ–΄)</summary>",
1953
+ "wf_preview.cmd_build": "| `/wizard server build` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |",
1954
+ "wf_preview.cmd_build_branch": "| `/wizard server build {branchName}` | μ΅œμ‹  μ»€λ°‹μœΌλ‘œ 재배포 |",
1955
+ "wf_preview.cmd_destroy": "| `/wizard server destroy` | Preview ν™˜κ²½ μ‚­μ œ |",
1956
+ "wf_preview.cmd_destroy_branch": "| `/wizard server destroy {branchName}` | Preview ν™˜κ²½ μ‚­μ œ |",
1957
+ "wf_preview.cmd_detected_build": "βœ… λͺ…λ Ήμ–΄ 감지: build",
1958
+ "wf_preview.cmd_detected_build_branch": "βœ… λͺ…λ Ήμ–΄ 감지: build (브랜치: {branch})",
1959
+ "wf_preview.cmd_detected_destroy": "βœ… λͺ…λ Ήμ–΄ 감지: destroy",
1960
+ "wf_preview.cmd_detected_destroy_branch": "βœ… λͺ…λ Ήμ–΄ 감지: destroy (브랜치: {branch})",
1961
+ "wf_preview.cmd_detected_status": "βœ… λͺ…λ Ήμ–΄ 감지: status",
1962
+ "wf_preview.cmd_detected_status_branch": "βœ… λͺ…λ Ήμ–΄ 감지: status (브랜치: {branch})",
1963
+ "wf_preview.cmd_from_issue": "ℹ️ Issue λŒ“κΈ€μ—μ„œ λͺ…λ Ήμ–΄ 감지",
1964
+ "wf_preview.cmd_from_pr": "ℹ️ PR λŒ“κΈ€μ—μ„œ λͺ…λ Ήμ–΄ 감지",
1965
+ "wf_preview.cmd_not_wizard": "ℹ️ /wizard server λͺ…λ Ήμ–΄κ°€ μ•„λ‹˜",
1966
+ "wf_preview.cmd_status": "| `/wizard server status` | ν˜„μž¬ μƒνƒœ 확인 |",
1967
+ "wf_preview.cmd_status_branch": "| `/wizard server status {branchName}` | ν˜„μž¬ μƒνƒœ 확인 |",
1968
+ "wf_preview.deploy_hint": "λ°°ν¬ν•˜λ €λ©΄: `/wizard server build`",
1969
+ "wf_preview.deploy_hint_branch": "λ°°ν¬ν•˜λ €λ©΄: `/wizard server build {branchName}`",
1970
+ "wf_preview.done_label": "μ™„λ£Œ",
1971
+ "wf_preview.dur_min_sec": "{minutes}λΆ„ {seconds}초",
1972
+ "wf_preview.dur_sec": "{seconds}초",
1973
+ "wf_preview.env_branch": "| **브랜치** | `{branchName}` |",
1974
+ "wf_preview.env_commit": "| **컀밋** | `{sha}` |",
1975
+ "wf_preview.env_container_issue": "| **μ»¨ν…Œμ΄λ„ˆ** | `{projectName}-pr-{issueNumber}` |",
1976
+ "wf_preview.env_container_name": "| **μ»¨ν…Œμ΄λ„ˆ** | `{containerName}` |",
1977
+ "wf_preview.env_container_num": "| **μ»¨ν…Œμ΄λ„ˆ** | `{projectName}-pr-{number}` |",
1978
+ "wf_preview.env_container_pr": "| **μ»¨ν…Œμ΄λ„ˆ** | `{projectName}-pr-{prNumber}` |",
1979
+ "wf_preview.env_marker": "| **마컀** | `{marker}` |",
1980
+ "wf_preview.env_status_absent": "| **μƒνƒœ** | πŸ”΄ Not Found |",
1981
+ "wf_preview.env_status_deleted": "| **μƒνƒœ** | μ‚­μ œλ¨ |",
1982
+ "wf_preview.env_status_running": "| **μƒνƒœ** | 🟒 Running |",
1983
+ "wf_preview.fail_branch_missing": "브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€",
1984
+ "wf_preview.fail_branch_missing_named": "브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€: {branchName}",
1985
+ "wf_preview.footer_context": "*πŸ€– 이 λŒ“κΈ€μ€ {contextType} Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*",
1986
+ "wf_preview.footer_custom": "*πŸ€– 이 λŒ“κΈ€μ€ Custom Branch Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*",
1987
+ "wf_preview.footer_generic": "*πŸ€– 이 λŒ“κΈ€μ€ Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*",
1988
+ "wf_preview.footer_issue": "*πŸ€– 이 λŒ“κΈ€μ€ Issue Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*",
1989
+ "wf_preview.footer_pr": "*πŸ€– 이 λŒ“κΈ€μ€ PR Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*",
1990
+ "wf_preview.footer_pr_issue": "*πŸ€– 이 λŒ“κΈ€μ€ PR/Issue Preview μ‹œμŠ€ν…œμ— μ˜ν•΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*",
1991
+ "wf_preview.footer_progress": "*πŸ€– 이 λŒ“κΈ€μ€ μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.*",
1992
+ "wf_preview.hint_docker": "- Docker 이미지 λΉŒλ“œ μ‹€νŒ¨",
1993
+ "wf_preview.hint_docker_go": "- Docker 이미지 λΉŒλ“œ μ‹€νŒ¨ (Go μ˜μ‘΄μ„±/λΉŒλ“œ 문제)",
1994
+ "wf_preview.hint_docker_python": "- Docker 이미지 λΉŒλ“œ μ‹€νŒ¨ (Python μ˜μ‘΄μ„± 문제)",
1995
+ "wf_preview.hint_env_missing": "- ν™˜κ²½λ³€μˆ˜ λˆ„λ½ (.env 파일 μ„€μ • 확인)",
1996
+ "wf_preview.hint_gradle": "- Gradle λΉŒλ“œ μ‹€νŒ¨",
1997
+ "wf_preview.hint_health_timeout": "- Health Check νƒ€μž„μ•„μ›ƒ (120초 λ‚΄ 기동 μ™„λ£Œ μ•ˆλ¨)",
1998
+ "wf_preview.hint_secrets": "- ν•„μˆ˜ Secret(DOCKERHUB_*, SERVER_*) 미등둝 λ˜λŠ” Dockerfile μ—†μŒ β†’ 둜그의 \"배포 사전 점검\" 단계 확인",
1999
+ "wf_preview.hint_server_conn": "- μ„œλ²„ μ—°κ²° 문제",
2000
+ "wf_preview.hint_start": "- μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ μ‹€νŒ¨",
2001
+ "wf_preview.hint_start_go": "- μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ μ‹€νŒ¨ (μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 기동 였λ₯˜)",
2002
+ "wf_preview.hint_start_python": "- μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ μ‹€νŒ¨ (FastAPI/Uvicorn 기동 였λ₯˜)",
2003
+ "wf_preview.hint_start_spring": "- μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘ μ‹€νŒ¨ (Spring Boot 기동 였λ₯˜)",
2004
+ "wf_preview.line_branch": "**브랜치**: `{branchName}`",
2005
+ "wf_preview.line_commit": "**컀밋**: `{sha}`",
2006
+ "wf_preview.link_build_logs": "**[πŸ“‹ λΉŒλ“œ/배포 둜그 확인]({runUrl})**",
2007
+ "wf_preview.link_logs": "**[πŸ“‹ μ‹€μ‹œκ°„ 둜그 보기]({runUrl})**",
2008
+ "wf_preview.log_branch_exists": "βœ… 브랜치 쑴재: {branchName}",
2009
+ "wf_preview.log_branch_found": "βœ… 브랜치 발견: {branchName}",
2010
+ "wf_preview.log_branch_missing": "❌ 브랜치 μ—†μŒ: {branchName}",
2011
+ "wf_preview.log_check_branch": "πŸ” 브랜치 확인: {branchName}",
2012
+ "wf_preview.log_check_exists": "πŸ” 브랜치 쑴재 확인: {branchName}",
2013
+ "wf_preview.log_hash": "βœ… ν•΄μ‹œ 생성: custom-{hashStr}",
2014
+ "wf_preview.log_helper_no_branch": "⚠️ Issue Helper λŒ“κΈ€μ—μ„œ 브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
2015
+ "wf_preview.log_issue_number": "βœ… Issue 번호 μΆ”μΆœ: #{n}",
2016
+ "wf_preview.log_marker": "πŸ“ 마컀: {marker}",
2017
+ "wf_preview.log_search_branch": "πŸ” Issue #{issueNumber}μ—μ„œ 브랜치 검색 쀑...",
2018
+ "wf_preview.next_logs": "1. μœ„ λ§ν¬μ—μ„œ λΉŒλ“œ/배포 둜그λ₯Ό ν™•μΈν•˜μ„Έμš”",
2019
+ "wf_preview.next_retry": "2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `/wizard server build`",
2020
+ "wf_preview.next_retry_branch": "2. 문제λ₯Ό μˆ˜μ •ν•œ ν›„ λ‹€μ‹œ μ‹œλ„ν•˜μ„Έμš”: `/wizard server build {branchName}`",
2021
+ "wf_preview.precheck_dockerfile_body": "{path} 파일이 μ—†μŠ΅λ‹ˆλ‹€. 이 μ›Œν¬ν”Œλ‘œμš°λŠ” Docker μ΄λ―Έμ§€λ‘œ λ°°ν¬ν•˜λ―€λ‘œ Dockerfile이 ν•„μš”ν•©λ‹ˆλ‹€ (μ„œλ²„ 배포λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 이 μ›Œν¬ν”Œλ‘œμš° νŒŒμΌμ„ μ‚­μ œν•˜μ„Έμš”)",
2022
+ "wf_preview.precheck_dockerfile_title": "Dockerfile μ—†μŒ",
2023
+ "wf_preview.precheck_ok": "βœ… 사전 점검 톡과: ν•„μˆ˜ Secretκ³Ό Dockerfile이 λͺ¨λ‘ μžˆμŠ΅λ‹ˆλ‹€",
2024
+ "wf_preview.precheck_secret_body": "λ“±λ‘λ˜μ§€ μ•Šμ€ GitHub Secret:{missing} β€” Settings β†’ Secrets and variables β†’ Actionsμ—μ„œ λ“±λ‘ν•˜μ„Έμš”",
2025
+ "wf_preview.precheck_secret_title": "ν•„μˆ˜ Secret λˆ„λ½",
2026
+ "wf_preview.r_container_absent": "❌ μ»¨ν…Œμ΄λ„ˆ μ—†μŒ",
2027
+ "wf_preview.r_container_confirmed": "βœ… μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ 확인됨",
2028
+ "wf_preview.r_container_exited": "❌ μ»¨ν…Œμ΄λ„ˆ 비정상 μ’…λ£Œ!",
2029
+ "wf_preview.r_container_logs": "πŸ“‹ μ»¨ν…Œμ΄λ„ˆ 둜그 (졜근 100쀄):",
2030
+ "wf_preview.r_container_missing_info": "ℹ️ μ»¨ν…Œμ΄λ„ˆκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ: {container_name}",
2031
+ "wf_preview.r_container_name": "πŸ“› μ»¨ν…Œμ΄λ„ˆ: {container_name}",
2032
+ "wf_preview.r_container_new_named": "🐳 μƒˆ μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘: {container_name}",
2033
+ "wf_preview.r_container_removing": "🐳 μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ 쀑...",
2034
+ "wf_preview.r_container_removing_named": "πŸ—‘οΈ μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ 쀑: {container_name}",
2035
+ "wf_preview.r_container_running": "βœ… μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ 쀑",
2036
+ "wf_preview.r_container_starting": "🐳 μƒˆ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ 쀑...",
2037
+ "wf_preview.r_deploy_done": "βœ… 배포 μ™„λ£Œ!",
2038
+ "wf_preview.r_deploy_failed_not_running": "❌ 배포 μ‹€νŒ¨: μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λ˜μ§€ μ•ŠμŒ",
2039
+ "wf_preview.r_deploy_head_custom": "πŸš€ Custom Branch Preview 배포 μ‹œμž‘",
2040
+ "wf_preview.r_deploy_head_custom_short": "πŸš€ Custom Branch Preview 배포",
2041
+ "wf_preview.r_deploy_head_issue": "πŸš€ Issue Preview 배포 μ‹œμž‘",
2042
+ "wf_preview.r_deploy_head_pr": "πŸš€ PR Preview 배포 μ‹œμž‘",
2043
+ "wf_preview.r_destroy_head": "πŸ—‘οΈ Preview μ‚­μ œ",
2044
+ "wf_preview.r_destroy_head_custom": "πŸ—‘οΈ Custom Branch Preview μ‚­μ œ",
2045
+ "wf_preview.r_destroy_head_pr": "πŸ—‘οΈ PR Preview μ‚­μ œ",
2046
+ "wf_preview.r_domain": "🌐 도메인: {domain}",
2047
+ "wf_preview.r_existing_cleanup": "πŸ—‘οΈ κΈ°μ‘΄ μ»¨ν…Œμ΄λ„ˆ 정리 쀑...",
2048
+ "wf_preview.r_existing_removed": "πŸ—‘οΈ κΈ°μ‘΄ μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ: {container_name}",
2049
+ "wf_preview.r_hc_done": "βœ… 배포 및 Health Check μ™„λ£Œ! (방식: {health_check_method})",
2050
+ "wf_preview.r_hc_ok_http": "βœ… 정상 기동 확인! (HTTP 응닡: {health_path})",
2051
+ "wf_preview.r_hc_ok_log": "βœ… 정상 기동 확인! (둜그 νŒ¨ν„΄)",
2052
+ "wf_preview.r_hc_start": "⏳ Health Check μ‹œμž‘ (μ΅œλŒ€ 120초 λŒ€κΈ°)...",
2053
+ "wf_preview.r_hc_timeout": "❌ Health Check νƒ€μž„μ•„μ›ƒ (120초)",
2054
+ "wf_preview.r_hc_wait_60": "⏳ Health Check λŒ€κΈ° (μ΅œλŒ€ 60초)...",
2055
+ "wf_preview.r_hc_waiting": "⏳ λŒ€κΈ° 쀑... ({retry_count}/{max_retries}) - μƒνƒœ: {status}",
2056
+ "wf_preview.r_image_pulling": "πŸ“₯ Docker 이미지 Pull 쀑...",
2057
+ "wf_preview.r_image_removing": "πŸ–ΌοΈ 이미지 μ‚­μ œ 쀑...",
2058
+ "wf_preview.r_num_generic": "πŸ”’ 번호: #{pr_number}",
2059
+ "wf_preview.r_num_issue": "πŸ”’ Issue 번호: #{issue_number}",
2060
+ "wf_preview.r_num_pr": "πŸ”’ PR 번호: #{pr_number}",
2061
+ "wf_preview.r_project_name": "πŸ“¦ ν”„λ‘œμ νŠΈ: {project_name}",
2062
+ "wf_preview.r_removed": "βœ… μ‚­μ œ μ™„λ£Œ!",
2063
+ "wf_preview.r_ssh_auth": "πŸ” SSH 인증 방식: {ssh_auth_method}",
2064
+ "wf_preview.r_status_head": "πŸ” Preview μƒνƒœ 확인",
2065
+ "wf_preview.r_status_head_custom": "πŸ” Custom Branch Preview μƒνƒœ 확인",
2066
+ "wf_preview.r_wait_i": "λŒ€κΈ° 쀑... ({i}/12)",
2067
+ "wf_preview.redeploy_hint": "λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: `/wizard server build`",
2068
+ "wf_preview.redeploy_hint_branch": "λ‹€μ‹œ λ°°ν¬ν•˜λ €λ©΄: `/wizard server build {branchName}`",
2069
+ "wf_preview.row_build_done": "| πŸ”¨ ν”„λ‘œμ νŠΈ λΉŒλ“œ | βœ… μ™„λ£Œ | {buildDuration} |",
2070
+ "wf_preview.row_build_progress": "| πŸ”¨ ν”„λ‘œμ νŠΈ λΉŒλ“œ | ⏳ μ§„ν–‰ 쀑... | - |",
2071
+ "wf_preview.row_build_status": "| πŸ”¨ ν”„λ‘œμ νŠΈ λΉŒλ“œ | {buildStatus} | {buildTime} |",
2072
+ "wf_preview.row_deploy_done": "| πŸš€ μ„œλ²„ 배포 & Health Check | βœ… μ™„λ£Œ | {deployDuration} |",
2073
+ "wf_preview.row_deploy_progress": "| πŸš€ μ„œλ²„ 배포 & Health Check | ⏳ μ§„ν–‰ 쀑... | - |",
2074
+ "wf_preview.row_deploy_status": "| πŸš€ μ„œλ²„ 배포 & Health Check | {deployStatus} | - |",
2075
+ "wf_preview.row_deploy_wait": "| πŸš€ μ„œλ²„ 배포 & Health Check | ⏸️ λŒ€κΈ° | - |",
2076
+ "wf_preview.row_docker_done": "| 🐳 Docker 이미지 λΉŒλ“œ & Push | βœ… μ™„λ£Œ | {dockerDuration} |",
2077
+ "wf_preview.row_docker_progress": "| 🐳 Docker 이미지 λΉŒλ“œ & Push | ⏳ μ§„ν–‰ 쀑... | - |",
2078
+ "wf_preview.row_docker_status": "| 🐳 Docker 이미지 λΉŒλ“œ & Push | {dockerStatus} | {dockerTime} |",
2079
+ "wf_preview.row_image_done": "| 🐳 Docker 이미지 생성 | βœ… μ™„λ£Œ | {dockerDuration} |",
2080
+ "wf_preview.row_image_progress": "| 🐳 Docker 이미지 생성 | ⏳ μ§„ν–‰ 쀑... | - |",
2081
+ "wf_preview.row_image_status": "| 🐳 Docker 이미지 생성 | {dockerStatus} | {dockerTime} |",
2082
+ "wf_preview.row_image_wait": "| 🐳 Docker 이미지 생성 | ⏸️ λŒ€κΈ° | - |",
2083
+ "wf_preview.sec_causes": "### πŸ” κ°€λŠ₯ν•œ 원인",
2084
+ "wf_preview.sec_check": "### πŸ’‘ 확인 사항",
2085
+ "wf_preview.sec_commands": "### πŸ“‹ λͺ…λ Ήμ–΄",
2086
+ "wf_preview.sec_env": "### 🌐 Preview ν™˜κ²½",
2087
+ "wf_preview.sec_next": "### πŸ’‘ λ‹€μŒ 단계",
2088
+ "wf_preview.skip_no_branch": "⚠️ λΈŒλžœμΉ˜κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ•„ λΉŒλ“œλ₯Ό κ±΄λ„ˆλœλ‹ˆλ‹€.",
2089
+ "wf_preview.status_done": "βœ… μ™„λ£Œ",
2090
+ "wf_preview.status_failed": "❌ μ‹€νŒ¨",
2091
+ "wf_preview.status_init_failed": "⚠️ μ΄ˆκΈ°ν™” μ‹€νŒ¨",
2092
+ "wf_preview.status_waiting": "⏸️ λŒ€κΈ°",
2093
+ "wf_preview.tbl_commands": "| λͺ…λ Ήμ–΄ | μ„€λͺ… |",
2094
+ "wf_preview.tbl_items": "| ν•­λͺ© | κ°’ |",
2095
+ "wf_preview.tbl_steps": "| 단계 | μƒνƒœ | μ†Œμš” μ‹œκ°„ |",
2096
+ "wf_preview.title_absent": "## ❌ Preview ν™˜κ²½ μ—†μŒ",
2097
+ "wf_preview.title_branch_missing": "## ❌ 브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€",
2098
+ "wf_preview.title_branch_missing_warn": "## ⚠️ 브랜치λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€",
2099
+ "wf_preview.title_custom_absent": "## ❌ Custom Branch Preview ν™˜κ²½ μ—†μŒ",
2100
+ "wf_preview.title_custom_building": "## πŸš€ Custom Branch Preview λΉŒλ“œ 쀑...",
2101
+ "wf_preview.title_custom_deployed": "## βœ… Custom Branch Preview 배포 μ™„λ£Œ!",
2102
+ "wf_preview.title_custom_destroyed": "## πŸ—‘οΈ Custom Branch Preview ν™˜κ²½ μ‚­μ œ μ™„λ£Œ!",
2103
+ "wf_preview.title_custom_destroyed_short": "## πŸ—‘οΈ Custom Branch Preview μ‚­μ œ μ™„λ£Œ",
2104
+ "wf_preview.title_custom_failed": "## ❌ Custom Branch Preview 배포 μ‹€νŒ¨!",
2105
+ "wf_preview.title_custom_running": "## βœ… Custom Branch Preview ν™˜κ²½ μ‹€ν–‰ 쀑",
2106
+ "wf_preview.title_custom_started": "## πŸš€ Custom Branch Preview 배포 μ‹œμž‘",
2107
+ "wf_preview.title_destroyed": "## πŸ—‘οΈ Preview ν™˜κ²½ μ‚­μ œ μ™„λ£Œ!",
2108
+ "wf_preview.title_issue_building": "## πŸš€ Issue Preview λΉŒλ“œ 쀑...",
2109
+ "wf_preview.title_issue_deployed": "## βœ… Issue Preview 배포 μ™„λ£Œ!",
2110
+ "wf_preview.title_issue_failed": "## ❌ Issue Preview 배포 μ‹€νŒ¨!",
2111
+ "wf_preview.title_pr_building": "## πŸš€ PR Preview λΉŒλ“œ 쀑...",
2112
+ "wf_preview.title_pr_deployed": "## βœ… PR Preview 배포 μ™„λ£Œ!",
2113
+ "wf_preview.title_pr_failed": "## ❌ PR Preview 배포 μ‹€νŒ¨!",
2114
+ "wf_preview.title_running": "## βœ… Preview ν™˜κ²½ μ‹€ν–‰ 쀑",
2115
+ # --- wf_readme ---
2116
+ "wf_readme.hint_first_example": "## μ΅œμ‹  버전 : v1.0.0 (2025-08-15)",
2117
+ "wf_readme.default_heading": "μ΅œμ‹  버전",
2118
+ # --- wf_release ---
2119
+ "wf_release.drift_heading": "### ⚠️ 릴리슀 λˆ„λ½ 감지",
2120
+ "wf_release.drift_version_line": "- version.yml: `{version}`",
2121
+ "wf_release.drift_tag_line": "- μ΅œμ‹  νƒœκ·Έ: `{tag}`",
2122
+ "wf_release.drift_body": "릴리슀 ν™•μ • 없이 λ²„μ „λ§Œ μ˜¬λΌκ°”μŠ΅λ‹ˆλ‹€. 이 버전은 npm에 λ°°ν¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.",
2123
+ "wf_release.drift_recover": "볡ꡬ: Actions β†’ PROJECT-RELEASE-PUBLISH β†’ Run workflow",
2124
+ "wf_release.readme_dispatch_ok": "README-VERSION-UPDATE workflow_dispatch 트리거 μš”μ²­ μ™„λ£Œ",
2125
+ "wf_release.readme_dispatch_skip": "README-VERSION-UPDATE μ›Œν¬ν”Œλ‘œμš°λ₯Ό κΉ¨μš°μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€ (μ‚­μ œν–ˆκ±°λ‚˜ λΉ„ν™œμ„±ν™”λ¨) β€” README 버전 갱신을 κ±΄λ„ˆλœλ‹ˆλ‹€",
2126
+ "wf_release.not_merge_release": "v{version}은 릴리슀 PR λ³‘ν•©μœΌλ‘œ λ“€μ–΄μ˜¨ λ¦΄λ¦¬μŠ€κ°€ μ•„λ‹™λ‹ˆλ‹€ β€” λ°°ν¬λŠ” push μ΄λ²€νŠΈκ°€ λ§‘μŠ΅λ‹ˆλ‹€",
2127
+ "wf_release.bot_merged": "PR #{pr}을 봇 토큰이 λ³‘ν•©ν–ˆμŠ΅λ‹ˆλ‹€ β€” push μ΄λ²€νŠΈκ°€ 배포λ₯Ό κΉ¨μš°μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€",
2128
+ "wf_release.merger_unknown_pat": "병합 주체λ₯Ό ν™•μΈν•˜μ§€ λͺ»ν–ˆκ³  WORKFLOW_PAT이 μžˆμŠ΅λ‹ˆλ‹€ β€” push μ΄λ²€νŠΈκ°€ 배포λ₯Ό μ‹€ν–‰ν–ˆλ‹€κ³  보고 κ±΄λ„ˆλœλ‹ˆλ‹€",
2129
+ "wf_release.merger_unknown_nopat": "병합 주체λ₯Ό ν™•μΈν•˜μ§€ λͺ»ν–ˆκ³  WORKFLOW_PAT이 μ—†μŠ΅λ‹ˆλ‹€ β€” 봇 토큰 λ³‘ν•©μœΌλ‘œ λ΄…λ‹ˆλ‹€",
2130
+ "wf_release.human_merged": "PR #{pr}을 {user}이(κ°€) λ³‘ν•©ν–ˆμŠ΅λ‹ˆλ‹€ β€” push μ΄λ²€νŠΈκ°€ 배포λ₯Ό 이미 μ‹€ν–‰ν–ˆμœΌλ―€λ‘œ κ±΄λ„ˆλœλ‹ˆλ‹€",
2131
+ "wf_release.no_targets": "{branch} push둜 λ„λŠ” 배포 μ›Œν¬ν”Œλ‘œμš°κ°€ μ—†μŠ΅λ‹ˆλ‹€ β€” κ±΄λ„ˆλœλ‹ˆλ‹€",
2132
+ "wf_release.deploy_trigger_ok": "{wf} workflow_dispatch 트리거 μš”μ²­ μ™„λ£Œ",
2133
+ "wf_release.deploy_trigger_warn": "{wf} 배포 μ›Œν¬ν”Œλ‘œμš°λ₯Ό κΉ¨μš°μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€ β€” Actions νƒ­μ—μ„œ Run workflow둜 직접 μ‹€ν–‰ν•˜μ„Έμš”",
2134
+ # --- wf_spring_ci ---
2135
+ "wf_spring_ci.status_ok": "βœ… 성곡",
2136
+ "wf_spring_ci.status_fail": "❌ μ‹€νŒ¨",
2137
+ "wf_spring_ci.err_compile_header": "## 🚨 컴파일 μ—λŸ¬",
2138
+ "wf_spring_ci.err_compile_missing": "μ—λŸ¬ 둜그λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
2139
+ "wf_spring_ci.err_test_header": "## πŸ§ͺ ν…ŒμŠ€νŠΈ μ‹€νŒ¨",
2140
+ "wf_spring_ci.err_test_missing": "ν…ŒμŠ€νŠΈ μ—λŸ¬ 둜그λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
2141
+ "wf_spring_ci.err_build_header": "## πŸ“¦ λΉŒλ“œ μ—λŸ¬",
2142
+ "wf_spring_ci.err_build_missing": "λΉŒλ“œ μ—λŸ¬ 둜그λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.",
2143
+ "wf_spring_ci.comment_title": "## πŸ”§ CI Build Check κ²°κ³Ό",
2144
+ "wf_spring_ci.comment_success": "### βœ… λΉŒλ“œ 성곡!",
2145
+ "wf_spring_ci.comment_failure": "### ❌ λΉŒλ“œ μ‹€νŒ¨!",
2146
+ "wf_spring_ci.table_header": "| 단계 | μƒνƒœ |",
2147
+ "wf_spring_ci.row_compile": "| 컴파일 | {status} |",
2148
+ "wf_spring_ci.row_test": "| ν…ŒμŠ€νŠΈ | {status} |",
2149
+ "wf_spring_ci.row_build": "| λΉŒλ“œ | {status} |",
2150
+ "wf_spring_ci.overall": "**전체 μƒνƒœ**: {status}",
2151
+ "wf_spring_ci.details_header": "### πŸ“‹ μ—λŸ¬ 상세 정보",
2152
+ "wf_spring_ci.fix_header": "### πŸ”§ ν•΄κ²° 방법",
2153
+ "wf_spring_ci.fix_build": "- λ‘œμ»¬μ—μ„œ `./gradlew clean build` λͺ…λ Ήμ–΄λ‘œ λΉŒλ“œλ₯Ό ν™•μΈν•΄λ³΄μ„Έμš”",
2154
+ "wf_spring_ci.fix_error": "- μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό μ°Έκ³ ν•˜μ—¬ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ£Όμ„Έμš”",
2155
+ "wf_spring_ci.fix_test": "- ν…ŒμŠ€νŠΈκ°€ μ‹€νŒ¨ν•œ 경우 `./gradlew test` λͺ…λ Ήμ–΄λ‘œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•΄λ³΄μ„Έμš”",
2156
+ "wf_spring_ci.footer": "*πŸ€– GitHub Actions에 μ˜ν•΄ μžλ™ 생성됨 - {time}*",
2157
+ "wf_spring_ci.date_locale": "ko-KR",
2158
+ "wf_spring_ci.check_summary_success": "λΉŒλ“œ 검증이 μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.",
2159
+ "wf_spring_ci.check_summary_failure": "λΉŒλ“œ 검증이 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.",
2160
+ "wf_spring_ci.check_compile": "컴파일: {status}",
2161
+ "wf_spring_ci.check_test": "ν…ŒμŠ€νŠΈ: {status}",
2162
+ "wf_spring_ci.check_build": "λΉŒλ“œ: {status}",
2163
+ "wf_spring_ci.build_failed": "❌ λΉŒλ“œκ°€ μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. μœ„μ˜ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”.",
2164
+ "wf_spring_ci.gate_results": "needs κ²°κ³Ό: {results}",
2165
+ "wf_spring_ci.gate_failed": "μ‹€νŒ¨ν•˜κ±°λ‚˜ μ·¨μ†Œλœ job이 μžˆμŠ΅λ‹ˆλ‹€.",
2166
+ # --- wf_spring_deploy ---
2167
+ "wf_spring_deploy.prod_yml_created": "βœ… application-prod.yml 파일 생성 μ™„λ£Œ ({dir})",
2168
+ "wf_spring_deploy.ssh_auth_method": "πŸ” SSH 인증 방식: {method}",
2169
+ "wf_spring_deploy.image_pull": "πŸ“₯ 이미지 Pull: {image}",
2170
+ "wf_spring_deploy.volume_mkdir": "πŸ“ λ³Όλ₯¨ 마운트 디렉토리 생성: {path}",
2171
+ "wf_spring_deploy.volume_disabled": "ℹ️ λ³Όλ₯¨ 마운트 λΉ„ν™œμ„±ν™”λ¨",
2172
+ "wf_spring_deploy.volume_enabled": "πŸ“¦ λ³Όλ₯¨ 마운트 ν™œμ„±ν™”: {host} β†’ {container}",
2173
+ "wf_spring_deploy.idle_slot_cleanup": "πŸ—‘οΈ idle 슬둯 정리: {name}",
2174
+ "wf_spring_deploy.banner_project": "πŸ“¦ ν”„λ‘œμ νŠΈ: {name}",
2175
+ "wf_spring_deploy.banner_domain": "🌐 도메인: {domain}",
2176
+ "wf_spring_deploy.banner_image": "πŸ–ΌοΈ 이미지: {image}",
2177
+ "wf_spring_deploy.old_removed": "πŸ—‘οΈ old={name} 제거",
2178
+ "wf_spring_deploy.old_absent": "ℹ️ old={name} μ—†μŒ β€” 정리 μƒλž΅",
2179
+ "wf_spring_deploy.inflight_wait": "⏱️ in-flight μš”μ²­ 처리 λŒ€κΈ° ({sec}초)",
2180
+ "wf_spring_deploy.prune_dangling": "🧹 dangling(<none>) 이미지 정리...",
2181
+ "wf_spring_deploy.new_container_start": "🐳 μƒˆ μ»¨ν…Œμ΄λ„ˆ 기동: {name}",
2182
+ "wf_spring_deploy.simple_env_setup": "πŸ”§ ν™˜κ²½λ³€μˆ˜ μ„€μ •..",
2183
+ "wf_spring_deploy.simple_container_name_default": "ℹ️ CONTAINER_NAME이 μ„€μ •λ˜μ§€ μ•Šμ•„ PROJECT_NAME을 μ‚¬μš©ν•©λ‹ˆλ‹€: {name}",
2184
+ "wf_spring_deploy.simple_container_name_custom": "ℹ️ μ‚¬μš©μž μ§€μ • CONTAINER_NAME μ‚¬μš©: {name}",
2185
+ "wf_spring_deploy.simple_deploy_start": "πŸš€ 배포 ν™˜κ²½μœΌλ‘œ λ°°ν¬ν•©λ‹ˆλ‹€ (브랜치: {branch})",
2186
+ "wf_spring_deploy.simple_config_header": "πŸ“‹ 배포 μ„€μ • 정보:",
2187
+ "wf_spring_deploy.simple_config_branch": " - 브랜치: {branch}",
2188
+ "wf_spring_deploy.simple_config_project": " - ν”„λ‘œμ νŠΈ: {name}",
2189
+ "wf_spring_deploy.simple_config_container": " - μ»¨ν…Œμ΄λ„ˆ 이름: {name}",
2190
+ "wf_spring_deploy.simple_config_port": " - 포트: {port}",
2191
+ "wf_spring_deploy.simple_config_image": " - Docker 이미지: {image}",
2192
+ "wf_spring_deploy.simple_image_pull": "⬇️ Docker 이미지 ν’€: {image}",
2193
+ "wf_spring_deploy.simple_container_check": "🧹 μ»¨ν…Œμ΄λ„ˆ {name} 쑴재 μ—¬λΆ€ 확인 쀑...",
2194
+ "wf_spring_deploy.simple_container_exists": "⚠️ μ»¨ν…Œμ΄λ„ˆ {name} 이(κ°€) μ‘΄μž¬ν•©λ‹ˆλ‹€. 쀑지 및 μ‚­μ œ 쀑...",
2195
+ "wf_spring_deploy.simple_container_removed": "βœ… μ»¨ν…Œμ΄λ„ˆ {name} 이(κ°€) μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
2196
+ "wf_spring_deploy.simple_container_missing": "ℹ️ μ‘΄μž¬ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ {name} 이(κ°€) μ—†μŠ΅λ‹ˆλ‹€.",
2197
+ "wf_spring_deploy.simple_container_starting": "πŸš€ μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆ {name} μ‹€ν–‰ 쀑...",
2198
+ "wf_spring_deploy.simple_volume_enabled": "πŸ“¦ λ³Όλ₯¨ 마운트 ν™œμ„±ν™”: {option}",
2199
+ "wf_spring_deploy.simple_init_wait": "⏳ μ»¨ν…Œμ΄λ„ˆ μ΄ˆκΈ°ν™” λŒ€κΈ° 쀑... ({sec}초)",
2200
+ "wf_spring_deploy.simple_hc_check": "πŸ₯ μ»¨ν…Œμ΄λ„ˆ ν—¬μŠ€μ²΄ν¬ 쀑...",
2201
+ "wf_spring_deploy.simple_hc_process_missing": "❌ μ»¨ν…Œμ΄λ„ˆ {name} ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€",
2202
+ "wf_spring_deploy.simple_hc_process_ok": "βœ… μ»¨ν…Œμ΄λ„ˆ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ 확인 μ™„λ£Œ",
2203
+ "wf_spring_deploy.simple_http_start": "🌐 HTTP ν—¬μŠ€μ²΄ν¬ μ‹œμž‘: {url}",
2204
+ "wf_spring_deploy.simple_http_attempt": " μ‹œλ„ {i}/{max}...",
2205
+ "wf_spring_deploy.simple_http_ok": "βœ… HTTP ν—¬μŠ€μ²΄ν¬ 성곡 (응닡 μ½”λ“œ: {code})",
2206
+ "wf_spring_deploy.simple_http_fail": "⚠️ HTTP ν—¬μŠ€μ²΄ν¬ μ‹€νŒ¨ (응닡 μ½”λ“œ: {code})",
2207
+ "wf_spring_deploy.simple_http_retry": " {sec}초 ν›„ μž¬μ‹œλ„...",
2208
+ "wf_spring_deploy.simple_http_fallback": "⚠️ HTTP ν—¬μŠ€μ²΄ν¬ μ΅œμ’… μ‹€νŒ¨, 둜그 νŒ¨ν„΄ 맀칭으둜 fallback...",
2209
+ "wf_spring_deploy.simple_hc_path_unset": "ℹ️ HEALTHCHECK_PATHκ°€ μ„€μ •λ˜μ§€ μ•Šμ•„ 둜그 νŒ¨ν„΄ 맀칭만 μ‚¬μš©ν•©λ‹ˆλ‹€",
2210
+ "wf_spring_deploy.simple_log_match_start": "πŸ“‹ 둜그 νŒ¨ν„΄ λ§€μΉ­ μ‹œμž‘: '{pattern}'",
2211
+ "wf_spring_deploy.simple_log_match_ok": "βœ… 둜그 νŒ¨ν„΄ λ§€μΉ­ 성곡: μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ‹œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€",
2212
+ "wf_spring_deploy.simple_log_match_fail": "❌ 둜그 νŒ¨ν„΄ λ§€μΉ­ μ‹€νŒ¨: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘ 둜그λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€",
2213
+ "wf_spring_deploy.simple_debug_header": "πŸ“‹ 디버깅 정보:",
2214
+ "wf_spring_deploy.simple_debug_pattern": " - 검색 νŒ¨ν„΄: {pattern}",
2215
+ "wf_spring_deploy.simple_debug_container": " - μ»¨ν…Œμ΄λ„ˆ: {name}",
2216
+ "wf_spring_deploy.simple_debug_image": " - 이미지: {image}",
2217
+ "wf_spring_deploy.simple_debug_port": " - 포트: {port}",
2218
+ "wf_spring_deploy.simple_debug_volume": " - λ³Όλ₯¨: {volume}",
2219
+ "wf_spring_deploy.simple_debug_profile": " - ν”„λ‘œνŒŒμΌ: {profile}",
2220
+ "wf_spring_deploy.simple_logs_tail": "πŸ“‹ μ»¨ν…Œμ΄λ„ˆ 둜그 (졜근 50쀄):",
2221
+ "wf_spring_deploy.simple_hc_done": "βœ… ν—¬μŠ€μ²΄ν¬ μ™„λ£Œ: μ»¨ν…Œμ΄λ„ˆ {name} 이(κ°€) μ •μƒμ μœΌλ‘œ μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€",
2222
+ "wf_spring_deploy.simple_deploy_done": "βœ… 배포가 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!",
2223
+ "wf_spring_deploy.simple_summary_header": "πŸ“‹ 배포 κ²°κ³Ό μš”μ•½:",
2224
+ "wf_spring_deploy.simple_summary_project": " 🎯 ν”„λ‘œμ νŠΈ: {name}",
2225
+ "wf_spring_deploy.simple_summary_branch": " 🌿 브랜치: {branch}",
2226
+ "wf_spring_deploy.simple_summary_container": " 🐳 μ»¨ν…Œμ΄λ„ˆ: {name}",
2227
+ "wf_spring_deploy.simple_summary_port": " 🌐 포트: {port}",
2228
+ "wf_spring_deploy.simple_summary_time": " ⏰ 배포 μ‹œκ°„: {time}",
2229
+ "wf_spring_deploy.simple_access_url": "πŸ”— 접속 URL: {url}",
2230
+ "wf_spring_deploy.nginx_deploy_start": "πŸš€ Nginx Blue-Green 무쀑단 배포 μ‹œμž‘",
2231
+ "wf_spring_deploy.nginx_backup_dir": "πŸ“ nginx λ°±μ—… 디렉토리 생성: {dir}",
2232
+ "wf_spring_deploy.nginx_backup_file": "πŸ’Ύ nginx config λ°±μ—…: {file}",
2233
+ "wf_spring_deploy.nginx_find_active": "πŸ” nginx config 의 ν˜„μž¬ ν™œμ„± 포트 탐색",
2234
+ "wf_spring_deploy.nginx_active_missing": "⚠️ ν™œμ„± 포트λ₯Ό μ°Ύμ§€ λͺ»ν•¨ β†’ κΈ°λ³Έκ°’(BLUE={blue})을 ν™œμ„±μœΌλ‘œ κ°„μ£Ό",
2235
+ "wf_spring_deploy.nginx_active_port": "🎨 ν˜„μž¬ ν™œμ„± 포트: {port}",
2236
+ "wf_spring_deploy.nginx_new_deploy": "🐳 μ‹ κ·œ 배포 β†’ 포트={port} μ»¨ν…Œμ΄λ„ˆ={name}",
2237
+ "wf_spring_deploy.nginx_old_container": "πŸ—‘οΈ 이전 μ»¨ν…Œμ΄λ„ˆ (제거 μ˜ˆμ •) = {name}",
2238
+ "wf_spring_deploy.nginx_new_container_start": "🐳 μƒˆ μ»¨ν…Œμ΄λ„ˆ 기동: {name} (포트 {port})",
2239
+ "wf_spring_deploy.nginx_hc_start": "⏳ ν—¬μŠ€μ²΄ν¬ μ‹œμž‘ (μ΅œλŒ€ {retries}회 Γ— {interval}초)",
2240
+ "wf_spring_deploy.nginx_hc_ok": "βœ… ν—¬μŠ€μ²΄ν¬ 성곡 (μ‹œλ„ {i})",
2241
+ "wf_spring_deploy.nginx_hc_progress": "⏳ ν—¬μŠ€μ²΄ν¬ 진행쀑... ({i}/{max})",
2242
+ "wf_spring_deploy.nginx_hc_fail": "❌ ν—¬μŠ€μ²΄ν¬ μ‹€νŒ¨ β†’ 배포 쀑단",
2243
+ "wf_spring_deploy.nginx_new_cleanup": "πŸ—‘οΈ μ‹ κ·œ μ»¨ν…Œμ΄λ„ˆ 정리: {name}",
2244
+ "wf_spring_deploy.nginx_toggle": "πŸ”§ nginx config 포트 ν† κΈ€: {old} β†’ {new}",
2245
+ "wf_spring_deploy.nginx_apply": "πŸ”§ nginx μ„€μ • 적용 및 검증",
2246
+ "wf_spring_deploy.nginx_test_fail": "❌ nginx μ„€μ • 검증 μ‹€νŒ¨ β†’ λ°±μ—… 파일둜 볡ꡬ",
2247
+ "wf_spring_deploy.nginx_test_ok": "βœ… nginx μ„€μ • 검증 성곡",
2248
+ "wf_spring_deploy.nginx_reload_fail": "⚠️ reload μ‹€νŒ¨ β†’ restart μ‹œλ„",
2249
+ "wf_spring_deploy.nginx_restart_fail": "❌ nginx reload/restart μ‹€νŒ¨ β†’ λ°±μ—… 볡ꡬ",
2250
+ "wf_spring_deploy.nginx_domain_check": "🌐 도메인 μ ‘κ·Ό 검증 ({domain})",
2251
+ "wf_spring_deploy.nginx_domain_ok": "βœ… 도메인 μ ‘κ·Ό 검증 성곡 (μ‹œλ„ {i})",
2252
+ "wf_spring_deploy.nginx_domain_progress": "⏳ 도메인 μ ‘κ·Ό 검증 쀑... ({i}/{max})",
2253
+ "wf_spring_deploy.nginx_domain_fail": "⚠️ 도메인 μ ‘κ·Ό 검증 μ‹€νŒ¨: 배포 μ§„ν–‰ (DNS μ „νŒŒ μ§€μ—° κ°€λŠ₯μ„±)",
2254
+ "wf_spring_deploy.nginx_backup_keep": "🧹 λ°±μ—… 파일 μ΅œμ‹  {keep}개 보쑴",
2255
+ "wf_spring_deploy.nginx_done": "βœ… 무쀑단 배포 μ™„λ£Œ. active={name} (포트 {port})",
2256
+ "wf_spring_deploy.traefik_deploy_start": "πŸš€ Blue-Green 무쀑단 배포 μ‹œμž‘",
2257
+ "wf_spring_deploy.traefik_entry": "πŸ”§ Traefik μ§„μž…: localhost:{port} (entrypoint={entrypoint})",
2258
+ "wf_spring_deploy.traefik_extra_network": "πŸ”— μΆ”κ°€ λ„€νŠΈμ›Œν¬ μ—°κ²°: {net}",
2259
+ "wf_spring_deploy.traefik_labels": "πŸ” Traefik 라벨 확인:",
2260
+ "wf_spring_deploy.traefik_hc_start": "⏳ ν—¬μŠ€μ²΄ν¬ μ‹œμž‘ (μ΅œλŒ€ {max_wait}초, {retries}회 Γ— {interval}초)",
2261
+ "wf_spring_deploy.traefik_exited": "❌ μ»¨ν…Œμ΄λ„ˆ 비정상 μ’…λ£Œ (exited). 둜그 200쀄:",
2262
+ "wf_spring_deploy.traefik_kept": "ℹ️ μ»¨ν…Œμ΄λ„ˆ {name} μœ μ§€ (μžλ™ μ‚­μ œ μ•ˆ 함) β€” μˆ˜λ™ 검증/디버깅",
2263
+ "wf_spring_deploy.traefik_rollback_note": "ℹ️ old={name} 쑴재 μ‹œ κ·ΈλŒ€λ‘œ μœ μ§€ β†’ 사싀상 μžλ™ λ‘€λ°±",
2264
+ "wf_spring_deploy.traefik_hc_pass": "βœ… ν—¬μŠ€μ²΄ν¬ 톡과 ({n}/{max}) HTTP={code}",
2265
+ "wf_spring_deploy.traefik_waiting": "⏳ λŒ€κΈ° ({n}/{max}) status={status} http={http}",
2266
+ "wf_spring_deploy.traefik_hc_timeout": "❌ ν—¬μŠ€μ²΄ν¬ νƒ€μž„μ•„μ›ƒ ({sec}초)",
2267
+ "wf_spring_deploy.traefik_logs_header": "πŸ” {name} 졜근 200쀄 둜그:",
2268
+ "wf_spring_deploy.traefik_done": "βœ… 무쀑단 배포 μ™„λ£Œ. active={name}",
2269
+ # --- wf_version ---
2270
+ "wf_version.release_publish_triggered": "RELEASE-PUBLISH workflow_dispatch 트리거 μš”μ²­ μ™„λ£Œ (WORKFLOW_PAT 없이도 λ™μž‘, 이슈 #61 λ“œλ¦¬ν”„νŠΈ μžλ™ 볡ꡬ)",
2271
+ "wf_version.backmerge_conflict": "{prod}을 {dev}에 μžλ™ λ³‘ν•©ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€ (좩돌). λ‹€μŒ 릴리슀 PR 전에 직접 λ³‘ν•©ν•˜μ„Έμš”: {manual}",
2272
+ "wf_version.backmerge_push_failed": "{dev}에 pushν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€ (브랜치 보호 λ“±). λ‹€μŒ 릴리슀 PR 전에 직접 λ³‘ν•©ν•˜μ„Έμš”: {manual}",
2273
+ }
2274
+
2275
+ CATALOG = {"en": EN, "ko": KO}
2276
+
2277
+
2278
+ if __name__ == "__main__":
2279
+ sys.exit(main(sys.argv[1:]))